summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yaml111
-rw-r--r--.github/workflows/monkey-test.yaml69
-rw-r--r--.github/workflows/static-analysis.yaml65
-rw-r--r--Makefile51
-rw-r--r--Makefile.defaults4
-rw-r--r--Makefile.tools118
-rw-r--r--content/fetch.h24
-rw-r--r--content/fetchers/about/certificate.c331
-rw-r--r--content/fetchers/curl.c675
-rw-r--r--content/fetchers/file/dirlist.c3
-rw-r--r--content/fs_backing_store.c14
-rw-r--r--content/handlers/css/dump.c28
-rw-r--r--content/handlers/css/hints.c18
-rw-r--r--content/handlers/css/utils.h25
-rw-r--r--content/handlers/html/Makefile1
-rw-r--r--content/handlers/html/box.h4
-rw-r--r--content/handlers/html/box_construct.c121
-rw-r--r--content/handlers/html/box_inspect.c13
-rw-r--r--content/handlers/html/box_inspect.h12
-rw-r--r--content/handlers/html/box_normalise.c202
-rw-r--r--content/handlers/html/box_normalise.h9
-rw-r--r--content/handlers/html/box_special.c37
-rw-r--r--content/handlers/html/css.c11
-rw-r--r--content/handlers/html/dom_event.c12
-rw-r--r--content/handlers/html/form.c31
-rw-r--r--content/handlers/html/html.c4
-rw-r--r--content/handlers/html/interaction.c10
-rw-r--r--content/handlers/html/layout.c770
-rw-r--r--content/handlers/html/layout_flex.c1117
-rw-r--r--content/handlers/html/layout_internal.h738
-rw-r--r--content/handlers/html/redraw_border.c9
-rw-r--r--content/handlers/html/script.c1
-rw-r--r--content/handlers/html/table.c49
-rw-r--r--content/handlers/image/Makefile3
-rw-r--r--content/handlers/image/gif.c9
-rw-r--r--content/handlers/image/image.c7
-rw-r--r--content/handlers/image/image_cache.c14
-rw-r--r--content/handlers/image/jpeg.c2
-rw-r--r--content/handlers/image/jpegxl.c340
-rw-r--r--content/handlers/image/jpegxl.h28
-rw-r--r--content/handlers/image/nssprite.c2
-rw-r--r--content/handlers/image/rsvg246.c280
-rw-r--r--content/handlers/image/webp.c2
-rw-r--r--content/handlers/javascript/duktape/CSSRule.bnd22
-rw-r--r--content/handlers/javascript/duktape/CSSStyleSheet.bnd22
-rw-r--r--content/handlers/javascript/duktape/Console.bnd2
-rw-r--r--content/handlers/javascript/duktape/DOMSettableTokenList.bnd44
-rw-r--r--content/handlers/javascript/duktape/DOMTokenList.bnd163
-rw-r--r--content/handlers/javascript/duktape/Element.bnd31
-rw-r--r--content/handlers/javascript/duktape/ImageData.bnd2
-rw-r--r--content/handlers/javascript/duktape/dukky.c8
-rw-r--r--content/handlers/javascript/duktape/netsurf.bnd6
-rw-r--r--content/handlers/javascript/duktape/polyfill.js18
-rw-r--r--content/handlers/text/textplain.c2
-rw-r--r--content/hlcache.c10
-rw-r--r--content/llcache.c21
-rw-r--r--content/mimesniff.c13
-rw-r--r--content/urldb.c10
-rw-r--r--desktop/cookie_manager.c30
-rw-r--r--desktop/global_history.c22
-rw-r--r--desktop/gui_factory.c18
-rw-r--r--desktop/hotlist.c29
-rw-r--r--desktop/netsurf.c2
-rw-r--r--desktop/options.h3
-rw-r--r--desktop/selection.c2
-rw-r--r--desktop/version.c4
-rw-r--r--docs/UnimplementedJavascript.md17
-rw-r--r--docs/env.sh156
-rw-r--r--frontends/amiga/Makefile2
-rw-r--r--frontends/amiga/Makefile.defaults1
-rw-r--r--frontends/amiga/font_bullet.c7
-rw-r--r--frontends/amiga/font_diskfont.c16
-rw-r--r--frontends/amiga/gui_menu.c31
-rw-r--r--frontends/amiga/gui_menu.h5
-rwxr-xr-xfrontends/amiga/gui_options.c19
-rwxr-xr-xfrontends/amiga/pkg/netsurf.readme4
-rw-r--r--frontends/amiga/pkg/netsurf_os3.readme10
-rw-r--r--frontends/amiga/version.c2
-rw-r--r--frontends/atari/Makefile2
-rw-r--r--frontends/beos/Makefile2
-rw-r--r--frontends/framebuffer/font_internal.c13
-rw-r--r--frontends/framebuffer/gui.c2
-rw-r--r--frontends/gtk/Makefile12
-rw-r--r--frontends/gtk/bitmap.c4
-rw-r--r--frontends/gtk/download.c7
-rw-r--r--frontends/gtk/fetch.c1
-rw-r--r--frontends/gtk/gdk.c2
l---------frontends/gtk/res/fr/credits.html1
l---------frontends/gtk/res/fr/licence.html1
l---------frontends/gtk/res/fr/welcome.html1
-rw-r--r--frontends/gtk/res/netsurf.gresource.xml3
-rw-r--r--frontends/gtk/scaffolding.c12
-rw-r--r--frontends/gtk/search.c2
-rw-r--r--frontends/gtk/toolbar.c9
-rw-r--r--frontends/riscos/Makefile8
-rw-r--r--frontends/riscos/Makefile.tools42
-rw-r--r--frontends/riscos/appdir/!Boot,feb4
-rw-r--r--frontends/riscos/appdir/Resources/en/!Help8
-rw-r--r--frontends/riscos/appdir/Resources/nl/!Help8
-rw-r--r--frontends/riscos/configure/con_content.c14
-rw-r--r--frontends/riscos/configure/con_image.c3
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/!Boot,feb2
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/!Help6
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/!Run,feb2
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Acorn/Latin1,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Acorn/Latin1)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/CentEuro,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/CentEuro)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Cyrillic,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Cyrillic)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Roman,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Roman)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Ukrainian,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Ukrainian)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/BigFive,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/BigFive)bin29516 -> 29516 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C0/40[ISO646],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C0/40[ISO646])bin64 -> 64 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C1/43[IS6429],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C1/43[IS6429])bin64 -> 64 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/40[646old],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/40[646old])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/41[646-GB],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/41[646-GB])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/42[646IRV],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/42[646IRV])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/43[FinSwe],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/43[FinSwe])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/47[646-SE],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/47[646-SE])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/48[646-SE],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/48[646-SE])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/49[JS201K],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/49[JS201K])0
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4A[JS201R],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4A[JS201R])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4B[646-DE],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4B[646-DE])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4C[646-PT],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4C[646-PT])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/54[GB1988],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/54[GB1988])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/56[Teltxt],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/56[Teltxt])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/59[646-IT],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/59[646-IT])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/5A[646-ES],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/5A[646-ES])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/60[646-NO],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/60[646-NO])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/66[646-FR],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/66[646-FR])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/69[646-HU],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/69[646-HU])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6B[Arabic],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6B[Arabic])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6C[IS6937],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6C[IS6937])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/7A[SerbCr],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/7A[SerbCr])bin188 -> 188 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/40[JS6226],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/40[JS6226])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/41[GB2312],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/41[GB2312])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/42[JIS208],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/42[JIS208])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/43[KS1001],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/43[KS1001])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/44[JIS212],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/44[JIS212])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/47[CNS1],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/47[CNS1])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/48[CNS2],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/48[CNS2])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/49[CNS3],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/49[CNS3])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4A[CNS4],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4A[CNS4])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4B[CNS5],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4B[CNS5])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4C[CNS6],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4C[CNS6])bin17672 -> 17672 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4D[CNS7],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4D[CNS7])0
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/41[Lat1],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/41[Lat1])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/42[Lat2],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/42[Lat2])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/43[Lat3],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/43[Lat3])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/44[Lat4],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/44[Lat4])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/46[Greek],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/46[Greek])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/47[Arabic],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/47[Arabic])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/48[Hebrew],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/48[Hebrew])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4C[Cyrill],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4C[Cyrill])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4D[Lat5],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4D[Lat5])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/50[LatSup],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/50[LatSup])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/52[IS6937],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/52[IS6937])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/54[Thai],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/54[Thai])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/56[Lat6],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/56[Lat6])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/58[L6Sami],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/58[L6Sami])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/59[Lat7],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/59[Lat7])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5C[Welsh],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5C[Welsh])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5D[Sami],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5D[Sami])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5E[Hebrew],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5E[Hebrew])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5F[Lat8],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5F[Lat8])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/62[Lat9],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/62[Lat9])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/66[Lat10],ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/66[Lat10])bin192 -> 192 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/KOI8-R,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/KOI8-R)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1250,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1250)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1251,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1251)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1252,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1252)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1253,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1253)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1254,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1254)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1256,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1256)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP866,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP866)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP874,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP874)bin256 -> 256 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP932,ffd (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP932)bin996 -> 996 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Files/CharNames14016
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites,ff9 (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites,ff9)bin5780 -> 5780 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites11,ff9 (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites11,ff9)bin11132 -> 11132 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites22,ff9 (renamed from frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites22,ff9)bin7324 -> 7324 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Morris4/!Sprites,ff9bin0 -> 996 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Morris4/!Sprites22,ff9bin0 -> 1892 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Ursula/!Sprites,ff9bin0 -> 1684 bytes
-rw-r--r--frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Ursula/!Sprites22,ff9bin0 -> 3268 bytes
-rw-r--r--frontends/riscos/distribution/!System/310/Modules/Network/SockWatch,ffabin0 -> 1840 bytes
-rw-r--r--frontends/riscos/distribution/!System/310/Modules/Network/URI,ffabin9188 -> 7120 bytes
-rw-r--r--[-rwxr-xr-x]frontends/riscos/distribution/!System/310/Modules/SharedULib,ffabin3116 -> 3192 bytes
-rw-r--r--frontends/riscos/distribution/!System/400/Modules/ARMEABISupport,ffabin0 -> 26504 bytes
-rw-r--r--frontends/riscos/distribution/3rdParty/ARMEABISupport/Copyright20
-rw-r--r--frontends/riscos/distribution/3rdParty/ARMEABISupport/Origin,b281
-rw-r--r--frontends/riscos/distribution/3rdParty/AcornURI/!ReadMe34
-rw-r--r--frontends/riscos/distribution/3rdParty/AcornURI/Apache-2.0202
-rw-r--r--frontends/riscos/distribution/3rdParty/AcornURI/Copying526
-rw-r--r--frontends/riscos/distribution/3rdParty/AcornURI/Origin,b281
-rw-r--r--frontends/riscos/distribution/3rdParty/Cache/Copyright20
-rw-r--r--frontends/riscos/distribution/3rdParty/Cache/Origin,b281
-rw-r--r--frontends/riscos/distribution/3rdParty/CryptRand/Origin,b281
-rw-r--r--frontends/riscos/distribution/3rdParty/Iconv/COPYING140
-rw-r--r--frontends/riscos/distribution/3rdParty/Iconv/Origin,b281
-rw-r--r--frontends/riscos/distribution/3rdParty/Iconv/ReadMe21
-rw-r--r--frontends/riscos/distribution/3rdParty/Iconv/licenses/Apache-2.0202
-rw-r--r--frontends/riscos/distribution/3rdParty/Iconv/licenses/LGPL-2481
-rw-r--r--frontends/riscos/distribution/3rdParty/SharedULib/Copyright15
-rw-r--r--frontends/riscos/distribution/3rdParty/SharedULib/Origin,b281
-rw-r--r--frontends/riscos/distribution/3rdParty/SocketWatch/!Info137
-rw-r--r--frontends/riscos/distribution/3rdParty/SocketWatch/Origin,b281
-rw-r--r--frontends/riscos/distribution/3rdParty/SocketWatch/Source/!ReadMe133
-rw-r--r--frontends/riscos/distribution/3rdParty/SocketWatch/Source/Build,fd716
-rw-r--r--frontends/riscos/distribution/3rdParty/SocketWatch/Source/Licence340
-rw-r--r--frontends/riscos/distribution/3rdParty/SocketWatch/Source/Source461
-rw-r--r--frontends/riscos/distribution/3rdParty/Tinct/Origin,b281
-rw-r--r--frontends/riscos/distribution/3rdParty/Unicode/Apache-2.0202
-rw-r--r--frontends/riscos/distribution/3rdParty/Unicode/Copyright66
-rw-r--r--frontends/riscos/distribution/3rdParty/Unicode/Origin,b281
-rw-r--r--frontends/riscos/distribution/LeesMij14
-rw-r--r--frontends/riscos/distribution/ReadMe23
-rw-r--r--frontends/riscos/gui.c269
-rw-r--r--frontends/riscos/image.c13
-rw-r--r--frontends/riscos/save.c2
-rw-r--r--frontends/riscos/scripts/Run14
-rw-r--r--frontends/riscos/templates/de6
-rw-r--r--frontends/riscos/templates/en6
-rw-r--r--frontends/riscos/templates/fr6
-rw-r--r--frontends/riscos/templates/nl4
-rw-r--r--frontends/riscos/textarea.c3
-rw-r--r--frontends/riscos/ucstables.c219
-rw-r--r--frontends/windows/Makefile2
-rw-r--r--frontends/windows/download.c1
-rw-r--r--frontends/windows/prefs.c1
-rw-r--r--frontends/windows/res/installer.nsi2
-rw-r--r--frontends/windows/window.c2
-rw-r--r--frontends/windows/window.h1
-rw-r--r--include/netsurf/fetch.h17
-rw-r--r--resources/FatMessages1139
-rw-r--r--resources/SearchEngines10
-rw-r--r--resources/ca-bundle723
-rw-r--r--resources/en/credits.html2
-rw-r--r--resources/en/licence.html14
-rw-r--r--resources/fr/credits.html98
-rw-r--r--resources/fr/licence.html1876
-rw-r--r--resources/fr/welcome.html64
-rw-r--r--resources/it/credits.html2
-rw-r--r--resources/nl/credits.html2
-rw-r--r--resources/nl/licence.html14
-rw-r--r--resources/zh_CN/credits.html2
-rw-r--r--resources/zh_CN/licence.html18
-rw-r--r--test/assert.c19
-rw-r--r--test/corestrings.c2
-rw-r--r--test/data/Choices-all2
-rw-r--r--test/js/class-list.html29
-rw-r--r--test/js/index.html1
-rwxr-xr-xtest/monkey-see-monkey-do2
-rwxr-xr-xtools/jenkins-build.sh24
-rw-r--r--utils/config.h9
-rw-r--r--utils/corestringlist.h1
-rw-r--r--utils/file.c57
-rw-r--r--utils/filename.c88
-rw-r--r--utils/idna.c8
-rw-r--r--utils/inet.h11
-rw-r--r--utils/libdom.c123
-rw-r--r--utils/libdom.h23
-rw-r--r--utils/log.c5
-rw-r--r--utils/log.h1
-rw-r--r--utils/nscolour.c31
-rw-r--r--utils/nsoption.c13
-rw-r--r--utils/ssl_certs.c35
-rw-r--r--utils/utf8.c206
-rw-r--r--utils/utils.h27
267 files changed, 25115 insertions, 3511 deletions
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
new file mode 100644
index 000000000..eb92cdda1
--- /dev/null
+++ b/.github/workflows/build.yaml
@@ -0,0 +1,111 @@
+name: "Linux Build"
+
+on: [push]
+
+jobs:
+ linux:
+ name: '${{ matrix.os }}: ${{ matrix.compiler.vendor }}'
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - ubuntu-22.04
+ - ubuntu-20.04
+ compiler:
+ # The NetSurf build system can't find LLVM AR (it looks for it
+ # in /usr/lib instead of /usr/bin:
+ # `make: /usr/lib/llvm-ar: No such file or directory`).
+ # So we need to make it explicit for llvm.
+ - { vendor: gnu, CC: gcc }
+ - { vendor: llvm, CC: clang, AR: llvm-ar }
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 1
+
+ - name: apt-get install packages
+ run: sudo apt-get update -qq &&
+ sudo apt-get install --no-install-recommends -y
+ bison
+ build-essential
+ ccache
+ check
+ clang
+ flex
+ git
+ gperf
+ libcurl4-openssl-dev
+ libgtk-3-dev
+ libhtml-parser-perl
+ libjpeg-dev
+ libpng-dev
+ librsvg2-dev
+ llvm
+ pkg-config
+ wbritish # Needed for `/usr/share/dict/words`, used by test
+
+ - name: ccache
+ uses: hendrikmuhs/ccache-action@v1.2
+ with:
+ key: ${{ github.job }}-${{ matrix.os }}-${{ matrix.compiler.vendor }}
+ max-size: 128M
+
+ - name: Build and install project libs
+ env:
+ CC: ${{ matrix.compiler.CC }}
+ CXX: ${{ matrix.compiler.CXX }}
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ ns-clone -d -s
+ ns-make-tools install
+ ns-make-libs install
+
+ - name: Disable -Werror
+ # We can remove this step if we ever move to GitHub properly.
+ run: |
+ find . -type f -name Makefile | xargs sed -i 's/-Werror//'
+
+ - name: Unit Tests
+ # Fails when built with clang:
+ # test/corestrings.c:58:F:corestrings:corestrings_test:486:
+ # Assertion 'ires == NSERROR_NOMEM' failed: ires == 0, NSERROR_NOMEM == 2
+ # Looks like `malloc_limit()` not working.
+ if: ${{ matrix.compiler.vendor != 'llvm' }}
+ env:
+ CC: ${{ matrix.compiler.CC }}
+ CXX: ${{ matrix.compiler.CXX }}
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ make test
+
+ - name: Build NetSurf GTK
+ env:
+ CC: ${{ matrix.compiler.CC }}
+ CXX: ${{ matrix.compiler.CXX }}
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ make -j"$(nproc)" TARGET=gtk
+
+ - name: Build NetSurf Monkey
+ env:
+ CC: ${{ matrix.compiler.CC }}
+ CXX: ${{ matrix.compiler.CXX }}
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ make -j"$(nproc)" TARGET=monkey
+
+ - name: Build NetSurf Framebuffer
+ env:
+ CC: ${{ matrix.compiler.CC }}
+ CXX: ${{ matrix.compiler.CXX }}
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ make -j"$(nproc)" TARGET=framebuffer
diff --git a/.github/workflows/monkey-test.yaml b/.github/workflows/monkey-test.yaml
new file mode 100644
index 000000000..e95c9796f
--- /dev/null
+++ b/.github/workflows/monkey-test.yaml
@@ -0,0 +1,69 @@
+name: "Monkey Test"
+
+on: [pull_request]
+
+jobs:
+ test:
+ name: '${{ matrix.test }}'
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ test:
+ - short-internet
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 1
+
+ - name: apt-get install packages
+ run: sudo apt-get update -qq &&
+ sudo apt-get install --no-install-recommends -y
+ bison
+ build-essential
+ ccache
+ check
+ clang
+ flex
+ git
+ gperf
+ libcurl4-openssl-dev
+ libgtk-3-dev
+ libhtml-parser-perl
+ libjpeg-dev
+ libpng-dev
+ librsvg2-dev
+ llvm
+ pkg-config
+ wbritish # Needed for `/usr/share/dict/words`, used by test
+
+ - name: ccache
+ uses: hendrikmuhs/ccache-action@v1.2
+ with:
+ key: ${{ github.job }}
+ max-size: 128M
+
+ - name: Build and install project libs
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ ns-clone -d -s
+ ns-make-tools install
+ ns-make-libs install
+
+ - name: Disable -Werror
+ # We can remove this step if we ever move to GitHub properly.
+ run: |
+ find . -type f -name Makefile | xargs sed -i 's/-Werror//'
+
+ - name: Build NetSurf Monkey
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ make -j"$(nproc)" TARGET=monkey
+
+ - name: Run Monkey Test
+ run: |
+ LC_ALL=C.UTF-8 test/monkey-see-monkey-do -v -d ${{ matrix.test }}
diff --git a/.github/workflows/static-analysis.yaml b/.github/workflows/static-analysis.yaml
new file mode 100644
index 000000000..8604761fe
--- /dev/null
+++ b/.github/workflows/static-analysis.yaml
@@ -0,0 +1,65 @@
+name: "Static Analysis"
+
+on: [push]
+
+jobs:
+ codeql:
+ name: codeql
+ runs-on: ubuntu-22.04
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: ['cpp']
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 1
+
+ - name: apt-get install packages
+ run: sudo apt-get update -qq &&
+ sudo apt-get install --no-install-recommends -y
+ bison
+ build-essential
+ ccache
+ flex
+ git
+ gperf
+ libcurl4-openssl-dev
+ libgtk-3-dev
+ libhtml-parser-perl
+ libjpeg-dev
+ libpng-dev
+ librsvg2-dev
+ pkg-config
+
+ - name: ccache
+ uses: hendrikmuhs/ccache-action@v1.2
+ with:
+ key: ${{ github.job }}
+ max-size: 128M
+
+ - name: Build and install project libs
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ ns-clone -d -s
+ ns-make-tools install
+ ns-make-libs install
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: ${{ matrix.language }}
+
+ - name: Build NetSurf
+ run: |
+ export TARGET_WORKSPACE="$(pwd)/projects"
+ source docs/env.sh
+ make -j"$(nproc)"
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
diff --git a/Makefile b/Makefile
index f66f79649..18665ed3d 100644
--- a/Makefile
+++ b/Makefile
@@ -3,6 +3,7 @@
#
# Copyright 2007 Daniel Silverstone <dsilvers@netsurf-browser.org>
# Copyright 2008 Rob Kendrick <rjek@netsurf-browser.org>
+# Copyright 2024 Vincent Sanders <vince@netsurf-browser.org>
#
# Trivially, invoke as:
# make
@@ -39,13 +40,6 @@ MESSAGES_LANGUAGES=de en fr it nl zh_CN
# The target directory for the split messages
MESSAGES_TARGET=resources
-# Defaults for tools
-PERL=perl
-MKDIR=mkdir
-TOUCH=touch
-STRIP?=strip
-INSTALL?=install
-
# build verbosity
ifeq ($(V),1)
Q:=
@@ -54,31 +48,11 @@ else
endif
VQ=@
-# Override this only if the host compiler is called something different
-BUILD_CC := cc
-BUILD_CFLAGS = -g -W -Wall -Wundef -Wpointer-arith -Wcast-align \
- -Wwrite-strings -Wmissing-declarations -Wuninitialized \
- -Wno-unused-parameter
-
# compute HOST, TARGET and SUBTARGET
include frontends/Makefile.hts
-# target specific tool overrides
-include frontends/$(TARGET)/Makefile.tools
-
-# compiler versioning to adjust warning flags
-CC_VERSION := $(shell $(CC) -dumpfullversion -dumpversion)
-CC_MAJOR := $(word 1,$(subst ., ,$(CC_VERSION)))
-CC_MINOR := $(word 2,$(subst ., ,$(CC_VERSION)))
-define cc_ver_ge
-$(shell expr $(CC_MAJOR) \> $(1) \| \( $(CC_MAJOR) = $(1) \& $(CC_MINOR) \>= $(2) \) )
-endef
-
-# CCACHE
-ifeq ($(origin CCACHE),undefined)
- CCACHE=$(word 1,$(shell ccache -V 2>/dev/null))
-endif
-CC := $(CCACHE) $(CC)
+# tools used in builds
+include Makefile.tools
# Target paths
OBJROOT = build/$(HOST)-$(TARGET)$(SUBTARGET)
@@ -96,6 +70,11 @@ include Makefile.macros
# General flag setup
# ----------------------------------------------------------------------------
+# host compiler flags
+BUILD_CFLAGS = -g -W -Wall -Wundef -Wpointer-arith -Wcast-align \
+ -Wwrite-strings -Wmissing-declarations -Wuninitialized \
+ -Wno-unused-parameter
+
# Set up the warning flags here so that they can be overridden in the
# Makefile.config
COMMON_WARNFLAGS = -W -Wall -Wundef -Wpointer-arith -Wcast-align \
@@ -110,9 +89,14 @@ ifeq ($(call cc_ver_ge,4,6),1)
COMMON_WARNFLAGS += -Wno-unused-but-set-variable
endif
-# Implicit fallthrough warnings suppressed by comment
-ifeq ($(call cc_ver_ge,7,1),1)
- COMMON_WARNFLAGS += -Wimplicit-fallthrough=3
+ifeq ($(TOOLCHAIN),gcc)
+ # Implicit fallthrough warnings
+ ifeq ($(call cc_ver_ge,7,1),1)
+ COMMON_WARNFLAGS += -Wimplicit-fallthrough=5
+ endif
+else
+ # non gcc has different warning syntax
+ COMMON_WARNFLAGS += -Wimplicit-fallthrough
endif
# deal with chaging warning flags for different platforms
@@ -171,6 +155,7 @@ endif
$(eval $(call pkg_config_find_and_add_enabled,OPENSSL,openssl,OpenSSL))
$(eval $(call pkg_config_find_and_add_enabled,UTF8PROC,libutf8proc,utf8))
+$(eval $(call pkg_config_find_and_add_enabled,JPEGXL,libjxl,JPEGXL))
$(eval $(call pkg_config_find_and_add_enabled,WEBP,libwebp,WEBP))
$(eval $(call pkg_config_find_and_add_enabled,PNG,libpng,PNG))
$(eval $(call pkg_config_find_and_add_enabled,BMP,libnsbmp,BMP))
@@ -333,7 +318,7 @@ ifneq ($(TARGET),riscos)
$(Q)$(CC) -o $(EXETARGET) $(OBJECTS) $(LDFLAGS) > $(DEPROOT)/link-raw.d
else
@# RISC OS targets are a bit special: we need to convert ELF -> AIF
- ifeq ($(SUBTARGET),riscos-aof)
+ ifeq ($(SUBTARGET),-aof)
$(Q)$(CC) -o $(EXETARGET) $(OBJECTS) $(LDFLAGS) > $(DEPROOT)/link-raw.d
else
$(Q)$(CXX) -o $(EXETARGET:,ff8=,e1f) $(OBJECTS) $(LDFLAGS) > $(DEPROOT)/link-raw.d
diff --git a/Makefile.defaults b/Makefile.defaults
index 85be74802..bbff68814 100644
--- a/Makefile.defaults
+++ b/Makefile.defaults
@@ -51,6 +51,10 @@ NETSURF_USE_GIF := AUTO
# Valid options: YES, NO (highly recommended)
NETSURF_USE_JPEG := YES
+# Enable NetSurf's use of libjxl for displaying JPEGXLs
+# Valid options: YES, NO, AUTO (highly recommended)
+NETSURF_USE_JPEGXL := AUTO
+
# Enable NetSurf's use of libpng for displaying PNGs.
# Valid options: YES, NO, AUTO (highly recommended)
NETSURF_USE_PNG := AUTO
diff --git a/Makefile.tools b/Makefile.tools
new file mode 100644
index 000000000..3226d13b0
--- /dev/null
+++ b/Makefile.tools
@@ -0,0 +1,118 @@
+# -*- mode: makefile-gmake -*-
+##
+## Setup tools to build project including compiler
+##
+
+# Expected inputs:
+#
+# HOST
+# TARGET
+# SUBTARGET
+#
+# output:
+# variables:
+# CC
+# BUILD_CC
+# CCACHE
+# TOOLCHAIN
+# PERL
+# MKDIR
+# TOUCH
+# STRIP
+# INSTALL
+# CC_VERSION
+# CC_MAJOR
+# CC_MINOR
+#
+# macros:
+# cc_ver_ge
+
+# Defaults for tools
+PERL=perl
+MKDIR=mkdir
+TOUCH=touch
+STRIP?=strip
+INSTALL?=install
+# Override this only if the host compiler is called something different
+BUILD_CC := cc
+
+# target specific tool overrides
+include frontends/$(TARGET)/Makefile.tools
+
+# CCACHE
+ifeq ($(origin CCACHE),undefined)
+ CCACHE=$(word 1,$(shell ccache -V 2>/dev/null))
+endif
+CC := $(CCACHE) $(CC)
+
+###############################################################################
+# Auto-detect the toolchain
+###############################################################################
+
+# Check for GCC first, as that's most likely
+# TODO: Using shell redirection like this probably hurts portability
+CC_SPECS := $(shell $(CC) -dumpspecs 2>&1)
+ifeq ($(findstring libgcc,$(CC_SPECS)),libgcc)
+ # Looks like GCC
+ TOOLCHAIN := gcc
+else
+ # Not GCC, so enquire further
+ ccvsn := $(shell $(CC) --version 2>&1)
+ ifeq ($(ccvsn),)
+ # Version string is blank
+ ifeq ($(BUILD),arm-unknown-riscos)
+ # For some reason we never see the output of SCL apps, so might be
+ # Norcroft. However it might also be a GCC linked against a buggy
+ # UnixLib.
+ # TODO: Something more useful than blindly assuming GCC.
+ ccvsn := GCC
+ # ccvsn := Norcroft
+ endif
+ endif
+
+ ifeq ($(findstring lcc:,$(ccvsn)),lcc:)
+ # MCST LCC pretends to be gcc
+ TOOLCHAIN := gcc
+ endif
+
+ # "Norcroft ..."
+ ifeq ($(word 1,$(ccvsn)),Norcroft)
+ TOOLCHAIN := norcroft
+ endif
+ # "GCC ..."
+ ifeq ($(word 1,$(ccvsn)),GCC)
+ TOOLCHAIN := gcc
+ endif
+ # "clang ..."
+ ifeq ($(word 1,$(ccvsn)),clang)
+ TOOLCHAIN := clang
+ endif
+ ifeq ($(word 2,$(ccvsn)),clang)
+ # Some newer clangs have distributor as first word
+ # (ie, Debian, Apple, etc)
+ TOOLCHAIN := clang
+ endif
+ ifeq ($(word 2,$(ccvsn)),LLVM)
+ # Apple version is "Apple LLVM" to be differntly awkward
+ TOOLCHAIN := clang
+ endif
+ ifeq ($(word 1,$(ccvsn)),Open64)
+ TOOLCHAIN := open64
+ endif
+endif
+
+ifeq ($(TOOLCHAIN),)
+ $(error Unable to detect toolchain)
+endif
+
+
+###############################################################################
+# Compiler Versioning (to adjust warning flags)
+###############################################################################
+
+CC_VERSION := $(shell $(CC) -dumpfullversion -dumpversion)
+CC_MAJOR := $(word 1,$(subst ., ,$(CC_VERSION)))
+CC_MINOR := $(word 2,$(subst ., ,$(CC_VERSION)))
+define cc_ver_ge
+$(shell expr $(CC_MAJOR) \> $(1) \| \( $(CC_MAJOR) = $(1) \& $(CC_MINOR) \>= $(2) \) )
+endef
diff --git a/content/fetch.h b/content/fetch.h
index 843fec96e..e7180d0c3 100644
--- a/content/fetch.h
+++ b/content/fetch.h
@@ -94,6 +94,16 @@ typedef struct fetch_msg {
} fetch_msg;
/**
+ * Fetcher post data types
+ */
+typedef enum {
+ FETCH_POSTDATA_NONE,
+ FETCH_POSTDATA_URLENC,
+ FETCH_POSTDATA_MULTIPART,
+} fetch_postdata_type;
+
+
+/**
* Fetch POST multipart data
*/
struct fetch_multipart_data {
@@ -106,6 +116,20 @@ struct fetch_multipart_data {
bool file; /**< Item is a file */
};
+/**
+ * fetch POST data
+ */
+struct fetch_postdata {
+ fetch_postdata_type type;
+ union {
+ /** Url encoded POST string if type is FETCH_POSTDATA_URLENC */
+ char *urlenc;
+ /** Multipart post data if type is FETCH_POSTDATA_MULTIPART */
+ struct fetch_multipart_data *multipart;
+ } data;
+};
+
+
typedef void (*fetch_callback)(const fetch_msg *msg, void *p);
/**
diff --git a/content/fetchers/about/certificate.c b/content/fetchers/about/certificate.c
index 554f06eb8..6f634d22a 100644
--- a/content/fetchers/about/certificate.c
+++ b/content/fetchers/about/certificate.c
@@ -134,26 +134,29 @@ static nserror free_ns_cert_info(struct ns_cert_info *cinfo)
#include <openssl/ssl.h>
#include <openssl/x509v3.h>
-/* OpenSSL 1.0.x, 1.0.2, 1.1.0 and 1.1.1 API all changed
- * LibreSSL declares its OpenSSL version as 2.1 but only supports 1.0.x API
- */
-#if (defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x1010000fL))
-/* 1.0.x */
+#if (OPENSSL_VERSION_NUMBER < 0x30000000L)
+/* OpenSSL 1.1.1 or LibreSSL */
+
+# if defined(LIBRESSL_VERSION_NUMBER)
+ /* LibreSSL */
+# if (LIBRESSL_VERSION_NUMBER < 0x3050000fL)
+ /* LibreSSL <3.5.0 */
-#if (defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x1000200fL))
-/* pre 1.0.2 */
+# if (LIBRESSL_VERSION_NUMBER < 0x2070000fL)
+ /* LibreSSL <2.7.0 */
static int ns_X509_get_signature_nid(X509 *cert)
{
return OBJ_obj2nid(cert->cert_info->key->algor->algorithm);
}
-#else
-#define ns_X509_get_signature_nid X509_get_signature_nid
-#endif
static const unsigned char *ns_ASN1_STRING_get0_data(ASN1_STRING *asn1str)
{
return (const unsigned char *)ASN1_STRING_data(asn1str);
}
+# else
+# define ns_X509_get_signature_nid X509_get_signature_nid
+# define ns_ASN1_STRING_get0_data ASN1_STRING_get0_data
+# endif
static const BIGNUM *ns_RSA_get0_n(const RSA *d)
{
@@ -164,298 +167,20 @@ static const BIGNUM *ns_RSA_get0_e(const RSA *d)
{
return d->e;
}
-
-static int ns_EVP_PKEY_get_bn_param(const EVP_PKEY *pkey,
- const char *key_name, BIGNUM **bn) {
- RSA *rsa;
- BIGNUM *result = NULL;
-
- /* Check parameters: only support allocation-form *bn */
- if (pkey == NULL || key_name == NULL || bn == NULL || *bn != NULL)
- return 0;
-
- /* Only support RSA keys */
- if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA)
- return 0;
-
- rsa = EVP_PKEY_get1_RSA((EVP_PKEY *) pkey);
- if (rsa == NULL)
- return 0;
-
- if (strcmp(key_name, "n") == 0) {
- const BIGNUM *n = ns_RSA_get0_n(rsa);
- if (n != NULL)
- result = BN_dup(n);
- } else if (strcmp(key_name, "e") == 0) {
- const BIGNUM *e = ns_RSA_get0_e(rsa);
- if (e != NULL)
- result = BN_dup(e);
- }
-
- RSA_free(rsa);
-
- *bn = result;
-
- return (result != NULL) ? 1 : 0;
-}
-
-static int ns_EVP_PKEY_get_utf8_string_param(const EVP_PKEY *pkey,
- const char *key_name, char *str, size_t max_len,
- size_t *out_len)
-{
- const EC_GROUP *ecgroup;
- const char *group;
- EC_KEY *ec;
- int ret = 0;
-
- if (pkey == NULL || key_name == NULL)
- return 0;
-
- /* Only support EC keys */
- if (EVP_PKEY_base_id(pkey) != EVP_PKEY_EC)
- return 0;
-
- /* Only support fetching the group */
- if (strcmp(key_name, "group") != 0)
- return 0;
-
- ec = EVP_PKEY_get1_EC_KEY((EVP_PKEY *) pkey);
-
- ecgroup = EC_KEY_get0_group(ec);
- if (ecgroup == NULL) {
- group = "";
- } else {
- group = OBJ_nid2ln(EC_GROUP_get_curve_name(ecgroup));
- }
-
- if (str != NULL && max_len > strlen(group)) {
- strcpy(str, group);
- str[strlen(group)] = '\0';
- ret = 1;
- }
- if (out_len != NULL)
- *out_len = strlen(group);
-
- EC_KEY_free(ec);
-
- return ret;
-}
-
-static int ns_EVP_PKEY_get_octet_string_param(const EVP_PKEY *pkey,
- const char *key_name, unsigned char *buf, size_t max_len,
- size_t *out_len)
-{
- const EC_GROUP *ecgroup;
- const EC_POINT *ecpoint;
- size_t len;
- BN_CTX *bnctx;
- EC_KEY *ec;
- int ret = 0;
-
- if (pkey == NULL || key_name == NULL)
- return 0;
-
- /* Only support EC keys */
- if (EVP_PKEY_base_id(pkey) != EVP_PKEY_EC)
- return 0;
-
- if (strcmp(key_name, "encoded-pub-key") != 0)
- return 0;
-
- ec = EVP_PKEY_get1_EC_KEY((EVP_PKEY *) pkey);
- if (ec == NULL)
- return 0;
-
- ecgroup = EC_KEY_get0_group(ec);
- if (ecgroup != NULL) {
- ecpoint = EC_KEY_get0_public_key(ec);
- if (ecpoint != NULL) {
- bnctx = BN_CTX_new();
- len = EC_POINT_point2oct(ecgroup,
- ecpoint,
- POINT_CONVERSION_UNCOMPRESSED,
- NULL,
- 0,
- bnctx);
- if (len != 0 && len <= max_len) {
- if (EC_POINT_point2oct(ecgroup,
- ecpoint,
- POINT_CONVERSION_UNCOMPRESSED,
- buf,
- len,
- bnctx) == len)
- ret = 1;
- }
- if (out_len != NULL)
- *out_len = len;
- BN_CTX_free(bnctx);
- }
- }
-
- EC_KEY_free(ec);
-
- return ret;
-}
-#elif (OPENSSL_VERSION_NUMBER < 0x1010100fL)
-/* 1.1.0 */
-#define ns_X509_get_signature_nid X509_get_signature_nid
-#define ns_ASN1_STRING_get0_data ASN1_STRING_get0_data
-
-static const BIGNUM *ns_RSA_get0_n(const RSA *r)
-{
- const BIGNUM *n;
- const BIGNUM *e;
- const BIGNUM *d;
- RSA_get0_key(r, &n, &e, &d);
- return n;
-}
-
-static const BIGNUM *ns_RSA_get0_e(const RSA *r)
-{
- const BIGNUM *n;
- const BIGNUM *e;
- const BIGNUM *d;
- RSA_get0_key(r, &n, &e, &d);
- return e;
-}
-
-static int ns_EVP_PKEY_get_bn_param(const EVP_PKEY *pkey,
- const char *key_name, BIGNUM **bn) {
- RSA *rsa;
- BIGNUM *result = NULL;
-
- /* Check parameters: only support allocation-form *bn */
- if (pkey == NULL || key_name == NULL || bn == NULL || *bn != NULL)
- return 0;
-
- /* Only support RSA keys */
- if (EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA)
- return 0;
-
- rsa = EVP_PKEY_get1_RSA((EVP_PKEY *) pkey);
- if (rsa == NULL)
- return 0;
-
- if (strcmp(key_name, "n") == 0) {
- const BIGNUM *n = ns_RSA_get0_n(rsa);
- if (n != NULL)
- result = BN_dup(n);
- } else if (strcmp(key_name, "e") == 0) {
- const BIGNUM *e = ns_RSA_get0_e(rsa);
- if (e != NULL)
- result = BN_dup(e);
- }
-
- RSA_free(rsa);
-
- *bn = result;
-
- return (result != NULL) ? 1 : 0;
-}
-
-static int ns_EVP_PKEY_get_utf8_string_param(const EVP_PKEY *pkey,
- const char *key_name, char *str, size_t max_len,
- size_t *out_len)
-{
- const EC_GROUP *ecgroup;
- const char *group;
- EC_KEY *ec;
- int ret = 0;
-
- if (pkey == NULL || key_name == NULL)
- return 0;
-
- /* Only support EC keys */
- if (EVP_PKEY_base_id(pkey) != EVP_PKEY_EC)
- return 0;
-
- /* Only support fetching the group */
- if (strcmp(key_name, "group") != 0)
- return 0;
-
- ec = EVP_PKEY_get1_EC_KEY((EVP_PKEY *) pkey);
-
- ecgroup = EC_KEY_get0_group(ec);
- if (ecgroup == NULL) {
- group = "";
- } else {
- group = OBJ_nid2ln(EC_GROUP_get_curve_name(ecgroup));
- }
-
- if (str != NULL && max_len > strlen(group)) {
- strcpy(str, group);
- str[strlen(group)] = '\0';
- ret = 1;
- }
- if (out_len != NULL)
- *out_len = strlen(group);
-
- EC_KEY_free(ec);
-
- return ret;
-}
-
-static int ns_EVP_PKEY_get_octet_string_param(const EVP_PKEY *pkey,
- const char *key_name, unsigned char *buf, size_t max_len,
- size_t *out_len)
-{
- const EC_GROUP *ecgroup;
- const EC_POINT *ecpoint;
- size_t len;
- BN_CTX *bnctx;
- EC_KEY *ec;
- int ret = 0;
-
- if (pkey == NULL || key_name == NULL)
- return 0;
-
- /* Only support EC keys */
- if (EVP_PKEY_base_id(pkey) != EVP_PKEY_EC)
- return 0;
-
- if (strcmp(key_name, "encoded-pub-key") != 0)
- return 0;
-
- ec = EVP_PKEY_get1_EC_KEY((EVP_PKEY *) pkey);
- if (ec == NULL)
- return 0;
-
- ecgroup = EC_KEY_get0_group(ec);
- if (ecgroup != NULL) {
- ecpoint = EC_KEY_get0_public_key(ec);
- if (ecpoint != NULL) {
- bnctx = BN_CTX_new();
- len = EC_POINT_point2oct(ecgroup,
- ecpoint,
- POINT_CONVERSION_UNCOMPRESSED,
- NULL,
- 0,
- bnctx);
- if (len != 0 && len <= max_len) {
- if (EC_POINT_point2oct(ecgroup,
- ecpoint,
- POINT_CONVERSION_UNCOMPRESSED,
- buf,
- len,
- bnctx) == len)
- ret = 1;
- }
- if (out_len != NULL)
- *out_len = len;
- BN_CTX_free(bnctx);
- }
- }
-
- EC_KEY_free(ec);
-
- return ret;
-}
-#elif (OPENSSL_VERSION_NUMBER < 0x30000000L)
-/* 1.1.1 */
-#define ns_X509_get_signature_nid X509_get_signature_nid
-#define ns_ASN1_STRING_get0_data ASN1_STRING_get0_data
-#define ns_RSA_get0_n RSA_get0_n
-#define ns_RSA_get0_e RSA_get0_e
+# else
+ /* LibreSSL >= 3.5.0 */
+# define ns_X509_get_signature_nid X509_get_signature_nid
+# define ns_ASN1_STRING_get0_data ASN1_STRING_get0_data
+# define ns_RSA_get0_n RSA_get0_n
+# define ns_RSA_get0_e RSA_get0_e
+# endif
+# else
+ /* OpenSSL 1.1.1 */
+# define ns_X509_get_signature_nid X509_get_signature_nid
+# define ns_ASN1_STRING_get0_data ASN1_STRING_get0_data
+# define ns_RSA_get0_n RSA_get0_n
+# define ns_RSA_get0_e RSA_get0_e
+# endif
static int ns_EVP_PKEY_get_bn_param(const EVP_PKEY *pkey,
const char *key_name, BIGNUM **bn) {
@@ -589,7 +314,7 @@ static int ns_EVP_PKEY_get_octet_string_param(const EVP_PKEY *pkey,
return ret;
}
#else
-/* 3.x and later */
+/* OpenSSL 3.x and later */
#define ns_X509_get_signature_nid X509_get_signature_nid
#define ns_ASN1_STRING_get0_data ASN1_STRING_get0_data
#define ns_RSA_get0_n RSA_get0_n
diff --git a/content/fetchers/curl.c b/content/fetchers/curl.c
index d36f44c09..680e60456 100644
--- a/content/fetchers/curl.c
+++ b/content/fetchers/curl.c
@@ -67,21 +67,38 @@
#define UPDATES_PER_SECOND 2
/**
- * The ciphersuites the browser is prepared to use
+ * The ciphersuites the browser is prepared to use for TLS1.3
+ */
+#define CIPHER_SUITES \
+ "TLS_AES_256_GCM_SHA384:" \
+ "TLS_CHACHA20_POLY1305_SHA256:" \
+ "TLS_AES_128_GCM_SHA256"
+
+/**
+ * The ciphersuites the browser is prepared to use for TLS<1.3
*/
#define CIPHER_LIST \
/* disable everything */ \
"-ALL:" \
- /* enable TLSv1.2 PFS suites */ \
- "EECDH+AES+TLSv1.2:EDH+AES+TLSv1.2:" \
- /* enable PFS AES GCM suites */ \
- "EECDH+AESGCM:EDH+AESGCM:" \
- /* Enable PFS AES CBC suites */ \
- "EECDH+AES:EDH+AES:" \
- /* Enable non-PFS fallback suite */ \
- "AES128-SHA:" \
- /* Remove any PFS suites using weak DSA key exchange */ \
- "-DSS"
+ /* enable TLSv1.2 ECDHE AES GCM suites */ \
+ "EECDH+AESGCM+TLSv1.2:" \
+ /* enable ECDHE CHACHA20/POLY1305 suites */ \
+ "EECDH+CHACHA20:" \
+ /* Sort above by strength */ \
+ "@STRENGTH:" \
+ /* enable ECDHE (auth=RSA, mac=SHA1) AES CBC suites */ \
+ "EECDH+aRSA+AES+SHA1"
+
+/**
+ * The legacy cipher suites the browser is prepared to use for TLS<1.3
+ */
+#define CIPHER_LIST_LEGACY \
+ /* as above */ \
+ CIPHER_LIST":" \
+ /* enable (non-PFS) RSA AES GCM suites */ \
+ "RSA+AESGCM:" \
+ /* enable (non-PFS) RSA (mac=SHA1) AES CBC suites */ \
+ "RSA+AES+SHA1"
/* Open SSL compatability for certificate handling */
#ifdef WITH_OPENSSL
@@ -89,33 +106,11 @@
#include <openssl/ssl.h>
#include <openssl/x509v3.h>
-/* OpenSSL 1.0.x to 1.1.0 certificate reference counting changed
- * LibreSSL declares its OpenSSL version as 2.1 but only supports the old way
- */
-#if (defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x1010000fL))
-static int ns_X509_up_ref(X509 *cert)
-{
- cert->references++;
- return 1;
-}
-
-static void ns_X509_free(X509 *cert)
-{
- cert->references--;
- if (cert->references == 0) {
- X509_free(cert);
- }
-}
-#else
-#define ns_X509_up_ref X509_up_ref
-#define ns_X509_free X509_free
-#endif
-
#else /* WITH_OPENSSL */
typedef char X509;
-static void ns_X509_free(X509 *cert)
+static void X509_free(X509 *cert)
{
free(cert);
}
@@ -216,6 +211,26 @@ struct cert_info {
long err; /**< OpenSSL error code */
};
+#if LIBCURL_VERSION_NUM >= 0x072000 /* 7.32.0 depricated CURLOPT_PROGRESSFUNCTION*/
+#define NSCURLOPT_PROGRESS_FUNCTION CURLOPT_XFERINFOFUNCTION
+#define NSCURLOPT_PROGRESS_DATA CURLOPT_XFERINFODATA
+#define NSCURL_PROGRESS_T curl_off_t
+#else
+#define NSCURLOPT_PROGRESS_FUNCTION CURLOPT_PROGRESSFUNCTION
+#define NSCURLOPT_PROGRESS_DATA CURLOPT_PROGRESSDATA
+#define NSCURL_PROGRESS_T double
+#endif
+
+#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 depricated curl_formadd */
+#define NSCURL_POSTDATA_T curl_mime
+#define NSCURL_POSTDATA_CURLOPT CURLOPT_MIMEPOST
+#define NSCURL_POSTDATA_FREE(x) curl_mime_free(x)
+#else
+#define NSCURL_POSTDATA_T struct curl_httppost
+#define NSCURL_POSTDATA_CURLOPT CURLOPT_HTTPPOST
+#define NSCURL_POSTDATA_FREE(x) curl_formfree(x)
+#endif
+
/** Information for a single fetch. */
struct curl_fetch_info {
struct fetch *fetch_handle; /**< The fetch handle we're parented by. */
@@ -225,7 +240,7 @@ struct curl_fetch_info {
bool abort; /**< Abort requested. */
bool stopped; /**< Download stopped on purpose. */
bool only_2xx; /**< Only HTTP 2xx responses acceptable. */
- bool downgrade_tls; /**< Downgrade to TLS <= 1.0 */
+ bool downgrade_tls; /**< Downgrade to TLS 1.2 */
nsurl *url; /**< URL of this fetch. */
lwc_string *host; /**< The hostname of this fetch. */
struct curl_slist *headers; /**< List of request headers. */
@@ -233,9 +248,11 @@ struct curl_fetch_info {
unsigned long content_length; /**< Response Content-Length, or 0. */
char *cookie_string; /**< Cookie string for this fetch */
char *realm; /**< HTTP Auth Realm */
- char *post_urlenc; /**< Url encoded POST string, or 0. */
+ struct fetch_postdata *postdata; /**< POST data */
+ NSCURL_POSTDATA_T *curl_postdata; /**< POST data in curl representation */
+
long http_code; /**< HTTP result code from cURL. */
- struct curl_httppost *post_multipart; /**< Multipart post data, or 0. */
+
uint64_t last_progress_update; /**< Time of last progress update */
int cert_depth; /**< deepest certificate in use */
struct cert_info cert_data[MAX_CERT_DEPTH]; /**< HTTPS certificate data */
@@ -342,85 +359,95 @@ static bool fetch_curl_can_fetch(const nsurl *url)
}
+
/**
- * Convert a list of struct ::fetch_multipart_data to a list of
- * struct curl_httppost for libcurl.
+ * allocate postdata
*/
-static struct curl_httppost *
-fetch_curl_post_convert(const struct fetch_multipart_data *control)
+static struct fetch_postdata *
+fetch_curl_alloc_postdata(const char *post_urlenc,
+ const struct fetch_multipart_data *post_multipart)
{
- struct curl_httppost *post = 0, *last = 0;
- CURLFORMcode code;
- nserror ret;
-
- for (; control; control = control->next) {
- if (control->file) {
- char *leafname = NULL;
- ret = guit->file->basename(control->value, &leafname, NULL);
- if (ret != NSERROR_OK) {
- continue;
+ struct fetch_postdata *postdata;
+ postdata = calloc(1, sizeof(struct fetch_postdata));
+ if (postdata != NULL) {
+
+ if (post_urlenc) {
+ postdata->type = FETCH_POSTDATA_URLENC;
+ postdata->data.urlenc = strdup(post_urlenc);
+ if (postdata->data.urlenc == NULL) {
+ free(postdata);
+ postdata = NULL;
}
-
- /* We have to special case filenames of "", so curl
- * a) actually attempts the fetch and
- * b) doesn't attempt to open the file ""
- */
- if (control->value[0] == '\0') {
- /* dummy buffer - needs to be static so
- * pointer's still valid when we go out
- * of scope (not that libcurl should be
- * attempting to access it, of course).
- */
- static char buf;
-
- code = curl_formadd(&post, &last,
- CURLFORM_COPYNAME, control->name,
- CURLFORM_BUFFER, control->value,
- /* needed, as basename("") == "." */
- CURLFORM_FILENAME, "",
- CURLFORM_BUFFERPTR, &buf,
- CURLFORM_BUFFERLENGTH, 0,
- CURLFORM_CONTENTTYPE,
- "application/octet-stream",
- CURLFORM_END);
- if (code != CURL_FORMADD_OK)
- NSLOG(netsurf, INFO,
- "curl_formadd: %d (%s)", code,
- control->name);
- } else {
- char *mimetype = guit->fetch->mimetype(control->value);
- code = curl_formadd(&post, &last,
- CURLFORM_COPYNAME, control->name,
- CURLFORM_FILE, control->rawfile,
- CURLFORM_FILENAME, leafname,
- CURLFORM_CONTENTTYPE,
- (mimetype != 0 ? mimetype : "text/plain"),
- CURLFORM_END);
- if (code != CURL_FORMADD_OK)
- NSLOG(netsurf, INFO,
- "curl_formadd: %d (%s=%s)",
- code,
- control->name,
- control->value);
- free(mimetype);
+ } else if (post_multipart) {
+ postdata->type = FETCH_POSTDATA_MULTIPART;
+ postdata->data.multipart = fetch_multipart_data_clone(post_multipart);
+ if (postdata->data.multipart == NULL) {
+ free(postdata);
+ postdata = NULL;
}
- free(leafname);
- }
- else {
- code = curl_formadd(&post, &last,
- CURLFORM_COPYNAME, control->name,
- CURLFORM_COPYCONTENTS, control->value,
- CURLFORM_END);
- if (code != CURL_FORMADD_OK)
- NSLOG(netsurf, INFO,
- "curl_formadd: %d (%s=%s)", code,
- control->name, control->value);
+ } else {
+ postdata->type = FETCH_POSTDATA_NONE;
}
}
+ return postdata;
+}
- return post;
+/**
+ * free postdata
+ */
+static void fetch_curl_free_postdata(struct fetch_postdata *postdata)
+{
+ if (postdata != NULL) {
+ switch (postdata->type) {
+ case FETCH_POSTDATA_NONE:
+ break;
+ case FETCH_POSTDATA_URLENC:
+ free(postdata->data.urlenc);
+ break;
+ case FETCH_POSTDATA_MULTIPART:
+ fetch_multipart_data_destroy(postdata->data.multipart);
+ break;
+ }
+
+ free(postdata);
+ }
}
+/**
+ *construct a new fetch structure
+ */
+static struct curl_fetch_info *fetch_alloc(void)
+{
+ struct curl_fetch_info *fetch;
+ fetch = malloc(sizeof (*fetch));
+ if (fetch == NULL)
+ return NULL;
+
+ fetch->curl_handle = NULL;
+ fetch->sent_ssl_chain = false;
+ fetch->had_headers = false;
+ fetch->abort = false;
+ fetch->stopped = false;
+ fetch->only_2xx = false;
+ fetch->downgrade_tls = false;
+ fetch->headers = NULL;
+ fetch->url = NULL;
+ fetch->host = NULL;
+ fetch->location = NULL;
+ fetch->content_length = 0;
+ fetch->http_code = 0;
+ fetch->cookie_string = NULL;
+ fetch->realm = NULL;
+ fetch->last_progress_update = 0;
+ fetch->postdata = NULL;
+ fetch->curl_postdata = NULL;
+
+ /* Clear certificate chain data */
+ memset(fetch->cert_data, 0, sizeof(fetch->cert_data));
+ fetch->cert_depth = -1;
+
+ return fetch;
+}
/**
* Start fetching data for the given URL.
@@ -456,46 +483,22 @@ fetch_curl_setup(struct fetch *parent_fetch,
struct curl_slist *slist;
int i;
- fetch = malloc(sizeof (*fetch));
+ fetch = fetch_alloc();
if (fetch == NULL)
- return 0;
-
- fetch->fetch_handle = parent_fetch;
+ return NULL;
NSLOG(netsurf, INFO, "fetch %p, url '%s'", fetch, nsurl_access(url));
- /* construct a new fetch structure */
- fetch->curl_handle = NULL;
- fetch->sent_ssl_chain = false;
- fetch->had_headers = false;
- fetch->abort = false;
- fetch->stopped = false;
fetch->only_2xx = only_2xx;
fetch->downgrade_tls = downgrade_tls;
- fetch->headers = NULL;
+ fetch->fetch_handle = parent_fetch;
fetch->url = nsurl_ref(url);
fetch->host = nsurl_get_component(url, NSURL_HOST);
- fetch->location = NULL;
- fetch->content_length = 0;
- fetch->http_code = 0;
- fetch->cookie_string = NULL;
- fetch->realm = NULL;
- fetch->post_urlenc = NULL;
- fetch->post_multipart = NULL;
- if (post_urlenc) {
- fetch->post_urlenc = strdup(post_urlenc);
- } else if (post_multipart) {
- fetch->post_multipart = fetch_curl_post_convert(post_multipart);
+ if (fetch->host == NULL) {
+ goto failed;
}
- fetch->last_progress_update = 0;
-
- /* Clear certificate chain data */
- memset(fetch->cert_data, 0, sizeof(fetch->cert_data));
- fetch->cert_depth = -1;
-
- if ((fetch->host == NULL) ||
- (post_multipart != NULL && fetch->post_multipart == NULL) ||
- (post_urlenc != NULL && fetch->post_urlenc == NULL)) {
+ fetch->postdata = fetch_curl_alloc_postdata(post_urlenc, post_multipart);
+ if (fetch->postdata == NULL) {
goto failed;
}
@@ -548,9 +551,7 @@ failed:
lwc_string_unref(fetch->host);
nsurl_unref(fetch->url);
- free(fetch->post_urlenc);
- if (fetch->post_multipart)
- curl_formfree(fetch->post_multipart);
+ fetch_curl_free_postdata(fetch->postdata);
curl_slist_free_all(fetch->headers);
free(fetch);
return NULL;
@@ -730,7 +731,7 @@ fetch_curl_verify_callback(int verify_ok, X509_STORE_CTX *x509_ctx)
*/
if (!fetch->cert_data[depth].cert) {
fetch->cert_data[depth].cert = X509_STORE_CTX_get_current_cert(x509_ctx);
- ns_X509_up_ref(fetch->cert_data[depth].cert);
+ X509_up_ref(fetch->cert_data[depth].cert);
fetch->cert_data[depth].err = X509_STORE_CTX_get_error(x509_ctx);
}
@@ -805,7 +806,8 @@ fetch_curl_sslctxfun(CURL *curl_handle, void *_sslctx, void *parm)
{
struct curl_fetch_info *f = (struct curl_fetch_info *) parm;
SSL_CTX *sslctx = _sslctx;
- long options = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
+ long options = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
+ SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1;
/* set verify callback for each certificate in chain */
SSL_CTX_set_verify(sslctx, SSL_VERIFY_PEER, fetch_curl_verify_callback);
@@ -816,19 +818,14 @@ fetch_curl_sslctxfun(CURL *curl_handle, void *_sslctx, void *parm)
parm);
if (f->downgrade_tls) {
- /* Disable TLS 1.1/1.2 if the server can't cope with them */
-#ifdef SSL_OP_NO_TLSv1_1
- options |= SSL_OP_NO_TLSv1_1;
-#endif
-#ifdef SSL_OP_NO_TLSv1_2
- options |= SSL_OP_NO_TLSv1_2;
+ /* Disable TLS 1.3 if the server can't cope with it */
+#ifdef SSL_OP_NO_TLSv1_3
+ options |= SSL_OP_NO_TLSv1_3;
#endif
#ifdef SSL_MODE_SEND_FALLBACK_SCSV
/* Ensure server rejects the connection if downgraded too far */
SSL_CTX_set_mode(sslctx, SSL_MODE_SEND_FALLBACK_SCSV);
#endif
- /* Disable TLS1.2 ciphersuites */
- SSL_CTX_set_cipher_list(sslctx, CIPHER_LIST ":-TLSv1.2");
}
SSL_CTX_set_options(sslctx, options);
@@ -865,6 +862,301 @@ fetch_curl_report_certs_upstream(struct curl_fetch_info *f)
f->sent_ssl_chain = true;
}
+#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 depricated curl_formadd */
+
+/**
+ * curl mime data context
+ */
+struct curl_mime_ctx {
+ char *buffer;
+ curl_off_t size;
+ curl_off_t position;
+};
+
+static size_t mime_data_read_callback(char *buffer, size_t size, size_t nitems, void *arg)
+{
+ struct curl_mime_ctx *mctx = (struct curl_mime_ctx *) arg;
+ curl_off_t sz = mctx->size - mctx->position;
+
+ nitems *= size;
+ if(sz > (curl_off_t)nitems) {
+ sz = nitems;
+ }
+ if(sz) {
+ memcpy(buffer, mctx->buffer + mctx->position, sz);
+ }
+ mctx->position += sz;
+ return sz;
+}
+
+static int mime_data_seek_callback(void *arg, curl_off_t offset, int origin)
+{
+ struct curl_mime_ctx *mctx = (struct curl_mime_ctx *) arg;
+
+ switch(origin) {
+ case SEEK_END:
+ offset += mctx->size;
+ break;
+ case SEEK_CUR:
+ offset += mctx->position;
+ break;
+ }
+
+ if(offset < 0) {
+ return CURL_SEEKFUNC_FAIL;
+ }
+ mctx->position = offset;
+ return CURL_SEEKFUNC_OK;
+}
+
+static void mime_data_free_callback(void *arg)
+{
+ struct curl_mime_ctx *mctx = (struct curl_mime_ctx *) arg;
+ free(mctx);
+}
+
+/**
+ * Convert a POST data list to a libcurl curl_mime.
+ *
+ * \param chandle curl fetch handle.
+ * \param multipart limked list of struct ::fetch_multipart forming post data.
+ */
+static curl_mime *
+fetch_curl_postdata_convert(CURL *chandle,
+ const struct fetch_multipart_data *multipart)
+{
+ curl_mime *cmime;
+ curl_mimepart *part;
+ CURLcode code = CURLE_OK;
+ size_t value_len;
+
+ cmime = curl_mime_init(chandle);
+ if (cmime == NULL) {
+ NSLOG(netsurf, WARNING, "postdata conversion failed to curl mime context");
+ return NULL;
+ }
+
+ /* iterate post data */
+ for (; multipart != NULL; multipart = multipart->next) {
+ part = curl_mime_addpart(cmime);
+ if (part == NULL) {
+ goto convert_failed;
+ }
+
+ code = curl_mime_name(part, multipart->name);
+ if (code != CURLE_OK) {
+ goto convert_failed;
+ }
+
+ value_len = strlen(multipart->value);
+
+ if (multipart->file && value_len==0) {
+ /* file entries with no filename require special handling */
+ code=curl_mime_data(part, multipart->value, value_len);
+ if (code != CURLE_OK) {
+ goto convert_failed;
+ }
+
+ code = curl_mime_filename(part, "");
+ if (code != CURLE_OK) {
+ goto convert_failed;
+ }
+
+ code = curl_mime_type(part, "application/octet-stream");
+ if (code != CURLE_OK) {
+ goto convert_failed;
+ }
+
+ } else if(multipart->file) {
+ /* file entry */
+ nserror ret;
+ char *leafname = NULL;
+ char *mimetype = NULL;
+
+ code = curl_mime_filedata(part, multipart->rawfile);
+ if (code != CURLE_OK) {
+ goto convert_failed;
+ }
+
+ ret = guit->file->basename(multipart->value, &leafname, NULL);
+ if (ret != NSERROR_OK) {
+ goto convert_failed;
+ }
+ code = curl_mime_filename(part, leafname);
+ free(leafname);
+ if (code != CURLE_OK) {
+ goto convert_failed;
+ }
+
+ mimetype = guit->fetch->mimetype(multipart->value);
+ if (mimetype == NULL) {
+ mimetype=strdup("text/plain");
+ }
+ if (mimetype == NULL) {
+ goto convert_failed;
+ }
+ code = curl_mime_type(part, mimetype);
+ free(mimetype);
+ if (code != CURLE_OK) {
+ goto convert_failed;
+ }
+
+ } else {
+ /* make the curl mime reference the existing multipart
+ * data which requires use of a callback and context.
+ */
+ struct curl_mime_ctx *cb_ctx;
+ cb_ctx = malloc(sizeof(struct curl_mime_ctx));
+ if (cb_ctx == NULL) {
+ goto convert_failed;
+ }
+ cb_ctx->buffer = multipart->value;
+ cb_ctx->size = value_len;
+ cb_ctx->position = 0;
+ code = curl_mime_data_cb(part,
+ value_len,
+ mime_data_read_callback,
+ mime_data_seek_callback,
+ mime_data_free_callback,
+ cb_ctx);
+ if (code != CURLE_OK) {
+ free(cb_ctx);
+ goto convert_failed;
+ }
+ }
+ }
+
+ return cmime;
+
+convert_failed:
+ NSLOG(netsurf, WARNING, "postdata conversion failed with curl code: %d", code);
+ curl_mime_free(cmime);
+ return NULL;
+}
+
+#else /* LIBCURL_VERSION_NUM >= 0x073800 */
+
+/**
+ * Convert a list of struct ::fetch_multipart_data to a list of
+ * struct curl_httppost for libcurl.
+ */
+static struct curl_httppost *
+fetch_curl_postdata_convert(CURL *chandle,
+ const struct fetch_multipart_data *control)
+{
+ struct curl_httppost *post = NULL, *last = NULL;
+ CURLFORMcode code;
+ nserror ret;
+
+ for (; control; control = control->next) {
+ if (control->file) {
+ char *leafname = NULL;
+ ret = guit->file->basename(control->value, &leafname, NULL);
+ if (ret != NSERROR_OK) {
+ continue;
+ }
+
+ /* We have to special case filenames of "", so curl
+ * a) actually attempts the fetch and
+ * b) doesn't attempt to open the file ""
+ */
+ if (control->value[0] == '\0') {
+ /* dummy buffer - needs to be static so
+ * pointer's still valid when we go out
+ * of scope (not that libcurl should be
+ * attempting to access it, of course).
+ */
+ static char buf;
+
+ code = curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, control->name,
+ CURLFORM_BUFFER, control->value,
+ /* needed, as basename("") == "." */
+ CURLFORM_FILENAME, "",
+ CURLFORM_BUFFERPTR, &buf,
+ CURLFORM_BUFFERLENGTH, 0,
+ CURLFORM_CONTENTTYPE,
+ "application/octet-stream",
+ CURLFORM_END);
+ if (code != CURL_FORMADD_OK)
+ NSLOG(netsurf, INFO,
+ "curl_formadd: %d (%s)", code,
+ control->name);
+ } else {
+ char *mimetype = guit->fetch->mimetype(control->value);
+ code = curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, control->name,
+ CURLFORM_FILE, control->rawfile,
+ CURLFORM_FILENAME, leafname,
+ CURLFORM_CONTENTTYPE,
+ (mimetype != 0 ? mimetype : "text/plain"),
+ CURLFORM_END);
+ if (code != CURL_FORMADD_OK)
+ NSLOG(netsurf, INFO,
+ "curl_formadd: %d (%s=%s)",
+ code,
+ control->name,
+ control->value);
+ free(mimetype);
+ }
+ free(leafname);
+ } else {
+ code = curl_formadd(&post, &last,
+ CURLFORM_COPYNAME, control->name,
+ CURLFORM_COPYCONTENTS, control->value,
+ CURLFORM_END);
+ if (code != CURL_FORMADD_OK)
+ NSLOG(netsurf, INFO,
+ "curl_formadd: %d (%s=%s)", code,
+ control->name, control->value);
+ }
+ }
+
+ return post;
+}
+
+#endif /* LIBCURL_VERSION_NUM >= 0x073800 */
+
+/**
+ * Setup multipart post data
+ */
+static CURLcode fetch_curl_set_postdata(struct curl_fetch_info *f)
+{
+ CURLcode code = CURLE_OK;
+
+#undef SETOPT
+#define SETOPT(option, value) { \
+ code = curl_easy_setopt(f->curl_handle, option, value); \
+ if (code != CURLE_OK) \
+ return code; \
+ }
+
+ switch (f->postdata->type) {
+ case FETCH_POSTDATA_NONE:
+ SETOPT(CURLOPT_POSTFIELDS, NULL);
+ SETOPT(NSCURL_POSTDATA_CURLOPT, NULL);
+ SETOPT(CURLOPT_HTTPGET, 1L);
+ break;
+
+ case FETCH_POSTDATA_URLENC:
+ SETOPT(NSCURL_POSTDATA_CURLOPT, NULL);
+ SETOPT(CURLOPT_HTTPGET, 0L);
+ SETOPT(CURLOPT_POSTFIELDS, f->postdata->data.urlenc);
+ break;
+
+ case FETCH_POSTDATA_MULTIPART:
+ SETOPT(CURLOPT_POSTFIELDS, NULL);
+ SETOPT(CURLOPT_HTTPGET, 0L);
+ if (f->curl_postdata == NULL) {
+ f->curl_postdata =
+ fetch_curl_postdata_convert(f->curl_handle,
+ f->postdata->data.multipart);
+ }
+ SETOPT(NSCURL_POSTDATA_CURLOPT, f->curl_postdata);
+ break;
+ }
+ return code;
+}
/**
* Set options specific for a fetch.
@@ -888,20 +1180,11 @@ static CURLcode fetch_curl_set_options(struct curl_fetch_info *f)
SETOPT(CURLOPT_PRIVATE, f);
SETOPT(CURLOPT_WRITEDATA, f);
SETOPT(CURLOPT_WRITEHEADER, f);
- SETOPT(CURLOPT_PROGRESSDATA, f);
+ SETOPT(NSCURLOPT_PROGRESS_DATA, f);
SETOPT(CURLOPT_HTTPHEADER, f->headers);
- if (f->post_urlenc) {
- SETOPT(CURLOPT_HTTPPOST, NULL);
- SETOPT(CURLOPT_HTTPGET, 0L);
- SETOPT(CURLOPT_POSTFIELDS, f->post_urlenc);
- } else if (f->post_multipart) {
- SETOPT(CURLOPT_POSTFIELDS, NULL);
- SETOPT(CURLOPT_HTTPGET, 0L);
- SETOPT(CURLOPT_HTTPPOST, f->post_multipart);
- } else {
- SETOPT(CURLOPT_POSTFIELDS, NULL);
- SETOPT(CURLOPT_HTTPPOST, NULL);
- SETOPT(CURLOPT_HTTPGET, 1L);
+ code = fetch_curl_set_postdata(f);
+ if (code != CURLE_OK) {
+ return code;
}
f->cookie_string = urldb_get_cookie(f->url, true);
@@ -948,6 +1231,12 @@ static CURLcode fetch_curl_set_options(struct curl_fetch_info *f)
SETOPT(CURLOPT_PROXY, NULL);
}
+
+ if (curl_with_openssl) {
+ SETOPT(CURLOPT_SSL_CIPHER_LIST,
+ f->downgrade_tls ? CIPHER_LIST_LEGACY : CIPHER_LIST);
+ }
+
/* Force-enable SSL session ID caching, as some distros are odd. */
SETOPT(CURLOPT_SSL_SESSIONID_CACHE, 1);
@@ -1161,15 +1450,13 @@ static void fetch_curl_free(void *vf)
if (f->headers) {
curl_slist_free_all(f->headers);
}
- free(f->post_urlenc);
- if (f->post_multipart) {
- curl_formfree(f->post_multipart);
- }
+ fetch_curl_free_postdata(f->postdata);
+ NSCURL_POSTDATA_FREE(f->curl_postdata);
/* free certificate data */
for (i = 0; i < MAX_CERT_DEPTH; i++) {
if (f->cert_data[i].cert != NULL) {
- ns_X509_free(f->cert_data[i].cert);
+ X509_free(f->cert_data[i].cert);
}
}
@@ -1199,7 +1486,7 @@ static bool fetch_curl_process_headers(struct curl_fetch_info *f)
http_code = f->http_code;
NSLOG(netsurf, INFO, "HTTP status code %li", http_code);
- if (http_code == 304 && !f->post_urlenc && !f->post_multipart) {
+ if ((http_code == 304) && (f->postdata->type==FETCH_POSTDATA_NONE)) {
/* Not Modified && GET request */
msg.type = FETCH_NOTMODIFIED;
fetch_send_callback(&msg, f->fetch_handle);
@@ -1435,10 +1722,10 @@ static void fetch_curl_poll(lwc_string *scheme_ignored)
*/
static int
fetch_curl_progress(void *clientp,
- double dltotal,
- double dlnow,
- double ultotal,
- double ulnow)
+ NSCURL_PROGRESS_T dltotal,
+ NSCURL_PROGRESS_T dlnow,
+ NSCURL_PROGRESS_T ultotal,
+ NSCURL_PROGRESS_T ulnow)
{
static char fetch_progress_buffer[256]; /**< Progress buffer for cURL */
struct curl_fetch_info *f = (struct curl_fetch_info *) clientp;
@@ -1505,6 +1792,24 @@ fetch_curl_debug(CURL *handle,
}
+static curl_socket_t fetch_curl_socket_open(void *clientp,
+ curlsocktype purpose, struct curl_sockaddr *address)
+{
+ (void) clientp;
+ (void) purpose;
+
+ return (curl_socket_t) guit->fetch->socket_open(
+ address->family, address->socktype,
+ address->protocol);
+}
+
+static int fetch_curl_socket_close(void *clientp, curl_socket_t item)
+{
+ (void) clientp;
+
+ return guit->fetch->socket_close((int) item);
+}
+
/**
* Callback function for cURL.
*/
@@ -1711,8 +2016,10 @@ nserror fetch_curl_register(void)
#undef SETOPT
#define SETOPT(option, value) \
mcode = curl_multi_setopt(fetch_curl_multi, option, value); \
- if (mcode != CURLM_OK) \
- goto curl_multi_setopt_failed;
+ if (mcode != CURLM_OK) { \
+ NSLOG(netsurf, ERROR, "attempting curl_multi_setopt(%s, ...)", #option); \
+ goto curl_multi_setopt_failed; \
+ }
SETOPT(CURLMOPT_MAXCONNECTS, maxconnects);
SETOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, maxconnects);
@@ -1732,8 +2039,10 @@ nserror fetch_curl_register(void)
#undef SETOPT
#define SETOPT(option, value) \
code = curl_easy_setopt(fetch_blank_curl, option, value); \
- if (code != CURLE_OK) \
- goto curl_easy_setopt_failed;
+ if (code != CURLE_OK) { \
+ NSLOG(netsurf, ERROR, "attempting curl_easy_setopt(%s, ...)", #option); \
+ goto curl_easy_setopt_failed; \
+ }
SETOPT(CURLOPT_ERRORBUFFER, fetch_error_buffer);
SETOPT(CURLOPT_DEBUGFUNCTION, fetch_curl_debug);
@@ -1748,7 +2057,7 @@ nserror fetch_curl_register(void)
SETOPT(CURLOPT_WRITEFUNCTION, fetch_curl_data);
SETOPT(CURLOPT_HEADERFUNCTION, fetch_curl_header);
- SETOPT(CURLOPT_PROGRESSFUNCTION, fetch_curl_progress);
+ SETOPT(NSCURLOPT_PROGRESS_FUNCTION, fetch_curl_progress);
SETOPT(CURLOPT_NOPROGRESS, 0);
SETOPT(CURLOPT_USERAGENT, user_agent_string());
SETOPT(CURLOPT_ENCODING, "gzip");
@@ -1756,6 +2065,8 @@ nserror fetch_curl_register(void)
SETOPT(CURLOPT_LOW_SPEED_TIME, 180L);
SETOPT(CURLOPT_NOSIGNAL, 1L);
SETOPT(CURLOPT_CONNECTTIMEOUT, nsoption_uint(curl_fetch_timeout));
+ SETOPT(CURLOPT_OPENSOCKETFUNCTION, fetch_curl_socket_open);
+ SETOPT(CURLOPT_CLOSESOCKETFUNCTION, fetch_curl_socket_close);
if (nsoption_charp(ca_bundle) &&
strcmp(nsoption_charp(ca_bundle), "")) {
@@ -1785,6 +2096,14 @@ nserror fetch_curl_register(void)
/* only set the cipher list with openssl otherwise the
* fetch fails with "Unknown cipher in list"
*/
+#if LIBCURL_VERSION_NUM >= 0x073d00
+ /* Need libcurl 7.61.0 or later built against OpenSSL with
+ * TLS1.3 support */
+ code = curl_easy_setopt(fetch_blank_curl,
+ CURLOPT_TLS13_CIPHERS, CIPHER_SUITES);
+ if (code != CURLE_OK && code != CURLE_NOT_BUILT_IN)
+ goto curl_easy_setopt_failed;
+#endif
SETOPT(CURLOPT_SSL_CIPHER_LIST, CIPHER_LIST);
}
diff --git a/content/fetchers/file/dirlist.c b/content/fetchers/file/dirlist.c
index d49dc7fe7..345dbd8f3 100644
--- a/content/fetchers/file/dirlist.c
+++ b/content/fetchers/file/dirlist.c
@@ -29,6 +29,7 @@
#include "utils/messages.h"
#include "utils/nscolour.h"
+#include "netsurf/inttypes.h"
#include "netsurf/types.h"
#include "netsurf/plot_style.h"
@@ -158,7 +159,7 @@ bool dirlist_generate_title(const char *title, char *buffer, int buffer_length)
"<title>%s</title>\n"
"<style>\n"
"html {\n"
- "\tbackground-color: #%06x;\n"
+ "\tbackground-color: #%06"PRIx32";\n"
"}\n"
"%s"
"</style>\n"
diff --git a/content/fs_backing_store.c b/content/fs_backing_store.c
index ede729f9a..a145c6fe1 100644
--- a/content/fs_backing_store.c
+++ b/content/fs_backing_store.c
@@ -89,14 +89,6 @@
#define BLOCK_USE_MAP_SIZE (1 << (BLOCK_ENTRY_COUNT - 3))
/**
- * The type used to store index values referring to store entries. Care
- * must be taken with this type as it is used to build address to
- * entry mapping so changing the size will have large impacts on
- * memory usage.
- */
-typedef uint16_t entry_index_t;
-
-/**
* The type used as a binary identifier for each entry derived from
* the URL. A larger identifier will have fewer collisions but
* requires proportionately more storage.
@@ -1614,7 +1606,7 @@ static nserror store_write_block(struct store_state *state,
offst);
if (wr != (ssize_t)bse->elem[elem_idx].size) {
NSLOG(netsurf, ERROR,
- "Write failed %"PRIssizet" of %d bytes from %p at %"PRIsizet" block %d errno %d",
+ "Write failed %"PRIssizet" of %"PRId32" bytes from %p at %"PRIsizet" block %"PRIu16" errno %d",
wr,
bse->elem[elem_idx].size,
bse->elem[elem_idx].data,
@@ -1661,7 +1653,7 @@ static nserror store_write_file(struct store_state *state,
close(fd);
if (wr != (ssize_t)bse->elem[elem_idx].size) {
NSLOG(netsurf, ERROR,
- "Write failed %"PRIssizet" of %d bytes from %p errno %d",
+ "Write failed %"PRIssizet" of %"PRId32" bytes from %p errno %d",
wr,
bse->elem[elem_idx].size,
bse->elem[elem_idx].data,
@@ -1784,7 +1776,7 @@ static nserror store_read_block(struct store_state *state,
offst);
if (rd != (ssize_t)bse->elem[elem_idx].size) {
NSLOG(netsurf, ERROR,
- "Failed reading %"PRIssizet" of %d bytes into %p from %"PRIsizet" block %d errno %d",
+ "Failed reading %"PRIssizet" of %"PRId32" bytes into %p from %"PRIsizet" block %"PRIu16" errno %d",
rd,
bse->elem[elem_idx].size,
bse->elem[elem_idx].data,
diff --git a/content/handlers/css/dump.c b/content/handlers/css/dump.c
index 1e448e0d4..950a6f8cc 100644
--- a/content/handlers/css/dump.c
+++ b/content/handlers/css/dump.c
@@ -19,6 +19,8 @@
#include <stdio.h>
#include <libcss/libcss.h>
+#include "netsurf/inttypes.h"
+
#include "css/dump.h"
#include "css/utils.h"
@@ -36,7 +38,7 @@ static void dump_css_fixed(FILE *stream, css_fixed f)
uint32_t fracpart = ((NSCSS_ABS(f) & 0x3ff) * 1000 + 500) / (1 << 10);
#undef NSCSS_ABS
- fprintf(stream, "%s%d.%03d", f < 0 ? "-" : "", uintpart, fracpart);
+ fprintf(stream, "%s%"PRIu32".%03"PRIu32, f < 0 ? "-" : "", uintpart, fracpart);
}
/**
@@ -48,7 +50,7 @@ static void dump_css_fixed(FILE *stream, css_fixed f)
static void dump_css_number(FILE *stream, css_fixed val)
{
if (INTTOFIX(FIXTOINT(val)) == val)
- fprintf(stream, "%d", FIXTOINT(val));
+ fprintf(stream, "%"PRId32, FIXTOINT(val));
else
dump_css_fixed(stream, val);
}
@@ -181,7 +183,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
val = css_computed_background_color(style, &color);
switch (val) {
case CSS_BACKGROUND_COLOR_COLOR:
- fprintf(stream, "background-color: #%08x ", color);
+ fprintf(stream, "background-color: #%08"PRIx32" ", color);
break;
default:
break;
@@ -255,7 +257,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
val = css_computed_border_top_color(style, &color);
switch (val) {
case CSS_BORDER_COLOR_COLOR:
- fprintf(stream, "border-top-color: #%08x ", color);
+ fprintf(stream, "border-top-color: #%08"PRIx32" ", color);
break;
default:
break;
@@ -265,7 +267,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
val = css_computed_border_right_color(style, &color);
switch (val) {
case CSS_BORDER_COLOR_COLOR:
- fprintf(stream, "border-right-color: #%08x ", color);
+ fprintf(stream, "border-right-color: #%08"PRIx32" ", color);
break;
default:
break;
@@ -275,7 +277,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
val = css_computed_border_bottom_color(style, &color);
switch (val) {
case CSS_BORDER_COLOR_COLOR:
- fprintf(stream, "border-bottom-color: #%08x ", color);
+ fprintf(stream, "border-bottom-color: #%08"PRIx32" ", color);
break;
default:
break;
@@ -285,7 +287,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
val = css_computed_border_left_color(style, &color);
switch (val) {
case CSS_BORDER_COLOR_COLOR:
- fprintf(stream, "border-left-color: #%08x ", color);
+ fprintf(stream, "border-left-color: #%08"PRIx32" ", color);
break;
default:
break;
@@ -610,7 +612,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
/* color */
val = css_computed_color(style, &color);
if (val == CSS_COLOR_COLOR) {
- fprintf(stream, "color: #%08x ", color);
+ fprintf(stream, "color: #%08"PRIx32" ", color);
}
/* content */
@@ -864,6 +866,12 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
case CSS_DISPLAY_NONE:
fprintf(stream, "display: none ");
break;
+ case CSS_DISPLAY_FLEX:
+ fprintf(stream, "display: flex ");
+ break;
+ case CSS_DISPLAY_INLINE_FLEX:
+ fprintf(stream, "display: inline-flex ");
+ break;
default:
break;
}
@@ -1347,7 +1355,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
fprintf(stream, "outline-color: invert ");
break;
case CSS_OUTLINE_COLOR_COLOR:
- fprintf(stream, "outline-color: #%08x ", color);
+ fprintf(stream, "outline-color: #%08"PRIx32" ", color);
break;
default:
break;
@@ -1814,7 +1822,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style)
fprintf(stream, "z-index: auto ");
break;
case CSS_Z_INDEX_SET:
- fprintf(stream, "z-index: %d ", zindex);
+ fprintf(stream, "z-index: %"PRId32" ", zindex);
break;
default:
break;
diff --git a/content/handlers/css/hints.c b/content/handlers/css/hints.c
index defeae10a..0f246a64c 100644
--- a/content/handlers/css/hints.c
+++ b/content/handlers/css/hints.c
@@ -1624,13 +1624,19 @@ static void css_hint_list(
}
-/* Exported function, documeted in css/hints.h */
+/* Exported function, documented in css/hints.h */
css_error node_presentational_hint(void *pw, void *node,
uint32_t *nhints, css_hint **hints)
{
dom_exception exc;
dom_html_element_type tag_type;
+ if (nsoption_bool(author_level_css) == false) {
+ *nhints = 0;
+ *hints = NULL;
+ return CSS_OK;
+ }
+
css_hint_clean();
exc = dom_html_element_get_tag_type(node, &tag_type);
@@ -1644,22 +1650,22 @@ css_error node_presentational_hint(void *pw, void *node,
css_hint_width(pw, node);
css_hint_table_cell_border_padding(pw, node);
css_hint_white_space_nowrap(pw, node);
- /* fall through */
+ fallthrough;
case DOM_HTML_ELEMENT_TYPE_TR:
css_hint_height(pw, node);
- /* fall through */
+ fallthrough;
case DOM_HTML_ELEMENT_TYPE_THEAD:
case DOM_HTML_ELEMENT_TYPE_TBODY:
case DOM_HTML_ELEMENT_TYPE_TFOOT:
css_hint_text_align_special(pw, node);
- /* fall through */
+ fallthrough;
case DOM_HTML_ELEMENT_TYPE_COL:
css_hint_vertical_align_table_cells(pw, node);
break;
case DOM_HTML_ELEMENT_TYPE_APPLET:
case DOM_HTML_ELEMENT_TYPE_IMG:
css_hint_margin_hspace_vspace(pw, node);
- /* fall through */
+ fallthrough;
case DOM_HTML_ELEMENT_TYPE_EMBED:
case DOM_HTML_ELEMENT_TYPE_IFRAME:
case DOM_HTML_ELEMENT_TYPE_OBJECT:
@@ -1682,7 +1688,7 @@ css_error node_presentational_hint(void *pw, void *node,
break;
case DOM_HTML_ELEMENT_TYPE_CAPTION:
css_hint_caption_side(pw, node);
- /* fall through */
+ fallthrough;
case DOM_HTML_ELEMENT_TYPE_DIV:
css_hint_text_align_special(pw, node);
break;
diff --git a/content/handlers/css/utils.h b/content/handlers/css/utils.h
index 541677a3a..ee241e2cc 100644
--- a/content/handlers/css/utils.h
+++ b/content/handlers/css/utils.h
@@ -28,41 +28,50 @@ extern css_fixed nscss_screen_dpi;
/**
* Temporary helper wrappers for for libcss computed style getter, while
- * we don't support flexbox related property values.
+ * we don't support all values of display.
*/
-
static inline uint8_t ns_computed_display(
const css_computed_style *style, bool root)
{
uint8_t value = css_computed_display(style, root);
- if (value == CSS_DISPLAY_FLEX) {
+ switch (value) {
+ case CSS_DISPLAY_GRID:
return CSS_DISPLAY_BLOCK;
- } else if (value == CSS_DISPLAY_INLINE_FLEX) {
+ case CSS_DISPLAY_INLINE_GRID:
return CSS_DISPLAY_INLINE_BLOCK;
+
+ default:
+ break;
}
return value;
}
-
+/**
+ * Temporary helper wrappers for for libcss computed style getter, while
+ * we don't support all values of display.
+ */
static inline uint8_t ns_computed_display_static(
const css_computed_style *style)
{
uint8_t value = css_computed_display_static(style);
- if (value == CSS_DISPLAY_FLEX) {
+ switch (value) {
+ case CSS_DISPLAY_GRID:
return CSS_DISPLAY_BLOCK;
- } else if (value == CSS_DISPLAY_INLINE_FLEX) {
+ case CSS_DISPLAY_INLINE_GRID:
return CSS_DISPLAY_INLINE_BLOCK;
+
+ default:
+ break;
}
return value;
}
-
static inline uint8_t ns_computed_min_height(
const css_computed_style *style,
css_fixed *length, css_unit *unit)
diff --git a/content/handlers/html/Makefile b/content/handlers/html/Makefile
index 8bb329b76..e41cc1d22 100644
--- a/content/handlers/html/Makefile
+++ b/content/handlers/html/Makefile
@@ -16,6 +16,7 @@ S_HTML := box_construct.c \
imagemap.c \
interaction.c \
layout.c \
+ layout_flex.c \
object.c \
redraw.c \
redraw_border.c \
diff --git a/content/handlers/html/box.h b/content/handlers/html/box.h
index 1059556e6..df2b99d87 100644
--- a/content/handlers/html/box.h
+++ b/content/handlers/html/box.h
@@ -66,7 +66,9 @@ typedef enum {
BOX_BR,
BOX_TEXT,
BOX_INLINE_END,
- BOX_NONE
+ BOX_NONE,
+ BOX_FLEX,
+ BOX_INLINE_FLEX,
} box_type;
diff --git a/content/handlers/html/box_construct.c b/content/handlers/html/box_construct.c
index 12d9df87c..8519c2b1d 100644
--- a/content/handlers/html/box_construct.c
+++ b/content/handlers/html/box_construct.c
@@ -86,28 +86,30 @@ struct box_construct_props {
static const content_type image_types = CONTENT_IMAGE;
-/**
- * mapping from CSS display to box type this table must be in sync
- * with libcss' css_display enum
- */
+/* mapping from CSS display to box type
+ * this table must be in sync with libcss' css_display enum */
static const box_type box_map[] = {
- 0, /* CSS_DISPLAY_INHERIT, */
- BOX_INLINE, /* CSS_DISPLAY_INLINE, */
- BOX_BLOCK, /* CSS_DISPLAY_BLOCK, */
- BOX_BLOCK, /* CSS_DISPLAY_LIST_ITEM, */
- BOX_INLINE, /* CSS_DISPLAY_RUN_IN, */
- BOX_INLINE_BLOCK, /* CSS_DISPLAY_INLINE_BLOCK, */
- BOX_TABLE, /* CSS_DISPLAY_TABLE, */
- BOX_TABLE, /* CSS_DISPLAY_INLINE_TABLE, */
- BOX_TABLE_ROW_GROUP, /* CSS_DISPLAY_TABLE_ROW_GROUP, */
- BOX_TABLE_ROW_GROUP, /* CSS_DISPLAY_TABLE_HEADER_GROUP, */
- BOX_TABLE_ROW_GROUP, /* CSS_DISPLAY_TABLE_FOOTER_GROUP, */
- BOX_TABLE_ROW, /* CSS_DISPLAY_TABLE_ROW, */
- BOX_NONE, /* CSS_DISPLAY_TABLE_COLUMN_GROUP, */
- BOX_NONE, /* CSS_DISPLAY_TABLE_COLUMN, */
- BOX_TABLE_CELL, /* CSS_DISPLAY_TABLE_CELL, */
- BOX_INLINE, /* CSS_DISPLAY_TABLE_CAPTION, */
- BOX_NONE /* CSS_DISPLAY_NONE */
+ BOX_BLOCK, /* CSS_DISPLAY_INHERIT */
+ BOX_INLINE, /* CSS_DISPLAY_INLINE */
+ BOX_BLOCK, /* CSS_DISPLAY_BLOCK */
+ BOX_BLOCK, /* CSS_DISPLAY_LIST_ITEM */
+ BOX_INLINE, /* CSS_DISPLAY_RUN_IN */
+ BOX_INLINE_BLOCK, /* CSS_DISPLAY_INLINE_BLOCK */
+ BOX_TABLE, /* CSS_DISPLAY_TABLE */
+ BOX_TABLE, /* CSS_DISPLAY_INLINE_TABLE */
+ BOX_TABLE_ROW_GROUP, /* CSS_DISPLAY_TABLE_ROW_GROUP */
+ BOX_TABLE_ROW_GROUP, /* CSS_DISPLAY_TABLE_HEADER_GROUP */
+ BOX_TABLE_ROW_GROUP, /* CSS_DISPLAY_TABLE_FOOTER_GROUP */
+ BOX_TABLE_ROW, /* CSS_DISPLAY_TABLE_ROW */
+ BOX_NONE, /* CSS_DISPLAY_TABLE_COLUMN_GROUP */
+ BOX_NONE, /* CSS_DISPLAY_TABLE_COLUMN */
+ BOX_TABLE_CELL, /* CSS_DISPLAY_TABLE_CELL */
+ BOX_INLINE, /* CSS_DISPLAY_TABLE_CAPTION */
+ BOX_NONE, /* CSS_DISPLAY_NONE */
+ BOX_FLEX, /* CSS_DISPLAY_FLEX */
+ BOX_INLINE_FLEX, /* CSS_DISPLAY_INLINE_FLEX */
+ BOX_BLOCK, /* CSS_DISPLAY_GRID */
+ BOX_INLINE_BLOCK, /* CSS_DISPLAY_INLINE_GRID */
};
@@ -142,7 +144,6 @@ static inline bool box_is_root(dom_node *n)
return true;
}
-
/**
* Extract transient construction properties
*
@@ -248,16 +249,19 @@ box_get_style(html_content *c,
const css_computed_style *root_style,
dom_node *n)
{
- dom_string *s;
- dom_exception err;
+ dom_string *s = NULL;
css_stylesheet *inline_style = NULL;
css_select_results *styles;
nscss_select_ctx ctx;
/* Firstly, construct inline stylesheet, if any */
- err = dom_element_get_attribute(n, corestring_dom_style, &s);
- if (err != DOM_NO_ERR)
- return NULL;
+ if (nsoption_bool(author_level_css)) {
+ dom_exception err;
+ err = dom_element_get_attribute(n, corestring_dom_style, &s);
+ if (err != DOM_NO_ERR) {
+ return NULL;
+ }
+ }
if (s != NULL) {
inline_style = nscss_create_inline_style(
@@ -438,6 +442,23 @@ box_construct_marker(struct box *box,
return true;
}
+static inline bool box__style_is_float(const struct box *box)
+{
+ return css_computed_float(box->style) == CSS_FLOAT_LEFT ||
+ css_computed_float(box->style) == CSS_FLOAT_RIGHT;
+}
+
+static inline bool box__is_flex(const struct box *box)
+{
+ return box->type == BOX_FLEX || box->type == BOX_INLINE_FLEX;
+}
+
+static inline bool box__containing_block_is_flex(
+ const struct box_construct_props *props)
+{
+ return props->containing_block != NULL &&
+ box__is_flex(props->containing_block);
+}
/**
* Construct the box tree for an XML element.
@@ -451,6 +472,7 @@ box_construct_element(struct box_construct_ctx *ctx, bool *convert_children)
{
dom_string *title0, *s;
lwc_string *id = NULL;
+ enum css_display_e css_display;
struct box *box = NULL, *old_box;
css_select_results *styles = NULL;
lwc_string *bgimage_uri;
@@ -549,16 +571,15 @@ box_construct_element(struct box_construct_ctx *ctx, bool *convert_children)
dom_string_unref(s);
}
+ css_display = ns_computed_display_static(box->style);
+
/* Set box type from computed display */
if ((css_computed_position(box->style) == CSS_POSITION_ABSOLUTE ||
- css_computed_position(box->style) ==
- CSS_POSITION_FIXED) &&
- (ns_computed_display_static(box->style) ==
- CSS_DISPLAY_INLINE ||
- ns_computed_display_static(box->style) ==
- CSS_DISPLAY_INLINE_BLOCK ||
- ns_computed_display_static(box->style) ==
- CSS_DISPLAY_INLINE_TABLE)) {
+ css_computed_position(box->style) == CSS_POSITION_FIXED) &&
+ (css_display == CSS_DISPLAY_INLINE ||
+ css_display == CSS_DISPLAY_INLINE_BLOCK ||
+ css_display == CSS_DISPLAY_INLINE_TABLE ||
+ css_display == CSS_DISPLAY_INLINE_FLEX)) {
/* Special case for absolute positioning: make absolute inlines
* into inline block so that the boxes are constructed in an
* inline container as if they were not absolutely positioned.
@@ -572,6 +593,21 @@ box_construct_element(struct box_construct_ctx *ctx, bool *convert_children)
/* Normal mapping */
box->type = box_map[ns_computed_display(box->style,
props.node_is_root)];
+
+ if (props.containing_block->type == BOX_FLEX ||
+ props.containing_block->type == BOX_INLINE_FLEX) {
+ /* Blockification */
+ switch (box->type) {
+ case BOX_INLINE_FLEX:
+ box->type = BOX_FLEX;
+ break;
+ case BOX_INLINE_BLOCK:
+ box->type = BOX_BLOCK;
+ break;
+ default:
+ break;
+ }
+ }
}
if (convert_special_elements(ctx->n,
@@ -587,10 +623,9 @@ box_construct_element(struct box_construct_ctx *ctx, bool *convert_children)
box->styles->styles[CSS_PSEUDO_ELEMENT_BEFORE]);
}
- if (box->type == BOX_NONE ||
- (ns_computed_display(box->style,
- props.node_is_root) == CSS_DISPLAY_NONE &&
- props.node_is_root == false)) {
+ if (box->type == BOX_NONE || (ns_computed_display(box->style,
+ props.node_is_root) == CSS_DISPLAY_NONE &&
+ props.node_is_root == false)) {
css_select_results_destroy(styles);
box->styles = NULL;
box->style = NULL;
@@ -625,8 +660,9 @@ box_construct_element(struct box_construct_ctx *ctx, bool *convert_children)
(box->type == BOX_INLINE ||
box->type == BOX_BR ||
box->type == BOX_INLINE_BLOCK ||
- css_computed_float(box->style) == CSS_FLOAT_LEFT ||
- css_computed_float(box->style) == CSS_FLOAT_RIGHT) &&
+ box->type == BOX_INLINE_FLEX ||
+ (box__style_is_float(box) &&
+ !box__containing_block_is_flex(&props))) &&
props.node_is_root == false) {
/* Found an inline child of a block without a current container
* (i.e. this box is the first child of its parent, or was
@@ -674,6 +710,7 @@ box_construct_element(struct box_construct_ctx *ctx, bool *convert_children)
box->flags |= CONVERT_CHILDREN;
if (box->type == BOX_INLINE || box->type == BOX_BR ||
+ box->type == BOX_INLINE_FLEX ||
box->type == BOX_INLINE_BLOCK) {
/* Inline container must exist, as we'll have
* created it above if it didn't */
@@ -690,6 +727,7 @@ box_construct_element(struct box_construct_ctx *ctx, bool *convert_children)
}
if (props.node_is_root == false &&
+ box__containing_block_is_flex(&props) == false &&
(css_computed_float(box->style) ==
CSS_FLOAT_LEFT ||
css_computed_float(box->style) ==
@@ -1342,7 +1380,6 @@ struct box *box_for_node(dom_node *n)
return box;
}
-
/* exported function documented in html/box_construct.h */
bool
box_extract_link(const html_content *content,
diff --git a/content/handlers/html/box_inspect.c b/content/handlers/html/box_inspect.c
index b4b13940d..6591b6446 100644
--- a/content/handlers/html/box_inspect.c
+++ b/content/handlers/html/box_inspect.c
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <dom/dom.h>
+#include "utils/utils.h"
#include "utils/nsurl.h"
#include "utils/errors.h"
#include "netsurf/types.h"
@@ -212,7 +213,7 @@ box_move_xy(struct box *b, enum box_walk_dir dir, int *x, int *y)
rb = b;
break;
}
- /* fall through */
+ fallthrough;
case BOX_WALK_NEXT_SIBLING:
do {
@@ -660,7 +661,7 @@ void box_dump(FILE *stream, struct box *box, unsigned int depth, bool style)
if (box->max_width != UNKNOWN_MAX_WIDTH) {
fprintf(stream, "min%i max%i ", box->min_width, box->max_width);
}
- fprintf(stream, "(%i %i %i %i) ",
+ fprintf(stream, "desc(%i %i %i %i) ",
box->descendant_x0, box->descendant_y0,
box->descendant_x1, box->descendant_y1);
@@ -724,6 +725,14 @@ void box_dump(FILE *stream, struct box *box, unsigned int depth, bool style)
fprintf(stream, "TEXT ");
break;
+ case BOX_FLEX:
+ fprintf(stream, "FLEX ");
+ break;
+
+ case BOX_INLINE_FLEX:
+ fprintf(stream, "INLINE_FLEX ");
+ break;
+
default:
fprintf(stream, "Unknown box type ");
}
diff --git a/content/handlers/html/box_inspect.h b/content/handlers/html/box_inspect.h
index b9161f148..a218326d8 100644
--- a/content/handlers/html/box_inspect.h
+++ b/content/handlers/html/box_inspect.h
@@ -139,5 +139,17 @@ static inline bool box_is_first_child(struct box *b)
return (b->parent == NULL || b == b->parent->children);
}
+static inline unsigned box_count_children(const struct box *b)
+{
+ const struct box *c = b->children;
+ unsigned count = 0;
+
+ while (c != NULL) {
+ count++;
+ c = c->next;
+ }
+
+ return count;
+}
#endif
diff --git a/content/handlers/html/box_normalise.c b/content/handlers/html/box_normalise.c
index 1b6a345d5..8f25b031f 100644
--- a/content/handlers/html/box_normalise.c
+++ b/content/handlers/html/box_normalise.c
@@ -177,6 +177,7 @@ box_normalise_table_row(struct box *row,
return false;
cell = child;
break;
+ case BOX_FLEX:
case BOX_BLOCK:
case BOX_INLINE_CONTAINER:
case BOX_TABLE:
@@ -211,6 +212,7 @@ box_normalise_table_row(struct box *row,
cell->prev = child->prev;
while (child != NULL && (
+ child->type == BOX_FLEX ||
child->type == BOX_BLOCK ||
child->type == BOX_INLINE_CONTAINER ||
child->type == BOX_TABLE ||
@@ -238,6 +240,7 @@ box_normalise_table_row(struct box *row,
break;
case BOX_INLINE:
case BOX_INLINE_END:
+ case BOX_INLINE_FLEX:
case BOX_INLINE_BLOCK:
case BOX_FLOAT_LEFT:
case BOX_FLOAT_RIGHT:
@@ -314,6 +317,7 @@ box_normalise_table_row_group(struct box *row_group,
c) == false)
return false;
break;
+ case BOX_FLEX:
case BOX_BLOCK:
case BOX_INLINE_CONTAINER:
case BOX_TABLE:
@@ -348,6 +352,7 @@ box_normalise_table_row_group(struct box *row_group,
row->prev = child->prev;
while (child != NULL && (
+ child->type == BOX_FLEX ||
child->type == BOX_BLOCK ||
child->type == BOX_INLINE_CONTAINER ||
child->type == BOX_TABLE ||
@@ -377,6 +382,7 @@ box_normalise_table_row_group(struct box *row_group,
break;
case BOX_INLINE:
case BOX_INLINE_END:
+ case BOX_INLINE_FLEX:
case BOX_INLINE_BLOCK:
case BOX_FLOAT_LEFT:
case BOX_FLOAT_RIGHT:
@@ -648,6 +654,7 @@ box_normalise_table(struct box *table, const struct box *root, html_content * c)
return false;
}
break;
+ case BOX_FLEX:
case BOX_BLOCK:
case BOX_INLINE_CONTAINER:
case BOX_TABLE:
@@ -686,6 +693,7 @@ box_normalise_table(struct box *table, const struct box *root, html_content * c)
row_group->prev = child->prev;
while (child != NULL && (
+ child->type == BOX_FLEX ||
child->type == BOX_BLOCK ||
child->type == BOX_INLINE_CONTAINER ||
child->type == BOX_TABLE ||
@@ -716,6 +724,7 @@ box_normalise_table(struct box *table, const struct box *root, html_content * c)
break;
case BOX_INLINE:
case BOX_INLINE_END:
+ case BOX_INLINE_FLEX:
case BOX_INLINE_BLOCK:
case BOX_FLOAT_LEFT:
case BOX_FLOAT_RIGHT:
@@ -806,6 +815,181 @@ box_normalise_table(struct box *table, const struct box *root, html_content * c)
return true;
}
+static bool box_normalise_flex(
+ struct box *flex_container,
+ const struct box *root,
+ html_content *c)
+{
+ struct box *child;
+ struct box *next_child;
+ struct box *implied_flex_item;
+ css_computed_style *style;
+ nscss_select_ctx ctx;
+
+ assert(flex_container != NULL);
+ assert(root != NULL);
+
+ ctx.root_style = root->style;
+
+#ifdef BOX_NORMALISE_DEBUG
+ NSLOG(netsurf, INFO, "flex_container %p, flex_container->type %u",
+ flex_container, flex_container->type);
+#endif
+
+ assert(flex_container->type == BOX_FLEX ||
+ flex_container->type == BOX_INLINE_FLEX);
+
+ for (child = flex_container->children; child != NULL; child = next_child) {
+#ifdef BOX_NORMALISE_DEBUG
+ NSLOG(netsurf, INFO, "child %p, child->type = %d",
+ child, child->type);
+#endif
+
+ next_child = child->next; /* child may be destroyed */
+
+ switch (child->type) {
+ case BOX_FLEX:
+ /* ok */
+ if (box_normalise_flex(child, root, c) == false)
+ return false;
+ break;
+ case BOX_BLOCK:
+ /* ok */
+ if (box_normalise_block(child, root, c) == false)
+ return false;
+ break;
+ case BOX_INLINE_CONTAINER:
+ /* insert implied flex item */
+ assert(flex_container->style != NULL);
+
+ ctx.ctx = c->select_ctx;
+ ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL);
+ ctx.base_url = c->base_url;
+ ctx.universal = c->universal;
+
+ style = nscss_get_blank_style(&ctx, &c->unit_len_ctx,
+ flex_container->style);
+ if (style == NULL)
+ return false;
+
+ implied_flex_item = box_create(NULL, style, true,
+ flex_container->href,
+ flex_container->target,
+ NULL, NULL, c->bctx);
+ if (implied_flex_item == NULL) {
+ css_computed_style_destroy(style);
+ return false;
+ }
+ implied_flex_item->type = BOX_BLOCK;
+
+ if (child->prev == NULL)
+ flex_container->children = implied_flex_item;
+ else
+ child->prev->next = implied_flex_item;
+
+ implied_flex_item->prev = child->prev;
+
+ while (child != NULL &&
+ child->type == BOX_INLINE_CONTAINER) {
+ box_add_child(implied_flex_item, child);
+
+ next_child = child->next;
+ child->next = NULL;
+ child = next_child;
+ }
+
+ implied_flex_item->last->next = NULL;
+ implied_flex_item->next = next_child = child;
+ if (implied_flex_item->next != NULL)
+ implied_flex_item->next->prev = implied_flex_item;
+ else
+ flex_container->last = implied_flex_item;
+ implied_flex_item->parent = flex_container;
+
+ if (box_normalise_block(implied_flex_item,
+ root, c) == false)
+ return false;
+ break;
+
+ case BOX_TABLE:
+ if (box_normalise_table(child, root, c) == false)
+ return false;
+ break;
+ case BOX_INLINE:
+ case BOX_INLINE_END:
+ case BOX_INLINE_FLEX:
+ case BOX_INLINE_BLOCK:
+ case BOX_FLOAT_LEFT:
+ case BOX_FLOAT_RIGHT:
+ case BOX_BR:
+ case BOX_TEXT:
+ /* should have been wrapped in inline
+ container by convert_xml_to_box() */
+ assert(0);
+ break;
+ case BOX_TABLE_ROW_GROUP:
+ case BOX_TABLE_ROW:
+ case BOX_TABLE_CELL:
+ /* insert implied table */
+ assert(flex_container->style != NULL);
+
+ ctx.ctx = c->select_ctx;
+ ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL);
+ ctx.base_url = c->base_url;
+ ctx.universal = c->universal;
+
+ style = nscss_get_blank_style(&ctx, &c->unit_len_ctx,
+ flex_container->style);
+ if (style == NULL)
+ return false;
+
+ implied_flex_item = box_create(NULL, style, true,
+ flex_container->href,
+ flex_container->target,
+ NULL, NULL, c->bctx);
+ if (implied_flex_item == NULL) {
+ css_computed_style_destroy(style);
+ return false;
+ }
+ implied_flex_item->type = BOX_TABLE;
+
+ if (child->prev == NULL)
+ flex_container->children = implied_flex_item;
+ else
+ child->prev->next = implied_flex_item;
+
+ implied_flex_item->prev = child->prev;
+
+ while (child != NULL && (
+ child->type == BOX_TABLE_ROW_GROUP ||
+ child->type == BOX_TABLE_ROW ||
+ child->type == BOX_TABLE_CELL)) {
+ box_add_child(implied_flex_item, child);
+
+ next_child = child->next;
+ child->next = NULL;
+ child = next_child;
+ }
+
+ implied_flex_item->last->next = NULL;
+ implied_flex_item->next = next_child = child;
+ if (implied_flex_item->next != NULL)
+ implied_flex_item->next->prev = implied_flex_item;
+ else
+ flex_container->last = implied_flex_item;
+ implied_flex_item->parent = flex_container;
+
+ if (box_normalise_table(implied_flex_item,
+ root, c) == false)
+ return false;
+ break;
+ default:
+ assert(0);
+ }
+ }
+
+ return true;
+}
static bool
box_normalise_inline_container(struct box *cont,
@@ -836,6 +1020,11 @@ box_normalise_inline_container(struct box *cont,
if (box_normalise_block(child, root, c) == false)
return false;
break;
+ case BOX_INLINE_FLEX:
+ /* ok */
+ if (box_normalise_flex(child, root, c) == false)
+ return false;
+ break;
case BOX_FLOAT_LEFT:
case BOX_FLOAT_RIGHT:
/* ok */
@@ -852,6 +1041,11 @@ box_normalise_inline_container(struct box *cont,
c) == false)
return false;
break;
+ case BOX_FLEX:
+ if (box_normalise_flex(child->children, root,
+ c) == false)
+ return false;
+ break;
default:
assert(0);
}
@@ -870,6 +1064,7 @@ box_normalise_inline_container(struct box *cont,
box_free(child);
}
break;
+ case BOX_FLEX:
case BOX_BLOCK:
case BOX_INLINE_CONTAINER:
case BOX_TABLE:
@@ -888,7 +1083,6 @@ box_normalise_inline_container(struct box *cont,
return true;
}
-
/* Exported function documented in html/box_normalise.h */
bool
box_normalise_block(struct box *block, const struct box *root, html_content *c)
@@ -920,6 +1114,11 @@ box_normalise_block(struct box *block, const struct box *root, html_content *c)
next_child = child->next; /* child may be destroyed */
switch (child->type) {
+ case BOX_FLEX:
+ /* ok */
+ if (box_normalise_flex(child, root, c) == false)
+ return false;
+ break;
case BOX_BLOCK:
/* ok */
if (box_normalise_block(child, root, c) == false)
@@ -935,6 +1134,7 @@ box_normalise_block(struct box *block, const struct box *root, html_content *c)
break;
case BOX_INLINE:
case BOX_INLINE_END:
+ case BOX_INLINE_FLEX:
case BOX_INLINE_BLOCK:
case BOX_FLOAT_LEFT:
case BOX_FLOAT_RIGHT:
diff --git a/content/handlers/html/box_normalise.h b/content/handlers/html/box_normalise.h
index 591feab8d..377cd9019 100644
--- a/content/handlers/html/box_normalise.h
+++ b/content/handlers/html/box_normalise.h
@@ -50,14 +50,15 @@
* The tree is modified to satisfy the following:
* \code
* parent permitted child nodes
- * BLOCK, INLINE_BLOCK BLOCK, INLINE_CONTAINER, TABLE
- * INLINE_CONTAINER INLINE, INLINE_BLOCK, FLOAT_LEFT, FLOAT_RIGHT, BR, TEXT
+ * BLOCK, INLINE_BLOCK BLOCK, INLINE_CONTAINER, TABLE, FLEX
+ * FLEX, INLINE_FLEX BLOCK, INLINE_CONTAINER, TABLE, FLEX
+ * INLINE_CONTAINER INLINE, INLINE_BLOCK, FLOAT_LEFT, FLOAT_RIGHT, BR, TEXT, INLINE_FLEX
* INLINE, TEXT none
* TABLE at least 1 TABLE_ROW_GROUP
* TABLE_ROW_GROUP at least 1 TABLE_ROW
* TABLE_ROW at least 1 TABLE_CELL
- * TABLE_CELL BLOCK, INLINE_CONTAINER, TABLE (same as BLOCK)
- * FLOAT_(LEFT|RIGHT) exactly 1 BLOCK or TABLE
+ * TABLE_CELL BLOCK, INLINE_CONTAINER, TABLE, FLEX (same as BLOCK)
+ * FLOAT_(LEFT|RIGHT) exactly 1 BLOCK, TABLE or FLEX
* \endcode
*/
bool box_normalise_block(struct box *block, const struct box *root, struct html_content *c);
diff --git a/content/handlers/html/box_special.c b/content/handlers/html/box_special.c
index f761557e0..db3c4126d 100644
--- a/content/handlers/html/box_special.c
+++ b/content/handlers/html/box_special.c
@@ -560,8 +560,18 @@ static bool
box_input_text(html_content *html, struct box *box, struct dom_node *node)
{
struct box *inline_container, *inline_box;
+ uint8_t display = css_computed_display_static(box->style);
- box->type = BOX_INLINE_BLOCK;
+ switch (display) {
+ case CSS_DISPLAY_GRID:
+ case CSS_DISPLAY_FLEX:
+ case CSS_DISPLAY_BLOCK:
+ box->type = BOX_BLOCK;
+ break;
+ default:
+ box->type = BOX_INLINE_BLOCK;
+ break;
+ }
inline_container = box_create(NULL, 0, false, 0, 0, 0, 0, html->bctx);
if (!inline_container)
@@ -825,8 +835,8 @@ box_canvas(dom_node *n,
}
*convert_children = false;
- if (box->style &&
- ns_computed_display(box->style, box_is_root(n)) == CSS_DISPLAY_NONE)
+ if (box->style && ns_computed_display(box->style,
+ box_is_root(n)) == CSS_DISPLAY_NONE)
return true;
/* This is replaced content */
@@ -854,8 +864,8 @@ box_embed(dom_node *n,
dom_string *src;
dom_exception err;
- if (box->style &&
- ns_computed_display(box->style, box_is_root(n)) == CSS_DISPLAY_NONE)
+ if (box->style && ns_computed_display(box->style,
+ box_is_root(n)) == CSS_DISPLAY_NONE)
return true;
params = talloc(content->bctx, struct object_params);
@@ -1025,8 +1035,8 @@ box_iframe(dom_node *n,
struct content_html_iframe *iframe;
int i;
- if (box->style &&
- ns_computed_display(box->style, box_is_root(n)) == CSS_DISPLAY_NONE)
+ if (box->style && ns_computed_display(box->style,
+ box_is_root(n)) == CSS_DISPLAY_NONE)
return true;
if (box->style &&
@@ -1154,8 +1164,8 @@ box_image(dom_node *n,
css_unit wunit = CSS_UNIT_PX;
css_unit hunit = CSS_UNIT_PX;
- if (box->style &&
- ns_computed_display(box->style, box_is_root(n)) == CSS_DISPLAY_NONE)
+ if (box->style && ns_computed_display(box->style,
+ box_is_root(n)) == CSS_DISPLAY_NONE)
return true;
/* handle alt text */
@@ -1322,10 +1332,9 @@ box_input(dom_node *n,
corestring_lwc_image)) {
gadget->type = GADGET_IMAGE;
- if (box->style &&
- ns_computed_display(box->style,
+ if (box->style && ns_computed_display(box->style,
box_is_root(n)) != CSS_DISPLAY_NONE &&
- nsoption_bool(foreground_images) == true) {
+ nsoption_bool(foreground_images) == true) {
dom_string *s;
err = dom_element_get_attribute(n, corestring_dom_src, &s);
@@ -1405,8 +1414,8 @@ box_object(dom_node *n,
dom_node *c;
dom_exception err;
- if (box->style &&
- ns_computed_display(box->style, box_is_root(n)) == CSS_DISPLAY_NONE)
+ if (box->style && ns_computed_display(box->style,
+ box_is_root(n)) == CSS_DISPLAY_NONE)
return true;
if (box_get_attribute(n, "usemap", content->bctx, &box->usemap) ==
diff --git a/content/handlers/html/css.c b/content/handlers/html/css.c
index 2434b1783..0bc38844f 100644
--- a/content/handlers/html/css.c
+++ b/content/handlers/html/css.c
@@ -33,6 +33,7 @@
#include "utils/nsoption.h"
#include "utils/corestrings.h"
#include "utils/log.h"
+#include "netsurf/inttypes.h"
#include "netsurf/misc.h"
#include "netsurf/content.h"
#include "content/hlcache.h"
@@ -173,7 +174,7 @@ html_stylesheet_from_domnode(html_content *c,
dom_string_unref(style);
- snprintf(urlbuf, sizeof(urlbuf), "x-ns-css:%u", key);
+ snprintf(urlbuf, sizeof(urlbuf), "x-ns-css:%"PRIu32"", key);
error = nsurl_create(urlbuf, &url);
if (error != NSERROR_OK) {
@@ -395,16 +396,20 @@ bool html_css_process_link(html_content *htmlc, dom_node *node)
if (exc != DOM_NO_ERR || rel == NULL)
return true;
- if (strcasestr(dom_string_data(rel), "stylesheet") == 0) {
+ if (strcasestr(dom_string_data(rel), "stylesheet") == NULL) {
dom_string_unref(rel);
return true;
- } else if (strcasestr(dom_string_data(rel), "alternate") != 0) {
+ } else if (strcasestr(dom_string_data(rel), "alternate") != NULL) {
/* Ignore alternate stylesheets */
dom_string_unref(rel);
return true;
}
dom_string_unref(rel);
+ if (nsoption_bool(author_level_css) == false) {
+ return true;
+ }
+
/* type='text/css' or not present */
exc = dom_element_get_attribute(node, corestring_dom_type, &type_attr);
if (exc == DOM_NO_ERR && type_attr != NULL) {
diff --git a/content/handlers/html/dom_event.c b/content/handlers/html/dom_event.c
index 36a020b6d..d42882515 100644
--- a/content/handlers/html/dom_event.c
+++ b/content/handlers/html/dom_event.c
@@ -25,6 +25,7 @@
#include <string.h>
#include "utils/config.h"
+#include "utils/utils.h"
#include "utils/corestrings.h"
#include "utils/nsoption.h"
#include "utils/log.h"
@@ -622,7 +623,9 @@ dom_default_action_DOMNodeInserted_cb(struct dom_event *evt, void *pw)
break;
case DOM_HTML_ELEMENT_TYPE_STYLE:
- html_css_process_style(htmlc, (dom_node *)node);
+ if (nsoption_bool(author_level_css)) {
+ html_css_process_style(htmlc, (dom_node *)node);
+ }
break;
case DOM_HTML_ELEMENT_TYPE_SCRIPT:
@@ -689,6 +692,7 @@ dom_default_action_DOMNodeInsertedIntoDocument_cb(struct dom_event *evt,
switch (tag_type) {
case DOM_HTML_ELEMENT_TYPE_SCRIPT:
dom_SCRIPT_showed_up(htmlc, (dom_html_script_element *) node);
+ fallthrough;
default:
break;
}
@@ -730,11 +734,15 @@ dom_default_action_DOMSubtreeModified_cb(struct dom_event *evt, void *pw)
switch (tag_type) {
case DOM_HTML_ELEMENT_TYPE_STYLE:
- html_css_update_style(htmlc, (dom_node *)node);
+ if (nsoption_bool(author_level_css)) {
+ html_css_update_style(htmlc,
+ (dom_node *)node);
+ }
break;
case DOM_HTML_ELEMENT_TYPE_TEXTAREA:
case DOM_HTML_ELEMENT_TYPE_INPUT:
html_texty_element_update(htmlc, (dom_node *)node);
+ fallthrough;
default:
break;
}
diff --git a/content/handlers/html/form.c b/content/handlers/html/form.c
index 97ec19518..9b6768a56 100644
--- a/content/handlers/html/form.c
+++ b/content/handlers/html/form.c
@@ -41,6 +41,7 @@
#include "utils/utf8.h"
#include "utils/ascii.h"
#include "netsurf/browser_window.h"
+#include "netsurf/inttypes.h"
#include "netsurf/mouse.h"
#include "netsurf/plotters.h"
#include "netsurf/misc.h"
@@ -486,7 +487,7 @@ form_dom_to_data_select(dom_html_select_element *select_element,
&option_element);
if (exp != DOM_NO_ERR) {
NSLOG(netsurf, INFO,
- "Could not get options item %d", option_index);
+ "Could not get options item %"PRId32, option_index);
res = NSERROR_DOM;
} else {
res = form_dom_to_data_select_option(
@@ -1100,7 +1101,7 @@ form_dom_to_data(struct form *form,
exp = dom_html_collection_item(elements, element_idx, &element);
if (exp != DOM_NO_ERR) {
NSLOG(netsurf, INFO,
- "retrieving form element %d failed with %d",
+ "retrieving form element %"PRIu32" failed with %d",
element_idx, exp);
res = NSERROR_DOM;
goto form_dom_to_data_error;
@@ -1110,7 +1111,7 @@ form_dom_to_data(struct form *form,
exp = dom_node_get_node_name(element, &nodename);
if (exp != DOM_NO_ERR) {
NSLOG(netsurf, INFO,
- "getting element node name %d failed with %d",
+ "getting element node name %"PRIu32" failed with %d",
element_idx, exp);
dom_node_unref(element);
res = NSERROR_DOM;
@@ -2001,15 +2002,33 @@ void form_radio_set(struct form_control *radio)
if (radio->selected)
return;
- for (control = radio->form->controls; control;
- control = control->next) {
+ /* Clear selected state for other controls in
+ * the same radio button group */
+ for (control = radio->form->controls;
+ control != NULL;
+ control = control->next) {
+ /* Only interested in radio inputs */
if (control->type != GADGET_RADIO)
continue;
+
+ /* Ignore ourself */
if (control == radio)
continue;
- if (strcmp(control->name, radio->name) != 0)
+
+ /* Ignore inputs where:
+ * a) this or the other control have no name attribute
+ * b) this or the other control have an empty name attribute
+ * c) the control names do not match
+ */
+ if ((control->name == NULL) ||
+ (radio->name == NULL) ||
+ (control->name[0] == '\0') ||
+ (radio->name[0] == '\0') ||
+ strcmp(control->name, radio->name) != 0)
continue;
+ /* Other control is in the same radio button group: clear its
+ * selected state */
if (control->selected) {
control->selected = false;
dom_html_input_element_set_checked(control->node, false);
diff --git a/content/handlers/html/html.c b/content/handlers/html/html.c
index 2b6b1a865..82f5f1388 100644
--- a/content/handlers/html/html.c
+++ b/content/handlers/html/html.c
@@ -123,7 +123,7 @@ bool fire_generic_dom_event(dom_string *type, dom_node *target,
return false;
}
NSLOG(netsurf, INFO, "Dispatching '%*s' against %p",
- dom_string_length(type), dom_string_data(type), target);
+ (int)dom_string_length(type), dom_string_data(type), target);
result = fire_dom_event(evt, target);
dom_event_unref(evt);
return result;
@@ -200,7 +200,7 @@ bool fire_dom_keyboard_event(dom_string *type, dom_node *target,
}
NSLOG(netsurf, INFO, "Dispatching '%*s' against %p",
- dom_string_length(type), dom_string_data(type), target);
+ (int)dom_string_length(type), dom_string_data(type), target);
result = fire_dom_event((dom_event *) evt, target);
dom_event_unref(evt);
diff --git a/content/handlers/html/interaction.c b/content/handlers/html/interaction.c
index 026ef1ee7..0a843e026 100644
--- a/content/handlers/html/interaction.c
+++ b/content/handlers/html/interaction.c
@@ -899,7 +899,7 @@ gadget_mouse_action(html_content *html,
}
free(oldcoords);
}
- /* Fall through */
+ fallthrough;
case GADGET_SUBMIT:
if (mas->gadget.control->form) {
@@ -1465,7 +1465,7 @@ html_mouse_action(struct content *c,
int x, int y)
{
html_content *html = (html_content *)c;
- nserror res;
+ nserror res = NSERROR_OK;
/* handle open select menu */
if (html->visible_select_menu != NULL) {
@@ -1493,7 +1493,7 @@ html_mouse_action(struct content *c,
break;
case HTML_DRAG_NONE:
- res = mouse_action_drag_none(html, bw, mouse, x, y);
+ res = mouse_action_drag_none(html, bw, mouse, x, y);
break;
default:
@@ -1669,7 +1669,7 @@ void html_set_drag_type(html_content *html, html_drag_type drag_type,
case HTML_DRAG_SELECTION:
assert(drag_owner.no_owner == true);
- /* Fall through */
+ fallthrough;
case HTML_DRAG_TEXTAREA_SELECTION:
case HTML_DRAG_CONTENT_SELECTION:
msg_data.drag.type = CONTENT_DRAG_SELECTION;
@@ -1800,7 +1800,7 @@ void html_set_selection(html_content *html, html_selection_type selection_type,
break;
case HTML_SELECTION_SELF:
assert(selection_owner.none == false);
- /* fall through */
+ fallthrough;
case HTML_SELECTION_TEXTAREA:
case HTML_SELECTION_CONTENT:
msg_data.selection.selection = true;
diff --git a/content/handlers/html/layout.c b/content/handlers/html/layout.c
index c06fdf690..76ce24df5 100644
--- a/content/handlers/html/layout.c
+++ b/content/handlers/html/layout.c
@@ -67,24 +67,11 @@
#include "html/font.h"
#include "html/form_internal.h"
#include "html/layout.h"
+#include "html/layout_internal.h"
#include "html/table.h"
-#define AUTO INT_MIN
-
-/* Fixed point percentage (a) of an integer (b), to an integer */
-#define FPCT_OF_INT_TOINT(a, b) (FIXTOINT(FDIV((a * b), F_100)))
-
-typedef uint8_t (*css_len_func)(
- const css_computed_style *style,
- css_fixed *length, css_unit *unit);
-typedef uint8_t (*css_border_style_func)(
- const css_computed_style *style);
-typedef uint8_t (*css_border_color_func)(
- const css_computed_style *style,
- css_color *color);
-
/** Array of per-side access functions for computed style margins. */
-static const css_len_func margin_funcs[4] = {
+const css_len_func margin_funcs[4] = {
[TOP] = css_computed_margin_top,
[RIGHT] = css_computed_margin_right,
[BOTTOM] = css_computed_margin_bottom,
@@ -92,7 +79,7 @@ static const css_len_func margin_funcs[4] = {
};
/** Array of per-side access functions for computed style paddings. */
-static const css_len_func padding_funcs[4] = {
+const css_len_func padding_funcs[4] = {
[TOP] = css_computed_padding_top,
[RIGHT] = css_computed_padding_right,
[BOTTOM] = css_computed_padding_bottom,
@@ -100,7 +87,7 @@ static const css_len_func padding_funcs[4] = {
};
/** Array of per-side access functions for computed style border_widths. */
-static const css_len_func border_width_funcs[4] = {
+const css_len_func border_width_funcs[4] = {
[TOP] = css_computed_border_top_width,
[RIGHT] = css_computed_border_right_width,
[BOTTOM] = css_computed_border_bottom_width,
@@ -108,7 +95,7 @@ static const css_len_func border_width_funcs[4] = {
};
/** Array of per-side access functions for computed style border styles. */
-static const css_border_style_func border_style_funcs[4] = {
+const css_border_style_func border_style_funcs[4] = {
[TOP] = css_computed_border_top_style,
[RIGHT] = css_computed_border_right_style,
[BOTTOM] = css_computed_border_bottom_style,
@@ -116,7 +103,7 @@ static const css_border_style_func border_style_funcs[4] = {
};
/** Array of per-side access functions for computed style border colors. */
-static const css_border_color_func border_color_funcs[4] = {
+const css_border_color_func border_color_funcs[4] = {
[TOP] = css_computed_border_top_color,
[RIGHT] = css_computed_border_right_color,
[BOTTOM] = css_computed_border_bottom_color,
@@ -124,10 +111,6 @@ static const css_border_color_func border_color_funcs[4] = {
};
/* forward declaration to break cycles */
-static bool layout_block_context(
- struct box *block,
- int viewport_height,
- html_content *content);
static void layout_minmax_block(
struct box *block,
const struct gui_layout_table *font_func,
@@ -263,75 +246,6 @@ static int layout_text_indent(
/**
- * Determine width of margin, borders, and padding on one side of a box.
- *
- * \param unit_len_ctx CSS length conversion context for document
- * \param style style to measure
- * \param side side of box to measure
- * \param margin whether margin width is required
- * \param border whether border width is required
- * \param padding whether padding width is required
- * \param fixed increased by sum of fixed margin, border, and padding
- * \param frac increased by sum of fractional margin and padding
- */
-static void
-calculate_mbp_width(const css_unit_ctx *unit_len_ctx,
- const css_computed_style *style,
- unsigned int side,
- bool margin,
- bool border,
- bool padding,
- int *fixed,
- float *frac)
-{
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- assert(style);
-
- /* margin */
- if (margin) {
- enum css_margin_e type;
-
- type = margin_funcs[side](style, &value, &unit);
- if (type == CSS_MARGIN_SET) {
- if (unit == CSS_UNIT_PCT) {
- *frac += FIXTOINT(FDIV(value, F_100));
- } else {
- *fixed += FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- }
- }
-
- /* border */
- if (border) {
- if (border_style_funcs[side](style) !=
- CSS_BORDER_STYLE_NONE) {
- border_width_funcs[side](style, &value, &unit);
-
- *fixed += FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- }
-
- /* padding */
- if (padding) {
- padding_funcs[side](style, &value, &unit);
- if (unit == CSS_UNIT_PCT) {
- *frac += FIXTOINT(FDIV(value, F_100));
- } else {
- *fixed += FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- }
-}
-
-
-/**
* Calculate minimum and maximum width of a table.
*
* \param table box of type TABLE
@@ -360,7 +274,7 @@ static void layout_minmax_table(struct box *table,
return;
if (table_calculate_column_types(&content->unit_len_ctx, table) == false) {
- NSLOG(netsurf, WARNING,
+ NSLOG(netsurf, ERROR,
"Could not establish table column types.");
return;
}
@@ -588,11 +502,7 @@ layout_minmax_line(struct box *first,
css_fixed value = 0;
css_unit unit = CSS_UNIT_PX;
- assert(b->type == BOX_INLINE || b->type == BOX_INLINE_BLOCK ||
- b->type == BOX_FLOAT_LEFT ||
- b->type == BOX_FLOAT_RIGHT ||
- b->type == BOX_BR || b->type == BOX_TEXT ||
- b->type == BOX_INLINE_END);
+ assert(lh__box_is_inline_content(b));
NSLOG(layout, DEBUG, "%p: min %i, max %i", b, min, max);
@@ -601,13 +511,13 @@ layout_minmax_line(struct box *first,
break;
}
- if (b->type == BOX_FLOAT_LEFT || b->type == BOX_FLOAT_RIGHT) {
+ if (lh__box_is_float_box(b)) {
assert(b->children);
- if (b->children->type == BOX_BLOCK)
- layout_minmax_block(b->children, font_func,
+ if (b->children->type == BOX_TABLE)
+ layout_minmax_table(b->children, font_func,
content);
else
- layout_minmax_table(b->children, font_func,
+ layout_minmax_block(b->children, font_func,
content);
b->min_width = b->children->min_width;
b->max_width = b->children->max_width;
@@ -617,7 +527,7 @@ layout_minmax_line(struct box *first,
continue;
}
- if (b->type == BOX_INLINE_BLOCK) {
+ if (b->type == BOX_INLINE_BLOCK || b->type == BOX_INLINE_FLEX) {
layout_minmax_block(b, font_func, content);
if (min < b->min_width)
min = b->min_width;
@@ -668,8 +578,7 @@ layout_minmax_line(struct box *first,
continue;
}
- if (!b->object && !(b->flags & IFRAME) && !b->gadget &&
- !(b->flags & REPLACE_DIM)) {
+ if (lh__box_is_replace(b) == false) {
/* inline non-replaced, 10.3.1 and 10.6.1 */
bool no_wrap_box;
if (!b->text)
@@ -951,7 +860,6 @@ layout_minmax_inline_container(struct box *inline_container,
inline_container->max_width);
}
-
/**
* Calculate minimum and maximum width of a block.
*
@@ -977,9 +885,13 @@ static void layout_minmax_block(
css_fixed height = 0;
css_unit hunit = CSS_UNIT_PX;
enum css_box_sizing_e bs = CSS_BOX_SIZING_CONTENT_BOX;
+ bool using_min_border_box = false;
+ bool using_max_border_box = false;
bool child_has_height = false;
assert(block->type == BOX_BLOCK ||
+ block->type == BOX_FLEX ||
+ block->type == BOX_INLINE_FLEX ||
block->type == BOX_INLINE_BLOCK ||
block->type == BOX_TABLE_CELL);
@@ -994,9 +906,9 @@ static void layout_minmax_block(
}
/* set whether the minimum width is of any interest for this box */
- if (((block->parent && (block->parent->type == BOX_FLOAT_LEFT ||
- block->parent->type == BOX_FLOAT_RIGHT)) ||
- block->type == BOX_INLINE_BLOCK) &&
+ if (((block->parent && lh__box_is_float_box(block->parent)) ||
+ block->type == BOX_INLINE_BLOCK ||
+ block->type == BOX_INLINE_FLEX) &&
wtype != CSS_WIDTH_SET) {
/* box shrinks to fit; need minimum width */
block->flags |= NEED_MIN;
@@ -1007,6 +919,9 @@ static void layout_minmax_block(
wtype != CSS_WIDTH_SET) {
/* box inside shrink-to-fit context; need minimum width */
block->flags |= NEED_MIN;
+ } else if (block->parent && (block->parent->type == BOX_FLEX)) {
+ /* box is flex item */
+ block->flags |= NEED_MIN;
}
if (block->gadget && (block->gadget->type == GADGET_TEXTBOX ||
@@ -1056,6 +971,7 @@ static void layout_minmax_block(
/* recurse through children */
for (child = block->children; child; child = child->next) {
switch (child->type) {
+ case BOX_FLEX:
case BOX_BLOCK:
layout_minmax_block(child, font_func,
content);
@@ -1097,10 +1013,24 @@ static void layout_minmax_block(
continue;
}
- if (min < child->min_width)
- min = child->min_width;
- if (max < child->max_width)
- max = child->max_width;
+ if (lh__box_is_flex_container(block) &&
+ lh__flex_main_is_horizontal(block)) {
+ if (block->style != NULL &&
+ css_computed_flex_wrap(block->style) ==
+ CSS_FLEX_WRAP_NOWRAP) {
+ min += child->min_width;
+ } else {
+ if (min < child->min_width)
+ min = child->min_width;
+ }
+ max += child->max_width;
+
+ } else {
+ if (min < child->min_width)
+ min = child->min_width;
+ if (max < child->max_width)
+ max = child->max_width;
+ }
if (child_has_height)
block->flags |= HAS_HEIGHT;
@@ -1113,23 +1043,40 @@ static void layout_minmax_block(
}
/* fixed width takes priority */
- if (block->type != BOX_TABLE_CELL && wtype == CSS_WIDTH_SET &&
- wunit != CSS_UNIT_PCT) {
- min = max = FIXTOINT(css_unit_len2device_px(block->style,
- &content->unit_len_ctx, width, wunit));
- if (bs == CSS_BOX_SIZING_BORDER_BOX) {
- int border_box_fixed = 0;
- float border_box_frac = 0;
- calculate_mbp_width(&content->unit_len_ctx,
- block->style, LEFT,
- false, true, true,
- &border_box_fixed, &border_box_frac);
- calculate_mbp_width(&content->unit_len_ctx,
- block->style, RIGHT,
- false, true, true,
- &border_box_fixed, &border_box_frac);
- if (min < border_box_fixed) {
- min = max = border_box_fixed;
+ if (block->type != BOX_TABLE_CELL && !lh__box_is_flex_item(block)) {
+ bool border_box = bs == CSS_BOX_SIZING_BORDER_BOX;
+ enum css_max_width_e max_type;
+ enum css_min_width_e min_type;
+ css_unit unit = CSS_UNIT_PX;
+ css_fixed value = 0;
+
+ if (wtype == CSS_WIDTH_SET && wunit != CSS_UNIT_PCT) {
+ min = max = FIXTOINT(
+ css_unit_len2device_px(block->style,
+ &content->unit_len_ctx, width, wunit));
+ using_max_border_box = border_box;
+ using_min_border_box = border_box;
+ }
+
+ min_type = css_computed_min_width(block->style, &value, &unit);
+ if (min_type == CSS_MIN_WIDTH_SET && unit != CSS_UNIT_PCT) {
+ int val = FIXTOINT(css_unit_len2device_px(block->style,
+ &content->unit_len_ctx, value, unit));
+
+ if (min < val) {
+ min = val;
+ using_min_border_box = border_box;
+ }
+ }
+
+ max_type = css_computed_max_width(block->style, &value, &unit);
+ if (max_type == CSS_MAX_WIDTH_SET && unit != CSS_UNIT_PCT) {
+ int val = FIXTOINT(css_unit_len2device_px(block->style,
+ &content->unit_len_ctx, value, unit));
+
+ if (val >= 0 && max > val) {
+ max = val;
+ using_max_border_box = border_box;
}
}
}
@@ -1143,22 +1090,30 @@ static void layout_minmax_block(
/* add margins, border, padding to min, max widths */
/* Note: we don't know available width here so percentage margin
* and paddings are wrong. */
- if (bs == CSS_BOX_SIZING_BORDER_BOX && wtype == CSS_WIDTH_SET) {
- /* Border and padding included in width, so just get margin */
- calculate_mbp_width(&content->unit_len_ctx,
- block->style, LEFT, true, false, false,
- &extra_fixed, &extra_frac);
- calculate_mbp_width(&content->unit_len_ctx,
- block->style, RIGHT, true, false, false,
- &extra_fixed, &extra_frac);
- } else {
- calculate_mbp_width(&content->unit_len_ctx,
- block->style, LEFT, true, true, true,
- &extra_fixed, &extra_frac);
- calculate_mbp_width(&content->unit_len_ctx,
- block->style, RIGHT, true, true, true,
- &extra_fixed, &extra_frac);
+ calculate_mbp_width(&content->unit_len_ctx, block->style, LEFT,
+ false, true, true, &extra_fixed, &extra_frac);
+ calculate_mbp_width(&content->unit_len_ctx, block->style, RIGHT,
+ false, true, true, &extra_fixed, &extra_frac);
+
+ if (using_max_border_box) {
+ max -= extra_fixed;
+ max = max(max, 0);
+ }
+
+ if (using_min_border_box) {
+ min -= extra_fixed;
+ min = max(min, 0);
+ }
+
+ if (max < min) {
+ min = max;
}
+
+ calculate_mbp_width(&content->unit_len_ctx, block->style, LEFT,
+ true, false, false, &extra_fixed, &extra_frac);
+ calculate_mbp_width(&content->unit_len_ctx, block->style, RIGHT,
+ true, false, false, &extra_fixed, &extra_frac);
+
if (extra_fixed < 0)
extra_fixed = 0;
if (extra_frac < 0)
@@ -1177,376 +1132,8 @@ static void layout_minmax_block(
block->max_width = (max + extra_fixed) / (1.0 - extra_frac);
}
- assert(0 <= block->min_width && block->min_width <= block->max_width);
-}
-
-
-/**
- * Adjust a specified width or height for the box-sizing property.
- *
- * This turns the specified dimension into a content-box dimension.
- *
- * \param unit_len_ctx Length conversion context
- * \param box gadget to adjust dimensions of
- * \param available_width width of containing block
- * \param setwidth set true if the dimension to be tweaked is a width,
- * else set false for a height
- * \param dimension current value for given width/height dimension.
- * updated to new value after consideration of
- * gadget properties.
- */
-static void layout_handle_box_sizing(
- const css_unit_ctx *unit_len_ctx,
- struct box *box,
- int available_width,
- bool setwidth,
- int *dimension)
-{
- enum css_box_sizing_e bs;
-
- assert(box && box->style);
-
- bs = css_computed_box_sizing(box->style);
-
- if (bs == CSS_BOX_SIZING_BORDER_BOX) {
- int orig = *dimension;
- int fixed = 0;
- float frac = 0;
-
- calculate_mbp_width(unit_len_ctx, box->style,
- setwidth ? LEFT : TOP,
- false, true, true, &fixed, &frac);
- calculate_mbp_width(unit_len_ctx, box->style,
- setwidth ? RIGHT : BOTTOM,
- false, true, true, &fixed, &frac);
- orig -= frac * available_width + fixed;
- *dimension = orig > 0 ? orig : 0;
- }
-}
-
-
-/**
- * Calculate width, height, and thickness of margins, paddings, and borders.
- *
- * \param unit_len_ctx Length conversion context
- * \param available_width width of containing block
- * \param viewport_height height of viewport in pixels or -ve if unknown
- * \param box current box
- * \param style style giving width, height, margins, paddings,
- * and borders
- * \param width updated to width, may be NULL
- * \param height updated to height, may be NULL
- * \param max_width updated to max-width, may be NULL
- * \param min_width updated to min-width, may be NULL
- * \param max_height updated to max-height, may be NULL
- * \param min_height updated to min-height, may be NULL
- * \param margin filled with margins, may be NULL
- * \param padding filled with paddings, may be NULL
- * \param border filled with border widths, may be NULL
- */
-static void
-layout_find_dimensions(const css_unit_ctx *unit_len_ctx,
- int available_width,
- int viewport_height,
- struct box *box,
- const css_computed_style *style,
- int *width,
- int *height,
- int *max_width,
- int *min_width,
- int *max_height,
- int *min_height,
- int margin[4],
- int padding[4],
- struct box_border border[4])
-{
- struct box *containing_block = NULL;
- unsigned int i;
-
- if (width) {
- enum css_width_e wtype;
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- wtype = css_computed_width(style, &value, &unit);
-
- if (wtype == CSS_WIDTH_SET) {
- if (unit == CSS_UNIT_PCT) {
- *width = FPCT_OF_INT_TOINT(
- value, available_width);
- } else {
- *width = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- } else {
- *width = AUTO;
- }
-
- if (*width != AUTO) {
- layout_handle_box_sizing(unit_len_ctx, box, available_width,
- true, width);
- }
- }
-
- if (height) {
- enum css_height_e htype;
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- htype = css_computed_height(style, &value, &unit);
-
- if (htype == CSS_HEIGHT_SET) {
- if (unit == CSS_UNIT_PCT) {
- enum css_height_e cbhtype;
-
- if (css_computed_position(box->style) ==
- CSS_POSITION_ABSOLUTE &&
- box->parent) {
- /* Box is absolutely positioned */
- assert(box->float_container);
- containing_block = box->float_container;
- } else if (box->float_container &&
- css_computed_position(box->style) !=
- CSS_POSITION_ABSOLUTE &&
- (css_computed_float(box->style) ==
- CSS_FLOAT_LEFT ||
- css_computed_float(box->style) ==
- CSS_FLOAT_RIGHT)) {
- /* Box is a float */
- assert(box->parent &&
- box->parent->parent &&
- box->parent->parent->parent);
-
- containing_block =
- box->parent->parent->parent;
- } else if (box->parent && box->parent->type !=
- BOX_INLINE_CONTAINER) {
- /* Box is a block level element */
- containing_block = box->parent;
- } else if (box->parent && box->parent->type ==
- BOX_INLINE_CONTAINER) {
- /* Box is an inline block */
- assert(box->parent->parent);
- containing_block = box->parent->parent;
- }
-
- if (containing_block) {
- css_fixed f = 0;
- css_unit u = CSS_UNIT_PX;
-
- cbhtype = css_computed_height(
- containing_block->style,
- &f, &u);
- }
-
- if (containing_block &&
- containing_block->height != AUTO &&
- (css_computed_position(box->style) ==
- CSS_POSITION_ABSOLUTE ||
- cbhtype == CSS_HEIGHT_SET)) {
- /* Box is absolutely positioned or its
- * containing block has a valid
- * specified height.
- * (CSS 2.1 Section 10.5) */
- *height = FPCT_OF_INT_TOINT(value,
- containing_block->height);
- } else if ((!box->parent ||
- !box->parent->parent) &&
- viewport_height >= 0) {
- /* If root element or it's child
- * (HTML or BODY) */
- *height = FPCT_OF_INT_TOINT(value,
- viewport_height);
- } else {
- /* precentage height not permissible
- * treat height as auto */
- *height = AUTO;
- }
- } else {
- *height = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- } else {
- *height = AUTO;
- }
-
- if (*height != AUTO) {
- layout_handle_box_sizing(unit_len_ctx, box, available_width,
- false, height);
- }
- }
-
- if (max_width) {
- enum css_max_width_e type;
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- type = css_computed_max_width(style, &value, &unit);
-
- if (type == CSS_MAX_WIDTH_SET) {
- if (unit == CSS_UNIT_PCT) {
- *max_width = FPCT_OF_INT_TOINT(value,
- available_width);
- } else {
- *max_width = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- } else {
- /* Inadmissible */
- *max_width = -1;
- }
-
- if (*max_width != -1) {
- layout_handle_box_sizing(unit_len_ctx, box, available_width,
- true, max_width);
- }
- }
-
- if (min_width) {
- enum css_min_width_e type;
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- type = ns_computed_min_width(style, &value, &unit);
-
- if (type == CSS_MIN_WIDTH_SET) {
- if (unit == CSS_UNIT_PCT) {
- *min_width = FPCT_OF_INT_TOINT(value,
- available_width);
- } else {
- *min_width = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- } else {
- /* Inadmissible */
- *min_width = 0;
- }
-
- if (*min_width != 0) {
- layout_handle_box_sizing(unit_len_ctx, box, available_width,
- true, min_width);
- }
- }
-
- if (max_height) {
- enum css_max_height_e type;
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- type = css_computed_max_height(style, &value, &unit);
-
- if (type == CSS_MAX_HEIGHT_SET) {
- if (unit == CSS_UNIT_PCT) {
- /* TODO: handle percentage */
- *max_height = -1;
- } else {
- *max_height = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- } else {
- /* Inadmissible */
- *max_height = -1;
- }
- }
-
- if (min_height) {
- enum css_min_height_e type;
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- type = ns_computed_min_height(style, &value, &unit);
-
- if (type == CSS_MIN_HEIGHT_SET) {
- if (unit == CSS_UNIT_PCT) {
- /* TODO: handle percentage */
- *min_height = 0;
- } else {
- *min_height = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- } else {
- /* Inadmissible */
- *min_height = 0;
- }
- }
-
- for (i = 0; i != 4; i++) {
- if (margin) {
- enum css_margin_e type = CSS_MARGIN_AUTO;
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- type = margin_funcs[i](style, &value, &unit);
-
- if (type == CSS_MARGIN_SET) {
- if (unit == CSS_UNIT_PCT) {
- margin[i] = FPCT_OF_INT_TOINT(value,
- available_width);
- } else {
- margin[i] = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- } else {
- margin[i] = AUTO;
- }
- }
-
- if (padding) {
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- padding_funcs[i](style, &value, &unit);
-
- if (unit == CSS_UNIT_PCT) {
- padding[i] = FPCT_OF_INT_TOINT(value,
- available_width);
- } else {
- padding[i] = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
- }
- }
-
- /* Table cell borders are populated in table.c */
- if (border && box->type != BOX_TABLE_CELL) {
- enum css_border_style_e bstyle = CSS_BORDER_STYLE_NONE;
- css_color color = 0;
- css_fixed value = 0;
- css_unit unit = CSS_UNIT_PX;
-
- border_width_funcs[i](style, &value, &unit);
- bstyle = border_style_funcs[i](style);
- border_color_funcs[i](style, &color);
-
- border[i].style = bstyle;
- border[i].c = color;
-
- if (bstyle == CSS_BORDER_STYLE_HIDDEN ||
- bstyle == CSS_BORDER_STYLE_NONE)
- /* spec unclear: following Mozilla */
- border[i].width = 0;
- else
- border[i].width = FIXTOINT(css_unit_len2device_px(
- style, unit_len_ctx,
- value, unit));
-
- /* Special case for border-collapse: make all borders
- * on table/table-row-group/table-row zero width. */
- if (css_computed_border_collapse(style) ==
- CSS_BORDER_COLLAPSE_COLLAPSE &&
- (box->type == BOX_TABLE ||
- box->type == BOX_TABLE_ROW_GROUP ||
- box->type == BOX_TABLE_ROW))
- border[i].width = 0;
- }
- }
+ assert(0 <= block->min_width);
+ assert(block->min_width <= block->max_width);
}
@@ -2013,15 +1600,10 @@ static void layout_move_children(struct box *box, int x, int y)
}
-/**
- * Layout a table.
- *
- * \param table table to layout
- * \param available_width width of containing block
- * \param content memory pool for any new boxes
- * \return true on success, false on memory exhaustion
- */
-static bool layout_table(struct box *table, int available_width,
+/* Documented in layout_internal.h */
+bool layout_table(
+ struct box *table,
+ int available_width,
html_content *content)
{
unsigned int columns = table->columns; /* total columns */
@@ -2713,7 +2295,9 @@ static bool layout_block_object(struct box *block)
{
assert(block);
assert(block->type == BOX_BLOCK ||
+ block->type == BOX_FLEX ||
block->type == BOX_INLINE_BLOCK ||
+ block->type == BOX_INLINE_FLEX ||
block->type == BOX_TABLE ||
block->type == BOX_TABLE_CELL);
assert(block->object);
@@ -2721,7 +2305,7 @@ static bool layout_block_object(struct box *block)
NSLOG(layout, DEBUG, "block %p, object %p, width %i", block,
hlcache_handle_get_url(block->object), block->width);
- if (content_get_type(block->object) == CONTENT_HTML) {
+ if (content_can_reformat(block->object)) {
content_reformat(block->object, false, block->width, 1);
} else {
/* Non-HTML objects */
@@ -3007,12 +2591,20 @@ layout_float_find_dimensions(
*/
static bool layout_float(struct box *b, int width, html_content *content)
{
- assert(b->type == BOX_TABLE || b->type == BOX_BLOCK ||
- b->type == BOX_INLINE_BLOCK);
+ assert(b->type == BOX_TABLE ||
+ b->type == BOX_BLOCK ||
+ b->type == BOX_INLINE_BLOCK ||
+ b->type == BOX_FLEX ||
+ b->type == BOX_INLINE_FLEX);
layout_float_find_dimensions(&content->unit_len_ctx, width, b->style, b);
- if (b->type == BOX_TABLE) {
- if (!layout_table(b, width, content))
- return false;
+ if (b->type == BOX_TABLE || b->type == BOX_INLINE_FLEX) {
+ if (b->type == BOX_TABLE) {
+ if (!layout_table(b, width, content))
+ return false;
+ } else {
+ if (!layout_flex(b, width, content))
+ return false;
+ }
if (b->margin[LEFT] == AUTO)
b->margin[LEFT] = 0;
if (b->margin[RIGHT] == AUTO)
@@ -3021,8 +2613,9 @@ static bool layout_float(struct box *b, int width, html_content *content)
b->margin[TOP] = 0;
if (b->margin[BOTTOM] == AUTO)
b->margin[BOTTOM] = 0;
- } else
+ } else {
return layout_block_context(b, -1, content);
+ }
return true;
}
@@ -3209,20 +2802,14 @@ layout_line(struct box *first,
for (x = 0, b = first; x <= x1 - x0 && b != 0; b = b->next) {
int min_width, max_width, min_height, max_height;
- assert(b->type == BOX_INLINE || b->type == BOX_INLINE_BLOCK ||
- b->type == BOX_FLOAT_LEFT ||
- b->type == BOX_FLOAT_RIGHT ||
- b->type == BOX_BR || b->type == BOX_TEXT ||
- b->type == BOX_INLINE_END);
-
+ assert(lh__box_is_inline_content(b));
NSLOG(layout, DEBUG, "pass 1: b %p, x %i", b, x);
-
if (b->type == BOX_BR)
break;
- if (b->type == BOX_FLOAT_LEFT || b->type == BOX_FLOAT_RIGHT)
+ if (lh__box_is_float_box(b))
continue;
if (b->type == BOX_INLINE_BLOCK &&
(css_computed_position(b->style) ==
@@ -3236,7 +2823,8 @@ layout_line(struct box *first,
x += space_after;
- if (b->type == BOX_INLINE_BLOCK) {
+ if (b->type == BOX_INLINE_BLOCK ||
+ b->type == BOX_INLINE_FLEX) {
if (b->max_width != UNKNOWN_WIDTH)
if (!layout_float(b, *width, content))
return false;
@@ -3288,8 +2876,7 @@ layout_line(struct box *first,
continue;
}
- if (!b->object && !(b->flags & IFRAME) && !b->gadget &&
- !(b->flags & REPLACE_DIM)) {
+ if (lh__box_is_replace(b) == false) {
/* inline non-replaced, 10.3.1 and 10.6.1 */
b->height = line_height(&content->unit_len_ctx,
b->style ? b->style :
@@ -3397,7 +2984,7 @@ layout_line(struct box *first,
}
/* Reformat object to new box size */
- if (b->object && content_get_type(b->object) == CONTENT_HTML &&
+ if (b->object && content_can_reformat(b->object) &&
b->width !=
content_get_available_width(b->object)) {
css_fixed value = 0;
@@ -3449,10 +3036,7 @@ layout_line(struct box *first,
CSS_POSITION_FIXED)) {
b->x = x + space_after;
- } else if (b->type == BOX_INLINE ||
- b->type == BOX_INLINE_BLOCK ||
- b->type == BOX_TEXT ||
- b->type == BOX_INLINE_END) {
+ } else if (lh__box_is_inline_flow(b)) {
assert(b->width != UNKNOWN_WIDTH);
x_previous = x;
@@ -3460,7 +3044,8 @@ layout_line(struct box *first,
b->x = x;
if ((b->type == BOX_INLINE && !b->inline_end) ||
- b->type == BOX_INLINE_BLOCK) {
+ b->type == BOX_INLINE_BLOCK ||
+ b->type == BOX_INLINE_FLEX) {
b->x += b->margin[LEFT] + b->border[LEFT].width;
x = b->x + b->padding[LEFT] + b->width +
b->padding[RIGHT] +
@@ -3791,9 +3376,7 @@ layout_line(struct box *first,
d->y = *y;
continue;
} else if ((d->type == BOX_INLINE &&
- ((d->object || d->gadget) == false) &&
- !(d->flags & IFRAME) &&
- !(d->flags & REPLACE_DIM)) ||
+ lh__box_is_replace(d) == false) ||
d->type == BOX_BR ||
d->type == BOX_TEXT ||
d->type == BOX_INLINE_END) {
@@ -3914,8 +3497,7 @@ static bool layout_inline_container(struct box *inline_container, int width,
whitespace == CSS_WHITE_SPACE_PRE_WRAP);
}
- if ((!c->object && !(c->flags & REPLACE_DIM) &&
- !(c->flags & IFRAME) &&
+ if ((lh__box_is_object(c) == false &&
c->text && (c->length || is_pre)) ||
c->type == BOX_BR)
has_text_children = true;
@@ -3945,21 +3527,11 @@ static bool layout_inline_container(struct box *inline_container, int width,
}
-/**
- * Layout a block formatting context.
- *
- * \param block BLOCK, INLINE_BLOCK, or TABLE_CELL to layout
- * \param viewport_height Height of viewport in pixels or -ve if unknown
- * \param content Memory pool for any new boxes
- * \return true on success, false on memory exhaustion
- *
- * This function carries out layout of a block and its children, as described
- * in CSS 2.1 9.4.1.
- */
-static bool
-layout_block_context(struct box *block,
- int viewport_height,
- html_content *content)
+/* Documented in layout_intertnal.h */
+bool layout_block_context(
+ struct box *block,
+ int viewport_height,
+ html_content *content)
{
struct box *box;
int cx, cy; /**< current coordinates */
@@ -3974,7 +3546,9 @@ layout_block_context(struct box *block,
assert(block->type == BOX_BLOCK ||
block->type == BOX_INLINE_BLOCK ||
- block->type == BOX_TABLE_CELL);
+ block->type == BOX_TABLE_CELL ||
+ block->type == BOX_FLEX ||
+ block->type == BOX_INLINE_FLEX);
assert(block->width != UNKNOWN_WIDTH);
assert(block->width != AUTO);
@@ -4043,7 +3617,9 @@ layout_block_context(struct box *block,
enum css_overflow_e overflow_x = CSS_OVERFLOW_VISIBLE;
enum css_overflow_e overflow_y = CSS_OVERFLOW_VISIBLE;
- assert(box->type == BOX_BLOCK || box->type == BOX_TABLE ||
+ assert(box->type == BOX_BLOCK ||
+ box->type == BOX_FLEX ||
+ box->type == BOX_TABLE ||
box->type == BOX_INLINE_CONTAINER);
/* Tables are laid out before being positioned, because the
@@ -4094,9 +3670,10 @@ layout_block_context(struct box *block,
* left and right margins to avoid any floats. */
lm = rm = 0;
- if (box->type == BOX_BLOCK || box->flags & IFRAME) {
- if (!box->object && !(box->flags & IFRAME) &&
- !(box->flags & REPLACE_DIM) &&
+ if (box->type == BOX_FLEX ||
+ box->type == BOX_BLOCK ||
+ box->flags & IFRAME) {
+ if (lh__box_is_object(box) == false &&
box->style &&
(overflow_x != CSS_OVERFLOW_VISIBLE ||
overflow_y != CSS_OVERFLOW_VISIBLE)) {
@@ -4181,6 +3758,7 @@ layout_block_context(struct box *block,
/* Vertical margin */
if (((box->type == BOX_BLOCK && (box->flags & HAS_HEIGHT)) ||
+ box->type == BOX_FLEX ||
box->type == BOX_TABLE ||
(box->type == BOX_INLINE_CONTAINER &&
!box_is_first_child(box)) ||
@@ -4205,11 +3783,19 @@ layout_block_context(struct box *block,
/* Unless the box has an overflow style of visible, the box
* establishes a new block context. */
- if (box->type == BOX_BLOCK && box->style &&
- (overflow_x != CSS_OVERFLOW_VISIBLE ||
- overflow_y != CSS_OVERFLOW_VISIBLE)) {
+ if (box->type == BOX_FLEX ||
+ (box->type == BOX_BLOCK && box->style &&
+ (overflow_x != CSS_OVERFLOW_VISIBLE ||
+ overflow_y != CSS_OVERFLOW_VISIBLE))) {
- layout_block_context(box, viewport_height, content);
+ if (box->type == BOX_FLEX) {
+ if (!layout_flex(box, box->width, content)) {
+ return false;
+ }
+ } else {
+ layout_block_context(box,
+ viewport_height, content);
+ }
cy += box->padding[TOP];
@@ -4230,7 +3816,8 @@ layout_block_context(struct box *block,
goto advance_to_next_box;
}
- NSLOG(layout, DEBUG, "box %p, cx %i, cy %i", box, cx, cy);
+ NSLOG(layout, DEBUG, "box %p, cx %i, cy %i, width %i",
+ box, cx, cy, box->width);
/* Layout (except tables). */
if (box->object) {
@@ -4607,7 +4194,7 @@ layout__get_ol_reversed(dom_node *ol_node)
*/
static bool
layout__get_list_item_count(
- dom_node *list_owner, int *count_out)
+ dom_node *list_owner, dom_long *count_out)
{
dom_html_element_type tag_type;
dom_exception exc;
@@ -4679,7 +4266,7 @@ layout__ordered_list_count(
dom_exception exc;
dom_node *child;
int step = 1;
- int next;
+ dom_long next;
if (box->node == NULL) {
return;
@@ -4914,9 +4501,9 @@ layout_compute_offsets(const css_unit_ctx *unit_len_ctx,
css_fixed value = 0;
css_unit unit = CSS_UNIT_PX;
- assert(containing_block->width != UNKNOWN_WIDTH &&
- containing_block->width != AUTO &&
- containing_block->height != AUTO);
+ assert(containing_block->width != UNKNOWN_WIDTH);
+ assert(containing_block->width != AUTO);
+ assert(containing_block->height != AUTO);
/* left */
type = css_computed_left(box->style, &value, &unit);
@@ -5006,7 +4593,9 @@ layout_absolute(struct box *box,
int space;
assert(box->type == BOX_BLOCK || box->type == BOX_TABLE ||
- box->type == BOX_INLINE_BLOCK);
+ box->type == BOX_INLINE_BLOCK ||
+ box->type == BOX_FLEX ||
+ box->type == BOX_INLINE_FLEX);
/* The static position is where the box would be if it was not
* absolutely positioned. The x and y are filled in by
@@ -5024,8 +4613,6 @@ layout_absolute(struct box *box,
containing_block->padding[RIGHT];
containing_block->height += containing_block->padding[TOP] +
containing_block->padding[BOTTOM];
- } else {
- /** \todo inline containers */
}
layout_compute_offsets(&content->unit_len_ctx, box, containing_block,
@@ -5243,6 +4830,13 @@ layout_absolute(struct box *box,
box->float_container = NULL;
layout_solve_width(box, box->parent->width, box->width, 0, 0,
-1, -1);
+ } else if (box->type == BOX_FLEX || box->type == BOX_INLINE_FLEX) {
+ /* layout_table also expects the containing block to be
+ * stored in the float_container field */
+ box->float_container = containing_block;
+ if (!layout_flex(box, width, content))
+ return false;
+ box->float_container = NULL;
}
/* 10.6.4 */
@@ -5379,7 +4973,9 @@ layout_position_absolute(struct box *box,
for (c = box->children; c; c = c->next) {
if ((c->type == BOX_BLOCK || c->type == BOX_TABLE ||
- c->type == BOX_INLINE_BLOCK) &&
+ c->type == BOX_INLINE_BLOCK ||
+ c->type == BOX_FLEX ||
+ c->type == BOX_INLINE_FLEX) &&
(css_computed_position(c->style) ==
CSS_POSITION_ABSOLUTE ||
css_computed_position(c->style) ==
diff --git a/content/handlers/html/layout_flex.c b/content/handlers/html/layout_flex.c
new file mode 100644
index 000000000..bde3c5bd1
--- /dev/null
+++ b/content/handlers/html/layout_flex.c
@@ -0,0 +1,1117 @@
+/*
+ * Copyright 2022 Michael Drake <tlsa@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file
+ * HTML layout implementation: display: flex.
+ *
+ * Layout is carried out in two stages:
+ *
+ * 1. + calculation of minimum / maximum box widths, and
+ * + determination of whether block level boxes will have >zero height
+ *
+ * 2. + layout (position and dimensions)
+ *
+ * In most cases the functions for the two stages are a corresponding pair
+ * layout_minmax_X() and layout_X().
+ */
+
+#include <string.h>
+
+#include "utils/log.h"
+#include "utils/utils.h"
+
+#include "html/box.h"
+#include "html/html.h"
+#include "html/private.h"
+#include "html/box_inspect.h"
+#include "html/layout_internal.h"
+
+/**
+ * Flex item data
+ */
+struct flex_item_data {
+ enum css_flex_basis_e basis;
+ css_fixed basis_length;
+ css_unit basis_unit;
+ struct box *box;
+
+ css_fixed shrink;
+ css_fixed grow;
+
+ int min_main;
+ int max_main;
+ int min_cross;
+ int max_cross;
+
+ int target_main_size;
+ int base_size;
+ int main_size;
+ size_t line;
+
+ bool freeze;
+ bool min_violation;
+ bool max_violation;
+};
+
+/**
+ * Flex line data
+ */
+struct flex_line_data {
+ int main_size;
+ int cross_size;
+
+ int used_main_size;
+ int main_auto_margin_count;
+
+ int pos;
+
+ size_t first;
+ size_t count;
+ size_t frozen;
+};
+
+/**
+ * Flex layout context
+ */
+struct flex_ctx {
+ html_content *content;
+ const struct box *flex;
+ const css_unit_ctx *unit_len_ctx;
+
+ int main_size;
+ int cross_size;
+
+ int available_main;
+ int available_cross;
+
+ bool horizontal;
+ bool main_reversed;
+ enum css_flex_wrap_e wrap;
+
+ struct flex_items {
+ size_t count;
+ struct flex_item_data *data;
+ } item;
+
+ struct flex_lines {
+ size_t count;
+ size_t alloc;
+ struct flex_line_data *data;
+ } line;
+};
+
+/**
+ * Destroy a flex layout context
+ *
+ * \param[in] ctx Flex layout context
+ */
+static void layout_flex_ctx__destroy(struct flex_ctx *ctx)
+{
+ if (ctx != NULL) {
+ free(ctx->item.data);
+ free(ctx->line.data);
+ free(ctx);
+ }
+}
+
+/**
+ * Create a flex layout context
+ *
+ * \param[in] content HTML content containing flex box
+ * \param[in] flex Box to create layout context for
+ * \return flex layout context or NULL on error
+ */
+static struct flex_ctx *layout_flex_ctx__create(
+ html_content *content,
+ const struct box *flex)
+{
+ struct flex_ctx *ctx;
+
+ ctx = calloc(1, sizeof(*ctx));
+ if (ctx == NULL) {
+ return NULL;
+ }
+ ctx->line.alloc = 1;
+
+ ctx->item.count = box_count_children(flex);
+ ctx->item.data = calloc(ctx->item.count, sizeof(*ctx->item.data));
+ if (ctx->item.data == NULL) {
+ layout_flex_ctx__destroy(ctx);
+ return NULL;
+ }
+
+ ctx->line.alloc = 1;
+ ctx->line.data = calloc(ctx->line.alloc, sizeof(*ctx->line.data));
+ if (ctx->line.data == NULL) {
+ layout_flex_ctx__destroy(ctx);
+ return NULL;
+ }
+
+ ctx->flex = flex;
+ ctx->content = content;
+ ctx->unit_len_ctx = &content->unit_len_ctx;
+
+ ctx->wrap = css_computed_flex_wrap(flex->style);
+ ctx->horizontal = lh__flex_main_is_horizontal(flex);
+ ctx->main_reversed = lh__flex_direction_reversed(flex);
+
+ return ctx;
+}
+
+/**
+ * Find box side representing the start of flex container in main direction.
+ *
+ * \param[in] ctx Flex layout context.
+ * \return the start side.
+ */
+static enum box_side layout_flex__main_start_side(
+ const struct flex_ctx *ctx)
+{
+ if (ctx->horizontal) {
+ return (ctx->main_reversed) ? RIGHT : LEFT;
+ } else {
+ return (ctx->main_reversed) ? BOTTOM : TOP;
+ }
+}
+
+/**
+ * Find box side representing the end of flex container in main direction.
+ *
+ * \param[in] ctx Flex layout context.
+ * \return the end side.
+ */
+static enum box_side layout_flex__main_end_side(
+ const struct flex_ctx *ctx)
+{
+ if (ctx->horizontal) {
+ return (ctx->main_reversed) ? LEFT : RIGHT;
+ } else {
+ return (ctx->main_reversed) ? TOP : BOTTOM;
+ }
+}
+
+/**
+ * Perform layout on a flex item
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] item Item to lay out
+ * \param[in] available_width Available width for item in pixels
+ * \return true on success false on failure
+ */
+static bool layout_flex_item(
+ const struct flex_ctx *ctx,
+ const struct flex_item_data *item,
+ int available_width)
+{
+ bool success;
+ struct box *b = item->box;
+
+ switch (b->type) {
+ case BOX_BLOCK:
+ success = layout_block_context(b, -1, ctx->content);
+ break;
+ case BOX_TABLE:
+ b->float_container = b->parent;
+ success = layout_table(b, available_width, ctx->content);
+ b->float_container = NULL;
+ break;
+ case BOX_FLEX:
+ b->float_container = b->parent;
+ success = layout_flex(b, available_width, ctx->content);
+ b->float_container = NULL;
+ break;
+ default:
+ assert(0 && "Bad flex item back type");
+ success = false;
+ break;
+ }
+
+ if (!success) {
+ NSLOG(flex, ERROR, "box %p: layout failed", b);
+ }
+
+ return success;
+}
+
+/**
+ * Calculate an item's base and target main sizes.
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] item Item to get sizes of
+ * \param[in] available_width Available width in pixels
+ * \return true on success false on failure
+ */
+static inline bool layout_flex__base_and_main_sizes(
+ const struct flex_ctx *ctx,
+ struct flex_item_data *item,
+ int available_width)
+{
+ struct box *b = item->box;
+ int content_min_width = b->min_width;
+ int content_max_width = b->max_width;
+ int delta_outer_main = lh__delta_outer_main(ctx->flex, b);
+
+ NSLOG(flex, DEEPDEBUG, "box %p: delta_outer_main: %i",
+ b, delta_outer_main);
+
+ if (item->basis == CSS_FLEX_BASIS_SET) {
+ if (item->basis_unit == CSS_UNIT_PCT) {
+ item->base_size = FPCT_OF_INT_TOINT(
+ item->basis_length,
+ available_width);
+ } else {
+ item->base_size = FIXTOINT(css_unit_len2device_px(
+ b->style, ctx->unit_len_ctx,
+ item->basis_length,
+ item->basis_unit));
+ }
+
+ } else if (item->basis == CSS_FLEX_BASIS_AUTO) {
+ item->base_size = ctx->horizontal ? b->width : b->height;
+ } else {
+ item->base_size = AUTO;
+ }
+
+ if (ctx->horizontal == false) {
+ if (b->width == AUTO) {
+ b->width = min(max(content_min_width, available_width),
+ content_max_width);
+ b->width -= lh__delta_outer_width(b);
+ }
+
+ if (!layout_flex_item(ctx, item, b->width)) {
+ return false;
+ }
+ }
+
+ if (item->base_size == AUTO) {
+ if (ctx->horizontal == false) {
+ item->base_size = b->height;
+ } else {
+ item->base_size = content_max_width - delta_outer_main;
+ }
+ }
+
+ item->base_size += delta_outer_main;
+
+ if (ctx->horizontal) {
+ item->base_size = min(item->base_size, available_width);
+ item->base_size = max(item->base_size, content_min_width);
+ }
+
+ item->target_main_size = item->base_size;
+ item->main_size = item->base_size;
+
+ if (item->max_main > 0 &&
+ item->main_size > item->max_main + delta_outer_main) {
+ item->main_size = item->max_main + delta_outer_main;
+ }
+
+ if (item->main_size < item->min_main + delta_outer_main) {
+ item->main_size = item->min_main + delta_outer_main;
+ }
+
+ NSLOG(flex, DEEPDEBUG, "flex-item box: %p: base_size: %i, main_size %i",
+ b, item->base_size, item->main_size);
+
+ return true;
+}
+
+/**
+ * Fill out all item's data in a flex container.
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] flex Flex box
+ * \param[in] available_width Available width in pixels
+ */
+static void layout_flex_ctx__populate_item_data(
+ const struct flex_ctx *ctx,
+ const struct box *flex,
+ int available_width)
+{
+ size_t i = 0;
+ bool horizontal = ctx->horizontal;
+
+ for (struct box *b = flex->children; b != NULL; b = b->next) {
+ struct flex_item_data *item = &ctx->item.data[i++];
+
+ b->float_container = b->parent;
+ layout_find_dimensions(ctx->unit_len_ctx, available_width, -1,
+ b, b->style, &b->width, &b->height,
+ horizontal ? &item->max_main : &item->max_cross,
+ horizontal ? &item->min_main : &item->min_cross,
+ horizontal ? &item->max_cross : &item->max_main,
+ horizontal ? &item->min_cross : &item->min_main,
+ b->margin, b->padding, b->border);
+ b->float_container = NULL;
+
+ NSLOG(flex, DEEPDEBUG, "flex-item box: %p: width: %i",
+ b, b->width);
+
+ item->box = b;
+ item->basis = css_computed_flex_basis(b->style,
+ &item->basis_length, &item->basis_unit);
+
+ css_computed_flex_shrink(b->style, &item->shrink);
+ css_computed_flex_grow(b->style, &item->grow);
+
+ layout_flex__base_and_main_sizes(ctx, item, available_width);
+ }
+}
+
+/**
+ * Ensure context's lines array has a free space
+ *
+ * \param[in] ctx Flex layout context
+ * \return true on success false on out of memory
+ */
+static bool layout_flex_ctx__ensure_line(struct flex_ctx *ctx)
+{
+ struct flex_line_data *temp;
+ size_t line_alloc = ctx->line.alloc * 2;
+
+ if (ctx->line.alloc > ctx->line.count) {
+ return true;
+ }
+
+ temp = realloc(ctx->line.data, sizeof(*ctx->line.data) * line_alloc);
+ if (temp == NULL) {
+ return false;
+ }
+ ctx->line.data = temp;
+
+ memset(ctx->line.data + ctx->line.alloc, 0,
+ sizeof(*ctx->line.data) * (line_alloc - ctx->line.alloc));
+ ctx->line.alloc = line_alloc;
+
+ return true;
+}
+
+/**
+ * Assigns flex items to the line and returns the line
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] item_index Index to first item to assign to this line
+ * \return Pointer to the new line, or NULL on error.
+ */
+static struct flex_line_data *layout_flex__build_line(struct flex_ctx *ctx,
+ size_t item_index)
+{
+ enum box_side start_side = layout_flex__main_start_side(ctx);
+ enum box_side end_side = layout_flex__main_end_side(ctx);
+ struct flex_line_data *line;
+ int used_main = 0;
+
+ if (!layout_flex_ctx__ensure_line(ctx)) {
+ return NULL;
+ }
+
+ line = &ctx->line.data[ctx->line.count];
+ line->first = item_index;
+
+ NSLOG(flex, DEEPDEBUG, "flex container %p: available main: %i",
+ ctx->flex, ctx->available_main);
+
+ while (item_index < ctx->item.count) {
+ struct flex_item_data *item = &ctx->item.data[item_index];
+ struct box *b = item->box;
+ int pos_main;
+
+ pos_main = ctx->horizontal ?
+ item->main_size :
+ b->height + lh__delta_outer_main(ctx->flex, b);
+
+ if (ctx->wrap == CSS_FLEX_WRAP_NOWRAP ||
+ pos_main + used_main <= ctx->available_main ||
+ lh__box_is_absolute(item->box) ||
+ ctx->available_main == AUTO ||
+ line->count == 0 ||
+ pos_main == 0) {
+ if (lh__box_is_absolute(item->box) == false) {
+ line->main_size += item->main_size;
+ used_main += pos_main;
+
+ if (b->margin[start_side] == AUTO) {
+ line->main_auto_margin_count++;
+ }
+ if (b->margin[end_side] == AUTO) {
+ line->main_auto_margin_count++;
+ }
+ }
+ item->line = ctx->line.count;
+ line->count++;
+ item_index++;
+ } else {
+ break;
+ }
+ }
+
+ if (line->count > 0) {
+ ctx->line.count++;
+ } else {
+ NSLOG(layout, ERROR, "Failed to fit any flex items");
+ }
+
+ return line;
+}
+
+/**
+ * Freeze an item on a line
+ *
+ * \param[in] line Line to containing item
+ * \param[in] item Item to freeze
+ */
+static inline void layout_flex__item_freeze(
+ struct flex_line_data *line,
+ struct flex_item_data *item)
+{
+ item->freeze = true;
+ line->frozen++;
+
+ if (!lh__box_is_absolute(item->box)){
+ line->used_main_size += item->target_main_size;
+ }
+
+ NSLOG(flex, DEEPDEBUG, "flex-item box: %p: "
+ "Frozen at target_main_size: %i",
+ item->box, item->target_main_size);
+}
+
+/**
+ * Calculate remaining free space and unfrozen item factor sum
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] line Line to calculate free space on
+ * \param[out] unfrozen_factor_sum Returns sum of unfrozen item's flex factors
+ * \param[in] initial_free_main Initial free space in main direction
+ * \param[in] available_main Available space in main direction
+ * \param[in] grow Whether to grow or shrink
+ * return remaining free space on line
+ */
+static inline int layout_flex__remaining_free_main(
+ struct flex_ctx *ctx,
+ struct flex_line_data *line,
+ css_fixed *unfrozen_factor_sum,
+ int initial_free_main,
+ int available_main,
+ bool grow)
+{
+ int remaining_free_main = available_main;
+ size_t item_count = line->first + line->count;
+
+ *unfrozen_factor_sum = 0;
+
+ for (size_t i = line->first; i < item_count; i++) {
+ struct flex_item_data *item = &ctx->item.data[i];
+
+ if (item->freeze) {
+ remaining_free_main -= item->target_main_size;
+ } else {
+ remaining_free_main -= item->base_size;
+
+ *unfrozen_factor_sum += grow ?
+ item->grow : item->shrink;
+ }
+ }
+
+ if (*unfrozen_factor_sum < F_1) {
+ int free_space = FIXTOINT(FMUL(INTTOFIX(initial_free_main),
+ *unfrozen_factor_sum));
+
+ if (free_space < remaining_free_main) {
+ remaining_free_main = free_space;
+ }
+ }
+
+ NSLOG(flex, DEEPDEBUG, "Remaining free space: %i",
+ remaining_free_main);
+
+ return remaining_free_main;
+}
+
+/**
+ * Clamp flex item target main size and get min/max violations
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] line Line to align items on
+ * return total violation in pixels
+ */
+static inline int layout_flex__get_min_max_violations(
+ struct flex_ctx *ctx,
+ struct flex_line_data *line)
+{
+
+ int total_violation = 0;
+ size_t item_count = line->first + line->count;
+
+ for (size_t i = line->first; i < item_count; i++) {
+ struct flex_item_data *item = &ctx->item.data[i];
+ int target_main_size = item->target_main_size;
+
+ NSLOG(flex, DEEPDEBUG, "item %p: target_main_size: %i",
+ item->box, target_main_size);
+
+ if (item->freeze) {
+ continue;
+ }
+
+ if (item->max_main > 0 &&
+ target_main_size > item->max_main) {
+ target_main_size = item->max_main;
+ item->max_violation = true;
+ NSLOG(flex, DEEPDEBUG, "Violation: max_main: %i",
+ item->max_main);
+ }
+
+ if (target_main_size < item->min_main) {
+ target_main_size = item->min_main;
+ item->min_violation = true;
+ NSLOG(flex, DEEPDEBUG, "Violation: min_main: %i",
+ item->min_main);
+ }
+
+ if (target_main_size < item->box->min_width) {
+ target_main_size = item->box->min_width;
+ item->min_violation = true;
+ NSLOG(flex, DEEPDEBUG, "Violation: box min_width: %i",
+ item->box->min_width);
+ }
+
+ if (target_main_size < 0) {
+ target_main_size = 0;
+ item->min_violation = true;
+ NSLOG(flex, DEEPDEBUG, "Violation: less than 0");
+ }
+
+ total_violation += target_main_size - item->target_main_size;
+ item->target_main_size = target_main_size;
+ }
+
+ NSLOG(flex, DEEPDEBUG, "Total violation: %i", total_violation);
+
+ return total_violation;
+}
+
+/**
+ * Distribute remaining free space proportional to the flex factors.
+ *
+ * Remaining free space may be negative.
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] line Line to distribute free space on
+ * \param[in] unfrozen_factor_sum Sum of unfrozen item's flex factors
+ * \param[in] remaining_free_main Remaining free space in main direction
+ * \param[in] grow Whether to grow or shrink
+ */
+static inline void layout_flex__distribute_free_main(
+ struct flex_ctx *ctx,
+ struct flex_line_data *line,
+ css_fixed unfrozen_factor_sum,
+ int remaining_free_main,
+ bool grow)
+{
+ size_t item_count = line->first + line->count;
+
+ if (grow) {
+ css_fixed remainder = 0;
+ for (size_t i = line->first; i < item_count; i++) {
+ struct flex_item_data *item = &ctx->item.data[i];
+ css_fixed result;
+ css_fixed ratio;
+
+ if (item->freeze) {
+ continue;
+ }
+
+ ratio = FDIV(item->grow, unfrozen_factor_sum);
+ result = FMUL(INTTOFIX(remaining_free_main), ratio) +
+ remainder;
+
+ item->target_main_size = item->base_size +
+ FIXTOINT(result);
+ remainder = FIXFRAC(result);
+ }
+ } else {
+ css_fixed scaled_shrink_factor_sum = 0;
+ css_fixed remainder = 0;
+
+ for (size_t i = line->first; i < item_count; i++) {
+ struct flex_item_data *item = &ctx->item.data[i];
+ css_fixed scaled_shrink_factor;
+
+ if (item->freeze) {
+ continue;
+ }
+
+ scaled_shrink_factor = FMUL(
+ item->shrink,
+ INTTOFIX(item->base_size));
+ scaled_shrink_factor_sum += scaled_shrink_factor;
+ }
+
+ for (size_t i = line->first; i < item_count; i++) {
+ struct flex_item_data *item = &ctx->item.data[i];
+ css_fixed scaled_shrink_factor;
+ css_fixed result;
+ css_fixed ratio;
+
+ if (item->freeze) {
+ continue;
+ } else if (scaled_shrink_factor_sum == 0) {
+ item->target_main_size = item->main_size;
+ layout_flex__item_freeze(line, item);
+ continue;
+ }
+
+ scaled_shrink_factor = FMUL(
+ item->shrink,
+ INTTOFIX(item->base_size));
+ ratio = FDIV(scaled_shrink_factor,
+ scaled_shrink_factor_sum);
+ result = FMUL(INTTOFIX(abs(remaining_free_main)),
+ ratio) + remainder;
+
+ item->target_main_size = item->base_size -
+ FIXTOINT(result);
+ remainder = FIXFRAC(result);
+ }
+ }
+}
+
+/**
+ * Resolve flexible item lengths along a line.
+ *
+ * See 9.7 of Tests CSS Flexible Box Layout Module Level 1.
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] line Line to resolve
+ * \return true on success, false on failure.
+ */
+static bool layout_flex__resolve_line(
+ struct flex_ctx *ctx,
+ struct flex_line_data *line)
+{
+ size_t item_count = line->first + line->count;
+ int available_main = ctx->available_main;
+ int initial_free_main;
+ bool grow;
+
+ if (available_main == AUTO) {
+ available_main = INT_MAX;
+ }
+
+ grow = (line->main_size < available_main);
+ initial_free_main = available_main;
+
+ NSLOG(flex, DEEPDEBUG, "box %p: line %zu: first: %zu, count: %zu",
+ ctx->flex, line - ctx->line.data,
+ line->first, line->count);
+ NSLOG(flex, DEEPDEBUG, "Line main_size: %i, available_main: %i",
+ line->main_size, available_main);
+
+ for (size_t i = line->first; i < item_count; i++) {
+ struct flex_item_data *item = &ctx->item.data[i];
+
+ /* 3. Size inflexible items */
+ if (grow) {
+ if (item->grow == 0 ||
+ item->base_size > item->main_size) {
+ item->target_main_size = item->main_size;
+ layout_flex__item_freeze(line, item);
+ }
+ } else {
+ if (item->shrink == 0 ||
+ item->base_size < item->main_size) {
+ item->target_main_size = item->main_size;
+ layout_flex__item_freeze(line, item);
+ }
+ }
+
+ /* 4. Calculate initial free space */
+ if (item->freeze) {
+ initial_free_main -= item->target_main_size;
+ } else {
+ initial_free_main -= item->base_size;
+ }
+ }
+
+ /* 5. Loop */
+ while (line->frozen < line->count) {
+ css_fixed unfrozen_factor_sum;
+ int remaining_free_main;
+ int total_violation;
+
+ NSLOG(flex, DEEPDEBUG, "flex-container: %p: Resolver pass",
+ ctx->flex);
+
+ /* b */
+ remaining_free_main = layout_flex__remaining_free_main(ctx,
+ line, &unfrozen_factor_sum, initial_free_main,
+ available_main, grow);
+
+ /* c */
+ if (remaining_free_main != 0) {
+ layout_flex__distribute_free_main(ctx,
+ line, unfrozen_factor_sum,
+ remaining_free_main, grow);
+ }
+
+ /* d */
+ total_violation = layout_flex__get_min_max_violations(
+ ctx, line);
+
+ /* e */
+ for (size_t i = line->first; i < item_count; i++) {
+ struct flex_item_data *item = &ctx->item.data[i];
+
+ if (item->freeze) {
+ continue;
+ }
+
+ if (total_violation == 0 ||
+ (total_violation > 0 && item->min_violation) ||
+ (total_violation < 0 && item->max_violation)) {
+ layout_flex__item_freeze(line, item);
+ }
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Position items along a line
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] line Line to resolve
+ * \return true on success, false on failure.
+ */
+static bool layout_flex__place_line_items_main(
+ struct flex_ctx *ctx,
+ struct flex_line_data *line)
+{
+ int main_pos = ctx->flex->padding[layout_flex__main_start_side(ctx)];
+ int post_multiplier = ctx->main_reversed ? 0 : 1;
+ int pre_multiplier = ctx->main_reversed ? -1 : 0;
+ size_t item_count = line->first + line->count;
+ int extra_remainder = 0;
+ int extra = 0;
+
+ if (ctx->main_reversed) {
+ main_pos = lh__box_size_main(ctx->horizontal, ctx->flex) -
+ main_pos;
+ }
+
+ if (ctx->available_main != AUTO &&
+ ctx->available_main != UNKNOWN_WIDTH &&
+ ctx->available_main > line->used_main_size) {
+ if (line->main_auto_margin_count > 0) {
+ extra = ctx->available_main - line->used_main_size;
+
+ extra_remainder = extra % line->main_auto_margin_count;
+ extra /= line->main_auto_margin_count;
+ }
+ }
+
+ for (size_t i = line->first; i < item_count; i++) {
+ enum box_side main_end = ctx->horizontal ? RIGHT : BOTTOM;
+ enum box_side main_start = ctx->horizontal ? LEFT : TOP;
+ struct flex_item_data *item = &ctx->item.data[i];
+ struct box *b = item->box;
+ int extra_total = 0;
+ int extra_post = 0;
+ int extra_pre = 0;
+ int box_size_main;
+ int *box_pos_main;
+
+ if (ctx->horizontal) {
+ b->width = item->target_main_size -
+ lh__delta_outer_width(b);
+
+ if (!layout_flex_item(ctx, item, b->width)) {
+ return false;
+ }
+ }
+
+ box_size_main = lh__box_size_main(ctx->horizontal, b);
+ box_pos_main = ctx->horizontal ? &b->x : &b->y;
+
+ if (!lh__box_is_absolute(b)) {
+ if (b->margin[main_start] == AUTO) {
+ extra_pre = extra + extra_remainder;
+ }
+ if (b->margin[main_end] == AUTO) {
+ extra_post = extra + extra_remainder;
+ }
+ extra_total = extra_pre + extra_post;
+
+ main_pos += pre_multiplier *
+ (extra_total + box_size_main +
+ lh__delta_outer_main(ctx->flex, b));
+ }
+
+ *box_pos_main = main_pos + lh__non_auto_margin(b, main_start) +
+ extra_pre + b->border[main_start].width;
+
+ if (!lh__box_is_absolute(b)) {
+ int cross_size;
+ int box_size_cross = lh__box_size_cross(
+ ctx->horizontal, b);
+
+ main_pos += post_multiplier *
+ (extra_total + box_size_main +
+ lh__delta_outer_main(ctx->flex, b));
+
+ cross_size = box_size_cross + lh__delta_outer_cross(
+ ctx->flex, b);
+ if (line->cross_size < cross_size) {
+ line->cross_size = cross_size;
+ }
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Collect items onto lines and place items along the lines
+ *
+ * \param[in] ctx Flex layout context
+ * \return true on success, false on failure.
+ */
+static bool layout_flex__collect_items_into_lines(
+ struct flex_ctx *ctx)
+{
+ size_t pos = 0;
+
+ while (pos < ctx->item.count) {
+ struct flex_line_data *line;
+
+ line = layout_flex__build_line(ctx, pos);
+ if (line == NULL) {
+ return false;
+ }
+
+ pos += line->count;
+
+ NSLOG(flex, DEEPDEBUG, "flex-container: %p: "
+ "fitted: %zu (total: %zu/%zu)",
+ ctx->flex, line->count,
+ pos, ctx->item.count);
+
+ if (!layout_flex__resolve_line(ctx, line)) {
+ return false;
+ }
+
+ if (!layout_flex__place_line_items_main(ctx, line)) {
+ return false;
+ }
+
+ ctx->cross_size += line->cross_size;
+ if (ctx->main_size < line->main_size) {
+ ctx->main_size = line->main_size;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Align items on a line.
+ *
+ * \param[in] ctx Flex layout context
+ * \param[in] line Line to align items on
+ * \param[in] extra Extra line width in pixels
+ */
+static void layout_flex__place_line_items_cross(struct flex_ctx *ctx,
+ struct flex_line_data *line, int extra)
+{
+ enum box_side cross_start = ctx->horizontal ? TOP : LEFT;
+ size_t item_count = line->first + line->count;
+
+ for (size_t i = line->first; i < item_count; i++) {
+ struct flex_item_data *item = &ctx->item.data[i];
+ struct box *b = item->box;
+ int cross_free_space;
+ int *box_size_cross;
+ int *box_pos_cross;
+
+ box_pos_cross = ctx->horizontal ? &b->y : &b->x;
+ box_size_cross = lh__box_size_cross_ptr(ctx->horizontal, b);
+
+ cross_free_space = line->cross_size + extra - *box_size_cross -
+ lh__delta_outer_cross(ctx->flex, b);
+
+ switch (lh__box_align_self(ctx->flex, b)) {
+ default:
+ case CSS_ALIGN_SELF_STRETCH:
+ if (lh__box_size_cross_is_auto(ctx->horizontal, b)) {
+ *box_size_cross += cross_free_space;
+
+ /* Relayout children for stretch. */
+ if (!layout_flex_item(ctx, item, b->width)) {
+ return;
+ }
+ }
+ fallthrough;
+ case CSS_ALIGN_SELF_FLEX_START:
+ *box_pos_cross = ctx->flex->padding[cross_start] +
+ line->pos +
+ lh__non_auto_margin(b, cross_start) +
+ b->border[cross_start].width;
+ break;
+
+ case CSS_ALIGN_SELF_FLEX_END:
+ *box_pos_cross = ctx->flex->padding[cross_start] +
+ line->pos + cross_free_space +
+ lh__non_auto_margin(b, cross_start) +
+ b->border[cross_start].width;
+ break;
+
+ case CSS_ALIGN_SELF_BASELINE:
+ case CSS_ALIGN_SELF_CENTER:
+ *box_pos_cross = ctx->flex->padding[cross_start] +
+ line->pos + cross_free_space / 2 +
+ lh__non_auto_margin(b, cross_start) +
+ b->border[cross_start].width;
+ break;
+ }
+ }
+}
+
+/**
+ * Place the lines and align the items on the line.
+ *
+ * \param[in] ctx Flex layout context
+ */
+static void layout_flex__place_lines(struct flex_ctx *ctx)
+{
+ bool reversed = ctx->wrap == CSS_FLEX_WRAP_WRAP_REVERSE;
+ int line_pos = reversed ? ctx->cross_size : 0;
+ int post_multiplier = reversed ? 0 : 1;
+ int pre_multiplier = reversed ? -1 : 0;
+ int extra_remainder = 0;
+ int extra = 0;
+
+ if (ctx->available_cross != AUTO &&
+ ctx->available_cross > ctx->cross_size &&
+ ctx->line.count > 0) {
+ extra = ctx->available_cross - ctx->cross_size;
+
+ extra_remainder = extra % ctx->line.count;
+ extra /= ctx->line.count;
+ }
+
+ for (size_t i = 0; i < ctx->line.count; i++) {
+ struct flex_line_data *line = &ctx->line.data[i];
+
+ line_pos += pre_multiplier * line->cross_size;
+ line->pos = line_pos;
+ line_pos += post_multiplier * line->cross_size +
+ extra + extra_remainder;
+
+ layout_flex__place_line_items_cross(ctx, line,
+ extra + extra_remainder);
+
+ if (extra_remainder > 0) {
+ extra_remainder--;
+ }
+ }
+}
+
+/**
+ * Layout a flex container.
+ *
+ * \param[in] flex table to layout
+ * \param[in] available_width width of containing block
+ * \param[in] content memory pool for any new boxes
+ * \return true on success, false on memory exhaustion
+ */
+bool layout_flex(struct box *flex, int available_width,
+ html_content *content)
+{
+ int max_height, min_height;
+ struct flex_ctx *ctx;
+ bool success = false;
+
+ ctx = layout_flex_ctx__create(content, flex);
+ if (ctx == NULL) {
+ return false;
+ }
+
+ NSLOG(flex, DEEPDEBUG, "box %p: %s, available_width %i, width: %i",
+ flex, ctx->horizontal ? "horizontal" : "vertical",
+ available_width, flex->width);
+
+ layout_find_dimensions(
+ ctx->unit_len_ctx, available_width, -1,
+ flex, flex->style, NULL, &flex->height,
+ NULL, NULL, &max_height, &min_height,
+ flex->margin, flex->padding, flex->border);
+
+ available_width = min(available_width, flex->width);
+
+ if (ctx->horizontal) {
+ ctx->available_main = available_width;
+ ctx->available_cross = ctx->flex->height;
+ } else {
+ ctx->available_main = ctx->flex->height;
+ ctx->available_cross = available_width;
+ }
+
+ NSLOG(flex, DEEPDEBUG, "box %p: available_main: %i",
+ flex, ctx->available_main);
+ NSLOG(flex, DEEPDEBUG, "box %p: available_cross: %i",
+ flex, ctx->available_cross);
+
+ layout_flex_ctx__populate_item_data(ctx, flex, available_width);
+
+ /* Place items onto lines. */
+ success = layout_flex__collect_items_into_lines(ctx);
+ if (!success) {
+ goto cleanup;
+ }
+
+ layout_flex__place_lines(ctx);
+
+ if (flex->height == AUTO) {
+ flex->height = ctx->horizontal ?
+ ctx->cross_size :
+ ctx->main_size;
+ }
+
+ if (flex->height != AUTO) {
+ if (max_height >= 0 && flex->height > max_height) {
+ flex->height = max_height;
+ }
+ if (min_height > 0 && flex->height < min_height) {
+ flex->height = min_height;
+ }
+ }
+
+ success = true;
+
+cleanup:
+ layout_flex_ctx__destroy(ctx);
+
+ NSLOG(flex, DEEPDEBUG, "box %p: %s: w: %i, h: %i", flex,
+ success ? "success" : "failure",
+ flex->width, flex->height);
+ return success;
+}
diff --git a/content/handlers/html/layout_internal.h b/content/handlers/html/layout_internal.h
new file mode 100644
index 000000000..d094462ec
--- /dev/null
+++ b/content/handlers/html/layout_internal.h
@@ -0,0 +1,738 @@
+/*
+ * Copyright 2003 James Bursa <bursa@users.sourceforge.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file
+ * HTML layout private interface.
+ */
+
+#ifndef NETSURF_HTML_LAYOUT_INTERNAL_H
+#define NETSURF_HTML_LAYOUT_INTERNAL_H
+
+#define AUTO INT_MIN
+
+/* Fixed point percentage (a) of an integer (b), to an integer */
+#define FPCT_OF_INT_TOINT(a, b) (FIXTOINT(FDIV((a * b), F_100)))
+
+/**
+ * Layout a block formatting context.
+ *
+ * \param block BLOCK, INLINE_BLOCK, or TABLE_CELL to layout
+ * \param viewport_height Height of viewport in pixels or -ve if unknown
+ * \param content Memory pool for any new boxes
+ * \return true on success, false on memory exhaustion
+ *
+ * This function carries out layout of a block and its children, as described
+ * in CSS 2.1 9.4.1.
+ */
+bool layout_block_context(
+ struct box *block,
+ int viewport_height,
+ html_content *content);
+
+/**
+ * Layout a table.
+ *
+ * \param table table to layout
+ * \param available_width width of containing block
+ * \param content memory pool for any new boxes
+ * \return true on success, false on memory exhaustion
+ */
+bool layout_table(
+ struct box *table,
+ int available_width,
+ html_content *content);
+
+/**
+ * Layout a flex container.
+ *
+ * \param[in] flex table to layout
+ * \param[in] available_width width of containing block
+ * \param[in] content memory pool for any new boxes
+ * \return true on success, false on memory exhaustion
+ */
+bool layout_flex(
+ struct box *flex,
+ int available_width,
+ html_content *content);
+
+typedef uint8_t (*css_len_func)(
+ const css_computed_style *style,
+ css_fixed *length, css_unit *unit);
+typedef uint8_t (*css_border_style_func)(
+ const css_computed_style *style);
+typedef uint8_t (*css_border_color_func)(
+ const css_computed_style *style,
+ css_color *color);
+
+/** Array of per-side access functions for computed style margins. */
+extern const css_len_func margin_funcs[4];
+
+/** Array of per-side access functions for computed style paddings. */
+extern const css_len_func padding_funcs[4];
+
+/** Array of per-side access functions for computed style border_widths. */
+extern const css_len_func border_width_funcs[4];
+
+/** Array of per-side access functions for computed style border styles. */
+extern const css_border_style_func border_style_funcs[4];
+
+/** Array of per-side access functions for computed style border colors. */
+extern const css_border_color_func border_color_funcs[4];
+
+/** Layout helper: Check whether box is a float. */
+static inline bool lh__box_is_float_box(const struct box *b)
+{
+ return b->type == BOX_FLOAT_LEFT ||
+ b->type == BOX_FLOAT_RIGHT;
+}
+
+/** Layout helper: Check whether box takes part in inline flow. */
+static inline bool lh__box_is_inline_flow(const struct box *b)
+{
+ return b->type == BOX_INLINE ||
+ b->type == BOX_INLINE_FLEX ||
+ b->type == BOX_INLINE_BLOCK ||
+ b->type == BOX_TEXT ||
+ b->type == BOX_INLINE_END;
+}
+
+/** Layout helper: Check whether box takes part in inline flow. */
+static inline bool lh__box_is_flex_container(const struct box *b)
+{
+ return b->type == BOX_FLEX ||
+ b->type == BOX_INLINE_FLEX;
+}
+
+/** Layout helper: Check whether box takes part in inline flow. */
+static inline bool lh__box_is_flex_item(const struct box *b)
+{
+ return (b->parent != NULL) && lh__box_is_flex_container(b->parent);
+}
+
+/** Layout helper: Check whether box is inline level. (Includes BR.) */
+static inline bool lh__box_is_inline_level(const struct box *b)
+{
+ return lh__box_is_inline_flow(b) ||
+ b->type == BOX_BR;
+}
+
+/** Layout helper: Check whether box is inline level. (Includes BR, floats.) */
+static inline bool lh__box_is_inline_content(const struct box *b)
+{
+ return lh__box_is_float_box(b) ||
+ lh__box_is_inline_level(b);
+}
+
+/** Layout helper: Check whether box is an object. */
+static inline bool lh__box_is_object(const struct box *b)
+{
+ return b->object ||
+ (b->flags & (IFRAME | REPLACE_DIM));
+}
+
+/** Layout helper: Check whether box is replaced. */
+static inline bool lh__box_is_replace(const struct box *b)
+{
+ return b->gadget ||
+ lh__box_is_object(b);
+}
+
+/** Layout helper: Check for CSS border on given side. */
+static inline bool lh__have_border(
+ enum box_side side,
+ const css_computed_style *style)
+{
+ return border_style_funcs[side](style) != CSS_BORDER_STYLE_NONE;
+}
+
+static inline bool lh__box_is_absolute(const struct box *b)
+{
+ return css_computed_position(b->style) == CSS_POSITION_ABSOLUTE ||
+ css_computed_position(b->style) == CSS_POSITION_FIXED;
+}
+
+static inline bool lh__flex_main_is_horizontal(const struct box *flex)
+{
+ const css_computed_style *style = flex->style;
+
+ assert(style != NULL);
+
+ switch (css_computed_flex_direction(style)) {
+ default: /* Fallthrough. */
+ case CSS_FLEX_DIRECTION_ROW: /* Fallthrough. */
+ case CSS_FLEX_DIRECTION_ROW_REVERSE:
+ return true;
+ case CSS_FLEX_DIRECTION_COLUMN: /* Fallthrough. */
+ case CSS_FLEX_DIRECTION_COLUMN_REVERSE:
+ return false;
+ }
+}
+
+static inline bool lh__flex_direction_reversed(const struct box *flex)
+{
+ switch (css_computed_flex_direction(flex->style)) {
+ default: /* Fallthrough. */
+ case CSS_FLEX_DIRECTION_ROW_REVERSE: /* Fallthrough. */
+ case CSS_FLEX_DIRECTION_COLUMN_REVERSE:
+ return true;
+ case CSS_FLEX_DIRECTION_ROW: /* Fallthrough. */
+ case CSS_FLEX_DIRECTION_COLUMN:
+ return false;
+ }
+}
+
+static inline int lh__non_auto_margin(const struct box *b, enum box_side side)
+{
+ return (b->margin[side] == AUTO) ? 0 : b->margin[side];
+}
+
+static inline int lh__delta_outer_height(const struct box *b)
+{
+ return b->padding[TOP] +
+ b->padding[BOTTOM] +
+ b->border[TOP].width +
+ b->border[BOTTOM].width +
+ lh__non_auto_margin(b, TOP) +
+ lh__non_auto_margin(b, BOTTOM);
+}
+
+static inline int lh__delta_outer_width(const struct box *b)
+{
+ return b->padding[LEFT] +
+ b->padding[RIGHT] +
+ b->border[LEFT].width +
+ b->border[RIGHT].width +
+ lh__non_auto_margin(b, LEFT) +
+ lh__non_auto_margin(b, RIGHT);
+}
+
+static inline int lh__delta_outer_main(
+ const struct box *flex,
+ const struct box *b)
+{
+ if (lh__flex_main_is_horizontal(flex)) {
+ return lh__delta_outer_width(b);
+ } else {
+ return lh__delta_outer_height(b);
+ }
+}
+
+static inline int lh__delta_outer_cross(
+ const struct box *flex,
+ const struct box *b)
+{
+ if (lh__flex_main_is_horizontal(flex) == false) {
+ return lh__delta_outer_width(b);
+ } else {
+ return lh__delta_outer_height(b);
+ }
+}
+
+static inline int *lh__box_size_main_ptr(
+ bool horizontal,
+ struct box *b)
+{
+ return horizontal ? &b->width : &b->height;
+}
+
+static inline int *lh__box_size_cross_ptr(
+ bool horizontal,
+ struct box *b)
+{
+ return horizontal ? &b->height : &b->width;
+}
+
+static inline int lh__box_size_main(
+ bool horizontal,
+ const struct box *b)
+{
+ return horizontal ? b->width : b->height;
+}
+
+static inline int lh__box_size_cross(
+ bool horizontal,
+ const struct box *b)
+{
+ return horizontal ? b->height : b->width;
+}
+
+static inline bool lh__box_size_cross_is_auto(
+ bool horizontal,
+ struct box *b)
+{
+ css_fixed length;
+ css_unit unit;
+
+ if (horizontal) {
+ return css_computed_height(b->style,
+ &length, &unit) == CSS_HEIGHT_AUTO;
+ } else {
+ return css_computed_width(b->style,
+ &length, &unit) == CSS_WIDTH_AUTO;
+ }
+}
+
+static inline enum css_align_self_e lh__box_align_self(
+ const struct box *flex,
+ const struct box *item)
+{
+ enum css_align_self_e align_self = css_computed_align_self(item->style);
+
+ if (align_self == CSS_ALIGN_SELF_AUTO) {
+ align_self = css_computed_align_items(flex->style);
+ }
+
+ return align_self;
+}
+
+/**
+ * Determine width of margin, borders, and padding on one side of a box.
+ *
+ * \param unit_len_ctx CSS length conversion context for document
+ * \param style style to measure
+ * \param side side of box to measure
+ * \param margin whether margin width is required
+ * \param border whether border width is required
+ * \param padding whether padding width is required
+ * \param fixed increased by sum of fixed margin, border, and padding
+ * \param frac increased by sum of fractional margin and padding
+ */
+static inline void calculate_mbp_width(
+ const css_unit_ctx *unit_len_ctx,
+ const css_computed_style *style,
+ unsigned int side,
+ bool margin,
+ bool border,
+ bool padding,
+ int *fixed,
+ float *frac)
+{
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ assert(style);
+
+ /* margin */
+ if (margin) {
+ enum css_margin_e type;
+
+ type = margin_funcs[side](style, &value, &unit);
+ if (type == CSS_MARGIN_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ *frac += FIXTOFLT(FDIV(value, F_100));
+ } else {
+ *fixed += FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ }
+ }
+
+ /* border */
+ if (border) {
+ if (lh__have_border(side, style)) {
+ border_width_funcs[side](style, &value, &unit);
+
+ *fixed += FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ }
+
+ /* padding */
+ if (padding) {
+ padding_funcs[side](style, &value, &unit);
+ if (unit == CSS_UNIT_PCT) {
+ *frac += FIXTOFLT(FDIV(value, F_100));
+ } else {
+ *fixed += FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ }
+}
+
+/**
+ * Adjust a specified width or height for the box-sizing property.
+ *
+ * This turns the specified dimension into a content-box dimension.
+ *
+ * \param unit_len_ctx Length conversion context
+ * \param box gadget to adjust dimensions of
+ * \param available_width width of containing block
+ * \param setwidth set true if the dimension to be tweaked is a width,
+ * else set false for a height
+ * \param dimension current value for given width/height dimension.
+ * updated to new value after consideration of
+ * gadget properties.
+ */
+static inline void layout_handle_box_sizing(
+ const css_unit_ctx *unit_len_ctx,
+ const struct box *box,
+ int available_width,
+ bool setwidth,
+ int *dimension)
+{
+ enum css_box_sizing_e bs;
+
+ assert(box && box->style);
+
+ bs = css_computed_box_sizing(box->style);
+
+ if (bs == CSS_BOX_SIZING_BORDER_BOX) {
+ int orig = *dimension;
+ int fixed = 0;
+ float frac = 0;
+
+ calculate_mbp_width(unit_len_ctx, box->style,
+ setwidth ? LEFT : TOP,
+ false, true, true, &fixed, &frac);
+ calculate_mbp_width(unit_len_ctx, box->style,
+ setwidth ? RIGHT : BOTTOM,
+ false, true, true, &fixed, &frac);
+ orig -= frac * available_width + fixed;
+ *dimension = orig > 0 ? orig : 0;
+ }
+}
+
+/**
+ * Calculate width, height, and thickness of margins, paddings, and borders.
+ *
+ * \param unit_len_ctx Length conversion context
+ * \param available_width width of containing block
+ * \param viewport_height height of viewport in pixels or -ve if unknown
+ * \param box current box
+ * \param style style giving width, height, margins, paddings,
+ * and borders
+ * \param width updated to width, may be NULL
+ * \param height updated to height, may be NULL
+ * \param max_width updated to max-width, may be NULL
+ * \param min_width updated to min-width, may be NULL
+ * \param max_height updated to max-height, may be NULL
+ * \param min_height updated to min-height, may be NULL
+ * \param margin filled with margins, may be NULL
+ * \param padding filled with paddings, may be NULL
+ * \param border filled with border widths, may be NULL
+ */
+static inline void layout_find_dimensions(
+ const css_unit_ctx *unit_len_ctx,
+ int available_width,
+ int viewport_height,
+ const struct box *box,
+ const css_computed_style *style,
+ int *width,
+ int *height,
+ int *max_width,
+ int *min_width,
+ int *max_height,
+ int *min_height,
+ int margin[4],
+ int padding[4],
+ struct box_border border[4])
+{
+ struct box *containing_block = NULL;
+ unsigned int i;
+
+ if (width) {
+ enum css_width_e wtype;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ wtype = css_computed_width(style, &value, &unit);
+
+ if (wtype == CSS_WIDTH_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ *width = FPCT_OF_INT_TOINT(
+ value, available_width);
+ } else {
+ *width = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ } else {
+ *width = AUTO;
+ }
+
+ if (*width != AUTO) {
+ layout_handle_box_sizing(unit_len_ctx, box,
+ available_width, true, width);
+ }
+ }
+
+ if (height) {
+ enum css_height_e htype;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ htype = css_computed_height(style, &value, &unit);
+
+ if (htype == CSS_HEIGHT_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ enum css_height_e cbhtype;
+
+ if (css_computed_position(box->style) ==
+ CSS_POSITION_ABSOLUTE &&
+ box->parent) {
+ /* Box is absolutely positioned */
+ assert(box->float_container);
+ containing_block = box->float_container;
+ } else if (box->float_container &&
+ css_computed_position(box->style) !=
+ CSS_POSITION_ABSOLUTE &&
+ (css_computed_float(box->style) ==
+ CSS_FLOAT_LEFT ||
+ css_computed_float(box->style) ==
+ CSS_FLOAT_RIGHT)) {
+ /* Box is a float */
+ assert(box->parent &&
+ box->parent->parent &&
+ box->parent->parent->parent);
+
+ containing_block =
+ box->parent->parent->parent;
+ } else if (box->parent && box->parent->type !=
+ BOX_INLINE_CONTAINER) {
+ /* Box is a block level element */
+ containing_block = box->parent;
+ } else if (box->parent && box->parent->type ==
+ BOX_INLINE_CONTAINER) {
+ /* Box is an inline block */
+ assert(box->parent->parent);
+ containing_block = box->parent->parent;
+ }
+
+ if (containing_block) {
+ css_fixed f = 0;
+ css_unit u = CSS_UNIT_PX;
+
+ cbhtype = css_computed_height(
+ containing_block->style,
+ &f, &u);
+ }
+
+ if (containing_block &&
+ containing_block->height != AUTO &&
+ (css_computed_position(box->style) ==
+ CSS_POSITION_ABSOLUTE ||
+ cbhtype == CSS_HEIGHT_SET)) {
+ /* Box is absolutely positioned or its
+ * containing block has a valid
+ * specified height.
+ * (CSS 2.1 Section 10.5) */
+ *height = FPCT_OF_INT_TOINT(value,
+ containing_block->height);
+ } else if ((!box->parent ||
+ !box->parent->parent) &&
+ viewport_height >= 0) {
+ /* If root element or it's child
+ * (HTML or BODY) */
+ *height = FPCT_OF_INT_TOINT(value,
+ viewport_height);
+ } else {
+ /* precentage height not permissible
+ * treat height as auto */
+ *height = AUTO;
+ }
+ } else {
+ *height = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ } else {
+ *height = AUTO;
+ }
+
+ if (*height != AUTO) {
+ layout_handle_box_sizing(unit_len_ctx, box,
+ available_width, false, height);
+ }
+ }
+
+ if (max_width) {
+ enum css_max_width_e type;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ type = css_computed_max_width(style, &value, &unit);
+
+ if (type == CSS_MAX_WIDTH_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ *max_width = FPCT_OF_INT_TOINT(value,
+ available_width);
+ } else {
+ *max_width = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ } else {
+ /* Inadmissible */
+ *max_width = -1;
+ }
+
+ if (*max_width != -1) {
+ layout_handle_box_sizing(unit_len_ctx, box,
+ available_width, true, max_width);
+ }
+ }
+
+ if (min_width) {
+ enum css_min_width_e type;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ type = ns_computed_min_width(style, &value, &unit);
+
+ if (type == CSS_MIN_WIDTH_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ *min_width = FPCT_OF_INT_TOINT(value,
+ available_width);
+ } else {
+ *min_width = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ } else {
+ /* Inadmissible */
+ *min_width = 0;
+ }
+
+ if (*min_width != 0) {
+ layout_handle_box_sizing(unit_len_ctx, box,
+ available_width, true, min_width);
+ }
+ }
+
+ if (max_height) {
+ enum css_max_height_e type;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ type = css_computed_max_height(style, &value, &unit);
+
+ if (type == CSS_MAX_HEIGHT_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ /* TODO: handle percentage */
+ *max_height = -1;
+ } else {
+ *max_height = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ } else {
+ /* Inadmissible */
+ *max_height = -1;
+ }
+ }
+
+ if (min_height) {
+ enum css_min_height_e type;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ type = ns_computed_min_height(style, &value, &unit);
+
+ if (type == CSS_MIN_HEIGHT_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ /* TODO: handle percentage */
+ *min_height = 0;
+ } else {
+ *min_height = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ } else {
+ /* Inadmissible */
+ *min_height = 0;
+ }
+ }
+
+ for (i = 0; i != 4; i++) {
+ if (margin) {
+ enum css_margin_e type = CSS_MARGIN_AUTO;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ type = margin_funcs[i](style, &value, &unit);
+
+ if (type == CSS_MARGIN_SET) {
+ if (unit == CSS_UNIT_PCT) {
+ margin[i] = FPCT_OF_INT_TOINT(value,
+ available_width);
+ } else {
+ margin[i] = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ } else {
+ margin[i] = AUTO;
+ }
+ }
+
+ if (padding) {
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ padding_funcs[i](style, &value, &unit);
+
+ if (unit == CSS_UNIT_PCT) {
+ padding[i] = FPCT_OF_INT_TOINT(value,
+ available_width);
+ } else {
+ padding[i] = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+ }
+ }
+
+ /* Table cell borders are populated in table.c */
+ if (border && box->type != BOX_TABLE_CELL) {
+ enum css_border_style_e bstyle = CSS_BORDER_STYLE_NONE;
+ css_color color = 0;
+ css_fixed value = 0;
+ css_unit unit = CSS_UNIT_PX;
+
+ border_width_funcs[i](style, &value, &unit);
+ bstyle = border_style_funcs[i](style);
+ border_color_funcs[i](style, &color);
+
+ border[i].style = bstyle;
+ border[i].c = color;
+
+ if (bstyle == CSS_BORDER_STYLE_HIDDEN ||
+ bstyle == CSS_BORDER_STYLE_NONE)
+ /* spec unclear: following Mozilla */
+ border[i].width = 0;
+ else
+ border[i].width = FIXTOINT(css_unit_len2device_px(
+ style, unit_len_ctx,
+ value, unit));
+
+ /* Special case for border-collapse: make all borders
+ * on table/table-row-group/table-row zero width. */
+ if (css_computed_border_collapse(style) ==
+ CSS_BORDER_COLLAPSE_COLLAPSE &&
+ (box->type == BOX_TABLE ||
+ box->type == BOX_TABLE_ROW_GROUP ||
+ box->type == BOX_TABLE_ROW))
+ border[i].width = 0;
+ }
+ }
+}
+
+#endif
diff --git a/content/handlers/html/redraw_border.c b/content/handlers/html/redraw_border.c
index 39ed432cd..3a1f6f308 100644
--- a/content/handlers/html/redraw_border.c
+++ b/content/handlers/html/redraw_border.c
@@ -25,6 +25,7 @@
#include <stdbool.h>
#include <stdlib.h>
+#include "utils/utils.h"
#include "utils/log.h"
#include "netsurf/plotters.h"
#include "netsurf/css.h"
@@ -121,7 +122,7 @@ html_redraw_border_plot(const int side,
switch (style) {
case CSS_BORDER_STYLE_DOTTED:
plot_style_bdr.stroke_type = PLOT_OP_TYPE_DOT;
- /* fall through */
+ fallthrough;
case CSS_BORDER_STYLE_DASHED:
rect.x0 = (p[0] + p[2]) / 2;
rect.y0 = (p[1] + p[3]) / 2;
@@ -131,7 +132,7 @@ html_redraw_border_plot(const int side,
break;
case CSS_BORDER_STYLE_SOLID:
- /* fall through to default */
+ /* solid is the default */
default:
if (rectangular || thickness == 1) {
@@ -190,7 +191,7 @@ html_redraw_border_plot(const int side,
case CSS_BORDER_STYLE_GROOVE:
light = 3 - light;
- /* fall through */
+ fallthrough;
case CSS_BORDER_STYLE_RIDGE:
/* choose correct colours for each part of the border line */
if (light <= 1) {
@@ -300,7 +301,7 @@ html_redraw_border_plot(const int side,
case CSS_BORDER_STYLE_INSET:
light = (light + 2) % 4;
- /* fall through */
+ fallthrough;
case CSS_BORDER_STYLE_OUTSET:
/* choose correct colours for each part of the border line */
switch (light) {
diff --git a/content/handlers/html/script.c b/content/handlers/html/script.c
index 962386d68..554fc4f70 100644
--- a/content/handlers/html/script.c
+++ b/content/handlers/html/script.c
@@ -495,6 +495,7 @@ exec_src_script(html_content *c,
switch (script_type) {
case HTML_SCRIPT_SYNC:
ret = DOM_HUBBUB_HUBBUB_ERR | HUBBUB_PAUSED;
+ break;
case HTML_SCRIPT_ASYNC:
break;
diff --git a/content/handlers/html/table.c b/content/handlers/html/table.c
index 4ffcceab9..f8762e862 100644
--- a/content/handlers/html/table.c
+++ b/content/handlers/html/table.c
@@ -26,6 +26,7 @@
#include <dom/dom.h>
#include "utils/log.h"
+#include "utils/utils.h"
#include "utils/talloc.h"
#include "css/utils.h"
@@ -93,27 +94,27 @@ table_border_is_more_eyecatching(const css_unit_ctx *unit_len_ctx,
/* 3b -- sort by style */
switch (a->style) {
- case CSS_BORDER_STYLE_DOUBLE: impact++; /* Fall through */
- case CSS_BORDER_STYLE_SOLID: impact++; /* Fall through */
- case CSS_BORDER_STYLE_DASHED: impact++; /* Fall through */
- case CSS_BORDER_STYLE_DOTTED: impact++; /* Fall through */
- case CSS_BORDER_STYLE_RIDGE: impact++; /* Fall through */
- case CSS_BORDER_STYLE_OUTSET: impact++; /* Fall through */
- case CSS_BORDER_STYLE_GROOVE: impact++; /* Fall through */
- case CSS_BORDER_STYLE_INSET: impact++; /* Fall through */
+ case CSS_BORDER_STYLE_DOUBLE: impact++; fallthrough;
+ case CSS_BORDER_STYLE_SOLID: impact++; fallthrough;
+ case CSS_BORDER_STYLE_DASHED: impact++; fallthrough;
+ case CSS_BORDER_STYLE_DOTTED: impact++; fallthrough;
+ case CSS_BORDER_STYLE_RIDGE: impact++; fallthrough;
+ case CSS_BORDER_STYLE_OUTSET: impact++; fallthrough;
+ case CSS_BORDER_STYLE_GROOVE: impact++; fallthrough;
+ case CSS_BORDER_STYLE_INSET: impact++; fallthrough;
default:
break;
}
switch (b->style) {
- case CSS_BORDER_STYLE_DOUBLE: impact--; /* Fall through */
- case CSS_BORDER_STYLE_SOLID: impact--; /* Fall through */
- case CSS_BORDER_STYLE_DASHED: impact--; /* Fall through */
- case CSS_BORDER_STYLE_DOTTED: impact--; /* Fall through */
- case CSS_BORDER_STYLE_RIDGE: impact--; /* Fall through */
- case CSS_BORDER_STYLE_OUTSET: impact--; /* Fall through */
- case CSS_BORDER_STYLE_GROOVE: impact--; /* Fall through */
- case CSS_BORDER_STYLE_INSET: impact--; /* Fall through */
+ case CSS_BORDER_STYLE_DOUBLE: impact--; fallthrough;
+ case CSS_BORDER_STYLE_SOLID: impact--; fallthrough;
+ case CSS_BORDER_STYLE_DASHED: impact--; fallthrough;
+ case CSS_BORDER_STYLE_DOTTED: impact--; fallthrough;
+ case CSS_BORDER_STYLE_RIDGE: impact--; fallthrough;
+ case CSS_BORDER_STYLE_OUTSET: impact--; fallthrough;
+ case CSS_BORDER_STYLE_GROOVE: impact--; fallthrough;
+ case CSS_BORDER_STYLE_INSET: impact--; fallthrough;
default:
break;
}
@@ -128,20 +129,20 @@ table_border_is_more_eyecatching(const css_unit_ctx *unit_len_ctx,
/** \todo COL/COL_GROUP */
switch (a_src) {
- case BOX_TABLE_CELL: impact++; /* Fall through */
- case BOX_TABLE_ROW: impact++; /* Fall through */
- case BOX_TABLE_ROW_GROUP: impact++; /* Fall through */
- case BOX_TABLE: impact++; /* Fall through */
+ case BOX_TABLE_CELL: impact++; fallthrough;
+ case BOX_TABLE_ROW: impact++; fallthrough;
+ case BOX_TABLE_ROW_GROUP: impact++; fallthrough;
+ case BOX_TABLE: impact++; fallthrough;
default:
break;
}
/** \todo COL/COL_GROUP */
switch (b_src) {
- case BOX_TABLE_CELL: impact--; /* Fall through */
- case BOX_TABLE_ROW: impact--; /* Fall through */
- case BOX_TABLE_ROW_GROUP: impact--; /* Fall through */
- case BOX_TABLE: impact--; /* Fall through */
+ case BOX_TABLE_CELL: impact--; fallthrough;
+ case BOX_TABLE_ROW: impact--; fallthrough;
+ case BOX_TABLE_ROW_GROUP: impact--; fallthrough;
+ case BOX_TABLE: impact--; fallthrough;
default:
break;
}
diff --git a/content/handlers/image/Makefile b/content/handlers/image/Makefile
index 1c27f74d7..ac052b37a 100644
--- a/content/handlers/image/Makefile
+++ b/content/handlers/image/Makefile
@@ -7,10 +7,11 @@ S_IMAGE_$(NETSURF_USE_BMP) += bmp.c
S_IMAGE_$(NETSURF_USE_GIF) += gif.c
S_IMAGE_$(NETSURF_USE_BMP) += ico.c
S_IMAGE_$(NETSURF_USE_JPEG) += jpeg.c
+S_IMAGE_$(NETSURF_USE_JPEGXL) += jpegxl.c
S_IMAGE_$(NETSURF_USE_ROSPRITE) += nssprite.c
S_IMAGE_$(NETSURF_USE_PNG) += png.c
S_IMAGE_$(NETSURF_USE_NSSVG) += svg.c
-S_IMAGE_$(NETSURF_USE_RSVG) += rsvg.c
+S_IMAGE_$(NETSURF_USE_RSVG) += rsvg$(RSVG_API).c
S_IMAGE_$(NETSURF_USE_VIDEO) += video.c
S_IMAGE_$(NETSURF_USE_WEBP) += webp.c
diff --git a/content/handlers/image/gif.c b/content/handlers/image/gif.c
index deabd0adc..4671d1df5 100644
--- a/content/handlers/image/gif.c
+++ b/content/handlers/image/gif.c
@@ -68,9 +68,6 @@ static inline nserror gif__nsgif_error_to_ns(nsgif_error gif_res)
nserror err;
switch (gif_res) {
- case NSGIF_OK:
- err = NSERROR_OK;
- break;
case NSGIF_ERR_OOM:
err = NSERROR_NOMEM;
break;
@@ -233,10 +230,12 @@ static bool gif_convert(struct content *c)
/* Initialise the GIF */
gif_err = nsgif_data_scan(gif->gif, size, data);
if (gif_err != NSGIF_OK) {
- NSLOG(netsurf, DEBUG, "%s", nsgif_strerror(gif_err));
- /* Not fatal unless er have no frames. */
+ NSLOG(netsurf, INFO, "nsgif scan: %s", nsgif_strerror(gif_err));
+ /* Not fatal unless we have no frames. */
}
+ nsgif_data_complete(gif->gif);
+
gif_info = nsgif_get_info(gif->gif);
assert(gif_info != NULL);
diff --git a/content/handlers/image/image.c b/content/handlers/image/image.c
index 3107ee495..2bd5f5f8d 100644
--- a/content/handlers/image/image.c
+++ b/content/handlers/image/image.c
@@ -32,6 +32,7 @@
#include "image/gif.h"
#include "image/ico.h"
#include "image/jpeg.h"
+#include "image/jpegxl.h"
#include "image/nssprite.h"
#include "image/png.h"
#include "image/rsvg.h"
@@ -72,6 +73,12 @@ nserror image_init(void)
return error;
#endif
+#ifdef WITH_JPEGXL
+ error = nsjpegxl_init();
+ if (error != NSERROR_OK)
+ return error;
+#endif
+
#ifdef WITH_PNG
error = nspng_init();
if (error != NSERROR_OK)
diff --git a/content/handlers/image/image_cache.c b/content/handlers/image/image_cache.c
index 6ce6b5234..8f7ff89ff 100644
--- a/content/handlers/image/image_cache.c
+++ b/content/handlers/image/image_cache.c
@@ -438,6 +438,7 @@ image_cache_init(const struct image_cache_parameters *image_cache_parameters)
nserror image_cache_fini(void)
{
unsigned int op_count;
+ uint64_t op_size;
guit->misc->schedule(-1, image_cache__background_update, image_cache);
@@ -452,6 +453,10 @@ nserror image_cache_fini(void)
image_cache->miss_count +
image_cache->fail_count;
+ op_size = image_cache->hit_size +
+ image_cache->miss_size +
+ image_cache->fail_size;
+
NSLOG(netsurf, INFO, "Age %ds", image_cache->current_age / 1000);
NSLOG(netsurf, INFO, "Peak size %"PRIsizet" (in %d)",
image_cache->max_bitmap_size,
@@ -460,12 +465,7 @@ nserror image_cache_fini(void)
image_cache->max_bitmap_count,
image_cache->max_bitmap_count_size);
- if (op_count > 0) {
- uint64_t op_size;
-
- op_size = image_cache->hit_size +
- image_cache->miss_size +
- image_cache->fail_size;
+ if ((op_count > 0) && (op_size >0)) {
NSLOG(netsurf, INFO,
"Cache total/hit/miss/fail (counts) %d/%d/%d/%d (100%%/%d%%/%d%%/%d%%)",
@@ -528,7 +528,7 @@ nserror image_cache_add(struct content *content,
image_cache__link(centry);
centry->content = content;
- centry->bitmap_size = content->width * content->height * 4;
+ centry->bitmap_size = content->width * content->height * 4llu;
}
NSLOG(netsurf, INFO, "centry %p, content %p, bitmap %p", centry,
diff --git a/content/handlers/image/jpeg.c b/content/handlers/image/jpeg.c
index e07fb47bb..93372f15a 100644
--- a/content/handlers/image/jpeg.c
+++ b/content/handlers/image/jpeg.c
@@ -206,7 +206,9 @@ static inline void nsjpeg__decode_rgb(
uint8_t * volatile pixels,
size_t rowstride)
{
+#if RGB_RED != 0 || RGB_GREEN != 1 || RGB_BLUE != 2 || RGB_PIXELSIZE != 4
int width = cinfo->output_width;
+#endif
do {
JSAMPROW scanlines[1] = {
diff --git a/content/handlers/image/jpegxl.c b/content/handlers/image/jpegxl.c
new file mode 100644
index 000000000..01c704577
--- /dev/null
+++ b/content/handlers/image/jpegxl.c
@@ -0,0 +1,340 @@
+/*
+ * Copyright 2023 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file
+ * implementation of content handling for image/jpegxl
+ *
+ * This implementation uses the JXL library.
+ */
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <setjmp.h>
+#include <string.h>
+
+#include <jxl/decode.h>
+
+#include "utils/utils.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "netsurf/bitmap.h"
+#include "content/llcache.h"
+#include "content/content.h"
+#include "content/content_protected.h"
+#include "content/content_factory.h"
+#include "desktop/gui_internal.h"
+#include "desktop/bitmap.h"
+
+#include "image/image_cache.h"
+
+#include "image/jpegxl.h"
+
+
+/**
+ * output image format
+ */
+static const JxlPixelFormat jxl_output_format = {
+ .num_channels = 4,
+ .data_type = JXL_TYPE_UINT8,
+ .endianness = JXL_LITTLE_ENDIAN,
+ .align = 0,
+};
+
+/**
+ * Content create entry point.
+ */
+static nserror
+nsjpegxl_create(const content_handler *handler,
+ lwc_string *imime_type, const struct http_parameter *params,
+ llcache_handle *llcache, const char *fallback_charset,
+ bool quirks, struct content **c)
+{
+ struct content *jpeg;
+ nserror error;
+
+ jpeg = calloc(1, sizeof(struct content));
+ if (jpeg == NULL)
+ return NSERROR_NOMEM;
+
+ error = content__init(jpeg, handler, imime_type, params,
+ llcache, fallback_charset, quirks);
+ if (error != NSERROR_OK) {
+ free(jpeg);
+ return error;
+ }
+
+ *c = jpeg;
+
+ return NSERROR_OK;
+}
+
+/**
+ * create a bitmap from jpeg xl content.
+ */
+static struct bitmap *
+jpegxl_cache_convert(struct content *c)
+{
+ struct bitmap * bitmap = NULL;
+ JxlDecoder *jxldec;
+ JxlDecoderStatus decstatus;
+ JxlBasicInfo binfo;
+ const uint8_t *src_data;
+ size_t src_size;
+ uint8_t * output;
+ bitmap_fmt_t jxl_fmt = {
+ /** TODO: At the moment we have to set the layout to the only
+ * pixel layout that libjxl supports. It looks like they
+ * plan to add support for decoding to other layouts
+ * in the future, as shown by the TODO in the docs:
+ *
+ * https://libjxl.readthedocs.io/en/latest/api_common.html#_CPPv414JxlPixelFormat
+ */
+ .layout = BITMAP_LAYOUT_R8G8B8A8,
+ .pma = bitmap_fmt.pma,
+ };
+
+ jxldec = JxlDecoderCreate(NULL);
+ if (jxldec == NULL) {
+ NSLOG(netsurf, ERROR, "Unable to allocate decoder");
+ return NULL;
+ }
+
+ decstatus = JxlDecoderSetUnpremultiplyAlpha(jxldec, !bitmap_fmt.pma);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ NSLOG(netsurf, ERROR, "unable to set premultiplied alpha status: %d",
+ decstatus);
+ JxlDecoderDestroy(jxldec);
+ return NULL;
+ }
+
+ decstatus= JxlDecoderSubscribeEvents(jxldec, JXL_DEC_FULL_IMAGE);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ NSLOG(netsurf, ERROR, "Unable to subscribe");
+ return NULL;
+ }
+ src_data = content__get_source_data(c, &src_size);
+
+ decstatus = JxlDecoderSetInput(jxldec, src_data, src_size);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ NSLOG(netsurf, ERROR, "unable to set input");
+ return NULL;
+ }
+
+ decstatus = JxlDecoderProcessInput(jxldec);
+ if (decstatus != JXL_DEC_NEED_IMAGE_OUT_BUFFER) {
+ NSLOG(netsurf, ERROR,
+ "expected status JXL_DEC_NEED_IMAGE_OUT_BUFFER(%d) got %d",
+ JXL_DEC_NEED_IMAGE_OUT_BUFFER,
+ decstatus);
+ JxlDecoderDestroy(jxldec);
+ return NULL;
+ }
+
+ decstatus = JxlDecoderGetBasicInfo(jxldec, &binfo);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ NSLOG(netsurf, ERROR, "unable to get basic info status:%d",decstatus);
+ JxlDecoderDestroy(jxldec);
+ return NULL;
+ }
+
+ /* create bitmap with appropriate opacity */
+ if (binfo.alpha_bits > 0) {
+ bitmap = guit->bitmap->create(c->width, c->height, BITMAP_OPAQUE);
+ } else {
+ bitmap = guit->bitmap->create(c->width, c->height, BITMAP_NONE);
+ }
+ if (bitmap == NULL) {
+ /* empty bitmap could not be created */
+ JxlDecoderDestroy(jxldec);
+ return NULL;
+ }
+
+ /* ensure buffer was allocated */
+ output = guit->bitmap->get_buffer(bitmap);
+ if (output == NULL) {
+ /* bitmap with no buffer available */
+ guit->bitmap->destroy(bitmap);
+ JxlDecoderDestroy(jxldec);
+ return NULL;
+ }
+ decstatus = JxlDecoderSetImageOutBuffer(jxldec, &jxl_output_format, output, c->size);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ NSLOG(netsurf, ERROR, "unable to set output buffer callback status:%d",decstatus);
+ guit->bitmap->destroy(bitmap);
+ JxlDecoderDestroy(jxldec);
+ return NULL;
+ }
+
+ decstatus = JxlDecoderProcessInput(jxldec);
+ if (decstatus != JXL_DEC_FULL_IMAGE) {
+ NSLOG(netsurf, ERROR, "did not get decode event");
+ guit->bitmap->destroy(bitmap);
+ JxlDecoderDestroy(jxldec);
+ return NULL;
+ }
+
+ JxlDecoderDestroy(jxldec);
+
+ bitmap_format_to_client(bitmap, &jxl_fmt);
+ guit->bitmap->modified(bitmap);
+
+ return bitmap;
+}
+
+/**
+ * report failiure
+ */
+static bool jxl_report_fail(struct content *c, JxlDecoderStatus decstatus, const char *msg)
+{
+ union content_msg_data msg_data;
+ NSLOG(netsurf, ERROR, "%s decoder status:%d", msg, decstatus);
+ msg_data.errordata.errorcode = NSERROR_UNKNOWN;
+ msg_data.errordata.errormsg = msg;
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
+ return false;
+}
+
+/**
+ * Convert a CONTENT_JPEGXL for display.
+ */
+static bool nsjpegxl_convert(struct content *c)
+{
+ JxlDecoder *jxldec;
+ JxlSignature decsig;
+ JxlDecoderStatus decstatus = JXL_DEC_ERROR;
+ JxlBasicInfo binfo;
+ union content_msg_data msg_data;
+ const uint8_t *data;
+ size_t size;
+ char *title;
+ size_t image_size;
+
+ /* check image header is valid and get width/height */
+ data = content__get_source_data(c, &size);
+
+ decsig = JxlSignatureCheck(data,size);
+ if ((decsig != JXL_SIG_CODESTREAM) && (decsig != JXL_SIG_CONTAINER)) {
+ NSLOG(netsurf, ERROR, "signature failed");
+ msg_data.errordata.errorcode = NSERROR_UNKNOWN;
+ msg_data.errordata.errormsg = "Signature failed";
+ content_broadcast(c, CONTENT_MSG_ERROR, &msg_data);
+ return false;
+ }
+
+ jxldec = JxlDecoderCreate(NULL);
+ if (jxldec == NULL) {
+ return jxl_report_fail(c, decstatus, "Unable to allocate decoder");
+ }
+ decstatus= JxlDecoderSubscribeEvents(jxldec, JXL_DEC_BASIC_INFO);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ return jxl_report_fail(c, decstatus, "Unable to subscribe");
+ }
+ decstatus = JxlDecoderSetInput(jxldec, data,size);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ return jxl_report_fail(c, decstatus, "unable to set input");
+ }
+ decstatus = JxlDecoderProcessInput(jxldec);
+ if (decstatus != JXL_DEC_BASIC_INFO) {
+ return jxl_report_fail(c, decstatus, "did not get basic info event");
+ }
+ decstatus = JxlDecoderGetBasicInfo(jxldec, &binfo);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ return jxl_report_fail(c, decstatus, "unable to get basic info");
+ }
+ decstatus = JxlDecoderImageOutBufferSize(jxldec, &jxl_output_format, &image_size);
+ if (decstatus != JXL_DEC_SUCCESS) {
+ return jxl_report_fail(c, decstatus, "unable get image size");
+ }
+
+ JxlDecoderDestroy(jxldec);
+
+ NSLOG(netsurf, INFO, "got basic info size:%ld x:%d y:%d", image_size, binfo.xsize, binfo.ysize);
+
+ c->width = binfo.xsize;
+ c->height = binfo.ysize;
+ c->size = image_size;
+
+ image_cache_add(c, NULL, jpegxl_cache_convert);
+
+ /* set title text */
+ title = messages_get_buff("JPEGXLTitle",
+ nsurl_access_leaf(llcache_handle_get_url(c->llcache)),
+ c->width, c->height);
+ if (title != NULL) {
+ content__set_title(c, title);
+ free(title);
+ }
+
+ content_set_ready(c);
+ content_set_done(c);
+ content_set_status(c, ""); /* Done: update status bar */
+
+ return true;
+}
+
+
+/**
+ * Clone content.
+ */
+static nserror nsjpegxl_clone(const struct content *old, struct content **newc)
+{
+ struct content *jpegxl_c;
+ nserror error;
+
+ jpegxl_c = calloc(1, sizeof(struct content));
+ if (jpegxl_c == NULL)
+ return NSERROR_NOMEM;
+
+ error = content__clone(old, jpegxl_c);
+ if (error != NSERROR_OK) {
+ content_destroy(jpegxl_c);
+ return error;
+ }
+
+ /* re-convert if the content is ready */
+ if ((old->status == CONTENT_STATUS_READY) ||
+ (old->status == CONTENT_STATUS_DONE)) {
+ if (nsjpegxl_convert(jpegxl_c) == false) {
+ content_destroy(jpegxl_c);
+ return NSERROR_CLONE_FAILED;
+ }
+ }
+
+ *newc = jpegxl_c;
+
+ return NSERROR_OK;
+}
+
+static const content_handler nsjpegxl_content_handler = {
+ .create = nsjpegxl_create,
+ .data_complete = nsjpegxl_convert,
+ .destroy = image_cache_destroy,
+ .redraw = image_cache_redraw,
+ .clone = nsjpegxl_clone,
+ .get_internal = image_cache_get_internal,
+ .type = image_cache_content_type,
+ .is_opaque = image_cache_is_opaque,
+ .no_share = false,
+};
+
+static const char *nsjpegxl_types[] = {
+ "image/jxl",
+};
+
+CONTENT_FACTORY_REGISTER_TYPES(nsjpegxl, nsjpegxl_types, nsjpegxl_content_handler);
diff --git a/content/handlers/image/jpegxl.h b/content/handlers/image/jpegxl.h
new file mode 100644
index 000000000..e37d9344e
--- /dev/null
+++ b/content/handlers/image/jpegxl.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2023 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Content for image/jpegxl (interface).
+ */
+
+#ifndef _NETSURF_IMAGE_JPEGXL_H_
+#define _NETSURF_IMAGE_JPEGXL_H_
+
+nserror nsjpegxl_init(void);
+
+#endif
diff --git a/content/handlers/image/nssprite.c b/content/handlers/image/nssprite.c
index a98c48aa2..c18f49063 100644
--- a/content/handlers/image/nssprite.c
+++ b/content/handlers/image/nssprite.c
@@ -124,7 +124,7 @@ static bool nssprite_convert(struct content *c)
content_broadcast_error(c, NSERROR_NOMEM, NULL);
return false;
}
- uint32_t* imagebuf = (uint32_t *)guit->bitmap->get_buffer(nssprite->bitmap);
+ uint32_t* imagebuf = (uint32_t *)(void *)guit->bitmap->get_buffer(nssprite->bitmap);
if (!imagebuf) {
content_broadcast_error(c, NSERROR_NOMEM, NULL);
return false;
diff --git a/content/handlers/image/rsvg246.c b/content/handlers/image/rsvg246.c
new file mode 100644
index 000000000..0e337132f
--- /dev/null
+++ b/content/handlers/image/rsvg246.c
@@ -0,0 +1,280 @@
+/*
+ * Copyright 2022 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file
+ * implementation of content handler for image/svg using librsvg 2.46 API.
+ *
+ * SVG files are rendered to a NetSurf bitmap by creating a Cairo rendering
+ * surface (content_rsvg_data.cs) over the bitmap's data, creating a Cairo
+ * drawing context using that surface, and then passing that drawing context
+ * to librsvg which then uses Cairo calls to plot the graphic to the bitmap.
+ * We store this in content->bitmap, and then use the usual bitmap plotter
+ * function to render it for redraw requests.
+ */
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <librsvg/rsvg.h>
+
+#include <nsutils/endian.h>
+
+#include "utils/log.h"
+#include "utils/utils.h"
+#include "utils/messages.h"
+#include "netsurf/plotters.h"
+#include "netsurf/bitmap.h"
+#include "netsurf/content.h"
+#include "content/llcache.h"
+#include "content/content_protected.h"
+#include "content/content_factory.h"
+#include "desktop/gui_internal.h"
+#include "desktop/bitmap.h"
+
+#include "image/image_cache.h"
+
+#include "image/rsvg.h"
+
+
+typedef struct rsvg_content {
+ struct content base;
+
+ RsvgHandle *rsvgh; /**< Context handle for RSVG renderer */
+} rsvg_content;
+
+
+static nserror
+rsvg_create(const content_handler *handler,
+ lwc_string *imime_type,
+ const struct http_parameter *params,
+ llcache_handle *llcache,
+ const char *fallback_charset,
+ bool quirks,
+ struct content **c)
+{
+ rsvg_content *svg;
+ nserror error;
+
+ svg = calloc(1, sizeof(rsvg_content));
+ if (svg == NULL)
+ return NSERROR_NOMEM;
+
+ error = content__init(&svg->base, handler, imime_type, params,
+ llcache, fallback_charset, quirks);
+ if (error != NSERROR_OK) {
+ free(svg);
+ return error;
+ }
+
+ *c = (struct content *)svg;
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * create a bitmap from jpeg content for the image cache.
+ */
+static struct bitmap *
+rsvg_cache_convert(struct content *c)
+{
+ rsvg_content *svgc = (rsvg_content *)c;
+ struct bitmap *bitmap;
+ cairo_surface_t *cs;
+ cairo_t *cr;
+ RsvgRectangle viewport;
+ gboolean renderres;
+
+ if ((bitmap = guit->bitmap->create(c->width, c->height, BITMAP_NONE)) == NULL) {
+ NSLOG(netsurf, INFO, "Failed to create bitmap for rsvg render.");
+ return NULL;
+ }
+
+ if ((cs = cairo_image_surface_create_for_data(
+ (unsigned char *)guit->bitmap->get_buffer(bitmap),
+ CAIRO_FORMAT_ARGB32,
+ c->width, c->height,
+ guit->bitmap->get_rowstride(bitmap))) == NULL) {
+ NSLOG(netsurf, INFO, "Failed to create Cairo image surface for rsvg render.");
+ guit->bitmap->destroy(bitmap);
+ return NULL;
+ }
+ if ((cr = cairo_create(cs)) == NULL) {
+ NSLOG(netsurf, INFO,
+ "Failed to create Cairo drawing context for rsvg render.");
+ cairo_surface_destroy(cs);
+ guit->bitmap->destroy(bitmap);
+ return NULL;
+ }
+
+ viewport.x = 0;
+ viewport.y = 0;
+ viewport.width = c->width;
+ viewport.height = c->height;
+ renderres = rsvg_handle_render_document(svgc->rsvgh, cr, &viewport, NULL);
+ NSLOG(netsurf, DEBUG, "rsvg render:%d, width:%d, height %d", renderres, c->width, c->height);
+
+ bitmap_format_to_client(bitmap, &(bitmap_fmt_t) {
+ .layout = BITMAP_LAYOUT_ARGB8888,
+ });
+ guit->bitmap->modified(bitmap);
+
+ cairo_destroy(cr);
+ cairo_surface_destroy(cs);
+
+ return bitmap;
+}
+
+static void rsvg__get_demensions(const rsvg_content *svgc,
+ int *width, int *height)
+{
+#if LIBRSVG_MAJOR_VERSION >= 2 && LIBRSVG_MINOR_VERSION >= 52
+ gdouble rwidth;
+ gdouble rheight;
+ gboolean gotsize;
+
+ gotsize = rsvg_handle_get_intrinsic_size_in_pixels(svgc->rsvgh,
+ &rwidth,
+ &rheight);
+ if (gotsize == TRUE) {
+ *width = rwidth;
+ *height = rheight;
+ } else {
+ RsvgRectangle ink_rect;
+ RsvgRectangle logical_rect;
+ rsvg_handle_get_geometry_for_element(svgc->rsvgh,
+ NULL,
+ &ink_rect,
+ &logical_rect,
+ NULL);
+ *width = ink_rect.width;
+ *height = ink_rect.height;
+ }
+#else
+ RsvgDimensionData rsvgsize;
+
+ rsvg_handle_get_dimensions(svgc->rsvgh, &rsvgsize);
+ *width = rsvgsize.width;
+ *height = rsvgsize.height;
+#endif
+ NSLOG(netsurf, DEBUG, "rsvg width:%d height:%d.", *width, *height);
+}
+
+static bool rsvg_convert(struct content *c)
+{
+ rsvg_content *svgc = (rsvg_content *)c;
+ const uint8_t *data; /* content data */
+ size_t size; /* content data size */
+ GInputStream * istream;
+ GError *gerror = NULL;
+
+ /* check image header is valid and get width/height */
+
+ data = content__get_source_data(c, &size);
+
+ istream = g_memory_input_stream_new_from_data(data, size, NULL);
+ svgc->rsvgh = rsvg_handle_new_from_stream_sync(istream,
+ NULL,
+ RSVG_HANDLE_FLAGS_NONE,
+ NULL,
+ &gerror);
+ g_object_unref(istream);
+ if (svgc->rsvgh == NULL) {
+ NSLOG(netsurf, INFO, "Failed to create rsvg handle for content.");
+ return false;
+ }
+
+ rsvg__get_demensions(svgc, &c->width, &c->height);
+
+ c->size = c->width * c->height * 4;
+
+ image_cache_add(c, NULL, rsvg_cache_convert);
+
+ content_set_ready(c);
+ content_set_done(c);
+ content_set_status(c, ""); /* Done: update status bar */
+
+ return true;
+}
+
+
+static nserror rsvg_clone(const struct content *old, struct content **newc)
+{
+ rsvg_content *svg;
+ nserror error;
+
+ svg = calloc(1, sizeof(rsvg_content));
+ if (svg == NULL)
+ return NSERROR_NOMEM;
+
+ error = content__clone(old, &svg->base);
+ if (error != NSERROR_OK) {
+ content_destroy(&svg->base);
+ return error;
+ }
+
+ /* re-convert if the content is ready */
+ if ((old->status == CONTENT_STATUS_READY) ||
+ (old->status == CONTENT_STATUS_DONE)) {
+ if (rsvg_convert(&svg->base) == false) {
+ content_destroy(&svg->base);
+ return NSERROR_CLONE_FAILED;
+ }
+ }
+
+ *newc = (struct content *)svg;
+
+ return NSERROR_OK;
+}
+
+
+static void rsvg_destroy(struct content *c)
+{
+ rsvg_content *d = (rsvg_content *) c;
+
+ if (d->rsvgh != NULL) {
+ g_object_unref(d->rsvgh);
+ d->rsvgh = NULL;
+ }
+
+ return image_cache_destroy(c);
+}
+
+static const content_handler rsvg_content_handler = {
+ .create = rsvg_create,
+ .data_complete = rsvg_convert,
+ .destroy = rsvg_destroy,
+ .redraw = image_cache_redraw,
+ .clone = rsvg_clone,
+ .get_internal = image_cache_get_internal,
+ .type = image_cache_content_type,
+ .is_opaque = image_cache_is_opaque,
+ .no_share = false,
+};
+
+static const char *rsvg_types[] = {
+ "image/svg",
+ "image/svg+xml"
+};
+
+CONTENT_FACTORY_REGISTER_TYPES(nsrsvg, rsvg_types, rsvg_content_handler);
+
diff --git a/content/handlers/image/webp.c b/content/handlers/image/webp.c
index da13316bc..c04c0efd2 100644
--- a/content/handlers/image/webp.c
+++ b/content/handlers/image/webp.c
@@ -142,7 +142,7 @@ webp_cache_convert(struct content *c)
default:
/* WebP has no ABGR function, fall back to default. */
webp_fmt.layout = BITMAP_LAYOUT_R8G8B8A8;
- /* Fall through. */
+ fallthrough;
case BITMAP_LAYOUT_R8G8B8A8:
decoded = WebPDecodeRGBAInto(source_data, source_size, pixels,
rowstride * webpfeatures.height, rowstride);
diff --git a/content/handlers/javascript/duktape/CSSRule.bnd b/content/handlers/javascript/duktape/CSSRule.bnd
new file mode 100644
index 000000000..555023c85
--- /dev/null
+++ b/content/handlers/javascript/duktape/CSSRule.bnd
@@ -0,0 +1,22 @@
+/* CSS Rule binding for NetSurf using duktape and libcss/libdom
+ *
+ * Copyright 2022 Daniel Silverstone <dsilvers@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+/* Note, for now this exists purely to block warnings, eventually
+ * rules will have to come from stylesheets etc.
+ */
+
+class CSSRule {
+ private bool unused;
+};
+
+init CSSRule()
+%{
+ priv->unused = true;
+%}
diff --git a/content/handlers/javascript/duktape/CSSStyleSheet.bnd b/content/handlers/javascript/duktape/CSSStyleSheet.bnd
new file mode 100644
index 000000000..9167b8afa
--- /dev/null
+++ b/content/handlers/javascript/duktape/CSSStyleSheet.bnd
@@ -0,0 +1,22 @@
+/* CSS Stylesheet binding for NetSurf using duktape and libcss/libdom
+ *
+ * Copyright 2022 Daniel Silverstone <dsilvers@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+/* Note, for now this exists purely to block warnings, eventually
+ * stylesheets will have to come from documents etc.
+ */
+
+class CSSStyleSheet {
+ private bool unused;
+};
+
+init CSSStyleSheet()
+%{
+ priv->unused = true;
+%}
diff --git a/content/handlers/javascript/duktape/Console.bnd b/content/handlers/javascript/duktape/Console.bnd
index 74601d6d4..89d13cfad 100644
--- a/content/handlers/javascript/duktape/Console.bnd
+++ b/content/handlers/javascript/duktape/Console.bnd
@@ -182,7 +182,7 @@ method Console::timeEnd()
duk_del_prop(ctx, 0);
duk_push_string(ctx, "Timer elapsed: ");
duk_insert(ctx, 0);
- duk_push_sprintf(ctx, "%lu ms", (duk_uint_t)(time_ms - old_time_ms));
+ duk_push_sprintf(ctx, "%u ms", (duk_uint_t)(time_ms - old_time_ms));
write_log_entry(ctx, priv->group, BW_CS_FLAG_LEVEL_INFO);
return 0;
%}
diff --git a/content/handlers/javascript/duktape/DOMSettableTokenList.bnd b/content/handlers/javascript/duktape/DOMSettableTokenList.bnd
new file mode 100644
index 000000000..ac5c7062a
--- /dev/null
+++ b/content/handlers/javascript/duktape/DOMSettableTokenList.bnd
@@ -0,0 +1,44 @@
+/* DOMTokenList binding for browser using duktape and libdom
+ *
+ * Copyright 2015 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+class DOMSettableTokenList {
+};
+
+init DOMSettableTokenList(struct dom_tokenlist *tokens::tokens);
+
+getter DOMSettableTokenList::value()
+%{
+ dom_exception exc;
+ dom_string *value;
+
+ exc = dom_tokenlist_get_value(priv->parent.tokens, &value);
+ if (exc != DOM_NO_ERR) return 0; /* coerced to undefined */
+
+ duk_push_lstring(ctx, dom_string_data(value), dom_string_length(value));
+ dom_string_unref(value);
+
+ return 1;
+%}
+
+setter DOMSettableTokenList::value()
+%{
+ dom_exception exc;
+ dom_string *value;
+ duk_size_t slen;
+ const char *s = duk_require_lstring(ctx, 0, &slen);
+
+ exc = dom_string_create_interned((const uint8_t *)s, slen, &value);
+ if (exc != DOM_NO_ERR) return 0;
+
+ exc = dom_tokenlist_set_value(priv->parent.tokens, value);
+ dom_string_unref(value);
+
+ return 0;
+%} \ No newline at end of file
diff --git a/content/handlers/javascript/duktape/DOMTokenList.bnd b/content/handlers/javascript/duktape/DOMTokenList.bnd
new file mode 100644
index 000000000..928d9ef35
--- /dev/null
+++ b/content/handlers/javascript/duktape/DOMTokenList.bnd
@@ -0,0 +1,163 @@
+/* DOMTokenList binding for browser using duktape and libdom
+ *
+ * Copyright 2015 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * Released under the terms of the MIT License,
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+class DOMTokenList {
+ private struct dom_tokenlist *tokens;
+};
+
+init DOMTokenList(struct dom_tokenlist *tokens)
+%{
+ priv->tokens = tokens;
+ dom_tokenlist_ref(tokens);
+%}
+
+fini DOMTokenList()
+%{
+ dom_tokenlist_unref(priv->tokens);
+%}
+
+getter DOMTokenList::length()
+%{
+ dom_exception err;
+ uint32_t len;
+
+ err = dom_tokenlist_get_length(priv->tokens, &len);
+
+ if (err != DOM_NO_ERR) return 0; /* coerced to undefined */
+
+ duk_push_uint(ctx, (duk_uint_t)len);
+
+ return 1;
+%}
+
+method DOMTokenList::item()
+%{
+ unsigned long i = duk_to_uint(ctx, 0);
+ dom_exception err;
+ dom_string *value;
+
+ err = dom_tokenlist_item(priv->tokens, i, &value);
+
+ if (err != DOM_NO_ERR) return 0; /* coerced to undefined */
+
+ if (value == NULL) {
+ duk_push_null(ctx);
+ return 1;
+ }
+
+ duk_push_lstring(ctx, dom_string_data(value), dom_string_length(value));
+ dom_string_unref(value);
+
+ return 1;
+%}
+
+method DOMTokenList::add()
+%{
+ dom_exception exc;
+ dom_string *value;
+ duk_size_t slen;
+ const char *s;
+ duk_idx_t spos;
+
+ for (spos = 0; spos < duk_get_top(ctx); ++spos) {
+ s = duk_safe_to_lstring(ctx, spos, &slen);
+
+ duk_safe_to_lstring(ctx, 0, &slen);
+
+ exc = dom_string_create_interned((const uint8_t *)s, slen, &value);
+ if (exc != DOM_NO_ERR) return 0;
+
+ exc = dom_tokenlist_add(priv->tokens, value);
+ dom_string_unref(value);
+ }
+
+ return 0;
+%}
+
+method DOMTokenList::remove()
+%{
+ dom_exception exc;
+ dom_string *value;
+ duk_size_t slen;
+ const char *s;
+ duk_idx_t spos;
+
+ for (spos = 0; spos < duk_get_top(ctx); ++spos) {
+ s = duk_safe_to_lstring(ctx, spos, &slen);
+
+ duk_safe_to_lstring(ctx, 0, &slen);
+
+ exc = dom_string_create_interned((const uint8_t *)s, slen, &value);
+ if (exc != DOM_NO_ERR) return 0;
+
+ exc = dom_tokenlist_remove(priv->tokens, value);
+ dom_string_unref(value);
+ }
+
+ return 0;
+%}
+
+method DOMTokenList::contains()
+%{
+ dom_exception exc;
+ dom_string *value;
+ duk_size_t slen;
+ const char *s = duk_safe_to_lstring(ctx, 0, &slen);
+ bool present = false;
+
+ exc = dom_string_create_interned((const uint8_t *)s, slen, &value);
+ if (exc != DOM_NO_ERR) return 0;
+
+ exc = dom_tokenlist_contains(priv->tokens, value, &present);
+ dom_string_unref(value);
+ if (exc != DOM_NO_ERR) return 0;
+
+ duk_push_boolean(ctx, present);
+
+ return 1;
+%}
+
+method DOMTokenList::toggle()
+%{
+ dom_exception exc;
+ dom_string *value;
+ duk_size_t slen;
+ const char *s = duk_require_lstring(ctx, 0, &slen);
+ bool toggle_set = duk_get_top(ctx) > 1;
+ bool toggle = duk_opt_boolean(ctx, 1, 0);
+ bool present;
+
+ exc = dom_string_create_interned((const uint8_t *)s, slen, &value);
+ if (exc != DOM_NO_ERR) return 0;
+
+ exc = dom_tokenlist_contains(priv->tokens, value, &present);
+ if (exc != DOM_NO_ERR) {
+ dom_string_unref(value);
+ return 0;
+ }
+
+ /* Decision matrix is based on present, toggle_set, and toggle */
+ if (toggle_set) {
+ if (toggle) {
+ exc = dom_tokenlist_add(priv->tokens, value);
+ } else {
+ exc = dom_tokenlist_remove(priv->tokens, value);
+ }
+ } else {
+ if (present) {
+ exc = dom_tokenlist_add(priv->tokens, value);
+ } else {
+ exc = dom_tokenlist_remove(priv->tokens, value);
+ }
+ }
+ dom_string_unref(value);
+
+ return 0;
+%} \ No newline at end of file
diff --git a/content/handlers/javascript/duktape/Element.bnd b/content/handlers/javascript/duktape/Element.bnd
index a965a6ceb..ff0686fd9 100644
--- a/content/handlers/javascript/duktape/Element.bnd
+++ b/content/handlers/javascript/duktape/Element.bnd
@@ -392,6 +392,37 @@ setter Element::className ()
return 0;
%}
+getter Element::classList ()
+%{
+ dom_exception exc;
+ dom_tokenlist *tokens;
+
+ duk_set_top(ctx, 0);
+ duk_push_this(ctx);
+ duk_get_prop_string(ctx, 0, MAGIC(classList));
+
+ if (duk_is_undefined(ctx, -1)) {
+ duk_pop(ctx);
+ exc = dom_tokenlist_create((dom_element *)priv->parent.node, corestring_dom_class, &tokens);
+ if (exc != DOM_NO_ERR) return 0; /* Coerced to undefined */
+
+ /* Create a settable tokenlist - While the IDL says this isn't settable, all browsers
+ * seem to make it settable, so we'll permit it too
+ */
+ duk_push_pointer(ctx, tokens);
+ if (dukky_create_object(ctx, PROTO_NAME(DOMSETTABLETOKENLIST), 1) != DUK_EXEC_SUCCESS) {
+ dom_tokenlist_unref(tokens);
+ NSLOG(dukky, DEBUG, "Unable to create DOMSettableTokenList object");
+ return 0; /* Coerced to undefined */
+ }
+ dom_tokenlist_unref(tokens);
+ duk_dup(ctx, -1);
+ duk_put_prop_string(ctx, 0, MAGIC(classList));
+ }
+
+ return 1;
+%}
+
getter Element::innerHTML()
%{
duk_push_lstring(ctx, "", 0);
diff --git a/content/handlers/javascript/duktape/ImageData.bnd b/content/handlers/javascript/duktape/ImageData.bnd
index 17673d92a..be28cbd77 100644
--- a/content/handlers/javascript/duktape/ImageData.bnd
+++ b/content/handlers/javascript/duktape/ImageData.bnd
@@ -39,6 +39,6 @@ getter ImageData::data()
%{
duk_push_this(ctx);
duk_get_prop_string(ctx, -1, MAGIC(DATA));
- duk_push_buffer_object(ctx, -1, 0, priv->width * priv->height * 4, DUK_BUFOBJ_UINT8CLAMPEDARRAY);
+ duk_push_buffer_object(ctx, -1, 0, priv->width * priv->height * 4llu, DUK_BUFOBJ_UINT8CLAMPEDARRAY);
return 1;
%}
diff --git a/content/handlers/javascript/duktape/dukky.c b/content/handlers/javascript/duktape/dukky.c
index 52a9c82cf..a780b0067 100644
--- a/content/handlers/javascript/duktape/dukky.c
+++ b/content/handlers/javascript/duktape/dukky.c
@@ -385,7 +385,7 @@ static void dukky_html_element_class_from_tag_type(dom_html_element_type type,
break;
case DOM_HTML_ELEMENT_TYPE__COUNT:
assert(type != DOM_HTML_ELEMENT_TYPE__COUNT);
- /* fallthrough */
+ fallthrough;
case DOM_HTML_ELEMENT_TYPE__UNKNOWN:
SET_HTML_CLASS(UNKNOWN)
break;
@@ -1156,7 +1156,7 @@ static void dukky_generic_event_handler(dom_event *evt, void *pw)
NSLOG(dukky, DEBUG, "Unable to find the event name");
return;
}
- NSLOG(dukky, DEBUG, "Event's name is %*s", dom_string_length(name),
+ NSLOG(dukky, DEBUG, "Event's name is %*s", (int)dom_string_length(name),
dom_string_data(name));
exc = dom_event_get_event_phase(evt, &phase);
if (exc != DOM_NO_ERR) {
@@ -1394,10 +1394,10 @@ void dukky_register_event_listener_for(duk_context *ctx,
if (exc != DOM_NO_ERR) {
NSLOG(dukky, DEBUG,
"Unable to register listener for %p.%*s", ele,
- dom_string_length(name), dom_string_data(name));
+ (int)dom_string_length(name), dom_string_data(name));
} else {
NSLOG(dukky, DEBUG, "have registered listener for %p.%*s",
- ele, dom_string_length(name), dom_string_data(name));
+ ele, (int)dom_string_length(name), dom_string_data(name));
}
dom_event_listener_unref(listen);
}
diff --git a/content/handlers/javascript/duktape/netsurf.bnd b/content/handlers/javascript/duktape/netsurf.bnd
index e47f07d2b..483f3471f 100644
--- a/content/handlers/javascript/duktape/netsurf.bnd
+++ b/content/handlers/javascript/duktape/netsurf.bnd
@@ -60,6 +60,8 @@ struct dom_html_br_element;
#include "Document.bnd"
#include "Node.bnd"
#include "NodeList.bnd"
+#include "DOMTokenList.bnd"
+#include "DOMSettableTokenList.bnd"
#include "NamedNodeMap.bnd"
#include "Element.bnd"
#include "HTMLCollection.bnd"
@@ -205,3 +207,7 @@ init HTMLPropertiesCollection(struct dom_html_collection *coll);
#include "CanvasRenderingContext2D.bnd"
#include "ImageData.bnd"
+/* CSS Object model */
+
+#include "CSSRule.bnd"
+#include "CSSStyleSheet.bnd"
diff --git a/content/handlers/javascript/duktape/polyfill.js b/content/handlers/javascript/duktape/polyfill.js
index 5f0215618..6c85ce1a0 100644
--- a/content/handlers/javascript/duktape/polyfill.js
+++ b/content/handlers/javascript/duktape/polyfill.js
@@ -83,3 +83,21 @@ if (!Array.from) {
};
}());
}
+
+// DOMTokenList formatter, in theory we can remove this if we do the stringifier IDL support
+
+DOMTokenList.prototype.toString = function () {
+ if (this.length == 0) {
+ return "";
+ }
+
+ var ret = this.item(0);
+ for (var index = 1; index < this.length; index++) {
+ ret = ret + " " + this.item(index);
+ }
+
+ return ret;
+}
+
+// Inherit the same toString for settable lists
+DOMSettableTokenList.prototype.toString = DOMTokenList.prototype.toString; \ No newline at end of file
diff --git a/content/handlers/text/textplain.c b/content/handlers/text/textplain.c
index 60051f5c9..cee89a1a5 100644
--- a/content/handlers/text/textplain.c
+++ b/content/handlers/text/textplain.c
@@ -264,7 +264,7 @@ textplain_drain_input(textplain_content *c,
parserutils_inputstream *stream,
parserutils_error terminator)
{
- static const uint8_t *u_fffd = (const uint8_t *) "\xef\xbf\xfd";
+ static const uint8_t *u_fffd = (const uint8_t *) "\xef\xbf\xbd";
const uint8_t *ch;
size_t chlen, offset = 0;
diff --git a/content/hlcache.c b/content/hlcache.c
index d860015a5..5cba88bc6 100644
--- a/content/hlcache.c
+++ b/content/hlcache.c
@@ -30,6 +30,7 @@
#include "utils/messages.h"
#include "utils/ring.h"
#include "utils/utils.h"
+#include "netsurf/inttypes.h"
#include "netsurf/misc.h"
#include "netsurf/content.h"
#include "desktop/gui_internal.h"
@@ -592,7 +593,7 @@ void hlcache_finalise(void)
num_contents++;
}
- NSLOG(netsurf, INFO, "%d contents remain before cache drain",
+ NSLOG(netsurf, INFO, "%"PRIu32" contents remain before cache drain",
num_contents);
/* Drain cache */
@@ -607,7 +608,8 @@ void hlcache_finalise(void)
}
} while (num_contents > 0 && num_contents != prev_contents);
- NSLOG(netsurf, INFO, "%d contents remaining after being polite", num_contents);
+ NSLOG(netsurf, INFO, "%"PRIu32" contents remaining after being polite",
+ num_contents);
/* Drain cache again, forcing the matter */
do {
@@ -621,12 +623,12 @@ void hlcache_finalise(void)
}
} while (num_contents > 0 && num_contents != prev_contents);
- NSLOG(netsurf, INFO, "%d contents remaining:", num_contents);
+ NSLOG(netsurf, INFO, "%"PRIu32" contents remaining:", num_contents);
for (entry = hlcache->content_list; entry != NULL; entry = entry->next) {
hlcache_handle entry_handle = { entry, NULL, NULL };
if (entry->content != NULL) {
- NSLOG(netsurf, INFO, " %p : %s (%d users)",
+ NSLOG(netsurf, INFO, " %p : %s (%"PRIu32" users)",
entry,
nsurl_access(hlcache_handle_get_url(&entry_handle)),
content_count_users(entry->content));
diff --git a/content/llcache.c b/content/llcache.c
index 7db59de0a..32c7449d2 100644
--- a/content/llcache.c
+++ b/content/llcache.c
@@ -116,7 +116,7 @@ typedef struct {
bool tried_with_auth; /**< Whether we've tried with auth */
- bool tried_with_tls_downgrade; /**< Whether we've tried TLS <= 1.0 */
+ bool tried_with_tls_downgrade; /**< Whether we've tried TLS 1.2 */
bool tainted_tls; /**< Whether the TLS transport is tainted */
} llcache_fetch_ctx;
@@ -1923,7 +1923,7 @@ llcache_object_retrieve_from_cache(nsurl *url,
llcache_object *obj, *newest = NULL;
NSLOG(llcache, DEBUG,
- "Searching cache for %s flags:%x referer:%s post:%p",
+ "Searching cache for %s flags:%"PRIx32" referer:%s post:%p",
nsurl_access(url), flags,
referer==NULL?"":nsurl_access(referer),
post);
@@ -2100,7 +2100,7 @@ llcache_object_retrieve(nsurl *url,
nsurl *defragmented_url;
bool uncachable = false;
- NSLOG(llcache, DEBUG, "Retrieve %s (%x, %s, %p)", nsurl_access(url), flags,
+ NSLOG(llcache, DEBUG, "Retrieve %s (%"PRIx32", %s, %p)", nsurl_access(url), flags,
referer==NULL?"":nsurl_access(referer), post);
@@ -2207,10 +2207,17 @@ static nserror llcache_hsts_transform_url(nsurl *url, nsurl **result,
scheme = nsurl_get_component(url, NSURL_SCHEME);
if (lwc_string_caseless_isequal(scheme, corestring_lwc_http,
&match) != lwc_error_ok || match == false) {
- /* Non-HTTP fetch: ignore */
+ /* Non-HTTP fetch: no transform required */
+ if (lwc_string_caseless_isequal(scheme, corestring_lwc_https,
+ &match) == lwc_error_ok && match) {
+ /* HTTPS: ask urldb if HSTS is enabled */
+ *hsts_in_use = urldb_get_hsts_enabled(url);
+ } else {
+ /* Anything else: no HSTS */
+ *hsts_in_use = false;
+ }
lwc_string_unref(scheme);
*result = nsurl_ref(url);
- *hsts_in_use = false;
return error;
}
lwc_string_unref(scheme);
@@ -3876,7 +3883,7 @@ void llcache_clean(bool purge)
}
}
- NSLOG(llcache, DEBUG, "Size: %u (limit: %u)", llcache_size, limit);
+ NSLOG(llcache, DEBUG, "Size: %"PRIu32" (limit: %"PRIu32")", llcache_size, limit);
}
/* Exported interface documented in content/llcache.h */
@@ -3897,7 +3904,7 @@ llcache_initialise(const struct llcache_parameters *prm)
llcache->all_caught_up = true;
NSLOG(llcache, INFO,
- "llcache initialising with a limit of %d bytes",
+ "llcache initialising with a limit of %"PRIu32" bytes",
llcache->limit);
/* backing store initialisation */
diff --git a/content/mimesniff.c b/content/mimesniff.c
index 9a11834f9..adc000dd7 100644
--- a/content/mimesniff.c
+++ b/content/mimesniff.c
@@ -260,6 +260,13 @@ static nserror mimesniff__match_unknown_exact(const uint8_t *data, size_t len,
SIG(&corestring_lwc_application_x_gzip, "\x1f\x8b\x08", true),
SIG(&corestring_lwc_application_postscript, "%!PS-Adobe-",true),
SIG(&corestring_lwc_application_pdf, "%PDF-", false),
+ SIG(&corestring_lwc_image_jxl, "\xFF\x0A", true), /* containerless jpeg xl*/
+ {
+ (const uint8_t *)"\x00\x00\x00\x0CJXL \x0D\x0A\x87\x0A",
+ 12,
+ true,
+ &corestring_lwc_image_jxl
+ }, /* containered jpeg xl*/
{ NULL, 0, false, NULL }
};
#undef SIG
@@ -376,6 +383,12 @@ static nserror mimesniff__compute_image(lwc_string *official_type,
SIG(&corestring_lwc_image_jpeg, "\xff\xd8\xff"),
SIG(&corestring_lwc_image_bmp, "BM"),
SIG(&corestring_lwc_image_vnd_microsoft_icon, "\x00\x00\x01\x00"),
+ SIG(&corestring_lwc_image_jxl, "\xFF\x0A"), /* containerless jpeg xl*/
+ {
+ (const uint8_t *)"\x00\x00\x00\x0CJXL \x0D\x0A\x87\x0A",
+ 12,
+ &corestring_lwc_image_jxl
+ }, /* containered jpeg xl*/
{ NULL, 0, NULL }
};
#undef SIG
diff --git a/content/urldb.c b/content/urldb.c
index 74d0b7db2..881f76f6d 100644
--- a/content/urldb.c
+++ b/content/urldb.c
@@ -115,11 +115,6 @@
#include "content/content.h"
#include "content/urldb.h"
-#ifdef WITH_AMISSL
-/* AmiSSL needs everything to be using bsdsocket directly to avoid conflicts */
-#include <proto/bsdsocket.h>
-#endif
-
/**
* cookie entry.
*
@@ -1526,7 +1521,10 @@ static void urldb_dump_search(struct search_node *parent, int depth)
for (h = parent->data; h; h = h->parent) {
if (h->part) {
r = snprintf(&s[i], sl - i, "%s", h->part);
- if ((i + r) > sl) {
+ if (r < 0) {
+ break;
+ }
+ if ((i + r) >= sl) {
break;
}
i += r;
diff --git a/desktop/cookie_manager.c b/desktop/cookie_manager.c
index 3e0417f23..b5ec89618 100644
--- a/desktop/cookie_manager.c
+++ b/desktop/cookie_manager.c
@@ -232,10 +232,6 @@ cookie_manager_field_builder(enum cookie_manager_field field,
*
* The time should be converted to text in the users locacle
*
- * \todo This should probably generate the user text using localtime
- * and strftime with the c format specifier. Currently ctime will
- * always generate output in the C locale.
- *
* \param field Cookie manager treeview field to build
* \param fdata Cookie manager entry field data to set
* \param value Time to show in field
@@ -246,22 +242,20 @@ cookie_manager_field_builder_time(enum cookie_manager_field field,
struct treeview_field_data *fdata,
const time_t *value)
{
- const char *date;
- char *date2;
+ struct tm *ftime;
fdata->field = cm_ctx.fields[field].field;
-
- date = ctime(value);
- date2 = strdup(date);
- if (date2 == NULL) {
- fdata->value = NULL;
- fdata->value_len = 0;
- } else {
- assert(date2[24] == '\n');
- date2[24] = '\0';
-
- fdata->value = date2;
- fdata->value_len = strlen(date2);
+ fdata->value = NULL;
+ fdata->value_len = 0;
+
+ if ((ftime = localtime(value)) != NULL) {
+ const size_t vsize = 256;
+ char *value = malloc(vsize);
+ if (value != NULL) {
+ fdata->value = value;
+ fdata->value_len = strftime(value, vsize,
+ "%a %b %e %H:%M:%S %Y", ftime);
+ }
}
return NSERROR_OK;
diff --git a/desktop/global_history.c b/desktop/global_history.c
index ad39a3e41..e98e4cb29 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -266,9 +266,9 @@ static nserror global_history_create_treeview_field_data(
const char *title = (data->title != NULL) ?
data->title : messages_get("NoTitle");
char buffer[16];
- const char *last_visited;
- char *last_visited2;
- int len;
+ struct tm *lvtime;
+ char *last_visited = NULL;
+ size_t len = 0;
e->data[GH_TITLE].field = gh_ctx.fields[GH_TITLE].field;
e->data[GH_TITLE].value = strdup(title);
@@ -279,16 +279,18 @@ static nserror global_history_create_treeview_field_data(
e->data[GH_URL].value = nsurl_access(e->url);
e->data[GH_URL].value_len = nsurl_length(e->url);
- last_visited = ctime(&data->last_visit);
- last_visited2 = strdup(last_visited);
- if (last_visited2 != NULL) {
- assert(last_visited2[24] == '\n');
- last_visited2[24] = '\0';
+ if ((lvtime = localtime(&data->last_visit)) != NULL) {
+ const size_t lvsize = 256;
+ last_visited = malloc(lvsize);
+ if (last_visited != NULL) {
+ len = strftime(last_visited, lvsize,
+ "%a %b %e %H:%M:%S %Y", lvtime);
+ }
}
e->data[GH_LAST_VISIT].field = gh_ctx.fields[GH_LAST_VISIT].field;
- e->data[GH_LAST_VISIT].value = last_visited2;
- e->data[GH_LAST_VISIT].value_len = (last_visited2 != NULL) ? 24 : 0;
+ e->data[GH_LAST_VISIT].value = last_visited;
+ e->data[GH_LAST_VISIT].value_len = len;
len = snprintf(buffer, 16, "%u", data->visits);
if (len == 16) {
diff --git a/desktop/gui_factory.c b/desktop/gui_factory.c
index 89f2e373f..0d4d9a904 100644
--- a/desktop/gui_factory.c
+++ b/desktop/gui_factory.c
@@ -20,10 +20,12 @@
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
+#include <unistd.h>
#include "utils/config.h"
#include "utils/errors.h"
#include "utils/file.h"
+#include "utils/inet.h"
#include "netsurf/bitmap.h"
#include "content/hlcache.h"
#include "content/backing_store.h"
@@ -472,6 +474,16 @@ static char *gui_default_mimetype(const char *path)
return strdup(guit->fetch->filetype(path));
}
+static int gui_default_socket_open(int domain, int type, int protocol)
+{
+ return (int) socket(domain, type, protocol);
+}
+
+static int gui_default_socket_close(int fd)
+{
+ return (int) ns_close_socket(fd);
+}
+
/** verify fetch table is valid */
static nserror verify_fetch_register(struct gui_fetch_table *gft)
{
@@ -498,6 +510,12 @@ static nserror verify_fetch_register(struct gui_fetch_table *gft)
if (gft->mimetype == NULL) {
gft->mimetype = gui_default_mimetype;
}
+ if (gft->socket_open == NULL) {
+ gft->socket_open = gui_default_socket_open;
+ }
+ if (gft->socket_close == NULL) {
+ gft->socket_close = gui_default_socket_close;
+ }
return NSERROR_OK;
}
diff --git a/desktop/hotlist.c b/desktop/hotlist.c
index 2e877b7c6..20c0890a1 100644
--- a/desktop/hotlist.c
+++ b/desktop/hotlist.c
@@ -193,29 +193,32 @@ static nserror hotlist_create_treeview_field_visits_data(
struct hotlist_entry *e, const struct url_data *data)
{
char buffer[16];
- const char *last_visited;
- char *last_visited2;
- int len;
+ char *last_visited = NULL;
+ size_t len = 0;
/* Last visited */
if (data->visits != 0) {
- last_visited = ctime(&data->last_visit);
- last_visited2 = strdup(last_visited);
- len = 24;
+ const size_t lvsize = 256;
+ struct tm *lvtime;
+
+ if ((lvtime = localtime(&data->last_visit)) != NULL) {
+ last_visited = malloc(lvsize);
+ if (last_visited != NULL) {
+ len = strftime(last_visited, lvsize,
+ "%a %b %e %H:%M:%S %Y",
+ lvtime);
+ }
+ }
} else {
- last_visited2 = strdup("-");
+ last_visited = strdup("-");
len = 1;
}
- if (last_visited2 == NULL) {
+ if (last_visited == NULL) {
return NSERROR_NOMEM;
-
- } else if (len == 24) {
- assert(last_visited2[24] == '\n');
- last_visited2[24] = '\0';
}
e->data[HL_LAST_VISIT].field = hl_ctx.fields[HL_LAST_VISIT].field;
- e->data[HL_LAST_VISIT].value = last_visited2;
+ e->data[HL_LAST_VISIT].value = last_visited;
e->data[HL_LAST_VISIT].value_len = len;
/* Visits */
diff --git a/desktop/netsurf.c b/desktop/netsurf.c
index fd838b80b..bd785898f 100644
--- a/desktop/netsurf.c
+++ b/desktop/netsurf.c
@@ -99,7 +99,7 @@
static void netsurf_lwc_iterator(lwc_string *str, void *pw)
{
- NSLOG(netsurf, WARNING, "[%3u] %.*s", str->refcnt,
+ NSLOG(netsurf, WARNING, "[%3"PRIu32"] %.*s", str->refcnt,
(int)lwc_string_length(str), lwc_string_data(str));
}
diff --git a/desktop/options.h b/desktop/options.h
index a12275ef7..b74fab829 100644
--- a/desktop/options.h
+++ b/desktop/options.h
@@ -123,6 +123,9 @@ NSOPTION_BOOL(animate_images, true)
/** Whether to execute javascript */
NSOPTION_BOOL(enable_javascript, false)
+/** Whether to allow Author level CSS. */
+NSOPTION_BOOL(author_level_css, true)
+
/** Maximum time (in seconds) to wait for a script to run */
NSOPTION_INTEGER(script_timeout, 10)
diff --git a/desktop/selection.c b/desktop/selection.c
index 332e9dafa..8b1f127c4 100644
--- a/desktop/selection.c
+++ b/desktop/selection.c
@@ -54,7 +54,6 @@ typedef enum {
struct selection {
struct content *c;
- struct box *root;
unsigned max_idx; /* total bytes in text representation */
@@ -257,7 +256,6 @@ struct selection *selection_create(struct content *c)
sel = calloc(1, sizeof(struct selection));
if (sel) {
sel->c = c;
- sel->root = NULL;
sel->drag_state = DRAG_NONE;
sel->max_idx = 0;
selection_clear(sel, false);
diff --git a/desktop/version.c b/desktop/version.c
index f0ed06d5f..91a7532f4 100644
--- a/desktop/version.c
+++ b/desktop/version.c
@@ -20,11 +20,11 @@
#include "desktop/version.h"
-const char * const netsurf_version = "3.11 (Dev"
+const char * const netsurf_version = "3.12 (Dev"
#if defined(CI_BUILD)
" CI #" CI_BUILD
#endif
")"
;
const int netsurf_version_major = 3;
-const int netsurf_version_minor = 11;
+const int netsurf_version_minor = 12;
diff --git a/docs/UnimplementedJavascript.md b/docs/UnimplementedJavascript.md
index 4a2f02e3f..0d21dc852 100644
--- a/docs/UnimplementedJavascript.md
+++ b/docs/UnimplementedJavascript.md
@@ -170,7 +170,6 @@ getter | Element::namespaceURI(string);
getter | Element::prefix(string);
getter | Element::localName(string);
getter | Element::tagName(string);
-getter | Element::classList(user);
getter | Element::outerHTML(string);
setter | Element::outerHTML(string);
getter | Element::children(user);
@@ -597,10 +596,6 @@ method | CanvasRenderingContext2D::arcTo();
method | CanvasRenderingContext2D::rect();
method | CanvasRenderingContext2D::arc();
method | CanvasRenderingContext2D::ellipse();
-getter | CanvasRenderingContext2D::width(unsigned long);
-setter | CanvasRenderingContext2D::width(unsigned long);
-getter | CanvasRenderingContext2D::height(unsigned long);
-setter | CanvasRenderingContext2D::height(unsigned long);
getter | CanvasRenderingContext2D::currentTransform(user);
setter | CanvasRenderingContext2D::currentTransform(user);
getter | CanvasRenderingContext2D::globalAlpha(double);
@@ -647,8 +642,6 @@ method | HTMLCanvasElement::setContext();
method | HTMLCanvasElement::transferControlToProxy();
method | HTMLCanvasElement::toDataURL();
method | HTMLCanvasElement::toBlob();
-setter | HTMLCanvasElement::width(unsigned long);
-setter | HTMLCanvasElement::height(unsigned long);
getter | HTMLTemplateElement::content(user);
getter | HTMLScriptElement::async(boolean);
setter | HTMLScriptElement::async(boolean);
@@ -1344,14 +1337,6 @@ method | HTMLAllCollection::namedItem();
getter | HTMLAllCollection::length(unsigned long);
method | XMLSerializer::serializeToString();
method | DOMParser::parseFromString();
-method | DOMTokenList::item();
-method | DOMTokenList::contains();
-method | DOMTokenList::add();
-method | DOMTokenList::remove();
-method | DOMTokenList::toggle();
-getter | DOMTokenList::length(unsigned long);
-getter | DOMSettableTokenList::value(string);
-setter | DOMSettableTokenList::value(string);
method | NodeFilter::acceptNode();
method | TreeWalker::parentNode();
method | TreeWalker::firstChild();
@@ -1560,5 +1545,5 @@ method | EventListener::handleEvent();
method | CustomEvent::initCustomEvent();
getter | CustomEvent::detail(any);
- 1554 unimplemented bindings
+ 1539 unimplemented bindings
diff --git a/docs/env.sh b/docs/env.sh
index 80292a40c..4cb056ec1 100644
--- a/docs/env.sh
+++ b/docs/env.sh
@@ -263,64 +263,81 @@ NS_GIT="git://git.netsurf-browser.org"
# Buildsystem: everything depends on this
NS_BUILDSYSTEM="buildsystem"
-# internal libraries all frontends require (order is important)
-NS_INTERNAL_LIBS="libwapcaplet libparserutils libhubbub libdom libcss libnsgif libnsbmp libutf8proc libnsutils libnspsl libnslog"
+NS_TOOLS=""
+NS_FRONTEND_LIBS=""
-# The browser itself
-NS_BROWSER="netsurf"
+BUILD_TARGET="${TARGET:-netsurf}"
-
-# add target specific libraries
-case "${HOST}" in
- i586-pc-haiku)
- # tools required to build the browser for haiku (beos)
- NS_TOOLS="nsgenbind"
- # libraries required for the haiku target abi
- NS_FRONTEND_LIBS="libsvgtiny"
- ;;
- *arwin*)
- # tools required to build the browser for OS X
- NS_TOOLS=""
- # libraries required for the Darwin target abi
- NS_FRONTEND_LIBS="libsvgtiny libnsfb"
- ;;
- arm-unknown-riscos|arm-riscos-gnueabihf)
- # tools required to build the browser for RISC OS
- NS_TOOLS="nsgenbind"
- # libraries required for the risc os target abi
- NS_FRONTEND_LIBS="libsvgtiny librufl libpencil librosprite"
+case "$BUILD_TARGET" in
+ libhubbub)
+ NS_INTERNAL_LIBS="libparserutils"
;;
- *-atari-mint)
- # tools required to build the browser for atari
- NS_TOOLS=""
- # libraries required for the atari frontend
- NS_FRONTEND_LIBS=""
- ;;
- ppc-amigaos)
- # default tools required to build the browser
- NS_TOOLS="nsgenbind"
- # default additional internal libraries
- NS_FRONTEND_LIBS="libsvgtiny"
- ;;
- m68k-unknown-amigaos)
- # default tools required to build the browser
- NS_TOOLS="nsgenbind"
- # default additional internal libraries
- NS_FRONTEND_LIBS="libsvgtiny"
+
+ libdom)
+ NS_INTERNAL_LIBS="libwapcaplet libparserutils libhubbub"
;;
- *-unknown-freebsd*)
- # tools required to build the browser for freebsd
- NS_TOOLS=""
- # libraries required for the freebsd frontend
- NS_FRONTEND_LIBS=""
- # select gnu make
- MAKE=gmake
+
+ libcss)
+ NS_INTERNAL_LIBS="libwapcaplet libparserutils"
;;
- *)
- # default tools required to build the browser
- NS_TOOLS="nsgenbind"
- # default additional internal libraries
- NS_FRONTEND_LIBS="libsvgtiny libnsfb"
+
+ netsurf)
+ # internal libraries all frontends require (order is important)
+ NS_INTERNAL_LIBS="libwapcaplet libparserutils libhubbub libdom libcss libnsgif libnsbmp libutf8proc libnsutils libnspsl libnslog"
+
+ # add target specific libraries
+ case "${HOST}" in
+ i586-pc-haiku)
+ # tools required to build the browser for haiku (beos)
+ NS_TOOLS="nsgenbind"
+ # libraries required for the haiku target abi
+ NS_FRONTEND_LIBS="libsvgtiny"
+ ;;
+ *arwin*)
+ # tools required to build the browser for OS X
+ NS_TOOLS=""
+ # libraries required for the Darwin target abi
+ NS_FRONTEND_LIBS="libsvgtiny libnsfb"
+ ;;
+ arm-unknown-riscos|arm-riscos-gnueabi*)
+ # tools required to build the browser for RISC OS
+ NS_TOOLS="nsgenbind"
+ # libraries required for the risc os target abi
+ NS_FRONTEND_LIBS="libsvgtiny librufl libpencil librosprite"
+ ;;
+ *-atari-mint)
+ # tools required to build the browser for atari
+ NS_TOOLS=""
+ # libraries required for the atari frontend
+ NS_FRONTEND_LIBS=""
+ ;;
+ ppc-amigaos)
+ # default tools required to build the browser
+ NS_TOOLS="nsgenbind"
+ # default additional internal libraries
+ NS_FRONTEND_LIBS="libsvgtiny"
+ ;;
+ m68k-unknown-amigaos)
+ # default tools required to build the browser
+ NS_TOOLS="nsgenbind"
+ # default additional internal libraries
+ NS_FRONTEND_LIBS="libsvgtiny"
+ ;;
+ *-unknown-freebsd*)
+ # tools required to build the browser for freebsd
+ NS_TOOLS=""
+ # libraries required for the freebsd frontend
+ NS_FRONTEND_LIBS=""
+ # select gnu make
+ MAKE=gmake
+ ;;
+ *)
+ # default tools required to build the browser
+ NS_TOOLS="nsgenbind"
+ # default additional internal libraries
+ NS_FRONTEND_LIBS="libsvgtiny libnsfb"
+ ;;
+ esac
;;
esac
@@ -331,7 +348,7 @@ export MAKE
# git pull in all repos parameters are passed to git pull
ns-pull()
{
- for REPO in $(echo ${NS_BUILDSYSTEM} ${NS_INTERNAL_LIBS} ${NS_FRONTEND_LIBS} ${NS_TOOLS} ${NS_BROWSER}) ; do
+ for REPO in $(echo ${NS_BUILDSYSTEM} ${NS_INTERNAL_LIBS} ${NS_FRONTEND_LIBS} ${NS_TOOLS} ${BUILD_TARGET}) ; do
echo -n " GIT: Pulling ${REPO}: "
if [ -f "${TARGET_WORKSPACE}/${REPO}/.git/config" ]; then
(cd ${TARGET_WORKSPACE}/${REPO} && git pull $*; )
@@ -344,19 +361,42 @@ ns-pull()
# clone all repositories
ns-clone()
{
+ SHALLOW=""
+ SKIP=""
+ while [ $# -gt 0 ]
+ do
+ case "$1" in
+ -d | --deps-only) SKIP="${BUILD_TARGET}"
+ shift
+ ;;
+ -s | --shallow) SHALLOW="--depth 1"
+ shift
+ ;;
+ -*) echo "Error: Unknown option: $1" >&2
+ exit 1
+ ;;
+ *) # No more options
+ break
+ ;;
+ esac
+ done
+
mkdir -p ${TARGET_WORKSPACE}
- for REPO in $(echo ${NS_BUILDSYSTEM} ${NS_INTERNAL_LIBS} ${NS_FRONTEND_LIBS} ${NS_RISCOS_LIBS} ${NS_TOOLS} ${NS_BROWSER}) ; do
+ for REPO in $(echo ${NS_BUILDSYSTEM} ${NS_INTERNAL_LIBS} ${NS_FRONTEND_LIBS} ${NS_RISCOS_LIBS} ${NS_TOOLS} ${BUILD_TARGET}) ; do
+ [ "x${REPO}" != "x${SKIP}" ] || continue
echo -n " GIT: Cloning ${REPO}: "
if [ -f ${TARGET_WORKSPACE}/${REPO}/.git/config ]; then
echo "Repository already present"
else
- (cd ${TARGET_WORKSPACE} && git clone ${NS_GIT}/${REPO}.git; )
+ (cd ${TARGET_WORKSPACE} && git clone ${SHALLOW} ${NS_GIT}/${REPO}.git; )
fi
done
# put current env.sh in place in workspace
- if [ ! -f "${TARGET_WORKSPACE}/env.sh" -a -f ${TARGET_WORKSPACE}/${NS_BROWSER}/docs/env.sh ]; then
- cp ${TARGET_WORKSPACE}/${NS_BROWSER}/docs/env.sh ${TARGET_WORKSPACE}/env.sh
+ if [ "x$NS_BROWSER" = "x" ]; then
+ if [ ! -f "${TARGET_WORKSPACE}/env.sh" -a -f ${TARGET_WORKSPACE}/${NS_BROWSER}/docs/env.sh ]; then
+ cp ${TARGET_WORKSPACE}/${NS_BROWSER}/docs/env.sh ${TARGET_WORKSPACE}/env.sh
+ fi
fi
}
diff --git a/frontends/amiga/Makefile b/frontends/amiga/Makefile
index 99745c90e..f537a1163 100644
--- a/frontends/amiga/Makefile
+++ b/frontends/amiga/Makefile
@@ -80,7 +80,7 @@ AMIGA_DISTRIBUTION_FILES := $(FRONTEND_SOURCE_DIR)/dist/*
AMIGA_PKG_DIR := $(FRONTEND_SOURCE_DIR)/pkg
AMIGA_INSTALL_TARGET_DIR := NetSurf_Amiga
-netsurf.lha: $(EXETARGET)
+netsurf.lha: $(EXETARGET) $(POSTEXES)
$(VQ)echo Creating netsurf.lha
$(Q)rm -rf $(AMIGA_INSTALL_TARGET_DIR)
$(Q)$(MKDIR) -p $(AMIGA_INSTALL_TARGET_DIR)/NetSurf
diff --git a/frontends/amiga/Makefile.defaults b/frontends/amiga/Makefile.defaults
index 7fcbef0fe..25e1f42e4 100644
--- a/frontends/amiga/Makefile.defaults
+++ b/frontends/amiga/Makefile.defaults
@@ -40,6 +40,7 @@ CFLAGS += -fomit-frame-pointer
ifeq ($(SUBTARGET),os3)
NETSURF_USE_OPENSSL := NO
NETSURF_USE_AMISSL := YES
+ NETSURF_FS_BACKING_STORE := YES
else
CFLAGS += -gstabs
endif
diff --git a/frontends/amiga/font_bullet.c b/frontends/amiga/font_bullet.c
index dec39a1f7..43f7b9488 100644
--- a/frontends/amiga/font_bullet.c
+++ b/frontends/amiga/font_bullet.c
@@ -554,6 +554,7 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
FIXED kern = 0;
ULONG glyphmaptag;
ULONG template_type;
+ bool skip_c2 = false;
uint32 long_char_1 = 0, long_char_2 = 0;
#ifndef __amigaos4__
struct BulletBase *BulletBase = ofont->BulletBase;
@@ -571,6 +572,8 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
}
#endif
+ if (*char2 < 0x0020) skip_c2 = true;
+
#ifdef __amigaos4__
if(__builtin_expect(aa == true, 1)) {
glyphmaptag = OT_GlyphMap8Bit;
@@ -633,7 +636,7 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
kern = 0;
- if(*char2) EObtainInfo(AMI_OFONT_ENGINE,
+ if((*char2) && (!skip_c2)) EObtainInfo(AMI_OFONT_ENGINE,
OT_TextKernPair, &kern,
TAG_END);
@@ -643,7 +646,7 @@ static inline int32 ami_font_plot_glyph(struct OutlineFont *ofont, struct RastPo
glyphmaptag, glyph,
TAG_END);
- if(*char2) EReleaseInfo(AMI_OFONT_ENGINE,
+ if((*char2) && (!skip_c2)) EReleaseInfo(AMI_OFONT_ENGINE,
OT_TextKernPair, kern,
TAG_END);
}
diff --git a/frontends/amiga/font_diskfont.c b/frontends/amiga/font_diskfont.c
index a587d6eaf..be1b89194 100644
--- a/frontends/amiga/font_diskfont.c
+++ b/frontends/amiga/font_diskfont.c
@@ -100,7 +100,10 @@ static struct TextFont *ami_font_bm_open(struct RastPort *rp, const plot_font_st
tattr.ta_YSize = fstyle->size / PLOT_STYLE_SCALE;
NSLOG(netsurf, INFO, "font: %s/%d", tattr.ta_Name, tattr.ta_YSize);
- if(prev_font != NULL) CloseFont(prev_font);
+ if(prev_font != NULL) {
+ CloseFont(prev_font);
+ prev_font = NULL;
+ }
if((bmfont = OpenDiskFont(&tattr))) {
SetRPAttrs(rp, RPTAG_Font, bmfont, TAG_DONE);
@@ -300,7 +303,14 @@ void ami_font_diskfont_init(void)
void ami_font_diskfont_fini(void)
{
- if(prev_font != NULL) CloseFont(prev_font);
- if(prev_fstyle != NULL) free(prev_fstyle);
+ if(prev_font != NULL) {
+ CloseFont(prev_font);
+ prev_font = NULL;
+ }
+
+ if(prev_fstyle != NULL) {
+ free(prev_fstyle);
+ prev_fstyle = NULL;
+ }
}
diff --git a/frontends/amiga/gui_menu.c b/frontends/amiga/gui_menu.c
index b9c0dd9f8..dc1450fce 100644
--- a/frontends/amiga/gui_menu.c
+++ b/frontends/amiga/gui_menu.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2017 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2017-2024 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -375,6 +375,18 @@ HOOKF(void, ami_menu_item_browser_enablejs, APTR, window, struct IntuiMessage *)
ami_gui_menu_set_check_toggled();
}
+HOOKF(void, ami_menu_item_browser_enablecss, APTR, window, struct IntuiMessage *)
+{
+ struct Menu *menustrip;
+ bool checked = false;
+
+ GetAttr(WINDOW_MenuStrip, (Object *)window, (ULONG *)&menustrip);
+ checked = ami_menu_get_selected(menustrip, msg);
+
+ nsoption_set_bool(author_level_css, checked);
+ ami_gui_menu_set_check_toggled();
+}
+
HOOKF(void, ami_menu_item_browser_scale_decrease, APTR, window, struct IntuiMessage *)
{
struct gui_window_2 *gwin;
@@ -582,6 +594,10 @@ ULONG ami_gui_menu_number(int item)
case M_JS:
menu_num = FULLMENUNUM(2,9,0);
break;
+
+ case M_CSS:
+ menu_num = FULLMENUNUM(2,10,0);
+ break;
default:
NSLOG(netsurf, INFO,
@@ -690,6 +706,13 @@ void ami_gui_menu_update_checked(struct gui_window_2 *gwin)
if(ItemAddress(menustrip, ami_gui_menu_number(M_JS))->Flags & CHECKED)
ItemAddress(menustrip, ami_gui_menu_number(M_JS))->Flags ^= CHECKED;
}
+ if(nsoption_bool(author_level_css) == true) {
+ if((ItemAddress(menustrip, ami_gui_menu_number(M_CSS))->Flags & CHECKED) == 0)
+ ItemAddress(menustrip, ami_gui_menu_number(M_CSS))->Flags ^= CHECKED;
+ } else {
+ if(ItemAddress(menustrip, ami_gui_menu_number(M_CSS))->Flags & CHECKED)
+ ItemAddress(menustrip, ami_gui_menu_number(M_CSS))->Flags ^= CHECKED;
+ }
if(nsoption_bool(foreground_images) == true) {
if((ItemAddress(menustrip, ami_gui_menu_number(M_IMGFORE))->Flags & CHECKED) == 0)
ItemAddress(menustrip, ami_gui_menu_number(M_IMGFORE))->Flags ^= CHECKED;
@@ -919,6 +942,10 @@ static void ami_init_menulabs(struct ami_menu_data **md)
if(nsoption_bool(enable_javascript) == true)
js_flags |= CHECKED;
+ UWORD css_flags = CHECKIT | MENUTOGGLE;
+ if(nsoption_bool(author_level_css) == true)
+ css_flags |= CHECKED;
+
UWORD imgfore_flags = CHECKIT | MENUTOGGLE;
if(nsoption_bool(foreground_images) == true)
imgfore_flags |= CHECKED;
@@ -1007,6 +1034,8 @@ static void ami_init_menulabs(struct ami_menu_data **md)
ami_menu_item_browser_backimg, NULL, imgback_flags);
ami_menu_alloc_item(md, M_JS, NM_ITEM, "EnableJS", NULL, NULL,
ami_menu_item_browser_enablejs, NULL, js_flags);
+ ami_menu_alloc_item(md, M_CSS, NM_ITEM, "EnableCSS", NULL, NULL,
+ ami_menu_item_browser_enablecss, NULL, css_flags);
ami_menu_alloc_item(md, M_BAR_B4, NM_ITEM, NM_BARLABEL, NULL, NULL, NULL, NULL, 0);
ami_menu_alloc_item(md, M_REDRAW, NM_ITEM, "Redraw", NULL, "TBImages:list_wand",
ami_menu_item_browser_redraw, NULL, 0);
diff --git a/frontends/amiga/gui_menu.h b/frontends/amiga/gui_menu.h
index ed72c24a4..ae36397c5 100644
--- a/frontends/amiga/gui_menu.h
+++ b/frontends/amiga/gui_menu.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2008-2017 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2008-2024 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -78,13 +78,14 @@ enum {
M_IMGFORE,
M_IMGBACK,
M_JS,
+ M_CSS,
M_BAR_B4,
M_REDRAW,
/* Hotlist menu */
M_HOTLIST,
M_HLADD,
M_HLSHOW,
- M_BAR_H1, // 47
+ M_BAR_H1, // 48
AMI_MENU_HOTLIST, /* Where the hotlist entries start */
AMI_MENU_HOTLIST_MAX = AMI_MENU_HOTLIST + AMI_HOTLIST_ITEMS,
/* Settings menu */
diff --git a/frontends/amiga/gui_options.c b/frontends/amiga/gui_options.c
index 395e5b48e..c8c51b012 100755
--- a/frontends/amiga/gui_options.c
+++ b/frontends/amiga/gui_options.c
@@ -94,6 +94,7 @@ enum
GID_OPTS_FROMLOCALE,
GID_OPTS_HISTORY,
GID_OPTS_JAVASCRIPT,
+ GID_OPTS_ENABLECSS,
GID_OPTS_REFERRAL,
GID_OPTS_DONOTTRACK,
GID_OPTS_FASTSCROLL,
@@ -369,6 +370,7 @@ static void ami_gui_opts_setup(struct ami_gui_opts_window *gow)
gadlab[GID_OPTS_FROMLOCALE] = (char *)ami_utf8_easy((char *)messages_get("LocaleLang"));
gadlab[GID_OPTS_HISTORY] = (char *)ami_utf8_easy((char *)messages_get("HistoryAge"));
gadlab[GID_OPTS_JAVASCRIPT] = (char *)ami_utf8_easy((char *)messages_get("EnableJS"));
+ gadlab[GID_OPTS_ENABLECSS] = (char *)ami_utf8_easy((char *)messages_get("EnableCSS"));
gadlab[GID_OPTS_REFERRAL] = (char *)ami_utf8_easy((char *)messages_get("SendReferer"));
gadlab[GID_OPTS_DONOTTRACK] = (char *)ami_utf8_easy((char *)messages_get("DoNotTrack"));
gadlab[GID_OPTS_FASTSCROLL] = (char *)ami_utf8_easy((char *)messages_get("FastScrolling"));
@@ -1499,6 +1501,12 @@ void ami_gui_opts_open(void)
GA_Selected, !nsoption_bool(core_select_menu),
GA_Disabled, !ami_selectmenu_is_safe(),
CheckBoxEnd,
+ LAYOUT_AddChild, gow->objects[GID_OPTS_ENABLECSS] = CheckBoxObj,
+ GA_ID, GID_OPTS_ENABLECSS,
+ GA_RelVerify, TRUE,
+ GA_Text, gadlab[GID_OPTS_ENABLECSS],
+ GA_Selected, nsoption_bool(author_level_css),
+ CheckBoxEnd,
LayoutEnd, // misc
CHILD_WeightedHeight, 0,
@@ -1742,7 +1750,16 @@ static void ami_gui_opts_use(bool save)
} else {
nsoption_set_bool(do_not_track, false);
}
-
+
+ GetAttr(GA_Selected,gow->objects[GID_OPTS_ENABLECSS],(ULONG *)&data);
+ if (data) {
+ nsoption_set_bool(author_level_css, true);
+ } else {
+ nsoption_set_bool(author_level_css, false);
+ }
+
+ ami_gui_menu_set_checked(NULL, M_CSS, nsoption_bool(author_level_css));
+
GetAttr(GA_Selected,gow->objects[GID_OPTS_FASTSCROLL],(ULONG *)&data);
if (data) {
nsoption_set_bool(faster_scroll, true);
diff --git a/frontends/amiga/pkg/netsurf.readme b/frontends/amiga/pkg/netsurf.readme
index 7d3b8defa..d2d83ac56 100755
--- a/frontends/amiga/pkg/netsurf.readme
+++ b/frontends/amiga/pkg/netsurf.readme
@@ -2,11 +2,11 @@ Short: Fast CSS capable web browser
Uploader: chris@unsatisfactorysoftware.co.uk (Chris Young)
Author: NetSurf contributors (OS4 port by Chris Young)
Type: comm/www
-Version: 3.10
+Version: 3.11
Requires: dev/misc/guigfxlib.lha
Architecture: ppc-amigaos >= 4.0.0
-This is NetSurf 3.10 for AmigaOS 4 (native frontend).
+This is NetSurf 3.11 for AmigaOS 4 (native frontend).
For the latest version, visit http://www.netsurf-browser.org
*******************************************
diff --git a/frontends/amiga/pkg/netsurf_os3.readme b/frontends/amiga/pkg/netsurf_os3.readme
index 418a9dec0..53514f8db 100644
--- a/frontends/amiga/pkg/netsurf_os3.readme
+++ b/frontends/amiga/pkg/netsurf_os3.readme
@@ -2,14 +2,14 @@ Short: Fast CSS capable web browser
Uploader: chris@unsatisfactorysoftware.co.uk (Chris Young)
Author: NetSurf contributors (OS4 port by Chris Young)
Type: comm/www
-Version: 3.10 BETA
-Requires: dev/misc/guigfxlib.lha util/libs/AmiSSL-4.3.lha
-Architecture: m68k-amigaos >= 3.5.0
+Version: 3.11 BETA
+Requires: dev/misc/guigfxlib.lha util/libs/AmiSSL-5.13-OS3.lha
+Architecture: m68k-amigaos >= 3.2.0
-This is NetSurf 3.10 BETA for AmigaOS 3.
+This is NetSurf 3.11 BETA for AmigaOS 3.
It is built off of the OS4 (Reaction) frontend.
-Requirements are AmigaOS 3.5 or 3.9, 32MB RAM.
+Requirements are AmigaOS 3.2, 3.5 or 3.9, 32MB RAM.
THIS IS EARLY BETA QUALITY SOFTWARE FOR TESTING ONLY.
ALL USE IS AT YOUR OWN RISK. IT *WILL* CRASH!
diff --git a/frontends/amiga/version.c b/frontends/amiga/version.c
index 7e017f3c8..ae898cb83 100644
--- a/frontends/amiga/version.c
+++ b/frontends/amiga/version.c
@@ -25,7 +25,7 @@
* problems created by "0" not being a valid AmigaOS revision number.
*/
#define NETSURF_VERSION_MAJOR "3"
-#define NETSURF_VERSION_MINOR_EXTERNAL "11"
+#define NETSURF_VERSION_MINOR_EXTERNAL "12"
#if defined(CI_BUILD)
#define NETSURF_VERSION_MINOR CI_BUILD
#else
diff --git a/frontends/atari/Makefile b/frontends/atari/Makefile
index 6de15b62e..2f6d7118b 100644
--- a/frontends/atari/Makefile
+++ b/frontends/atari/Makefile
@@ -161,7 +161,7 @@ $(ATARI_FONT_TMP_DIR)$(ATARI_FONT_NAME):
package-atari: $(ATARI_FONT_TMP_DIR)$(ATARI_FONT_NAME) $(PKGNAME)
$(VQ)echo Creating $(PKGNAME)
-$(PKGNAME): $(EXETARGET)
+$(PKGNAME): $(EXETARGET) $(POSTEXES)
ifneq ($(strip $(STRIP)),)
$(Q)echo Stripping symbols from $(EXETARGET) with $(STRIP)
$(Q)$(STRIP) $(EXETARGET)
diff --git a/frontends/beos/Makefile b/frontends/beos/Makefile
index 46f12ec85..81c9326ee 100644
--- a/frontends/beos/Makefile
+++ b/frontends/beos/Makefile
@@ -151,7 +151,7 @@ install-beos:
package-beos: $(PKGNAME)
$(VQ)echo Creating $(PKGNAME)
-$(PKGNAME): $(EXETARGET)
+$(PKGNAME): $(EXETARGET) $(POSTEXES)
$(Q)rm -rf $(HAIKU_TARGET_DIR)
$(Q)rm -rf $(PKGNAME)
$(Q)$(MKDIR) $(HAIKU_TARGET_DIR)
diff --git a/frontends/framebuffer/font_internal.c b/frontends/framebuffer/font_internal.c
index d755681c6..4d28c61ad 100644
--- a/frontends/framebuffer/font_internal.c
+++ b/frontends/framebuffer/font_internal.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include "utils/nsoption.h"
+#include "utils/utils.h"
#include "utils/utf8.h"
#include "netsurf/utf8.h"
#include "netsurf/layout.h"
@@ -270,7 +271,8 @@ fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
break;
}
}
- /* Fall through. */
+ fallthrough;
+
case FB_BOLD:
section = fb_bold_section_table[ucs4 / 256];
if (section != 0 || ucs4 / 256 == 0) {
@@ -281,7 +283,8 @@ fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
break;
}
}
- /* Fall through. */
+ fallthrough;
+
case FB_ITALIC:
section = fb_italic_section_table[ucs4 / 256];
if (section != 0 || ucs4 / 256 == 0) {
@@ -292,7 +295,8 @@ fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
break;
}
}
- /* Fall through. */
+ fallthrough;
+
case FB_REGULAR:
section = fb_regular_section_table[ucs4 / 256];
if (section != 0 || ucs4 / 256 == 0) {
@@ -303,7 +307,8 @@ fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale)
break;
}
}
- /* Fall through. */
+ fallthrough;
+
default:
glyph_data = get_codepoint(ucs4, style & FB_ITALIC);
break;
diff --git a/frontends/framebuffer/gui.c b/frontends/framebuffer/gui.c
index 934ba05c8..689b63dc1 100644
--- a/frontends/framebuffer/gui.c
+++ b/frontends/framebuffer/gui.c
@@ -1000,7 +1000,7 @@ fb_browser_window_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
break;
}
/* Z or Y pressed but not undo or redo; */
- /* Fall through */
+ fallthrough;
default:
ucs4 = fbtk_keycode_to_ucs4(cbi->event->value.keycode,
diff --git a/frontends/gtk/Makefile b/frontends/gtk/Makefile
index 4f3fd5f52..64a0872ba 100644
--- a/frontends/gtk/Makefile
+++ b/frontends/gtk/Makefile
@@ -11,6 +11,8 @@
NETSURF_FEATURE_RSVG_CFLAGS := -DWITH_RSVG
NETSURF_FEATURE_VIDEO_CFLAGS := -DWITH_VIDEO
+# determine if the rsvg library API version
+RSVG_API := $(shell $(PKG_CONFIG) --atleast-version=2.46 librsvg-2.0 && echo 246)
$(eval $(call pkg_config_find_and_add_enabled,RSVG,librsvg-2.0,SVG))
$(eval $(call pkg_config_find_and_add_enabled,VIDEO,gstreamer-0.10,Video))
@@ -32,13 +34,19 @@ ifeq ($(NETSURF_GTK_MAJOR),2)
GTKDEPFLAGS += -DGTK_DISABLE_DEPRECATED
endif
+# C library API control
+ifeq ($(HOST),FreeBSD)
+CAPIFLAGS :=
+else
+CAPIFLAGS := -D_XOPEN_SOURCE=700 \
+ -D_POSIX_C_SOURCE=200809L
+endif
GTKCFLAGS := -std=c99 -Dgtk -Dnsgtk -g \
$(GTKDEPFLAGS) \
+ $(CAPIFLAGS) \
-D_BSD_SOURCE \
-D_DEFAULT_SOURCE \
- -D_XOPEN_SOURCE=700 \
- -D_POSIX_C_SOURCE=200809L \
-D_NETBSD_SOURCE \
-DGTK_RESPATH=\"$(NETSURF_GTK_RES_PATH)\"
diff --git a/frontends/gtk/bitmap.c b/frontends/gtk/bitmap.c
index bfd29e1f4..a995a9e28 100644
--- a/frontends/gtk/bitmap.c
+++ b/frontends/gtk/bitmap.c
@@ -53,6 +53,10 @@ static void *bitmap_create(int width, int height, enum gui_bitmap_flags flags)
{
struct bitmap *gbitmap;
+ if (width == 0 || height == 0) {
+ return NULL;
+ }
+
gbitmap = calloc(1, sizeof(struct bitmap));
if (gbitmap != NULL) {
if (flags & BITMAP_OPAQUE) {
diff --git a/frontends/gtk/download.c b/frontends/gtk/download.c
index 173d2e46e..d1231634d 100644
--- a/frontends/gtk/download.c
+++ b/frontends/gtk/download.c
@@ -432,7 +432,7 @@ static gboolean nsgtk_download_update(gboolean force_update)
switch (dl->status) {
case NSGTK_DOWNLOAD_WORKING:
pulse_mode = TRUE;
- /* Fall through */
+ fallthrough;
case NSGTK_DOWNLOAD_NONE:
dl->speed = dl->size_downloaded /
@@ -449,12 +449,13 @@ static gboolean nsgtk_download_update(gboolean force_update)
dl_ctx.num_active++;
update = TRUE;
- /* Fall through */
+ fallthrough;
case NSGTK_DOWNLOAD_COMPLETE:
downloaded += dl->size_downloaded;
total += dl->size_total;
dls++;
+ fallthrough;
default:
;//Do nothing
@@ -1022,7 +1023,7 @@ nserror nsgtk_download_init(void)
/* exported interface documented in gtk/download.h */
-void nsgtk_download_destroy ()
+void nsgtk_download_destroy(void)
{
nsgtk_download_do(nsgtk_download_store_cancel_item);
}
diff --git a/frontends/gtk/fetch.c b/frontends/gtk/fetch.c
index 58bd0b853..d77073a63 100644
--- a/frontends/gtk/fetch.c
+++ b/frontends/gtk/fetch.c
@@ -75,6 +75,7 @@ void gtk_fetch_filetype_init(const char *mimefile)
hash_add(mime_hash, "html", "text/html");
hash_add(mime_hash, "jpg", "image/jpeg");
hash_add(mime_hash, "jpeg", "image/jpeg");
+ hash_add(mime_hash, "jxl", "image/jxl");
hash_add(mime_hash, "gif", "image/gif");
hash_add(mime_hash, "png", "image/png");
hash_add(mime_hash, "jng", "image/jng");
diff --git a/frontends/gtk/gdk.c b/frontends/gtk/gdk.c
index 2912862da..fe9a0791c 100644
--- a/frontends/gtk/gdk.c
+++ b/frontends/gtk/gdk.c
@@ -73,7 +73,7 @@ nsgdk_pixbuf_get_from_surface(cairo_surface_t *surface, int scwidth, int scheigh
memset(gdk_pixbuf_get_pixels(pixbuf),
0xff,
- gdk_pixbuf_get_rowstride(pixbuf) * scheight);
+ gdk_pixbuf_get_rowstride(pixbuf) * (size_t)scheight);
/* scale cairo surface into new surface the target size */
cairo_surface_flush(surface); /* ensure source surface is ready */
diff --git a/frontends/gtk/res/fr/credits.html b/frontends/gtk/res/fr/credits.html
new file mode 120000
index 000000000..47da488e8
--- /dev/null
+++ b/frontends/gtk/res/fr/credits.html
@@ -0,0 +1 @@
+../../../../resources/fr/credits.html \ No newline at end of file
diff --git a/frontends/gtk/res/fr/licence.html b/frontends/gtk/res/fr/licence.html
new file mode 120000
index 000000000..2fd247ba8
--- /dev/null
+++ b/frontends/gtk/res/fr/licence.html
@@ -0,0 +1 @@
+../../../../resources/fr/licence.html \ No newline at end of file
diff --git a/frontends/gtk/res/fr/welcome.html b/frontends/gtk/res/fr/welcome.html
new file mode 120000
index 000000000..a7a2023ea
--- /dev/null
+++ b/frontends/gtk/res/fr/welcome.html
@@ -0,0 +1 @@
+../../../../resources/fr/welcome.html \ No newline at end of file
diff --git a/frontends/gtk/res/netsurf.gresource.xml b/frontends/gtk/res/netsurf.gresource.xml
index ada2d59fc..21a2e7723 100644
--- a/frontends/gtk/res/netsurf.gresource.xml
+++ b/frontends/gtk/res/netsurf.gresource.xml
@@ -14,15 +14,18 @@
<file preprocess="to-pixdata">throbber/throbber7.png</file>
<file preprocess="to-pixdata">throbber/throbber8.png</file>
<file>credits.html</file>
+ <file>fr/credits.html</file>
<file>it/credits.html</file>
<file>nl/credits.html</file>
<file>zh_CN/credits.html</file>
<file>licence.html</file>
+ <file>fr/licence.html</file>
<file>it/licence.html</file>
<file>nl/licence.html</file>
<file>zh_CN/licence.html</file>
<file>welcome.html</file>
<file>de/welcome.html</file>
+ <file>fr/welcome.html</file>
<file>it/welcome.html</file>
<file>ja/welcome.html</file>
<file>nl/welcome.html</file>
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 71c96a8ba..f9d4f6d67 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -193,6 +193,18 @@ static void scaffolding_window_destroy(GtkWidget *widget, gpointer data)
nsgtk_local_history_hide();
+ /* ensure scaffolding being destroyed is not current */
+ if (scaf_current == gs) {
+ scaf_current = NULL;
+ /* attempt to select nearest scaffold instead of just selecting the first */
+ if (gs->prev != NULL) {
+ scaf_current = gs->prev;
+ } else if (gs->next != NULL) {
+ scaf_current = gs->next;
+ }
+ }
+
+ /* remove scaffolding from list */
if (gs->prev != NULL) {
gs->prev->next = gs->next;
} else {
diff --git a/frontends/gtk/search.c b/frontends/gtk/search.c
index 17447bbb7..f9a509f6e 100644
--- a/frontends/gtk/search.c
+++ b/frontends/gtk/search.c
@@ -270,6 +270,8 @@ nserror nsgtk_search_restyle(struct gtk_search *search)
case 4: /* Text icons only */
gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
GTK_TOOLBAR_TEXT);
+ break;
+
default:
break;
}
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index be676e210..6ec41cc1d 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -673,15 +673,22 @@ nsgtk_toolbar_customisation_save(struct nsgtk_toolbar *tb)
for (location = BACK_BUTTON;
location < PLACEHOLDER_BUTTON;
location++) {
+ int written;
itemid = itemid_from_location(tb, location);
if (itemid == PLACEHOLDER_BUTTON) {
/* no more filled locations */
break;
}
- start += snprintf(start,
+ written = snprintf(start,
orderlen - (start - order),
"%s/",
tb->items[itemid].name);
+ if ((written < 0) ||
+ (written >= orderlen - (start - order))) {
+ free(order);
+ return NSERROR_UNKNOWN;
+ }
+ start += written;
if ((start - order) >= orderlen) {
break;
diff --git a/frontends/riscos/Makefile b/frontends/riscos/Makefile
index 79e6fc493..265f9289d 100644
--- a/frontends/riscos/Makefile
+++ b/frontends/riscos/Makefile
@@ -22,6 +22,9 @@ RESOURCES = $(TPD_RISCOS)
CFLAGS += -Driscos -std=c99 -D_BSD_SOURCE -D_POSIX_C_SOURCE \
-mpoke-function-name -fno-strict-aliasing
+ifeq ($(findstring -elfeabi,$(SUBTARGET)),-elfeabi)
+ CFLAGS += -funwind-tables
+endif
CFLAGS += -I$(GCCSDK_INSTALL_ENV)/include
ifeq ($(HOST),riscos)
@@ -111,6 +114,9 @@ MESSAGES_FILTER=ro
$(FRONTEND_SOURCE_DIR)/appdir/!Run$(RUNEXT): $(FRONTEND_SOURCE_DIR)/scripts/Run $(EXETARGET)
$(VQ)echo " MAKERUN: $@"
$(Q)$(MAKERUN) $(EXETARGET) $< $@
+ifeq ($(findstring -elfeabi,$(SUBTARGET)),-elfeabi)
+ $(Q)$(SED) -i -e 's/^|\(RMEnsure ARMEABISupport\)/\1/' -e 's/SharedUnixLibrary 1\.07/SharedUnixLibrary 1.16/g' $@
+endif
$(FRONTEND_SOURCE_DIR)/appdir/!Help$(RUNEXT): $(FRONTEND_SOURCE_DIR)/scripts/Help
$(VQ)echo " CP: $@"
@@ -174,7 +180,7 @@ install-riscos:
package-riscos: netsurf.zip
-netsurf.zip: $(EXETARGET)
+netsurf.zip: $(EXETARGET) $(POSTEXES)
$(eval $@_TMPDIR := $(shell mktemp -d))
$(Q) $(RM) $@
$(Q) cp -rLvp $(FRONTEND_SOURCE_DIR)/appdir $($@_TMPDIR)/!NetSurf
diff --git a/frontends/riscos/Makefile.tools b/frontends/riscos/Makefile.tools
index 19a2e7768..a5b5cca1e 100644
--- a/frontends/riscos/Makefile.tools
+++ b/frontends/riscos/Makefile.tools
@@ -16,27 +16,33 @@ ifeq ($(HOST),riscos)
EXEEXT :=
PKG_CONFIG :=
ZIP := zip
+ SED :=
else
# Cross-build for RO
- # Three options are available:
- # a. GCCSDK 3.4.6 - AOF (machine: arm-unknown-riscos)
- # b. GCCSDK 4 - ELF (machine: arm-unknown-riscos)
- # c. GCCSDK 8+ - ELF, using EABI (machine: arm-riscos-gnueabihf)
+ # Four options are available:
+ # a. GCCSDK 3.4.6 - AOF (machine: arm-unknown-riscos)
+ # b. GCCSDK 4 - ELF (machine: arm-unknown-riscos)
+ # c. GCCSDK 8+ - ELF, using soft-float EABI (machine: arm-riscos-gnueabi)
+ # d. GCCSDK 8+ - ELF, using hard-float EABI (machine: arm-riscos-gnueabihf)
# GCCSDK 3.4.6 and 4 are distinguished by GCCSDK 3.4.6 binary names
# not having the machine prefix (e.g. gcc), whereas GCCSDK 4 binaries
# do (e.g. arm-unknown-riscos-gcc).
# Search for the toolchain install locations if we haven't been told
- # The search order prefers GCCSDK 3.4.6/4 over 8+.
+ # The search order prefers GCCSDK 3.4.6/4 over 8+ and soft-float over hard.
ifeq ($(origin GCCSDK_INSTALL_ENV),undefined)
ifneq ($(realpath /opt/netsurf/arm-unknown-riscos/env),)
GCCSDK_INSTALL_ENV := /opt/netsurf/arm-unknown-riscos/env
else
- ifneq ($(realpath /opt/netsurf/arm-riscos-gnueabihf/env),)
- GCCSDK_INSTALL_ENV := /opt/netsurf/arm-riscos-gnueabihf/env
+ ifneq ($(realpath /opt/netsurf/arm-riscos-gnueabi/env),)
+ GCCSDK_INSTALL_ENV := /opt/netsurf/arm-riscos-gnueabi/env
else
- # No NetSurf-specific toolchain found: try the "normal" GCCSDK path
- GCCSDK_INSTALL_ENV := /home/riscos/env
+ ifneq ($(realpath /opt/netsurf/arm-riscos-gnueabihf/env),)
+ GCCSDK_INSTALL_ENV := /opt/netsurf/arm-riscos-gnueabihf/env
+ else
+ # No NetSurf-specific toolchain found: try the "normal" GCCSDK path
+ GCCSDK_INSTALL_ENV := /home/riscos/env
+ endif
endif
endif
endif
@@ -45,11 +51,15 @@ else
ifneq ($(realpath /opt/netsurf/arm-unknown-riscos/cross/bin),)
GCCSDK_INSTALL_CROSSBIN := /opt/netsurf/arm-unknown-riscos/cross/bin
else
- ifneq ($(realpath /opt/netsurf/arm-riscos-gnueabihf/cross/bin),)
- GCCSDK_INSTALL_CROSSBIN := /opt/netsurf/arm-riscos-gnueabihf/cross/bin
+ ifneq ($(realpath /opt/netsurf/arm-riscos-gnueabi/cross/bin),)
+ GCCSDK_INSTALL_CROSSBIN := /opt/netsurf/arm-riscos-gnueabi/cross/bin
else
- # No NetSurf-specific toolchain found: try the "normal" GCCSDK path
- GCCSDK_INSTALL_CROSSBIN := /home/riscos/cross/bin
+ ifneq ($(realpath /opt/netsurf/arm-riscos-gnueabihf/cross/bin),)
+ GCCSDK_INSTALL_CROSSBIN := /opt/netsurf/arm-riscos-gnueabihf/cross/bin
+ else
+ # No NetSurf-specific toolchain found: try the "normal" GCCSDK path
+ GCCSDK_INSTALL_CROSSBIN := /home/riscos/cross/bin
+ endif
endif
endif
endif
@@ -68,9 +78,12 @@ else
EXEEXT := ,e1f
ELF2AIF := $(GCCSDK_INSTALL_CROSSBIN)/elf2aif
else
- ifneq (,$(findstring arm-riscos-gnueabihf-gcc,$(CC)))
+ ifneq (,$(findstring arm-riscos-gnueabi,$(CC)))
# GCCSDK 8+
SUBTARGET := -elfeabi
+ ifneq (,$(findstring gnueabihf,$(CC)))
+ SUBTARGET := -elfeabihf
+ endif
EXEEXT := ,e1f
ELF2AIF := $(GCCSDK_INSTALL_CROSSBIN)/elf2aif -e
else
@@ -83,4 +96,5 @@ else
CXX := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*g++)
PKG_CONFIG = PKG_CONFIG_LIBDIR="$(PREFIX)/lib/pkgconfig:$(GCCSDK_INSTALL_ENV)/lib/pkgconfig:$(GCCSDK_INSTALL_ENV)/share/pkgconfig" pkg-config
ZIP := $(GCCSDK_INSTALL_CROSSBIN)/zip
+ SED := sed
endif
diff --git a/frontends/riscos/appdir/!Boot,feb b/frontends/riscos/appdir/!Boot,feb
index ca7a3feec..acaad8192 100644
--- a/frontends/riscos/appdir/!Boot,feb
+++ b/frontends/riscos/appdir/!Boot,feb
@@ -35,10 +35,8 @@ Set File$Type_F91 URI
Set File$Type_FAF HTML
| Application system variables
-|
-| See http://www.iyonix.com/32bit/help.shtml for more details.
If (("<NetSurf$Help>" = "") OR ("<NetSurf$ForceVars>" = "1")) Then Set NetSurf$Help <NetSurf$Dir>.Docs.docs_en
-If (("<NetSurf$Web>" = "") OR ("<NetSurf$ForceVars>" = "1")) Then Set NetSurf$Web "http://www.netsurf-browser.org/"
+If (("<NetSurf$Web>" = "") OR ("<NetSurf$ForceVars>" = "1")) Then Set NetSurf$Web "https://www.netsurf-browser.org/"
If (("<NetSurf$Title>" = "") OR ("<NetSurf$ForceVars>" = "1")) Then Set NetSurf$Title "NetSurf"
If (("<NetSurf$Publisher>" = "") OR ("<NetSurf$ForceVars>" = "1")) Then Set NetSurf$Publisher "The NetSurf Developers"
If (("<NetSurf$Description>" = "") OR ("<NetSurf$ForceVars>" = "1")) Then Set NetSurf$Description "Web browser"
diff --git a/frontends/riscos/appdir/Resources/en/!Help b/frontends/riscos/appdir/Resources/en/!Help
index 977f069d8..bba2b2a72 100644
--- a/frontends/riscos/appdir/Resources/en/!Help
+++ b/frontends/riscos/appdir/Resources/en/!Help
@@ -1,14 +1,14 @@
-NetSurf - Open Source web browser - http://www.netsurf-browser.org/
+NetSurf - Open Source web browser - https://www.netsurf-browser.org/
To view the full documentation, start NetSurf and choose "Help..." from the
icon bar menu.
This is a development build of NetSurf. In case of problems, please check
-for a newer development build at http://www.netsurf-browser.org/
+for a newer development build at https://www.netsurf-browser.org/
Please report any unexpected behaviour on the NetSurf bug tracker.
-This may be found at http://bugs.netsurf-browser.org/
+This may be found at https://bugs.netsurf-browser.org/
-Alternatively, the developers are often available on Freenode in the
+Alternatively, the developers are often available on libera.chat in the
channel #netsurf.
diff --git a/frontends/riscos/appdir/Resources/nl/!Help b/frontends/riscos/appdir/Resources/nl/!Help
index 4eca563bc..8a68e94f9 100644
--- a/frontends/riscos/appdir/Resources/nl/!Help
+++ b/frontends/riscos/appdir/Resources/nl/!Help
@@ -1,15 +1,15 @@
-NetSurf - Webbrowser (met open broncode) - http://www.netsurf-browser.org/
+NetSurf - Webbrowser (met open broncode) - https://www.netsurf-browser.org/
Om alle documentatie te kunnen raadplegen: start NetSurf en kies "Help..."
vanuit het symbolenbalkmenu.
Dit is een ontwikkelversie van NetSurf. Bij problemen: kijk eerst of er een
-nieuwere versie is op http://www.netsurf-browser.org/
+nieuwere versie is op https://www.netsurf-browser.org/
Gelieve ook elk onverwacht gedrag van NetSurf, in het Engels te melden via
-onze 'bug tracker' op http://bugs.netsurf-browser.org/
+onze 'bug tracker' op https://bugs.netsurf-browser.org/
-Een alternatief is Freenode op het kanaal #netsurf waar de ontwikkelaars
+Een alternatief is libera.chat op het kanaal #netsurf waar de ontwikkelaars
vaak bereikbaar zijn.
diff --git a/frontends/riscos/configure/con_content.c b/frontends/riscos/configure/con_content.c
index 50bbd15ef..bdf147bd4 100644
--- a/frontends/riscos/configure/con_content.c
+++ b/frontends/riscos/configure/con_content.c
@@ -30,7 +30,7 @@
#define CONTENT_BLOCK_ADVERTISEMENTS 2
#define CONTENT_BLOCK_POPUPS 3
-#define CONTENT_NO_PLUGINS 4
+#define CONTENT_BLOCK_CSS 4
#define CONTENT_TARGET_BLANK 7
#define CONTENT_DEFAULT_BUTTON 8
#define CONTENT_CANCEL_BUTTON 9
@@ -47,8 +47,8 @@ bool ro_gui_options_content_initialise(wimp_w w)
nsoption_bool(block_advertisements));
ro_gui_set_icon_selected_state(w, CONTENT_BLOCK_POPUPS,
nsoption_bool(block_popups));
- ro_gui_set_icon_selected_state(w, CONTENT_NO_PLUGINS,
- nsoption_bool(no_plugins));
+ ro_gui_set_icon_selected_state(w, CONTENT_BLOCK_CSS,
+ !nsoption_bool(author_level_css));
ro_gui_set_icon_selected_state(w, CONTENT_TARGET_BLANK,
nsoption_bool(target_blank));
ro_gui_set_icon_selected_state(w, CONTENT_NO_JAVASCRIPT,
@@ -57,7 +57,7 @@ bool ro_gui_options_content_initialise(wimp_w w)
/* initialise all functions for a newly created window */
ro_gui_wimp_event_register_checkbox(w, CONTENT_BLOCK_ADVERTISEMENTS);
ro_gui_wimp_event_register_checkbox(w, CONTENT_BLOCK_POPUPS);
- ro_gui_wimp_event_register_checkbox(w, CONTENT_NO_PLUGINS);
+ ro_gui_wimp_event_register_checkbox(w, CONTENT_BLOCK_CSS);
ro_gui_wimp_event_register_checkbox(w, CONTENT_TARGET_BLANK);
ro_gui_wimp_event_register_checkbox(w, CONTENT_NO_JAVASCRIPT);
ro_gui_wimp_event_register_button(w, CONTENT_DEFAULT_BUTTON,
@@ -78,7 +78,7 @@ void ro_gui_options_content_default(wimp_pointer *pointer)
false);
ro_gui_set_icon_selected_state(pointer->w, CONTENT_BLOCK_POPUPS,
false);
- ro_gui_set_icon_selected_state(pointer->w, CONTENT_NO_PLUGINS,
+ ro_gui_set_icon_selected_state(pointer->w, CONTENT_BLOCK_CSS,
false);
ro_gui_set_icon_selected_state(pointer->w, CONTENT_TARGET_BLANK,
true);
@@ -93,8 +93,8 @@ bool ro_gui_options_content_ok(wimp_w w)
nsoption_set_bool(block_popups,
ro_gui_get_icon_selected_state(w, CONTENT_BLOCK_POPUPS));
- nsoption_set_bool(no_plugins,
- ro_gui_get_icon_selected_state(w, CONTENT_NO_PLUGINS));
+ nsoption_set_bool(author_level_css,
+ !ro_gui_get_icon_selected_state(w, CONTENT_BLOCK_CSS));
nsoption_set_bool(target_blank,
ro_gui_get_icon_selected_state(w, CONTENT_TARGET_BLANK));
diff --git a/frontends/riscos/configure/con_image.c b/frontends/riscos/configure/con_image.c
index 86e6b8f6f..d81dc5c3b 100644
--- a/frontends/riscos/configure/con_image.c
+++ b/frontends/riscos/configure/con_image.c
@@ -23,6 +23,7 @@
#include "utils/nsoption.h"
#include "utils/log.h"
+#include "utils/utils.h"
#include "riscos/gui.h"
#include "riscos/configure/configure.h"
@@ -209,7 +210,7 @@ bool ro_gui_options_image_click(wimp_pointer *pointer)
data.indirected_text.text, true);
ro_gui_set_icon_selected_state(pointer->w,
IMAGE_DISABLE_ANIMATION, false);
- /* fall through */
+ fallthrough;
case IMAGE_DISABLE_ANIMATION:
ro_gui_options_update_shading(pointer->w);
break;
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Boot,feb b/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Boot,feb
index 7c0c46241..b2cdbf102 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Boot,feb
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Boot,feb
@@ -2,4 +2,4 @@
|
Set Unicode$Dir <Obey$Dir>
SetMacro Unicode$Path <Unicode$Dir>.,Resources:$.Resources.Unicode.
-IconSprites Unicode:!Sprites
+IconSprites Unicode:Themes.!Sprites
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Help b/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Help
index 8c0488185..a24701e02 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Help
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Help
@@ -1 +1,5 @@
-This application contains resources for Unicode support in applications.
+ !Unicode
+ ========
+
+This application contains resources for Unicode support in
+applications.
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Run,feb b/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Run,feb
index bd70e96ac..40999ded5 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Run,feb
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Run,feb
@@ -2,4 +2,4 @@
|
Set Unicode$Dir <Obey$Dir>
SetMacro Unicode$Path <Unicode$Dir>.,Resources:$.Resources.Unicode.
-IconSprites Unicode:!Sprites
+IconSprites Unicode:Themes.!Sprites
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Acorn/Latin1 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Acorn/Latin1,ffd
index bdf5d3b67..bdf5d3b67 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Acorn/Latin1
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Acorn/Latin1,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/CentEuro b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/CentEuro,ffd
index 5ab69ff2e..5ab69ff2e 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/CentEuro
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/CentEuro,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Cyrillic b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Cyrillic,ffd
index 670fd6cdc..670fd6cdc 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Cyrillic
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Cyrillic,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Roman b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Roman,ffd
index 254579e2c..254579e2c 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Roman
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Roman,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Ukrainian b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Ukrainian,ffd
index a220587ba..a220587ba 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Ukrainian
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Apple/Ukrainian,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/BigFive b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/BigFive,ffd
index c659cef19..c659cef19 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/BigFive
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/BigFive,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C0/40[ISO646] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C0/40[ISO646],ffd
index cd92b5486..cd92b5486 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C0/40[ISO646]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C0/40[ISO646],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C1/43[IS6429] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C1/43[IS6429],ffd
index 74002a168..74002a168 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C1/43[IS6429]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/C1/43[IS6429],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/40[646old] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/40[646old],ffd
index 00e2d1096..00e2d1096 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/40[646old]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/40[646old],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/41[646-GB] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/41[646-GB],ffd
index c293f93d6..c293f93d6 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/41[646-GB]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/41[646-GB],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/42[646IRV] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/42[646IRV],ffd
index e0b4bcadb..e0b4bcadb 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/42[646IRV]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/42[646IRV],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/43[FinSwe] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/43[FinSwe],ffd
index 7d4646905..7d4646905 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/43[FinSwe]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/43[FinSwe],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/47[646-SE] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/47[646-SE],ffd
index a6b091a22..a6b091a22 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/47[646-SE]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/47[646-SE],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/48[646-SE] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/48[646-SE],ffd
index 9bd24ab29..9bd24ab29 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/48[646-SE]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/48[646-SE],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/49[JS201K] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/49[JS201K],ffd
index 20ce8d498..20ce8d498 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/49[JS201K]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/49[JS201K],ffd
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4A[JS201R] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4A[JS201R],ffd
index 21d2a479b..21d2a479b 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4A[JS201R]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4A[JS201R],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4B[646-DE] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4B[646-DE],ffd
index a2e284e1b..a2e284e1b 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4B[646-DE]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4B[646-DE],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4C[646-PT] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4C[646-PT],ffd
index e076e2517..e076e2517 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4C[646-PT]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/4C[646-PT],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/54[GB1988] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/54[GB1988],ffd
index 3b43719ce..3b43719ce 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/54[GB1988]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/54[GB1988],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/56[Teltxt] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/56[Teltxt],ffd
index 73ce49e17..73ce49e17 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/56[Teltxt]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/56[Teltxt],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/59[646-IT] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/59[646-IT],ffd
index f1ae81962..f1ae81962 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/59[646-IT]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/59[646-IT],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/5A[646-ES] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/5A[646-ES],ffd
index 674fc2d70..674fc2d70 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/5A[646-ES]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/5A[646-ES],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/60[646-NO] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/60[646-NO],ffd
index fc92892ee..fc92892ee 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/60[646-NO]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/60[646-NO],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/66[646-FR] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/66[646-FR],ffd
index 8dd604679..8dd604679 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/66[646-FR]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/66[646-FR],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/69[646-HU] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/69[646-HU],ffd
index 65300b2c5..65300b2c5 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/69[646-HU]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/69[646-HU],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6B[Arabic] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6B[Arabic],ffd
index c47689914..c47689914 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6B[Arabic]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6B[Arabic],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6C[IS6937] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6C[IS6937],ffd
index 93453f5de..93453f5de 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6C[IS6937]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/6C[IS6937],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/7A[SerbCr] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/7A[SerbCr],ffd
index 9740e784e..9740e784e 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/7A[SerbCr]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94/7A[SerbCr],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/40[JS6226] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/40[JS6226],ffd
index a677dfc3d..a677dfc3d 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/40[JS6226]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/40[JS6226],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/41[GB2312] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/41[GB2312],ffd
index 679608ad2..679608ad2 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/41[GB2312]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/41[GB2312],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/42[JIS208] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/42[JIS208],ffd
index 532b1f4f3..532b1f4f3 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/42[JIS208]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/42[JIS208],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/43[KS1001] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/43[KS1001],ffd
index 36186c864..36186c864 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/43[KS1001]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/43[KS1001],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/44[JIS212] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/44[JIS212],ffd
index f5343a30e..f5343a30e 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/44[JIS212]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/44[JIS212],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/47[CNS1] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/47[CNS1],ffd
index da07f45d3..da07f45d3 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/47[CNS1]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/47[CNS1],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/48[CNS2] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/48[CNS2],ffd
index 44ee24c91..44ee24c91 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/48[CNS2]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/48[CNS2],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/49[CNS3] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/49[CNS3],ffd
index a8464e5aa..a8464e5aa 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/49[CNS3]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/49[CNS3],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4A[CNS4] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4A[CNS4],ffd
index a8f3e3270..a8f3e3270 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4A[CNS4]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4A[CNS4],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4B[CNS5] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4B[CNS5],ffd
index 535b0f4b5..535b0f4b5 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4B[CNS5]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4B[CNS5],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4C[CNS6] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4C[CNS6],ffd
index 7bfb2b1d4..7bfb2b1d4 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4C[CNS6]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4C[CNS6],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4D[CNS7] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4D[CNS7],ffd
index be14c7279..be14c7279 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4D[CNS7]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G94x94/4D[CNS7],ffd
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/41[Lat1] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/41[Lat1],ffd
index 97e6b1106..97e6b1106 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/41[Lat1]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/41[Lat1],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/42[Lat2] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/42[Lat2],ffd
index b753c40fe..b753c40fe 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/42[Lat2]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/42[Lat2],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/43[Lat3] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/43[Lat3],ffd
index 88d477886..88d477886 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/43[Lat3]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/43[Lat3],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/44[Lat4] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/44[Lat4],ffd
index a40662d45..a40662d45 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/44[Lat4]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/44[Lat4],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/46[Greek] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/46[Greek],ffd
index c42397388..c42397388 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/46[Greek]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/46[Greek],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/47[Arabic] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/47[Arabic],ffd
index 4507f467a..4507f467a 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/47[Arabic]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/47[Arabic],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/48[Hebrew] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/48[Hebrew],ffd
index 70f39cca6..70f39cca6 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/48[Hebrew]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/48[Hebrew],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4C[Cyrill] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4C[Cyrill],ffd
index 8ff0115e4..8ff0115e4 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4C[Cyrill]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4C[Cyrill],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4D[Lat5] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4D[Lat5],ffd
index 6381e607e..6381e607e 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4D[Lat5]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/4D[Lat5],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/50[LatSup] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/50[LatSup],ffd
index a320c7fe8..a320c7fe8 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/50[LatSup]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/50[LatSup],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/52[IS6937] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/52[IS6937],ffd
index dff6ccba4..dff6ccba4 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/52[IS6937]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/52[IS6937],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/54[Thai] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/54[Thai],ffd
index d74377759..d74377759 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/54[Thai]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/54[Thai],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/56[Lat6] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/56[Lat6],ffd
index 4e3e4f313..4e3e4f313 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/56[Lat6]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/56[Lat6],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/58[L6Sami] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/58[L6Sami],ffd
index 4dfd9188c..4dfd9188c 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/58[L6Sami]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/58[L6Sami],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/59[Lat7] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/59[Lat7],ffd
index 256a88e76..256a88e76 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/59[Lat7]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/59[Lat7],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5C[Welsh] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5C[Welsh],ffd
index b5e00509f..b5e00509f 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5C[Welsh]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5C[Welsh],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5D[Sami] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5D[Sami],ffd
index 15734c036..15734c036 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5D[Sami]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5D[Sami],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5E[Hebrew] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5E[Hebrew],ffd
index a6593b071..a6593b071 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5E[Hebrew]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5E[Hebrew],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5F[Lat8] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5F[Lat8],ffd
index c15713e82..c15713e82 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5F[Lat8]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/5F[Lat8],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/62[Lat9] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/62[Lat9],ffd
index 5bf449d58..5bf449d58 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/62[Lat9]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/62[Lat9],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/66[Lat10] b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/66[Lat10],ffd
index e8ba925d3..e8ba925d3 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/66[Lat10]
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/ISO2022/G96/66[Lat10],ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/KOI8-R b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/KOI8-R,ffd
index 8063cd4bc..8063cd4bc 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/KOI8-R
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/KOI8-R,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1250 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1250,ffd
index 7a0d35ceb..7a0d35ceb 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1250
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1250,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1251 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1251,ffd
index 3d6009cab..3d6009cab 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1251
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1251,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1252 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1252,ffd
index 6d3bf293d..6d3bf293d 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1252
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1252,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1253 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1253,ffd
index 50a48be13..50a48be13 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1253
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1253,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1254 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1254,ffd
index 45ecfe907..45ecfe907 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1254
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1254,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1256 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1256,ffd
index 7fc95a92f..7fc95a92f 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1256
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP1256,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP866 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP866,ffd
index cd214d24b..cd214d24b 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP866
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP866,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP874 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP874,ffd
index 26a6fc8c3..26a6fc8c3 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP874
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP874,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP932 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP932,ffd
index 2c0c111f9..2c0c111f9 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP932
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Encodings/Microsoft/CP932,ffd
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Files/CharNames b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Files/CharNames
new file mode 100644
index 000000000..3600913be
--- /dev/null
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Files/CharNames
@@ -0,0 +1,14016 @@
+# > Unicode:Files.CharNames
+# Mapping of code points to character names
+#
+# Lines starting with a '#' are comments, blank lines are ignored.
+#
+# Copyright (c) 2002 Unicode, Inc. All rights reserved.
+# Based on http://www.unicode.org/Public/3.2-Update/UnicodeData-3.2.0.txt
+#
+0000-001F:\ê
+0020:SPACE
+0021:EXCLAM\”\¥
+0022:QUOT\”\¥
+0023:\­SIGN
+0024:DOLLAR\‚
+0025:PERCENT\‚
+0026:AMPERSAND
+0027:APOSTROPHE
+0028:\‰ \ÑS
+0029:\ù\ÑS
+002A:ASTERISK
+002B:PLUS\‚
+002C:COMMA
+002D:HYPHEN-MINUS
+002E:FULL STOP
+002F:SOLIDUS
+0030:DIGIT ZERO
+0031:DIGIT ONE
+0032:DIGIT TWO
+0033:DIGIT THREE
+0034:DIGIT FOUR
+0035:DIGIT FIVE
+0036:DIGIT SIX
+0037:DIGIT SEVEN
+0038:DIGIT E\¼
+0039:DIGIT NINE
+003A:COLON
+003B:SEMICOLON
+003C:\µ\‚
+003D:EQUALS\‚
+003E:\’\‚
+003F:QUESTION\¥
+0040:COMMERCIAL AT
+0041:\PA
+0042:\PB
+0043:\PC
+0044:\PD
+0045:\PE
+0046:\PF
+0047:\PG
+0048:\PH
+0049:\PI
+004A:\PJ
+004B:\PK
+004C:\PL
+004D:\PM
+004E:\PN
+004F:\PO
+0050:\PP
+0051:\PQ
+0052:\PR
+0053:\PS
+0054:\PT
+0055:\PU
+0056:\PV
+0057:\PW
+0058:\PX
+0059:\PY
+005A:\PZ
+005B:\‰ \r\–
+005C:REVERSE SOLIDUS
+005D:\ù\r\–
+005E:CIRCUMFLEX\×
+005F:LOW \ä
+0060:GRAVE\×
+0061:\LA
+0062:\LB
+0063:\LC
+0064:\LD
+0065:\LE
+0066:\LF
+0067:\LG
+0068:\LH
+0069:\LI
+006A:\LJ
+006B:\LK
+006C:\LL
+006D:\LM
+006E:\LN
+006F:\LO
+0070:\LP
+0071:\LQ
+0072:\LR
+0073:\LS
+0074:\LT
+0075:\LU
+0076:\LV
+0077:\LW
+0078:\LX
+0079:\LY
+007A:\LZ
+007B:\‰ CURLY \–
+007C:\€ \ä
+007D:\ùCURLY \–
+007E:\æ
+007F:\ê
+0080:\ê
+0081:\ê
+0082:\ê
+0083:\ê
+0084:\ê
+0085:\ê
+0086:\ê
+0087:\ê
+0088:\ê
+0089:\ê
+008A:\ê
+008B:\ê
+008C:\ê
+008D:\ê
+008E:\ê
+008F:\ê
+0090:\ê
+0091:\ê
+0092:\ê
+0093:\ê
+0094:\ê
+0095:\ê
+0096:\ê
+0097:\ê
+0098:\ê
+0099:\ê
+009A:\ê
+009B:\ê
+009C:\ê
+009D:\ê
+009E:\ê
+009F:\ê
+00A0:NO-BREAK SPACE
+00A1:INVERT\ÂEXCLAM\”\¥
+00A2:CENT\‚
+00A3:POUND\‚
+00A4:CURRENCY\‚
+00A5:YEN\‚
+00A6:BROKEN\ì
+00A7:SECTION\‚
+00A8:DIAERESIS
+00A9:COPY\ùSIGN
+00AA:FEMININE ORDINAL INDICATOR
+00AB:\‰-\Ä\0 ANGLE QUOT\”\¥
+00AC:NOT\‚
+00AD:SOFT HYPHEN
+00AE:REGISTERED\‚
+00AF:\å
+00B0:DEGREE\‚
+00B1:PLUS-MINUS\‚
+00B2:SUPER\Ž TWO
+00B3:SUPER\Ž THREE
+00B4:\Ü\×
+00B5:MICRO\‚
+00B6:PILCROW\‚
+00B7:MIDDLE DOT
+00B8:CEDILLA
+00B9:SUPER\Ž ONE
+00BA:MASCU\ä ORDINAL INDICATOR
+00BB:\q-\Ä\0 ANGLE QUOT\”\¥
+00BC:\úONE QUARTER
+00BD:\úONE HALF
+00BE:\úTHREE QUARTERS
+00BF:INVERT\ÂQUESTION\¥
+00C0:\PA\HGRAVE
+00C1:\PA\H\Ü
+00C2:\PA\ˆ
+00C3:\PA\H\æ
+00C4:\PA\ž
+00C5:\PA\HR\ô\p
+00C6:\PAE
+00C7:\PC\HCEDILLA
+00C8:\PE\HGRAVE
+00C9:\PE\H\Ü
+00CA:\PE\ˆ
+00CB:\PE\ž
+00CC:\PI\HGRAVE
+00CD:\PI\H\Ü
+00CE:\PI\ˆ
+00CF:\PI\ž
+00D0:\PETH
+00D1:\PN\H\æ
+00D2:\PO\HGRAVE
+00D3:\PO\H\Ü
+00D4:\PO\ˆ
+00D5:\PO\H\æ
+00D6:\PO\ž
+00D7:MULTIPLIC\”\‚
+00D8:\PO\H\Á
+00D9:\PU\HGRAVE
+00DA:\PU\H\Ü
+00DB:\PU\ˆ
+00DC:\PU\ž
+00DD:\PY\H\Ü
+00DE:\PTHORN
+00DF:\LSHARP S
+00E0:\LA\HGRAVE
+00E1:\LA\H\Ü
+00E2:\LA\ˆ
+00E3:\LA\H\æ
+00E4:\LA\ž
+00E5:\LA\HR\ô\p
+00E6:\LAE
+00E7:\LC\HCEDILLA
+00E8:\LE\HGRAVE
+00E9:\LE\H\Ü
+00EA:\LE\ˆ
+00EB:\LE\ž
+00EC:\LI\HGRAVE
+00ED:\LI\H\Ü
+00EE:\LI\ˆ
+00EF:\LI\ž
+00F0:\LETH
+00F1:\LN\H\æ
+00F2:\LO\HGRAVE
+00F3:\LO\H\Ü
+00F4:\LO\ˆ
+00F5:\LO\H\æ
+00F6:\LO\ž
+00F7:DIVISION\‚
+00F8:\LO\H\Á
+00F9:\LU\HGRAVE
+00FA:\LU\H\Ü
+00FB:\LU\ˆ
+00FC:\LU\ž
+00FD:\LY\H\Ü
+00FE:\LTHORN
+00FF:\LY\ž
+0100:\PA\H\å
+0101:\LA\H\å
+0102:\PA\HBREVE
+0103:\LA\HBREVE
+0104:\PA\HOGONEK
+0105:\LA\HOGONEK
+0106:\PC\H\Ü
+0107:\LC\H\Ü
+0108:\PC\ˆ
+0109:\LC\ˆ
+010A:\PC\³\p
+010B:\LC\³\p
+010C:\PC\û
+010D:\LC\û
+010E:\PD\û
+010F:\LD\û
+0110:\PD\H\Á
+0111:\LD\H\Á
+0112:\PE\H\å
+0113:\LE\H\å
+0114:\PE\HBREVE
+0115:\LE\HBREVE
+0116:\PE\³\p
+0117:\LE\³\p
+0118:\PE\HOGONEK
+0119:\LE\HOGONEK
+011A:\PE\û
+011B:\LE\û
+011C:\PG\ˆ
+011D:\LG\ˆ
+011E:\PG\HBREVE
+011F:\LG\HBREVE
+0120:\PG\³\p
+0121:\LG\³\p
+0122:\PG\HCEDILLA
+0123:\LG\HCEDILLA
+0124:\PH\ˆ
+0125:\LH\ˆ
+0126:\PH\H\Á
+0127:\LH\H\Á
+0128:\PI\H\æ
+0129:\LI\H\æ
+012A:\PI\H\å
+012B:\LI\H\å
+012C:\PI\HBREVE
+012D:\LI\HBREVE
+012E:\PI\HOGONEK
+012F:\LI\HOGONEK
+0130:\PI\³\p
+0131:\LDOTLESS I
+0132:LATIN\Ò\òIJ
+0133:LATIN\Ç\òIJ
+0134:\PJ\ˆ
+0135:\LJ\ˆ
+0136:\PK\HCEDILLA
+0137:\LK\HCEDILLA
+0138:\LKRA
+0139:\PL\H\Ü
+013A:\LL\H\Ü
+013B:\PL\HCEDILLA
+013C:\LL\HCEDILLA
+013D:\PL\û
+013E:\LL\û
+013F:\PL\HMIDDLE DOT
+0140:\LL\HMIDDLE DOT
+0141:\PL\H\Á
+0142:\LL\H\Á
+0143:\PN\H\Ü
+0144:\LN\H\Ü
+0145:\PN\HCEDILLA
+0146:\LN\HCEDILLA
+0147:\PN\û
+0148:\LN\û
+0149:\LN PRECED\ÂBY APOSTROPHE
+014A:\PENG
+014B:\LENG
+014C:\PO\H\å
+014D:\LO\H\å
+014E:\PO\HBREVE
+014F:\LO\HBREVE
+0150:\PO\H\0 \Ü
+0151:\LO\H\0 \Ü
+0152:LATIN\Ò\òOE
+0153:LATIN\Ç\òOE
+0154:\PR\H\Ü
+0155:\LR\H\Ü
+0156:\PR\HCEDILLA
+0157:\LR\HCEDILLA
+0158:\PR\û
+0159:\LR\û
+015A:\PS\H\Ü
+015B:\LS\H\Ü
+015C:\PS\ˆ
+015D:\LS\ˆ
+015E:\PS\HCEDILLA
+015F:\LS\HCEDILLA
+0160:\PS\û
+0161:\LS\û
+0162:\PT\HCEDILLA
+0163:\LT\HCEDILLA
+0164:\PT\û
+0165:\LT\û
+0166:\PT\H\Á
+0167:\LT\H\Á
+0168:\PU\H\æ
+0169:\LU\H\æ
+016A:\PU\H\å
+016B:\LU\H\å
+016C:\PU\HBREVE
+016D:\LU\HBREVE
+016E:\PU\HR\ô\p
+016F:\LU\HR\ô\p
+0170:\PU\H\0 \Ü
+0171:\LU\H\0 \Ü
+0172:\PU\HOGONEK
+0173:\LU\HOGONEK
+0174:\PW\ˆ
+0175:\LW\ˆ
+0176:\PY\ˆ
+0177:\LY\ˆ
+0178:\PY\ž
+0179:\PZ\H\Ü
+017A:\LZ\H\Ü
+017B:\PZ\³\p
+017C:\LZ\³\p
+017D:\PZ\û
+017E:\LZ\û
+017F:\LLONG S
+0180:\LB\H\Á
+0181:\PB\í
+0182:\PB\HTOPBAR
+0183:\LB\HTOPBAR
+0184:\PTONE SIX
+0185:\LTONE SIX
+0186:\POPEN O
+0187:\PC\í
+0188:\LC\í
+0189:\PAFRICAN D
+018A:\PD\í
+018B:\PD\HTOPBAR
+018C:\LD\HTOPBAR
+018D:\LTURN\ÂDELTA
+018E:\P\öE
+018F:\PSCHWA
+0190:\POPEN E
+0191:\PF\í
+0192:\LF\í
+0193:\PG\í
+0194:\PGAMMA
+0195:\LHV
+0196:\PIOTA
+0197:\PI\H\Á
+0198:\PK\í
+0199:\LK\í
+019A:\LL\HBAR
+019B:\LLAMBDA\H\Á
+019C:\PTURN\ÂM
+019D:\PN\H\‰ HOOK
+019E:\LN\HLONG \ùLEG
+019F:\PO\HMIDDLE \æ
+01A0:\PO\HHORN
+01A1:\LO\HHORN
+01A2:\POI
+01A3:\LOI
+01A4:\PP\í
+01A5:\LP\í
+01A6:LATIN\@YR
+01A7:\PTONE TWO
+01A8:\LTONE TWO
+01A9:\PESH
+01AA:LATIN\@\öESH LOOP
+01AB:\LT\HPALATAL HOOK
+01AC:\PT\í
+01AD:\LT\í
+01AE:\PT\HRETROFLEX HOOK
+01AF:\PU\HHORN
+01B0:\LU\HHORN
+01B1:\PU\É
+01B2:\PV\í
+01B3:\PY\í
+01B4:\LY\í
+01B5:\PZ\H\Á
+01B6:\LZ\H\Á
+01B7:\PEZH
+01B8:\PEZH REVERSED
+01B9:\LEZH REVERSED
+01BA:\LEZH\HTAIL
+01BB:LATIN\@TWO\H\Á
+01BC:\PTONE FIVE
+01BD:\LTONE FIVE
+01BE:LATIN\@INVERT\ÂGLOTTAL STOP\H\Á
+01BF:LATIN\@WYNN
+01C0:LATIN\@DENTAL CLICK
+01C1:LATIN\@LATERAL CLICK
+01C2:LATIN\@ALVEOLAR CLICK
+01C3:LATIN\@RETROFLEX CLICK
+01C4:\PDZ\û
+01C5:\PD\HSMALL\@Z\û
+01C6:\LDZ\û
+01C7:\PLJ
+01C8:\PL\HSMALL\@J
+01C9:\LLJ
+01CA:\PNJ
+01CB:\PN\HSMALL\@J
+01CC:\LNJ
+01CD:\PA\û
+01CE:\LA\û
+01CF:\PI\û
+01D0:\LI\û
+01D1:\PO\û
+01D2:\LO\û
+01D3:\PU\û
+01D4:\LU\û
+01D5:\PU\ž\i\å
+01D6:\LU\ž\i\å
+01D7:\PU\ž\i\Ü
+01D8:\LU\ž\i\Ü
+01D9:\PU\ž\iCARON
+01DA:\LU\ž\iCARON
+01DB:\PU\ž\iGRAVE
+01DC:\LU\ž\iGRAVE
+01DD:\LTURN\ÂE
+01DE:\PA\ž\i\å
+01DF:\LA\ž\i\å
+01E0:\PA\³\p\i\å
+01E1:\LA\³\p\i\å
+01E2:\PAE\H\å
+01E3:\LAE\H\å
+01E4:\PG\H\Á
+01E5:\LG\H\Á
+01E6:\PG\û
+01E7:\LG\û
+01E8:\PK\û
+01E9:\LK\û
+01EA:\PO\HOGONEK
+01EB:\LO\HOGONEK
+01EC:\PO\HOGONEK\i\å
+01ED:\LO\HOGONEK\i\å
+01EE:\PEZH\û
+01EF:\LEZH\û
+01F0:\LJ\û
+01F1:\PDZ
+01F2:\PD\HSMALL\@Z
+01F3:\LDZ
+01F4:\PG\H\Ü
+01F5:\LG\H\Ü
+01F6:\PHWAIR
+01F7:\PWYNN
+01F8:\PN\HGRAVE
+01F9:\LN\HGRAVE
+01FA:\PA\HR\ô\p\i\Ü
+01FB:\LA\HR\ô\p\i\Ü
+01FC:\PAE\H\Ü
+01FD:\LAE\H\Ü
+01FE:\PO\H\Á\i\Ü
+01FF:\LO\H\Á\i\Ü
+0200:\PA\H\0 GRAVE
+0201:\LA\H\0 GRAVE
+0202:\PA\HINVERT\ÂBREVE
+0203:\LA\HINVERT\ÂBREVE
+0204:\PE\H\0 GRAVE
+0205:\LE\H\0 GRAVE
+0206:\PE\HINVERT\ÂBREVE
+0207:\LE\HINVERT\ÂBREVE
+0208:\PI\H\0 GRAVE
+0209:\LI\H\0 GRAVE
+020A:\PI\HINVERT\ÂBREVE
+020B:\LI\HINVERT\ÂBREVE
+020C:\PO\H\0 GRAVE
+020D:\LO\H\0 GRAVE
+020E:\PO\HINVERT\ÂBREVE
+020F:\LO\HINVERT\ÂBREVE
+0210:\PR\H\0 GRAVE
+0211:\LR\H\0 GRAVE
+0212:\PR\HINVERT\ÂBREVE
+0213:\LR\HINVERT\ÂBREVE
+0214:\PU\H\0 GRAVE
+0215:\LU\H\0 GRAVE
+0216:\PU\HINVERT\ÂBREVE
+0217:\LU\HINVERT\ÂBREVE
+0218:\PS\HCOMMA\…
+0219:\LS\HCOMMA\…
+021A:\PT\HCOMMA\…
+021B:\LT\HCOMMA\…
+021C:\PYOGH
+021D:\LYOGH
+021E:\PH\û
+021F:\LH\û
+0220:\PN\HLONG \ùLEG
+0222:\POU
+0223:\LOU
+0224:\PZ\í
+0225:\LZ\í
+0226:\PA\³\p
+0227:\LA\³\p
+0228:\PE\HCEDILLA
+0229:\LE\HCEDILLA
+022A:\PO\ž\i\å
+022B:\LO\ž\i\å
+022C:\PO\H\æ\i\å
+022D:\LO\H\æ\i\å
+022E:\PO\³\p
+022F:\LO\³\p
+0230:\PO\³\p\i\å
+0231:\LO\³\p\i\å
+0232:\PY\H\å
+0233:\LY\H\å
+0250:\LTURN\ÂA
+0251:\L\þ
+0252:\LTURN\Â\þ
+0253:\LB\í
+0254:\LOPEN O
+0255:\LC\HCURL
+0256:\LD\HTAIL
+0257:\LD\í
+0258:\L\öE
+0259:\LSCHWA
+025A:\LSCHWA\í
+025B:\LOPEN E
+025C:\L\öOPEN E
+025D:\L\öOPEN E\í
+025E:\LCLOS\Â\öOPEN E
+025F:\LDOTLESS J\H\Á
+0260:\LG\í
+0261:\L\Ž G
+0262:LATIN\@SMALL\ÒG
+0263:\LGAMMA
+0264:\LRAMS HORN
+0265:\LTURN\ÂH
+0266:\LH\í
+0267:\LHENG\í
+0268:\LI\H\Á
+0269:\LIOTA
+026A:LATIN\@SMALL\ÒI
+026B:\LL\HMIDDLE \æ
+026C:\LL\HBELT
+026D:\LL\HRETROFLEX HOOK
+026E:\LLEZH
+026F:\LTURN\ÂM
+0270:\LTURN\ÂM\HLONG LEG
+0271:\LM\í
+0272:\LN\H\‰ HOOK
+0273:\LN\HRETROFLEX HOOK
+0274:LATIN\@SMALL\ÒN
+0275:\LBARR\ÂO
+0276:LATIN\@SMALL\ÒOE
+0277:\LCLOS\Â\ü
+0278:\LPHI
+0279:\LTURN\ÂR
+027A:\LTURN\ÂR\HLONG LEG
+027B:\LTURN\ÂR\í
+027C:\LR\HLONG LEG
+027D:\LR\HTAIL
+027E:\LR\HFISHHOOK
+027F:\L\öR\HFISHHOOK
+0280:LATIN\@SMALL\ÒR
+0281:LATIN\@SMALL\ÒINVERT\ÂR
+0282:\LS\í
+0283:\LESH
+0284:\LDOTLESS J\H\Á\iHOOK
+0285:\LSQUAT \öESH
+0286:\LESH\HCURL
+0287:\LTURN\ÂT
+0288:\LT\HRETROFLEX HOOK
+0289:\LU\ì
+028A:\LU\É
+028B:\LV\í
+028C:\LTURN\ÂV
+028D:\LTURN\ÂW
+028E:\LTURN\ÂY
+028F:LATIN\@SMALL\ÒY
+0290:\LZ\HRETROFLEX HOOK
+0291:\LZ\HCURL
+0292:\LEZH
+0293:\LEZH\HCURL
+0294:LATIN\@GLOTTAL STOP
+0295:LATIN\@PHARYNGEAL VOIC\ÂFRICATIVE
+0296:LATIN\@INVERT\ÂGLOTTAL STOP
+0297:LATIN\@STRETCH\ÂC
+0298:LATIN\@BILABIAL CLICK
+0299:LATIN\@SMALL\ÒB
+029A:\LCLOS\ÂOPEN E
+029B:LATIN\@SMALL\ÒG\í
+029C:LATIN\@SMALL\ÒH
+029D:\LJ\HCROSSED-TAIL
+029E:\LTURN\ÂK
+029F:LATIN\@SMALL\ÒL
+02A0:\LQ\í
+02A1:LATIN\@GLOTTAL STOP\H\Á
+02A2:LATIN\@\öGLOTTAL STOP\H\Á
+02A3:\LDZ DIGRAPH
+02A4:\LDEZH DIGRAPH
+02A5:\LDZ DIGRAPH\HCURL
+02A6:\LTS DIGRAPH
+02A7:\LTESH DIGRAPH
+02A8:\LTC DIGRAPH\HCURL
+02A9:\LFENG DIGRAPH
+02AA:\LLS DIGRAPH
+02AB:\LLZ DIGRAPH
+02AC:LATIN\@BILABIAL PERCUSSIVE
+02AD:LATIN\@BIDENTAL PERCUSSIVE
+02B0:\®\§H
+02B1:\®\§H\í
+02B2:\®\§J
+02B3:\®\§R
+02B4:\®\§TURN\ÂR
+02B5:\®\§TURN\ÂR\í
+02B6:\®SMALL\ÒINVERT\ÂR
+02B7:\®\§W
+02B8:\®\§Y
+02B9:\®PRIME
+02BA:\®\0 PRIME
+02BB:\®TURN\ÂCOMMA
+02BC:\®APOSTROPHE
+02BD:\®\öCOMMA
+02BE:\®\ùHALF R\ô
+02BF:\®\‰ HALF R\ô
+02C0:\®GLOTTAL STOP
+02C1:\®\öGLOTTAL STOP
+02C2:\®\‰\uHEAD
+02C3:\®\q\uHEAD
+02C4:\®UP\uHEAD
+02C5:\®\Ë\uHEAD
+02C6:\®CIRCUMFLEX\×
+02C7:CARON
+02C8:\®\€ \ä
+02C9:\®\å
+02CA:\®\Ü\×
+02CB:\®GRAVE\×
+02CC:\®LOW \€ \ä
+02CD:\®LOW \å
+02CE:\®LOW GRAVE\×
+02CF:\®LOW \Ü\×
+02D0:\®TRIANGULAR COLON
+02D1:\®HALF TRIANGULAR COLON
+02D2:\®CENTR\Â\ùHALF R\ô
+02D3:\®CENTR\Â\‰ HALF R\ô
+02D4:\®UP TACK
+02D5:\®\Ë TACK
+02D6:\®PLUS\‚
+02D7:\®MINUS\‚
+02D8:BREVE
+02D9:DOT\p
+02DA:R\ô\p
+02DB:OGONEK
+02DC:\§\æ
+02DD:\0 \Ü\×
+02DE:\®RHOTIC HOOK
+02DF:\®CROSS\×
+02E0:\®\§GAMMA
+02E1:\®\§L
+02E2:\®\§S
+02E3:\®\§X
+02E4:\®\§\öGLOTTAL STOP
+02E5:\®EXTRA-HIGH TONE\ì
+02E6:\®HIGH TONE\ì
+02E7:\®MID TONE\ì
+02E8:\®LOW TONE\ì
+02E9:\®EXTRA-LOW TONE\ì
+02EA:\®YIN DEPART\ô TONE\¥
+02EB:\®YANG DEPART\ô TONE\¥
+02EC:\®VOIC\ô
+02ED:\®UNASPIRATED
+02EE:\®\0 APOSTROPHE
+0300:\oGRAVE\×
+0301:\o\Ü\×
+0302:\oCIRCUMFLEX\×
+0303:\o\æ
+0304:\o\å
+0305:\oOVER\ä
+0306:\oBREVE
+0307:\oDOT\p
+0308:\oDIAERESIS
+0309:\oHOOK\p
+030A:\oR\ô\p
+030B:\o\0 \Ü\×
+030C:\oCARON
+030D:\o\€ \ä\p
+030E:\o\0 \€ \ä\p
+030F:\o\0 GRAVE\×
+0310:\oCANDRABINDU
+0311:\oINVERT\ÂBREVE
+0312:\oTURN\ÂCOMMA\p
+0313:\oCOMMA\p
+0314:\o\öCOMMA\p
+0315:\oCOMMA\p \q
+0316:\oGRAVE\×\…
+0317:\o\Ü\×\…
+0318:\o\‰ TACK\…
+0319:\o\ùTACK\…
+031A:\o\‰ ANGLE\p
+031B:\oHORN
+031C:\o\‰ HALF R\ô\…
+031D:\oUP TACK\…
+031E:\o\Ë TACK\…
+031F:\oPLUS\‚\…
+0320:\oMINUS\‚\…
+0321:\oPALATALIZ\ÂHOOK\…
+0322:\oRETROFLEX HOOK\…
+0323:\oDOT\…
+0324:\oDIAERESIS\…
+0325:\oR\ô\…
+0326:\oCOMMA\…
+0327:\oCEDILLA
+0328:\oOGONEK
+0329:\o\€ \ä\…
+032A:\oBRIDGE\…
+032B:\oINVERT\Â\0 ARCH\…
+032C:\oCARON\…
+032D:\oCIRCUMFLEX\×\…
+032E:\oBREVE\…
+032F:\oINVERT\ÂBREVE\…
+0330:\o\æ\…
+0331:\o\å\…
+0332:\oLOW \ä
+0333:\o\0 LOW \ä
+0334:\o\æ OVERLAY
+0335:\oSHORT \Á OVERLAY
+0336:\oLONG \Á OVERLAY
+0337:\oSHORT SOLIDUS OVERLAY
+0338:\oLONG SOLIDUS OVERLAY
+0339:\o\ùHALF R\ô\…
+033A:\oINVERT\ÂBRIDGE\…
+033B:\o\rBELOW
+033C:\oSEAGULL\…
+033D:\oX\p
+033E:\o\€ \æ
+033F:\o\0 OVER\ä
+0340:\oGRAVE TONE\¥
+0341:\o\Ü TONE\¥
+0342:\oGREEK \´
+0343:\oGREEK KORONIS
+0344:\oGREEK DIALYTIKA TONOS
+0345:\oGREEK YPO\œ
+0346:\oBRIDGE\p
+0347:\oEQUALS\‚\…
+0348:\o\0 \€ \ä\…
+0349:\o\‰ ANGLE\…
+034A:\oNOT \æ\p
+034B:\oHOMOTHETIC\p
+034C:\oALMOST\‘\p
+034D:\o\‰ \q\u\…
+034E:\oUP\Š\u\…
+034F:\oGRAPHEME JOINER
+0360:\o\0 \æ
+0361:\o\0 INVERT\ÂBREVE
+0362:\o\0 \Ù\…
+0363:\o\LA
+0364:\o\LE
+0365:\o\LI
+0366:\o\LO
+0367:\o\LU
+0368:\o\LC
+0369:\o\LD
+036A:\o\LH
+036B:\o\LM
+036C:\o\LR
+036D:\o\LT
+036E:\o\LV
+036F:\o\LX
+0374:GREEK NUMERAL\‚
+0375:GREEK \ïNUMERAL\‚
+037A:GREEK YPO\œ
+037E:GREEK QUESTION\¥
+0384:GREEK TONOS
+0385:GREEK DIALYTIKA TONOS
+0386:\9\þ\HTONOS
+0387:GREEK ANO TELEIA
+0388:\9E\É\HTONOS
+0389:\9ETA\HTONOS
+038A:\9IOTA\HTONOS
+038C:\9OMICRON\HTONOS
+038E:\9U\É\HTONOS
+038F:\9\ü\HTONOS
+0390:\yIOTA\HDIALYTIKA\iTONOS
+0391:\9\þ
+0392:\9BETA
+0393:\9GAMMA
+0394:\9DELTA
+0395:\9E\É
+0396:\9ZETA
+0397:\9ETA
+0398:\9THETA
+0399:\9IOTA
+039A:\9KAPPA
+039B:\9LAMDA
+039C:\9MU
+039D:\9NU
+039E:\9XI
+039F:\9OMICRON
+03A0:\9PI
+03A1:\9RHO
+03A3:\9SIGMA
+03A4:\9TAU
+03A5:\9U\É
+03A6:\9PHI
+03A7:\9CHI
+03A8:\9PSI
+03A9:\9\ü
+03AA:\9IOTA\HDIALYTIKA
+03AB:\9U\É\HDIALYTIKA
+03AC:\y\þ\HTONOS
+03AD:\yE\É\HTONOS
+03AE:\yETA\HTONOS
+03AF:\yIOTA\HTONOS
+03B0:\yU\É\HDIALYTIKA\iTONOS
+03B1:\y\þ
+03B2:\yBETA
+03B3:\yGAMMA
+03B4:\yDELTA
+03B5:\yE\É
+03B6:\yZETA
+03B7:\yETA
+03B8:\yTHETA
+03B9:\yIOTA
+03BA:\yKAPPA
+03BB:\yLAMDA
+03BC:\yMU
+03BD:\yNU
+03BE:\yXI
+03BF:\yOMICRON
+03C0:\yPI
+03C1:\yRHO
+03C2:\yFINAL SIGMA
+03C3:\ySIGMA
+03C4:\yTAU
+03C5:\yU\É
+03C6:\yPHI
+03C7:\yCHI
+03C8:\yPSI
+03C9:\y\ü
+03CA:\yIOTA\HDIALYTIKA
+03CB:\yU\É\HDIALYTIKA
+03CC:\yOMICRON\HTONOS
+03CD:\yU\É\HTONOS
+03CE:\y\ü\HTONOS
+03D0:GREEK BETA \
+03D1:GREEK THETA \
+03D2:GREEK U\É\í \
+03D3:GREEK U\É\H\Ü\iHOOK \
+03D4:GREEK U\É\ž\iHOOK \
+03D5:GREEK PHI \
+03D6:GREEK PI \
+03D7:GREEK KAI \
+03D8:GREEK\@ARCHAIC KOPPA
+03D9:\yARCHAIC KOPPA
+03DA:GREEK\@STIGMA
+03DB:\ySTIGMA
+03DC:GREEK\@DIGAMMA
+03DD:\yDIGAMMA
+03DE:GREEK\@KOPPA
+03DF:\yKOPPA
+03E0:GREEK\@SAMPI
+03E1:\ySAMPI
+03E2:COPTIC\ãSHEI
+03E3:COPTIC\N\@SHEI
+03E4:COPTIC\ãFEI
+03E5:COPTIC\N\@FEI
+03E6:COPTIC\ãKHEI
+03E7:COPTIC\N\@KHEI
+03E8:COPTIC\ãHORI
+03E9:COPTIC\N\@HORI
+03EA:COPTIC\ãGANGIA
+03EB:COPTIC\N\@GANGIA
+03EC:COPTIC\ãSHIMA
+03ED:COPTIC\N\@SHIMA
+03EE:COPTIC\ãDEI
+03EF:COPTIC\N\@DEI
+03F0:GREEK KAPPA \
+03F1:GREEK RHO \
+03F2:GREEK LUNATE SIGMA \
+03F3:GREEK\@YOT
+03F4:GREEK\ÒTHETA \
+03F5:GREEK LUNATE E\É \
+03F6:GREEK \öLUNATE E\É \
+0400:\¡IE\HGRAVE
+0401:\¡IO
+0402:\¡DJE
+0403:\¡GJE
+0404:\¡UKRAINIAN IE
+0405:\¡DZE
+0406:\¡BYELORUSSIAN-UKRAINIAN I
+0407:\¡YI
+0408:\¡JE
+0409:\¡LJE
+040A:\¡NJE
+040B:\¡TSHE
+040C:\¡KJE
+040D:\¡I\HGRAVE
+040E:\¡SHORT U
+040F:\¡DZHE
+0410:\¡A
+0411:\¡BE
+0412:\¡VE
+0413:\¡GHE
+0414:\¡DE
+0415:\¡IE
+0416:\¡ZHE
+0417:\¡ZE
+0418:\¡I
+0419:\¡SHORT I
+041A:\¡KA
+041B:\¡EL
+041C:\¡EM
+041D:\¡EN
+041E:\¡O
+041F:\¡PE
+0420:\¡ER
+0421:\¡ES
+0422:\¡TE
+0423:\¡U
+0424:\¡EF
+0425:\¡HA
+0426:\¡TSE
+0427:\¡CHE
+0428:\¡SHA
+0429:\¡SHCHA
+042A:\¡HARD\‚
+042B:\¡YERU
+042C:\¡SOFT\‚
+042D:\¡E
+042E:\¡YU
+042F:\¡YA
+0430:\¢A
+0431:\¢BE
+0432:\¢VE
+0433:\¢GHE
+0434:\¢DE
+0435:\¢IE
+0436:\¢ZHE
+0437:\¢ZE
+0438:\¢I
+0439:\¢SHORT I
+043A:\¢KA
+043B:\¢EL
+043C:\¢EM
+043D:\¢EN
+043E:\¢O
+043F:\¢PE
+0440:\¢ER
+0441:\¢ES
+0442:\¢TE
+0443:\¢U
+0444:\¢EF
+0445:\¢HA
+0446:\¢TSE
+0447:\¢CHE
+0448:\¢SHA
+0449:\¢SHCHA
+044A:\¢HARD\‚
+044B:\¢YERU
+044C:\¢SOFT\‚
+044D:\¢E
+044E:\¢YU
+044F:\¢YA
+0450:\¢IE\HGRAVE
+0451:\¢IO
+0452:\¢DJE
+0453:\¢GJE
+0454:\¢UKRAINIAN IE
+0455:\¢DZE
+0456:\¢BYELORUSSIAN-UKRAINIAN I
+0457:\¢YI
+0458:\¢JE
+0459:\¢LJE
+045A:\¢NJE
+045B:\¢TSHE
+045C:\¢KJE
+045D:\¢I\HGRAVE
+045E:\¢SHORT U
+045F:\¢DZHE
+0460:\¡\ü
+0461:\¢\ü
+0462:\¡YAT
+0463:\¢YAT
+0464:\¡IOTIFI\ÂE
+0465:\¢IOTIFI\ÂE
+0466:\¡LITTLE YUS
+0467:\¢LITTLE YUS
+0468:\¡IOTIFI\ÂLITTLE YUS
+0469:\¢IOTIFI\ÂLITTLE YUS
+046A:\¡BIG YUS
+046B:\¢BIG YUS
+046C:\¡IOTIFI\ÂBIG YUS
+046D:\¢IOTIFI\ÂBIG YUS
+046E:\¡KSI
+046F:\¢KSI
+0470:\¡PSI
+0471:\¢PSI
+0472:\¡FITA
+0473:\¢FITA
+0474:\¡IZHITSA
+0475:\¢IZHITSA
+0476:\¡IZHITSA\H\0 GRAVE\×
+0477:\¢IZHITSA\H\0 GRAVE\×
+0478:\¡UK
+0479:\¢UK
+047A:\¡ROUND \ü
+047B:\¢ROUND \ü
+047C:\¡\ü\HTITLO
+047D:\¢\ü\HTITLO
+047E:\¡OT
+047F:\¢OT
+0480:\¡KOPPA
+0481:\¢KOPPA
+0482:\g THOUSANDS\‚
+0483:\o\g TITLO
+0484:\o\g PALATALIZ\”
+0485:\o\g DASIA PNEUMATA
+0486:\o\g PSILI PNEUMATA
+0488:\o\g HUNDR\ÂTHOUSANDS\‚
+0489:\o\g MILLIONS\‚
+048A:\¡SHORT I\HTAIL
+048B:\¢SHORT I\HTAIL
+048C:\¡SEMISOFT\‚
+048D:\¢SEMISOFT\‚
+048E:\¡ER\HTICK
+048F:\¢ER\HTICK
+0490:\¡GHE\HUPTURN
+0491:\¢GHE\HUPTURN
+0492:\¡GHE\H\Á
+0493:\¢GHE\H\Á
+0494:\¡GHE\HMIDDLE HOOK
+0495:\¢GHE\HMIDDLE HOOK
+0496:\¡ZHE\HDESCENDER
+0497:\¢ZHE\HDESCENDER
+0498:\¡ZE\HDESCENDER
+0499:\¢ZE\HDESCENDER
+049A:\¡KA\HDESCENDER
+049B:\¢KA\HDESCENDER
+049C:\¡KA\H\€ \Á
+049D:\¢KA\H\€ \Á
+049E:\¡KA\H\Á
+049F:\¢KA\H\Á
+04A0:\¡BASHKIR KA
+04A1:\¢BASHKIR KA
+04A2:\¡EN\HDESCENDER
+04A3:\¢EN\HDESCENDER
+04A4:\g\Ò\òEN GHE
+04A5:\g\Ç\òEN GHE
+04A6:\¡PE\HMIDDLE HOOK
+04A7:\¢PE\HMIDDLE HOOK
+04A8:\¡ABKHASIAN HA
+04A9:\¢ABKHASIAN HA
+04AA:\¡ES\HDESCENDER
+04AB:\¢ES\HDESCENDER
+04AC:\¡TE\HDESCENDER
+04AD:\¢TE\HDESCENDER
+04AE:\¡STRA\¼ U
+04AF:\¢STRA\¼ U
+04B0:\¡STRA\¼ U\H\Á
+04B1:\¢STRA\¼ U\H\Á
+04B2:\¡HA\HDESCENDER
+04B3:\¢HA\HDESCENDER
+04B4:\g\Ò\òTE TSE
+04B5:\g\Ç\òTE TSE
+04B6:\¡CHE\HDESCENDER
+04B7:\¢CHE\HDESCENDER
+04B8:\¡CHE\H\€ \Á
+04B9:\¢CHE\H\€ \Á
+04BA:\¡SHHA
+04BB:\¢SHHA
+04BC:\¡ABKHASIAN CHE
+04BD:\¢ABKHASIAN CHE
+04BE:\¡ABKHASIAN CHE\HDESCENDER
+04BF:\¢ABKHASIAN CHE\HDESCENDER
+04C0:\g\@PALOCHKA
+04C1:\¡ZHE\HBREVE
+04C2:\¢ZHE\HBREVE
+04C3:\¡KA\í
+04C4:\¢KA\í
+04C5:\¡EL\HTAIL
+04C6:\¢EL\HTAIL
+04C7:\¡EN\í
+04C8:\¢EN\í
+04C9:\¡EN\HTAIL
+04CA:\¢EN\HTAIL
+04CB:\¡KHAKASSIAN CHE
+04CC:\¢KHAKASSIAN CHE
+04CD:\¡EM\HTAIL
+04CE:\¢EM\HTAIL
+04D0:\¡A\HBREVE
+04D1:\¢A\HBREVE
+04D2:\¡A\ž
+04D3:\¢A\ž
+04D4:\g\Ò\òA IE
+04D5:\g\Ç\òA IE
+04D6:\¡IE\HBREVE
+04D7:\¢IE\HBREVE
+04D8:\¡SCHWA
+04D9:\¢SCHWA
+04DA:\¡SCHWA\ž
+04DB:\¢SCHWA\ž
+04DC:\¡ZHE\ž
+04DD:\¢ZHE\ž
+04DE:\¡ZE\ž
+04DF:\¢ZE\ž
+04E0:\¡ABKHASIAN DZE
+04E1:\¢ABKHASIAN DZE
+04E2:\¡I\H\å
+04E3:\¢I\H\å
+04E4:\¡I\ž
+04E5:\¢I\ž
+04E6:\¡O\ž
+04E7:\¢O\ž
+04E8:\¡BARR\ÂO
+04E9:\¢BARR\ÂO
+04EA:\¡BARR\ÂO\ž
+04EB:\¢BARR\ÂO\ž
+04EC:\¡E\ž
+04ED:\¢E\ž
+04EE:\¡U\H\å
+04EF:\¢U\H\å
+04F0:\¡U\ž
+04F1:\¢U\ž
+04F2:\¡U\H\0 \Ü
+04F3:\¢U\H\0 \Ü
+04F4:\¡CHE\ž
+04F5:\¢CHE\ž
+04F8:\¡YERU\ž
+04F9:\¢YERU\ž
+0500:\¡KOMI DE
+0501:\¢KOMI DE
+0502:\¡KOMI DJE
+0503:\¢KOMI DJE
+0504:\¡KOMI ZJE
+0505:\¢KOMI ZJE
+0506:\¡KOMI DZJE
+0507:\¢KOMI DZJE
+0508:\¡KOMI LJE
+0509:\¢KOMI LJE
+050A:\¡KOMI NJE
+050B:\¢KOMI NJE
+050C:\¡KOMI SJE
+050D:\¢KOMI SJE
+050E:\¡KOMI TJE
+050F:\¢KOMI TJE
+0531:ARMENIAN\ãAYB
+0532:ARMENIAN\ãBEN
+0533:ARMENIAN\ãGIM
+0534:ARMENIAN\ãDA
+0535:ARMENIAN\ãECH
+0536:ARMENIAN\ãZA
+0537:ARMENIAN\ãEH
+0538:ARMENIAN\ãET
+0539:ARMENIAN\ãTO
+053A:ARMENIAN\ãZHE
+053B:ARMENIAN\ãINI
+053C:ARMENIAN\ãLIWN
+053D:ARMENIAN\ãXEH
+053E:ARMENIAN\ãCA
+053F:ARMENIAN\ãKEN
+0540:ARMENIAN\ãHO
+0541:ARMENIAN\ãJA
+0542:ARMENIAN\ãGHAD
+0543:ARMENIAN\ãCHEH
+0544:ARMENIAN\ãMEN
+0545:ARMENIAN\ãYI
+0546:ARMENIAN\ãNOW
+0547:ARMENIAN\ãSHA
+0548:ARMENIAN\ãVO
+0549:ARMENIAN\ãCHA
+054A:ARMENIAN\ãPEH
+054B:ARMENIAN\ãJHEH
+054C:ARMENIAN\ãRA
+054D:ARMENIAN\ãSEH
+054E:ARMENIAN\ãVEW
+054F:ARMENIAN\ãTIWN
+0550:ARMENIAN\ãREH
+0551:ARMENIAN\ãCO
+0552:ARMENIAN\ãYIWN
+0553:ARMENIAN\ãPIWR
+0554:ARMENIAN\ãKEH
+0555:ARMENIAN\ãOH
+0556:ARMENIAN\ãFEH
+0559:ARMENIAN \®\‰ HALF R\ô
+055A:ARMENIAN APOSTROPHE
+055B:ARMENIAN EMPHASIS\¥
+055C:ARMENIAN EXCLAM\”\¥
+055D:ARMENIAN COMMA
+055E:ARMENIAN QUESTION\¥
+055F:ARMENIAN ABBREVI\”\¥
+0561:ARMENIAN\N\@AYB
+0562:ARMENIAN\N\@BEN
+0563:ARMENIAN\N\@GIM
+0564:ARMENIAN\N\@DA
+0565:ARMENIAN\N\@ECH
+0566:ARMENIAN\N\@ZA
+0567:ARMENIAN\N\@EH
+0568:ARMENIAN\N\@ET
+0569:ARMENIAN\N\@TO
+056A:ARMENIAN\N\@ZHE
+056B:ARMENIAN\N\@INI
+056C:ARMENIAN\N\@LIWN
+056D:ARMENIAN\N\@XEH
+056E:ARMENIAN\N\@CA
+056F:ARMENIAN\N\@KEN
+0570:ARMENIAN\N\@HO
+0571:ARMENIAN\N\@JA
+0572:ARMENIAN\N\@GHAD
+0573:ARMENIAN\N\@CHEH
+0574:ARMENIAN\N\@MEN
+0575:ARMENIAN\N\@YI
+0576:ARMENIAN\N\@NOW
+0577:ARMENIAN\N\@SHA
+0578:ARMENIAN\N\@VO
+0579:ARMENIAN\N\@CHA
+057A:ARMENIAN\N\@PEH
+057B:ARMENIAN\N\@JHEH
+057C:ARMENIAN\N\@RA
+057D:ARMENIAN\N\@SEH
+057E:ARMENIAN\N\@VEW
+057F:ARMENIAN\N\@TIWN
+0580:ARMENIAN\N\@REH
+0581:ARMENIAN\N\@CO
+0582:ARMENIAN\N\@YIWN
+0583:ARMENIAN\N\@PIWR
+0584:ARMENIAN\N\@KEH
+0585:ARMENIAN\N\@OH
+0586:ARMENIAN\N\@FEH
+0587:ARMENIAN\Ç\òECH YIWN
+0589:ARMENIAN\é
+058A:ARMENIAN HYPHEN
+0591:\Ÿ\× ETNAHTA
+0592:\Ÿ\× SEGOL
+0593:\Ÿ\× SHALSHELET
+0594:\Ÿ\× ZAQEF QATAN
+0595:\Ÿ\× ZAQEF GADOL
+0596:\Ÿ\× TIPEHA
+0597:\Ÿ\× REVIA
+0598:\Ÿ\× ZARQA
+0599:\Ÿ\× PASHTA
+059A:\Ÿ\× YETIV
+059B:\Ÿ\× TEVIR
+059C:\Ÿ\× GERESH
+059D:\Ÿ\× GERESH MUQDAM
+059E:\Ÿ\× GERSHAYIM
+059F:\Ÿ\× QARNEY PARA
+05A0:\Ÿ\× TELISHA GEDOLA
+05A1:\Ÿ\× PAZER
+05A3:\Ÿ\× MUNAH
+05A4:\Ÿ\× MAHAPAKH
+05A5:\Ÿ\× MERKHA
+05A6:\Ÿ\× MERKHA KEFULA
+05A7:\Ÿ\× DARGA
+05A8:\Ÿ\× QADMA
+05A9:\Ÿ\× TELISHA QETANA
+05AA:\Ÿ\× YERAH BEN YOMO
+05AB:\Ÿ\× OLE
+05AC:\Ÿ\× ILUY
+05AD:\Ÿ\× DEHI
+05AE:\Ÿ\× ZINOR
+05AF:\Ÿ\¥ MASORA \Ð
+05B0:\Ÿ POINT SHEVA
+05B1:\Ÿ POINT HATAF SEGOL
+05B2:\Ÿ POINT HATAF PATAH
+05B3:\Ÿ POINT HATAF QAMATS
+05B4:\Ÿ POINT HIRIQ
+05B5:\Ÿ POINT TSERE
+05B6:\Ÿ POINT SEGOL
+05B7:\Ÿ POINT PATAH
+05B8:\Ÿ POINT QAMATS
+05B9:\Ÿ POINT HOLAM
+05BB:\Ÿ POINT QUBUTS
+05BC:\Ÿ POINT DAGESH OR MAPIQ
+05BD:\Ÿ POINT METEG
+05BE:\Ÿ PUNCTU\” MAQAF
+05BF:\Ÿ POINT RAFE
+05C0:\Ÿ PUNCTU\” PASEQ
+05C1:\Ÿ POINT SHIN DOT
+05C2:\Ÿ POINT SIN DOT
+05C3:\Ÿ PUNCTU\” SOF PASUQ
+05C4:\Ÿ\¥ \÷DOT
+05D0:\Ÿ\@ALEF
+05D1:\Ÿ\@BET
+05D2:\Ÿ\@GIMEL
+05D3:\Ÿ\@DALET
+05D4:\Ÿ\@HE
+05D5:\Ÿ\@VAV
+05D6:\Ÿ\@ZAYIN
+05D7:\Ÿ\@HET
+05D8:\Ÿ\@TET
+05D9:\Ÿ\@YOD
+05DA:\Ÿ\@FINAL KAF
+05DB:\Ÿ\@KAF
+05DC:\Ÿ\@LAMED
+05DD:\Ÿ\@FINAL MEM
+05DE:\Ÿ\@MEM
+05DF:\Ÿ\@FINAL NUN
+05E0:\Ÿ\@NUN
+05E1:\Ÿ\@SAMEKH
+05E2:\Ÿ\@AYIN
+05E3:\Ÿ\@FINAL PE
+05E4:\Ÿ\@PE
+05E5:\Ÿ\@FINAL TSADI
+05E6:\Ÿ\@TSADI
+05E7:\Ÿ\@QOF
+05E8:\Ÿ\@RESH
+05E9:\Ÿ\@SHIN
+05EA:\Ÿ\@TAV
+05F0:\Ÿ \òYIDDISH \0 VAV
+05F1:\Ÿ \òYIDDISH VAV YOD
+05F2:\Ÿ \òYIDDISH \0 YOD
+05F3:\Ÿ PUNCTU\” GERESH
+05F4:\Ÿ PUNCTU\” GERSHAYIM
+060C:\Ê COMMA
+061B:\Ê SEMICOLON
+061F:\Ê QUESTION\¥
+0621:\^HAMZA
+0622:\^ALEF\HMADDA\p
+0623:\^ALEF\HHAMZA\p
+0624:\^WAW\HHAMZA\p
+0625:\^ALEF\HHAMZA\…
+0626:\^\º
+0627:\^ALEF
+0628:\^BEH
+0629:\^TEH MARBUTA
+062A:\^TEH
+062B:\^THEH
+062C:\^JEEM
+062D:\^HAH
+062E:\^KHAH
+062F:\^DAL
+0630:\^THAL
+0631:\^REH
+0632:\^ZAIN
+0633:\^SEEN
+0634:\^SHEEN
+0635:\^SAD
+0636:\^DAD
+0637:\^TAH
+0638:\^ZAH
+0639:\^AIN
+063A:\^GHAIN
+0640:\Ê TATWEEL
+0641:\^FEH
+0642:\^QAF
+0643:\^KAF
+0644:\^LAM
+0645:\^MEEM
+0646:\^NOON
+0647:\^HEH
+0648:\^WAW
+0649:\^ALEF MAKSURA
+064A:\^YEH
+064B:\Ê FATHATAN
+064C:\Ê DAMMATAN
+064D:\Ê KASRATAN
+064E:\Ê FATHA
+064F:\Ê DAMMA
+0650:\Ê KASRA
+0651:\Ê SHADDA
+0652:\Ê SUKUN
+0653:\Ê MADDAH\p
+0654:\Ê HAMZA\p
+0655:\Ê HAMZA\…
+0660:\Ê-INDIC\hZERO
+0661:\Ê-INDIC\hONE
+0662:\Ê-INDIC\hTWO
+0663:\Ê-INDIC\hTHREE
+0664:\Ê-INDIC\hFOUR
+0665:\Ê-INDIC\hFIVE
+0666:\Ê-INDIC\hSIX
+0667:\Ê-INDIC\hSEVEN
+0668:\Ê-INDIC\hE\¼
+0669:\Ê-INDIC\hNINE
+066A:\Ê PERCENT\‚
+066B:\Ê DECIMAL SEPARATOR
+066C:\Ê THOUSANDS SEPARATOR
+066D:\Ê FIVE POINT\ÂSTAR
+066E:\^DOTLESS BEH
+066F:\^DOTLESS QAF
+0670:\^SUPER\Ž ALEF
+0671:\^ALEF WASLA
+0672:\^ALEF\HWAVY HAMZA\p
+0673:\^ALEF\HWAVY HAMZA\…
+0674:\^HIGH HAMZA
+0675:\^HIGH HAMZA ALEF
+0676:\^HIGH HAMZA WAW
+0677:\^U\HHAMZA\p
+0678:\^HIGH HAMZA YEH
+0679:\^TTEH
+067A:\^TTEHEH
+067B:\^BEEH
+067C:\^TEH\HR\ô
+067D:\^TEH\HTHREE DOTS\p \Ë\Š
+067E:\^PEH
+067F:\^TEHEH
+0680:\^BEHEH
+0681:\^HAH\HHAMZA\p
+0682:\^HAH\HTWO DOTS \€\p
+0683:\^NYEH
+0684:\^DYEH
+0685:\^HAH\HTHREE DOTS\p
+0686:\^TCHEH
+0687:\^TCHEHEH
+0688:\^DDAL
+0689:\^DAL\HR\ô
+068A:\^DAL\³\…
+068B:\^DAL\³\… AND\ÇTAH
+068C:\^DAHAL
+068D:\^DDAHAL
+068E:\^DUL
+068F:\^DAL\HTHREE DOTS\p \Ë\Š
+0690:\^DAL\HFOUR DOTS\p
+0691:\^RREH
+0692:\^REH WITH\ÇV
+0693:\^REH\HR\ô
+0694:\^REH\³\…
+0695:\^REH WITH\ÇV\…
+0696:\^REH\³\…\iDOT\p
+0697:\^REH\HTWO DOTS\p
+0698:\^JEH
+0699:\^REH\HFOUR DOTS\p
+069A:\^SEEN\³\…\iDOT\p
+069B:\^SEEN\HTHREE DOTS\…
+069C:\^SEEN\HTHREE DOTS\…\iTHREE DOTS\p
+069D:\^SAD\HTWO DOTS\…
+069E:\^SAD\HTHREE DOTS\p
+069F:\^TAH\HTHREE DOTS\p
+06A0:\^AIN\HTHREE DOTS\p
+06A1:\^DOTLESS FEH
+06A2:\^FEH\³ MOVED\…
+06A3:\^FEH\³\…
+06A4:\^VEH
+06A5:\^FEH\HTHREE DOTS\…
+06A6:\^PEHEH
+06A7:\^QAF\³\p
+06A8:\^QAF\HTHREE DOTS\p
+06A9:\^KEHEH
+06AA:\^SWASH KAF
+06AB:\^KAF\HR\ô
+06AC:\^KAF\³\p
+06AD:\^NG
+06AE:\^KAF\HTHREE DOTS\…
+06AF:\^GAF
+06B0:\^GAF\HR\ô
+06B1:\^NGOEH
+06B2:\^GAF\HTWO DOTS\…
+06B3:\^GUEH
+06B4:\^GAF\HTHREE DOTS\p
+06B5:\^LAM WITH\ÇV
+06B6:\^LAM\³\p
+06B7:\^LAM\HTHREE DOTS\p
+06B8:\^LAM\HTHREE DOTS\…
+06B9:\^NOON\³\…
+06BA:\^NOON GHUNNA
+06BB:\^RNOON
+06BC:\^NOON\HR\ô
+06BD:\^NOON\HTHREE DOTS\p
+06BE:\^HEH DOACHASHMEE
+06BF:\^TCHEH\³\p
+06C0:\^HEH\HYEH\p
+06C1:\^HEH GOAL
+06C2:\^HEH GOAL\HHAMZA\p
+06C3:\^TEH MARBUTA GOAL
+06C4:\^WAW\HR\ô
+06C5:\^KIRGHIZ OE
+06C6:\^OE
+06C7:\^U
+06C8:\^YU
+06C9:\^KIRGHIZ YU
+06CA:\^WAW\HTWO DOTS\p
+06CB:\^VE
+06CC:\^FARSI YEH
+06CD:\^YEH\HTAIL
+06CE:\^YEH WITH\ÇV
+06CF:\^WAW\³\p
+06D0:\^E
+06D1:\^YEH\HTHREE DOTS\…
+06D2:\^YEH\ìREE
+06D3:\^YEH\ìREE\HHAMZA\p
+06D4:\Ê\é
+06D5:\^AE
+06D6:\Ê\ÇHIGH \òSAD\HLAM\‡
+06D7:\Ê\ÇHIGH \òQAF\HLAM\‡
+06D8:\Ê\ÇHIGH MEEM\2
+06D9:\Ê\ÇHIGH LAM ALEF
+06DA:\Ê\ÇHIGH JEEM
+06DB:\Ê\ÇHIGH THREE DOTS
+06DC:\Ê\ÇHIGH SEEN
+06DD:\Ê END OF AYAH
+06DE:\Ê START OF RUB EL HIZB
+06DF:\Ê\ÇHIGH ROUND\ÂZERO
+06E0:\Ê\ÇHIGH UP\ùRECTANGULAR ZERO
+06E1:\Ê\ÇHIGH DOTLESS HEAD OF KHAH
+06E2:\Ê\ÇHIGH MEEM\Q
+06E3:\Ê\ÇLOW SEEN
+06E4:\Ê\ÇHIGH MADDA
+06E5:\Ê\ÇWAW
+06E6:\Ê\ÇYEH
+06E7:\Ê\ÇHIGH YEH
+06E8:\Ê\ÇHIGH NOON
+06E9:\Ê PLACE OF SAJDAH
+06EA:\Ê EMPTY CENTRE LOW STOP
+06EB:\Ê EMPTY CENTRE HIGH STOP
+06EC:\Ê ROUND\ÂHIGH STOP\HFILL\ÂCENTRE
+06ED:\Ê\ÇLOW MEEM
+06F0:EXTEND\Â\Ê-INDIC\hZERO
+06F1:EXTEND\Â\Ê-INDIC\hONE
+06F2:EXTEND\Â\Ê-INDIC\hTWO
+06F3:EXTEND\Â\Ê-INDIC\hTHREE
+06F4:EXTEND\Â\Ê-INDIC\hFOUR
+06F5:EXTEND\Â\Ê-INDIC\hFIVE
+06F6:EXTEND\Â\Ê-INDIC\hSIX
+06F7:EXTEND\Â\Ê-INDIC\hSEVEN
+06F8:EXTEND\Â\Ê-INDIC\hE\¼
+06F9:EXTEND\Â\Ê-INDIC\hNINE
+06FA:\^SHEEN\³\…
+06FB:\^DAD\³\…
+06FC:\^GHAIN\³\…
+06FD:\Ê\‚ SINDHI AMPERSAND
+06FE:\Ê\‚ SINDHI POSTPOSITION MEN
+0700:\Ó END OF PARAGRAPH
+0701:\Ó SUPRA\äAR\é
+0702:\Ó SUB\äAR\é
+0703:\Ó SUPRA\äAR COLON
+0704:\Ó SUB\äAR COLON
+0705:\Ó \ COLON
+0706:\Ó COLON SKEW\Â\‰
+0707:\Ó COLON SKEW\Â\q
+0708:\Ó SUPRA\äAR COLON SKEW\Â\‰
+0709:\Ó SUB\äAR COLON SKEW\Â\q
+070A:\Ó CONTRACTION
+070B:\Ó HARKLEAN OBELUS
+070C:\Ó HARKLEAN METOBELUS
+070D:\Ó HARKLEAN ASTERISCUS
+070F:\Ó ABBREVI\”\¥
+0710:\Ó\@ALAPH
+0711:\Ó\@SUPER\Ž ALAPH
+0712:\Ó\@BETH
+0713:\Ó\@GAMAL
+0714:\Ó\@GAMAL GARSHUNI
+0715:\Ó\@DALATH
+0716:\Ó\@DOTLESS DALATH RISH
+0717:\Ó\@HE
+0718:\Ó\@WAW
+0719:\Ó\@ZAIN
+071A:\Ó\@HETH
+071B:\Ó\@TETH
+071C:\Ó\@TETH GARSHUNI
+071D:\Ó\@YUDH
+071E:\Ó\@YUDH HE
+071F:\Ó\@KAPH
+0720:\Ó\@LAMADH
+0721:\Ó\@MIM
+0722:\Ó\@NUN
+0723:\Ó\@SEMKATH
+0724:\Ó\@FINAL SEMKATH
+0725:\Ó\@E
+0726:\Ó\@PE
+0727:\Ó\@\öPE
+0728:\Ó\@SADHE
+0729:\Ó\@QAPH
+072A:\Ó\@RISH
+072B:\Ó\@SHIN
+072C:\Ó\@TAW
+0730:\Ó PTHAHA\p
+0731:\Ó PTHAHA\…
+0732:\Ó PTHAHA DOTTED
+0733:\Ó ZQAPHA\p
+0734:\Ó ZQAPHA\…
+0735:\Ó ZQAPHA DOTTED
+0736:\Ó RBASA\p
+0737:\Ó RBASA\…
+0738:\Ó DOTT\ÂZLAMA \
+0739:\Ó DOTT\ÂZLAMA ANGULAR
+073A:\Ó HBASA\p
+073B:\Ó HBASA\…
+073C:\Ó HBASA-ESASA DOTTED
+073D:\Ó ESASA\p
+073E:\Ó ESASA\…
+073F:\Ó RWAHA
+0740:\Ó FEMININE DOT
+0741:\Ó QUSHSHAYA
+0742:\Ó RUKKAKHA
+0743:\Ó TWO \€ DOTS\p
+0744:\Ó TWO \€ DOTS\…
+0745:\Ó THREE DOTS\p
+0746:\Ó THREE DOTS\…
+0747:\Ó OBLIQUE \ä\p
+0748:\Ó OBLIQUE \ä\…
+0749:\Ó MUSIC
+074A:\Ó\ìREKH
+0780:\ëHAA
+0781:\ëSHAVIYANI
+0782:\ëNOONU
+0783:\ëRAA
+0784:\ëBAA
+0785:\ëLHAVIYANI
+0786:\ëKAAFU
+0787:\ëALIFU
+0788:\ëVAAVU
+0789:\ëMEEMU
+078A:\ëFAAFU
+078B:\ëDHAALU
+078C:\ëTHAA
+078D:\ëLAAMU
+078E:\ëGAAFU
+078F:\ëGNAVIYANI
+0790:\ëSEENU
+0791:\ëDAVIYANI
+0792:\ëZAVIYANI
+0793:\ëTAVIYANI
+0794:\ëYAA
+0795:\ëPAVIYANI
+0796:\ëJAVIYANI
+0797:\ëCHAVIYANI
+0798:\ëTTAA
+0799:\ëHHAA
+079A:\ëKHAA
+079B:\ëTHAALU
+079C:\ëZAA
+079D:\ëSHEENU
+079E:\ëSAADHU
+079F:\ëDAADHU
+07A0:\ëTO
+07A1:\ëZO
+07A2:\ëAINU
+07A3:\ëGHAINU
+07A4:\ëQAAFU
+07A5:\ëWAAVU
+07A6:THAANA ABAFILI
+07A7:THAANA AABAAFILI
+07A8:THAANA IBIFILI
+07A9:THAANA EEBEEFILI
+07AA:THAANA UBUFILI
+07AB:THAANA OOBOOFILI
+07AC:THAANA EBEFILI
+07AD:THAANA EYBEYFILI
+07AE:THAANA OBOFILI
+07AF:THAANA OABOAFILI
+07B0:THAANA SUKUN
+07B1:\ëNAA
+0901:\„\‚ CANDRABINDU
+0902:\„\‚ ANUSVARA
+0903:\„\‚ VISARGA
+0905:\„\@A
+0906:\„\@AA
+0907:\„\@I
+0908:\„\@II
+0909:\„\@U
+090A:\„\@UU
+090B:\„\@\ÎR
+090C:\„\@\ÎL
+090D:\„\@CANDRA E
+090E:\„\@SHORT E
+090F:\„\@E
+0910:\„\@AI
+0911:\„\@CANDRA O
+0912:\„\@SHORT O
+0913:\„\@O
+0914:\„\@AU
+0915:\„\@KA
+0916:\„\@KHA
+0917:\„\@GA
+0918:\„\@GHA
+0919:\„\@NGA
+091A:\„\@CA
+091B:\„\@CHA
+091C:\„\@JA
+091D:\„\@JHA
+091E:\„\@NYA
+091F:\„\@TTA
+0920:\„\@TTHA
+0921:\„\@DDA
+0922:\„\@DDHA
+0923:\„\@NNA
+0924:\„\@TA
+0925:\„\@THA
+0926:\„\@DA
+0927:\„\@DHA
+0928:\„\@NA
+0929:\„\@NNNA
+092A:\„\@PA
+092B:\„\@PHA
+092C:\„\@BA
+092D:\„\@BHA
+092E:\„\@MA
+092F:\„\@YA
+0930:\„\@RA
+0931:\„\@RRA
+0932:\„\@LA
+0933:\„\@LLA
+0934:\„\@LLLA
+0935:\„\@VA
+0936:\„\@SHA
+0937:\„\@SSA
+0938:\„\@SA
+0939:\„\@HA
+093C:\„\‚ NUKTA
+093D:\„\‚ AVAGRAHA
+093E:\„\bAA
+093F:\„\bI
+0940:\„\bII
+0941:\„\bU
+0942:\„\bUU
+0943:\„\b\ÎR
+0944:\„\b\ÎRR
+0945:\„\bCANDRA E
+0946:\„\bSHORT E
+0947:\„\bE
+0948:\„\bAI
+0949:\„\bCANDRA O
+094A:\„\bSHORT O
+094B:\„\bO
+094C:\„\bAU
+094D:\„\‚ VIRAMA
+0950:\„ OM
+0951:\„ STRESS\‚ UDATTA
+0952:\„ STRESS\‚ ANUDATTA
+0953:\„ GRAVE\×
+0954:\„ \Ü\×
+0958:\„\@QA
+0959:\„\@KHHA
+095A:\„\@GHHA
+095B:\„\@ZA
+095C:\„\@DDDHA
+095D:\„\@RHA
+095E:\„\@FA
+095F:\„\@YYA
+0960:\„\@\ÎRR
+0961:\„\@\ÎLL
+0962:\„\b\ÎL
+0963:\„\b\ÎLL
+0964:\„ DANDA
+0965:\„ \0 DANDA
+0966:\„\hZERO
+0967:\„\hONE
+0968:\„\hTWO
+0969:\„\hTHREE
+096A:\„\hFOUR
+096B:\„\hFIVE
+096C:\„\hSIX
+096D:\„\hSEVEN
+096E:\„\hE\¼
+096F:\„\hNINE
+0970:\„ ABBREVI\”\‚
+0981:\°\‚ CANDRABINDU
+0982:\°\‚ ANUSVARA
+0983:\°\‚ VISARGA
+0985:\°\@A
+0986:\°\@AA
+0987:\°\@I
+0988:\°\@II
+0989:\°\@U
+098A:\°\@UU
+098B:\°\@\ÎR
+098C:\°\@\ÎL
+098F:\°\@E
+0990:\°\@AI
+0993:\°\@O
+0994:\°\@AU
+0995:\°\@KA
+0996:\°\@KHA
+0997:\°\@GA
+0998:\°\@GHA
+0999:\°\@NGA
+099A:\°\@CA
+099B:\°\@CHA
+099C:\°\@JA
+099D:\°\@JHA
+099E:\°\@NYA
+099F:\°\@TTA
+09A0:\°\@TTHA
+09A1:\°\@DDA
+09A2:\°\@DDHA
+09A3:\°\@NNA
+09A4:\°\@TA
+09A5:\°\@THA
+09A6:\°\@DA
+09A7:\°\@DHA
+09A8:\°\@NA
+09AA:\°\@PA
+09AB:\°\@PHA
+09AC:\°\@BA
+09AD:\°\@BHA
+09AE:\°\@MA
+09AF:\°\@YA
+09B0:\°\@RA
+09B2:\°\@LA
+09B6:\°\@SHA
+09B7:\°\@SSA
+09B8:\°\@SA
+09B9:\°\@HA
+09BC:\°\‚ NUKTA
+09BE:\°\bAA
+09BF:\°\bI
+09C0:\°\bII
+09C1:\°\bU
+09C2:\°\bUU
+09C3:\°\b\ÎR
+09C4:\°\b\ÎRR
+09C7:\°\bE
+09C8:\°\bAI
+09CB:\°\bO
+09CC:\°\bAU
+09CD:\°\‚ VIRAMA
+09D7:\° AU LENGTH\¥
+09DC:\°\@RRA
+09DD:\°\@RHA
+09DF:\°\@YYA
+09E0:\°\@\ÎRR
+09E1:\°\@\ÎLL
+09E2:\°\b\ÎL
+09E3:\°\b\ÎLL
+09E6:\°\hZERO
+09E7:\°\hONE
+09E8:\°\hTWO
+09E9:\°\hTHREE
+09EA:\°\hFOUR
+09EB:\°\hFIVE
+09EC:\°\hSIX
+09ED:\°\hSEVEN
+09EE:\°\hE\¼
+09EF:\°\hNINE
+09F0:\°\@RA\HMIDDLE DIAGONAL
+09F1:\°\@RA\H\ïDIAGONAL
+09F2:\° RUPEE\¥
+09F3:\° RUPEE\‚
+09F4:\° CURRENCY NUMERATOR ONE
+09F5:\° CURRENCY NUMERATOR TWO
+09F6:\° CURRENCY NUMERATOR THREE
+09F7:\° CURRENCY NUMERATOR FOUR
+09F8:\° CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9:\° CURRENCY DENOMINATOR SIXTEEN
+09FA:\° ISSHAR
+0A02:\¯\‚ BINDI
+0A05:\¯\@A
+0A06:\¯\@AA
+0A07:\¯\@I
+0A08:\¯\@II
+0A09:\¯\@U
+0A0A:\¯\@UU
+0A0F:\¯\@EE
+0A10:\¯\@AI
+0A13:\¯\@OO
+0A14:\¯\@AU
+0A15:\¯\@KA
+0A16:\¯\@KHA
+0A17:\¯\@GA
+0A18:\¯\@GHA
+0A19:\¯\@NGA
+0A1A:\¯\@CA
+0A1B:\¯\@CHA
+0A1C:\¯\@JA
+0A1D:\¯\@JHA
+0A1E:\¯\@NYA
+0A1F:\¯\@TTA
+0A20:\¯\@TTHA
+0A21:\¯\@DDA
+0A22:\¯\@DDHA
+0A23:\¯\@NNA
+0A24:\¯\@TA
+0A25:\¯\@THA
+0A26:\¯\@DA
+0A27:\¯\@DHA
+0A28:\¯\@NA
+0A2A:\¯\@PA
+0A2B:\¯\@PHA
+0A2C:\¯\@BA
+0A2D:\¯\@BHA
+0A2E:\¯\@MA
+0A2F:\¯\@YA
+0A30:\¯\@RA
+0A32:\¯\@LA
+0A33:\¯\@LLA
+0A35:\¯\@VA
+0A36:\¯\@SHA
+0A38:\¯\@SA
+0A39:\¯\@HA
+0A3C:\¯\‚ NUKTA
+0A3E:\¯\bAA
+0A3F:\¯\bI
+0A40:\¯\bII
+0A41:\¯\bU
+0A42:\¯\bUU
+0A47:\¯\bEE
+0A48:\¯\bAI
+0A4B:\¯\bOO
+0A4C:\¯\bAU
+0A4D:\¯\‚ VIRAMA
+0A59:\¯\@KHHA
+0A5A:\¯\@GHHA
+0A5B:\¯\@ZA
+0A5C:\¯\@RRA
+0A5E:\¯\@FA
+0A66:\¯\hZERO
+0A67:\¯\hONE
+0A68:\¯\hTWO
+0A69:\¯\hTHREE
+0A6A:\¯\hFOUR
+0A6B:\¯\hFIVE
+0A6C:\¯\hSIX
+0A6D:\¯\hSEVEN
+0A6E:\¯\hE\¼
+0A6F:\¯\hNINE
+0A70:\¯ TIPPI
+0A71:\¯ ADDAK
+0A72:\¯ IRI
+0A73:\¯ URA
+0A74:\¯ EK ONKAR
+0A81:\ª\‚ CANDRABINDU
+0A82:\ª\‚ ANUSVARA
+0A83:\ª\‚ VISARGA
+0A85:\ª\@A
+0A86:\ª\@AA
+0A87:\ª\@I
+0A88:\ª\@II
+0A89:\ª\@U
+0A8A:\ª\@UU
+0A8B:\ª\@\ÎR
+0A8D:\ª VOWEL CANDRA E
+0A8F:\ª\@E
+0A90:\ª\@AI
+0A91:\ª VOWEL CANDRA O
+0A93:\ª\@O
+0A94:\ª\@AU
+0A95:\ª\@KA
+0A96:\ª\@KHA
+0A97:\ª\@GA
+0A98:\ª\@GHA
+0A99:\ª\@NGA
+0A9A:\ª\@CA
+0A9B:\ª\@CHA
+0A9C:\ª\@JA
+0A9D:\ª\@JHA
+0A9E:\ª\@NYA
+0A9F:\ª\@TTA
+0AA0:\ª\@TTHA
+0AA1:\ª\@DDA
+0AA2:\ª\@DDHA
+0AA3:\ª\@NNA
+0AA4:\ª\@TA
+0AA5:\ª\@THA
+0AA6:\ª\@DA
+0AA7:\ª\@DHA
+0AA8:\ª\@NA
+0AAA:\ª\@PA
+0AAB:\ª\@PHA
+0AAC:\ª\@BA
+0AAD:\ª\@BHA
+0AAE:\ª\@MA
+0AAF:\ª\@YA
+0AB0:\ª\@RA
+0AB2:\ª\@LA
+0AB3:\ª\@LLA
+0AB5:\ª\@VA
+0AB6:\ª\@SHA
+0AB7:\ª\@SSA
+0AB8:\ª\@SA
+0AB9:\ª\@HA
+0ABC:\ª\‚ NUKTA
+0ABD:\ª\‚ AVAGRAHA
+0ABE:\ª\bAA
+0ABF:\ª\bI
+0AC0:\ª\bII
+0AC1:\ª\bU
+0AC2:\ª\bUU
+0AC3:\ª\b\ÎR
+0AC4:\ª\b\ÎRR
+0AC5:\ª\bCANDRA E
+0AC7:\ª\bE
+0AC8:\ª\bAI
+0AC9:\ª\bCANDRA O
+0ACB:\ª\bO
+0ACC:\ª\bAU
+0ACD:\ª\‚ VIRAMA
+0AD0:\ª OM
+0AE0:\ª\@\ÎRR
+0AE6:\ª\hZERO
+0AE7:\ª\hONE
+0AE8:\ª\hTWO
+0AE9:\ª\hTHREE
+0AEA:\ª\hFOUR
+0AEB:\ª\hFIVE
+0AEC:\ª\hSIX
+0AED:\ª\hSEVEN
+0AEE:\ª\hE\¼
+0AEF:\ª\hNINE
+0B01:ORIYA\‚ CANDRABINDU
+0B02:ORIYA\‚ ANUSVARA
+0B03:ORIYA\‚ VISARGA
+0B05:\âA
+0B06:\âAA
+0B07:\âI
+0B08:\âII
+0B09:\âU
+0B0A:\âUU
+0B0B:\â\ÎR
+0B0C:\â\ÎL
+0B0F:\âE
+0B10:\âAI
+0B13:\âO
+0B14:\âAU
+0B15:\âKA
+0B16:\âKHA
+0B17:\âGA
+0B18:\âGHA
+0B19:\âNGA
+0B1A:\âCA
+0B1B:\âCHA
+0B1C:\âJA
+0B1D:\âJHA
+0B1E:\âNYA
+0B1F:\âTTA
+0B20:\âTTHA
+0B21:\âDDA
+0B22:\âDDHA
+0B23:\âNNA
+0B24:\âTA
+0B25:\âTHA
+0B26:\âDA
+0B27:\âDHA
+0B28:\âNA
+0B2A:\âPA
+0B2B:\âPHA
+0B2C:\âBA
+0B2D:\âBHA
+0B2E:\âMA
+0B2F:\âYA
+0B30:\âRA
+0B32:\âLA
+0B33:\âLLA
+0B36:\âSHA
+0B37:\âSSA
+0B38:\âSA
+0B39:\âHA
+0B3C:ORIYA\‚ NUKTA
+0B3D:ORIYA\‚ AVAGRAHA
+0B3E:ORIYA\bAA
+0B3F:ORIYA\bI
+0B40:ORIYA\bII
+0B41:ORIYA\bU
+0B42:ORIYA\bUU
+0B43:ORIYA\b\ÎR
+0B47:ORIYA\bE
+0B48:ORIYA\bAI
+0B4B:ORIYA\bO
+0B4C:ORIYA\bAU
+0B4D:ORIYA\‚ VIRAMA
+0B56:ORIYA AI LENGTH\¥
+0B57:ORIYA AU LENGTH\¥
+0B5C:\âRRA
+0B5D:\âRHA
+0B5F:\âYYA
+0B60:\â\ÎRR
+0B61:\â\ÎLL
+0B66:ORIYA\hZERO
+0B67:ORIYA\hONE
+0B68:ORIYA\hTWO
+0B69:ORIYA\hTHREE
+0B6A:ORIYA\hFOUR
+0B6B:ORIYA\hFIVE
+0B6C:ORIYA\hSIX
+0B6D:ORIYA\hSEVEN
+0B6E:ORIYA\hE\¼
+0B6F:ORIYA\hNINE
+0B70:ORIYA ISSHAR
+0B82:TAMIL\‚ ANUSVARA
+0B83:TAMIL\‚ VISARGA
+0B85:TAMIL\@A
+0B86:TAMIL\@AA
+0B87:TAMIL\@I
+0B88:TAMIL\@II
+0B89:TAMIL\@U
+0B8A:TAMIL\@UU
+0B8E:TAMIL\@E
+0B8F:TAMIL\@EE
+0B90:TAMIL\@AI
+0B92:TAMIL\@O
+0B93:TAMIL\@OO
+0B94:TAMIL\@AU
+0B95:TAMIL\@KA
+0B99:TAMIL\@NGA
+0B9A:TAMIL\@CA
+0B9C:TAMIL\@JA
+0B9E:TAMIL\@NYA
+0B9F:TAMIL\@TTA
+0BA3:TAMIL\@NNA
+0BA4:TAMIL\@TA
+0BA8:TAMIL\@NA
+0BA9:TAMIL\@NNNA
+0BAA:TAMIL\@PA
+0BAE:TAMIL\@MA
+0BAF:TAMIL\@YA
+0BB0:TAMIL\@RA
+0BB1:TAMIL\@RRA
+0BB2:TAMIL\@LA
+0BB3:TAMIL\@LLA
+0BB4:TAMIL\@LLLA
+0BB5:TAMIL\@VA
+0BB7:TAMIL\@SSA
+0BB8:TAMIL\@SA
+0BB9:TAMIL\@HA
+0BBE:TAMIL\bAA
+0BBF:TAMIL\bI
+0BC0:TAMIL\bII
+0BC1:TAMIL\bU
+0BC2:TAMIL\bUU
+0BC6:TAMIL\bE
+0BC7:TAMIL\bEE
+0BC8:TAMIL\bAI
+0BCA:TAMIL\bO
+0BCB:TAMIL\bOO
+0BCC:TAMIL\bAU
+0BCD:TAMIL\‚ VIRAMA
+0BD7:TAMIL AU LENGTH\¥
+0BE7:TAMIL\hONE
+0BE8:TAMIL\hTWO
+0BE9:TAMIL\hTHREE
+0BEA:TAMIL\hFOUR
+0BEB:TAMIL\hFIVE
+0BEC:TAMIL\hSIX
+0BED:TAMIL\hSEVEN
+0BEE:TAMIL\hE\¼
+0BEF:TAMIL\hNINE
+0BF0:TAMIL \­TEN
+0BF1:TAMIL \­ONE HUNDRED
+0BF2:TAMIL \­ONE THOUSAND
+0C01:\Ï\‚ CANDRABINDU
+0C02:\Ï\‚ ANUSVARA
+0C03:\Ï\‚ VISARGA
+0C05:\Ï\@A
+0C06:\Ï\@AA
+0C07:\Ï\@I
+0C08:\Ï\@II
+0C09:\Ï\@U
+0C0A:\Ï\@UU
+0C0B:\Ï\@\ÎR
+0C0C:\Ï\@\ÎL
+0C0E:\Ï\@E
+0C0F:\Ï\@EE
+0C10:\Ï\@AI
+0C12:\Ï\@O
+0C13:\Ï\@OO
+0C14:\Ï\@AU
+0C15:\Ï\@KA
+0C16:\Ï\@KHA
+0C17:\Ï\@GA
+0C18:\Ï\@GHA
+0C19:\Ï\@NGA
+0C1A:\Ï\@CA
+0C1B:\Ï\@CHA
+0C1C:\Ï\@JA
+0C1D:\Ï\@JHA
+0C1E:\Ï\@NYA
+0C1F:\Ï\@TTA
+0C20:\Ï\@TTHA
+0C21:\Ï\@DDA
+0C22:\Ï\@DDHA
+0C23:\Ï\@NNA
+0C24:\Ï\@TA
+0C25:\Ï\@THA
+0C26:\Ï\@DA
+0C27:\Ï\@DHA
+0C28:\Ï\@NA
+0C2A:\Ï\@PA
+0C2B:\Ï\@PHA
+0C2C:\Ï\@BA
+0C2D:\Ï\@BHA
+0C2E:\Ï\@MA
+0C2F:\Ï\@YA
+0C30:\Ï\@RA
+0C31:\Ï\@RRA
+0C32:\Ï\@LA
+0C33:\Ï\@LLA
+0C35:\Ï\@VA
+0C36:\Ï\@SHA
+0C37:\Ï\@SSA
+0C38:\Ï\@SA
+0C39:\Ï\@HA
+0C3E:\Ï\bAA
+0C3F:\Ï\bI
+0C40:\Ï\bII
+0C41:\Ï\bU
+0C42:\Ï\bUU
+0C43:\Ï\b\ÎR
+0C44:\Ï\b\ÎRR
+0C46:\Ï\bE
+0C47:\Ï\bEE
+0C48:\Ï\bAI
+0C4A:\Ï\bO
+0C4B:\Ï\bOO
+0C4C:\Ï\bAU
+0C4D:\Ï\‚ VIRAMA
+0C55:\Ï LENGTH\¥
+0C56:\Ï AI LENGTH\¥
+0C60:\Ï\@\ÎRR
+0C61:\Ï\@\ÎLL
+0C66:\Ï\hZERO
+0C67:\Ï\hONE
+0C68:\Ï\hTWO
+0C69:\Ï\hTHREE
+0C6A:\Ï\hFOUR
+0C6B:\Ï\hFIVE
+0C6C:\Ï\hSIX
+0C6D:\Ï\hSEVEN
+0C6E:\Ï\hE\¼
+0C6F:\Ï\hNINE
+0C82:\»\‚ ANUSVARA
+0C83:\»\‚ VISARGA
+0C85:\»\@A
+0C86:\»\@AA
+0C87:\»\@I
+0C88:\»\@II
+0C89:\»\@U
+0C8A:\»\@UU
+0C8B:\»\@\ÎR
+0C8C:\»\@\ÎL
+0C8E:\»\@E
+0C8F:\»\@EE
+0C90:\»\@AI
+0C92:\»\@O
+0C93:\»\@OO
+0C94:\»\@AU
+0C95:\»\@KA
+0C96:\»\@KHA
+0C97:\»\@GA
+0C98:\»\@GHA
+0C99:\»\@NGA
+0C9A:\»\@CA
+0C9B:\»\@CHA
+0C9C:\»\@JA
+0C9D:\»\@JHA
+0C9E:\»\@NYA
+0C9F:\»\@TTA
+0CA0:\»\@TTHA
+0CA1:\»\@DDA
+0CA2:\»\@DDHA
+0CA3:\»\@NNA
+0CA4:\»\@TA
+0CA5:\»\@THA
+0CA6:\»\@DA
+0CA7:\»\@DHA
+0CA8:\»\@NA
+0CAA:\»\@PA
+0CAB:\»\@PHA
+0CAC:\»\@BA
+0CAD:\»\@BHA
+0CAE:\»\@MA
+0CAF:\»\@YA
+0CB0:\»\@RA
+0CB1:\»\@RRA
+0CB2:\»\@LA
+0CB3:\»\@LLA
+0CB5:\»\@VA
+0CB6:\»\@SHA
+0CB7:\»\@SSA
+0CB8:\»\@SA
+0CB9:\»\@HA
+0CBE:\»\bAA
+0CBF:\»\bI
+0CC0:\»\bII
+0CC1:\»\bU
+0CC2:\»\bUU
+0CC3:\»\b\ÎR
+0CC4:\»\b\ÎRR
+0CC6:\»\bE
+0CC7:\»\bEE
+0CC8:\»\bAI
+0CCA:\»\bO
+0CCB:\»\bOO
+0CCC:\»\bAU
+0CCD:\»\‚ VIRAMA
+0CD5:\» LENGTH\¥
+0CD6:\» AI LENGTH\¥
+0CDE:\»\@FA
+0CE0:\»\@\ÎRR
+0CE1:\»\@\ÎLL
+0CE6:\»\hZERO
+0CE7:\»\hONE
+0CE8:\»\hTWO
+0CE9:\»\hTHREE
+0CEA:\»\hFOUR
+0CEB:\»\hFIVE
+0CEC:\»\hSIX
+0CED:\»\hSEVEN
+0CEE:\»\hE\¼
+0CEF:\»\hNINE
+0D02:\š\‚ ANUSVARA
+0D03:\š\‚ VISARGA
+0D05:\š\@A
+0D06:\š\@AA
+0D07:\š\@I
+0D08:\š\@II
+0D09:\š\@U
+0D0A:\š\@UU
+0D0B:\š\@\ÎR
+0D0C:\š\@\ÎL
+0D0E:\š\@E
+0D0F:\š\@EE
+0D10:\š\@AI
+0D12:\š\@O
+0D13:\š\@OO
+0D14:\š\@AU
+0D15:\š\@KA
+0D16:\š\@KHA
+0D17:\š\@GA
+0D18:\š\@GHA
+0D19:\š\@NGA
+0D1A:\š\@CA
+0D1B:\š\@CHA
+0D1C:\š\@JA
+0D1D:\š\@JHA
+0D1E:\š\@NYA
+0D1F:\š\@TTA
+0D20:\š\@TTHA
+0D21:\š\@DDA
+0D22:\š\@DDHA
+0D23:\š\@NNA
+0D24:\š\@TA
+0D25:\š\@THA
+0D26:\š\@DA
+0D27:\š\@DHA
+0D28:\š\@NA
+0D2A:\š\@PA
+0D2B:\š\@PHA
+0D2C:\š\@BA
+0D2D:\š\@BHA
+0D2E:\š\@MA
+0D2F:\š\@YA
+0D30:\š\@RA
+0D31:\š\@RRA
+0D32:\š\@LA
+0D33:\š\@LLA
+0D34:\š\@LLLA
+0D35:\š\@VA
+0D36:\š\@SHA
+0D37:\š\@SSA
+0D38:\š\@SA
+0D39:\š\@HA
+0D3E:\š\bAA
+0D3F:\š\bI
+0D40:\š\bII
+0D41:\š\bU
+0D42:\š\bUU
+0D43:\š\b\ÎR
+0D46:\š\bE
+0D47:\š\bEE
+0D48:\š\bAI
+0D4A:\š\bO
+0D4B:\š\bOO
+0D4C:\š\bAU
+0D4D:\š\‚ VIRAMA
+0D57:\š AU LENGTH\¥
+0D60:\š\@\ÎRR
+0D61:\š\@\ÎLL
+0D66:\š\hZERO
+0D67:\š\hONE
+0D68:\š\hTWO
+0D69:\š\hTHREE
+0D6A:\š\hFOUR
+0D6B:\š\hFIVE
+0D6C:\š\hSIX
+0D6D:\š\hSEVEN
+0D6E:\š\hE\¼
+0D6F:\š\hNINE
+0D82:SINHALA\‚ ANUSVARAYA
+0D83:SINHALA\‚ VISARGAYA
+0D85:\¶AYANNA
+0D86:\¶AAYANNA
+0D87:\¶AEYANNA
+0D88:\¶AEEYANNA
+0D89:\¶IYANNA
+0D8A:\¶IIYANNA
+0D8B:\¶UYANNA
+0D8C:\¶UUYANNA
+0D8D:\¶IRUYANNA
+0D8E:\¶IRUUYANNA
+0D8F:\¶ILUYANNA
+0D90:\¶ILUUYANNA
+0D91:\¶EYANNA
+0D92:\¶EEYANNA
+0D93:\¶AIYANNA
+0D94:\¶OYANNA
+0D95:\¶OOYANNA
+0D96:\¶AUYANNA
+0D9A:\¶ALPAPRAANA KAYANNA
+0D9B:\¶MAHAAPRAANA KAYANNA
+0D9C:\¶ALPAPRAANA GAYANNA
+0D9D:\¶MAHAAPRAANA GAYANNA
+0D9E:\¶KANTAJA NAASIKYAYA
+0D9F:\¶SANYAKA GAYANNA
+0DA0:\¶ALPAPRAANA CAYANNA
+0DA1:\¶MAHAAPRAANA CAYANNA
+0DA2:\¶ALPAPRAANA JAYANNA
+0DA3:\¶MAHAAPRAANA JAYANNA
+0DA4:\¶TAALUJA NAASIKYAYA
+0DA5:\¶TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6:\¶SANYAKA JAYANNA
+0DA7:\¶ALPAPRAANA TTAYANNA
+0DA8:\¶MAHAAPRAANA TTAYANNA
+0DA9:\¶ALPAPRAANA DDAYANNA
+0DAA:\¶MAHAAPRAANA DDAYANNA
+0DAB:\¶MUURDHAJA NAYANNA
+0DAC:\¶SANYAKA DDAYANNA
+0DAD:\¶ALPAPRAANA TAYANNA
+0DAE:\¶MAHAAPRAANA TAYANNA
+0DAF:\¶ALPAPRAANA DAYANNA
+0DB0:\¶MAHAAPRAANA DAYANNA
+0DB1:\¶DANTAJA NAYANNA
+0DB3:\¶SANYAKA DAYANNA
+0DB4:\¶ALPAPRAANA PAYANNA
+0DB5:\¶MAHAAPRAANA PAYANNA
+0DB6:\¶ALPAPRAANA BAYANNA
+0DB7:\¶MAHAAPRAANA BAYANNA
+0DB8:\¶MAYANNA
+0DB9:\¶AMBA BAYANNA
+0DBA:\¶YAYANNA
+0DBB:\¶RAYANNA
+0DBD:\¶DANTAJA LAYANNA
+0DC0:\¶VAYANNA
+0DC1:\¶TAALUJA SAYANNA
+0DC2:\¶MUURDHAJA SAYANNA
+0DC3:\¶DANTAJA SAYANNA
+0DC4:\¶HAYANNA
+0DC5:\¶MUURDHAJA LAYANNA
+0DC6:\¶FAYANNA
+0DCA:SINHALA\‚ AL-LAKUNA
+0DCF:SINHALA\bAELA-PILLA
+0DD0:SINHALA\bKETTI AEDA-PILLA
+0DD1:SINHALA\bDIGA AEDA-PILLA
+0DD2:SINHALA\bKETTI IS-PILLA
+0DD3:SINHALA\bDIGA IS-PILLA
+0DD4:SINHALA\bKETTI PAA-PILLA
+0DD6:SINHALA\bDIGA PAA-PILLA
+0DD8:SINHALA\bGAETTA-PILLA
+0DD9:SINHALA\bKOMBUVA
+0DDA:SINHALA\bDIGA KOMBUVA
+0DDB:SINHALA\bKOMBU DEKA
+0DDC:SINHALA\bKOMBUVA HAA AELA-PILLA
+0DDD:SINHALA\bKOMBUVA HAA DIGA AELA-PILLA
+0DDE:SINHALA\bKOMBUVA HAA GAYANUKITTA
+0DDF:SINHALA\bGAYANUKITTA
+0DF2:SINHALA\bDIGA GAETTA-PILLA
+0DF3:SINHALA\bDIGA GAYANUKITTA
+0DF4:SINHALA PUNCTU\” KUNDDALIYA
+0E01:\3KO KAI
+0E02:\3KHO KHAI
+0E03:\3KHO KHUAT
+0E04:\3KHO KHWAI
+0E05:\3KHO KHON
+0E06:\3KHO RAKHANG
+0E07:\3NGO NGU
+0E08:\3CHO CHAN
+0E09:\3CHO CH\ô
+0E0A:\3CHO CHANG
+0E0B:\3SO SO
+0E0C:\3CHO CHOE
+0E0D:\3YO Y\ô
+0E0E:\3DO CHADA
+0E0F:\3TO PATAK
+0E10:\3THO THAN
+0E11:\3THO NANGMONTHO
+0E12:\3THO PHUTHAO
+0E13:\3NO NEN
+0E14:\3DO DEK
+0E15:\3TO TAO
+0E16:\3THO THUNG
+0E17:\3THO THAHAN
+0E18:\3THO THONG
+0E19:\3NO NU
+0E1A:\3BO BAIMAI
+0E1B:\3PO PLA
+0E1C:\3PHO PHUNG
+0E1D:\3FO FA
+0E1E:\3PHO PHAN
+0E1F:\3FO FAN
+0E20:\3PHO SAMPHAO
+0E21:\3MO MA
+0E22:\3YO YAK
+0E23:\3RO RUA
+0E24:\3RU
+0E25:\3LO L\ô
+0E26:\3LU
+0E27:\3WO WAEN
+0E28:\3SO SALA
+0E29:\3SO RUSI
+0E2A:\3SO SUA
+0E2B:\3HO HIP
+0E2C:\3LO CHULA
+0E2D:\3O ANG
+0E2E:\3HO NOKHUK
+0E2F:\3PAIYANNOI
+0E30:\3SARA A
+0E31:\3MAI HAN-AKAT
+0E32:\3SARA AA
+0E33:\3SARA AM
+0E34:\3SARA I
+0E35:\3SARA II
+0E36:\3SARA UE
+0E37:\3SARA UEE
+0E38:\3SARA U
+0E39:\3SARA UU
+0E3A:\3PHINTHU
+0E3F:THAI CURRENCY \ BAHT
+0E40:\3SARA E
+0E41:\3SARA AE
+0E42:\3SARA O
+0E43:\3SARA AI MAIMUAN
+0E44:\3SARA AI MAIMALAI
+0E45:\3LAKKHANGYAO
+0E46:\3MAIYAMOK
+0E47:\3MAITAIKHU
+0E48:\3MAI EK
+0E49:\3MAI THO
+0E4A:\3MAI TRI
+0E4B:\3MAI CHATTAWA
+0E4C:\3THANTHAKHAT
+0E4D:\3NIKHAHIT
+0E4E:\3YAMAKKAN
+0E4F:\3FONGMAN
+0E50:THAI\hZERO
+0E51:THAI\hONE
+0E52:THAI\hTWO
+0E53:THAI\hTHREE
+0E54:THAI\hFOUR
+0E55:THAI\hFIVE
+0E56:THAI\hSIX
+0E57:THAI\hSEVEN
+0E58:THAI\hE\¼
+0E59:THAI\hNINE
+0E5A:\3ANGKHANKHU
+0E5B:\3KHOMUT
+0E81:LAO\@KO
+0E82:LAO\@KHO SUNG
+0E84:LAO\@KHO TAM
+0E87:LAO\@NGO
+0E88:LAO\@CO
+0E8A:LAO\@SO TAM
+0E8D:LAO\@NYO
+0E94:LAO\@DO
+0E95:LAO\@TO
+0E96:LAO\@THO SUNG
+0E97:LAO\@THO TAM
+0E99:LAO\@NO
+0E9A:LAO\@BO
+0E9B:LAO\@PO
+0E9C:LAO\@PHO SUNG
+0E9D:LAO\@FO TAM
+0E9E:LAO\@PHO TAM
+0E9F:LAO\@FO SUNG
+0EA1:LAO\@MO
+0EA2:LAO\@YO
+0EA3:LAO\@LO L\ô
+0EA5:LAO\@LO LOOT
+0EA7:LAO\@WO
+0EAA:LAO\@SO SUNG
+0EAB:LAO\@HO SUNG
+0EAD:LAO\@O
+0EAE:LAO\@HO TAM
+0EAF:LAO ELLIPSIS
+0EB0:LAO\bA
+0EB1:LAO\bMAI KAN
+0EB2:LAO\bAA
+0EB3:LAO\bAM
+0EB4:LAO\bI
+0EB5:LAO\bII
+0EB6:LAO\bY
+0EB7:LAO\bYY
+0EB8:LAO\bU
+0EB9:LAO\bUU
+0EBB:LAO\bMAI KON
+0EBC:LAO SEMIVOWEL\‚ LO
+0EBD:LAO SEMIVOWEL\‚ NYO
+0EC0:LAO\bE
+0EC1:LAO\bEI
+0EC2:LAO\bO
+0EC3:LAO\bAY
+0EC4:LAO\bAI
+0EC6:LAO KO LA
+0EC8:LAO TONE MAI EK
+0EC9:LAO TONE MAI THO
+0ECA:LAO TONE MAI TI
+0ECB:LAO TONE MAI CATAWA
+0ECC:LAO CANCELL\”\¥
+0ECD:LAO NIGGAHITA
+0ED0:LAO\hZERO
+0ED1:LAO\hONE
+0ED2:LAO\hTWO
+0ED3:LAO\hTHREE
+0ED4:LAO\hFOUR
+0ED5:LAO\hFIVE
+0ED6:LAO\hSIX
+0ED7:LAO\hSEVEN
+0ED8:LAO\hE\¼
+0ED9:LAO\hNINE
+0EDC:LAO HO NO
+0EDD:LAO HO MO
+0F00:\5\COM
+0F01:\5\¥ GTER YIG MGO TRUNCAT\ÂA
+0F02:\5\¥ GTER YIG MGO -UM RNAM BCAD MA
+0F03:\5\¥ GTER YIG MGO -UM GTER TSHEG MA
+0F04:\5\¥ INITIAL YIG MGO MDUN MA
+0F05:\5\¥ CLOS\ô YIG MGO SGAB MA
+0F06:\5\¥ CARET YIG MGO PHUR SHAD MA
+0F07:\5\¥ YIG MGO TSHEG SHAD MA
+0F08:\5\¥ SBRUL SHAD
+0F09:\5\¥ BSKUR YIG MGO
+0F0A:\5\¥ BKA- SHOG YIG MGO
+0F0B:\5\¥ INTERSYLLABIC TSHEG
+0F0C:\5\¥ DELIMITER TSHEG BSTAR
+0F0D:\5\¥ SHAD
+0F0E:\5\¥ NYIS SHAD
+0F0F:\5\¥ TSHEG SHAD
+0F10:\5\¥ NYIS TSHEG SHAD
+0F11:\5\¥ RIN CHEN SPUNGS SHAD
+0F12:\5\¥ RGYA GRAM SHAD
+0F13:\5\¥ CARET -DZUD RTAGS ME LONG CAN
+0F14:\5\¥ GTER TSHEG
+0F15:\5 LOGOTYPE\‚ CHAD RTAGS
+0F16:\5 LOGOTYPE\‚ LHAG RTAGS
+0F17:\5 ASTROLOGICAL\‚ SGRA GCAN -CHAR RTAGS
+0F18:\5 ASTROLOGICAL\‚ -KHYUD PA
+0F19:\5 ASTROLOGICAL\‚ SDONG TSHUGS
+0F1A:\5\‚ RDEL DKAR GCIG
+0F1B:\5\‚ RDEL DKAR GNYIS
+0F1C:\5\‚ RDEL DKAR GSUM
+0F1D:\5\‚ RDEL NAG GCIG
+0F1E:\5\‚ RDEL NAG GNYIS
+0F1F:\5\‚ RDEL DKAR RDEL NAG
+0F20:\5\hZERO
+0F21:\5\hONE
+0F22:\5\hTWO
+0F23:\5\hTHREE
+0F24:\5\hFOUR
+0F25:\5\hFIVE
+0F26:\5\hSIX
+0F27:\5\hSEVEN
+0F28:\5\hE\¼
+0F29:\5\hNINE
+0F2A:\5\hHALF ONE
+0F2B:\5\hHALF TWO
+0F2C:\5\hHALF THREE
+0F2D:\5\hHALF FOUR
+0F2E:\5\hHALF FIVE
+0F2F:\5\hHALF SIX
+0F30:\5\hHALF SEVEN
+0F31:\5\hHALF E\¼
+0F32:\5\hHALF NINE
+0F33:\5\hHALF ZERO
+0F34:\5\¥ BSDUS RTAGS
+0F35:\5\¥ NGAS BZUNG NYI ZLA
+0F36:\5\¥ CARET -DZUD RTAGS BZHI MIG CAN
+0F37:\5\¥ NGAS BZUNG SGOR RTAGS
+0F38:\5\¥ CHE MGO
+0F39:\5\¥ TSA -PHRU
+0F3A:\5\¥ GUG RTAGS GYON
+0F3B:\5\¥ GUG RTAGS GYAS
+0F3C:\5\¥ ANG KHANG GYON
+0F3D:\5\¥ ANG KHANG GYAS
+0F3E:\5\‚ YAR TSHES
+0F3F:\5\‚ MAR TSHES
+0F40:\5\@KA
+0F41:\5\@KHA
+0F42:\5\@GA
+0F43:\5\@GHA
+0F44:\5\@NGA
+0F45:\5\@CA
+0F46:\5\@CHA
+0F47:\5\@JA
+0F49:\5\@NYA
+0F4A:\5\@TTA
+0F4B:\5\@TTHA
+0F4C:\5\@DDA
+0F4D:\5\@DDHA
+0F4E:\5\@NNA
+0F4F:\5\@TA
+0F50:\5\@THA
+0F51:\5\@DA
+0F52:\5\@DHA
+0F53:\5\@NA
+0F54:\5\@PA
+0F55:\5\@PHA
+0F56:\5\@BA
+0F57:\5\@BHA
+0F58:\5\@MA
+0F59:\5\@TSA
+0F5A:\5\@TSHA
+0F5B:\5\@DZA
+0F5C:\5\@DZHA
+0F5D:\5\@WA
+0F5E:\5\@ZHA
+0F5F:\5\@ZA
+0F60:\5\@-A
+0F61:\5\@YA
+0F62:\5\@RA
+0F63:\5\@LA
+0F64:\5\@SHA
+0F65:\5\@SSA
+0F66:\5\@SA
+0F67:\5\@HA
+0F68:\5\@A
+0F69:\5\@KSSA
+0F6A:\5\@FIXED-FORM RA
+0F71:\5\bAA
+0F72:\5\bI
+0F73:\5\bII
+0F74:\5\bU
+0F75:\5\bUU
+0F76:\5\b\ÎR
+0F77:\5\b\ÎRR
+0F78:\5\b\ÎL
+0F79:\5\b\ÎLL
+0F7A:\5\bE
+0F7B:\5\bEE
+0F7C:\5\bO
+0F7D:\5\bOO
+0F7E:\5\‚ RJES SU NGA RO
+0F7F:\5\‚ RNAM BCAD
+0F80:\5\b\öI
+0F81:\5\b\öII
+0F82:\5\‚ NYI ZLA NAA DA
+0F83:\5\‚ SNA LDAN
+0F84:\5\¥ HALANTA
+0F85:\5\¥ PALUTA
+0F86:\5\‚ LCI RTAGS
+0F87:\5\‚ YANG RTAGS
+0F88:\5\‚ LCE TSA CAN
+0F89:\5\‚ MCHU CAN
+0F8A:\5\‚ GRU CAN RGY\ôS
+0F8B:\5\‚ GRU M\ÂRGY\ôS
+0F90:\KA
+0F91:\KHA
+0F92:\GA
+0F93:\GHA
+0F94:\NGA
+0F95:\CA
+0F96:\CHA
+0F97:\JA
+0F99:\NYA
+0F9A:\TTA
+0F9B:\TTHA
+0F9C:\DDA
+0F9D:\DDHA
+0F9E:\NNA
+0F9F:\TA
+0FA0:\THA
+0FA1:\DA
+0FA2:\DHA
+0FA3:\NA
+0FA4:\PA
+0FA5:\PHA
+0FA6:\BA
+0FA7:\BHA
+0FA8:\MA
+0FA9:\TSA
+0FAA:\TSHA
+0FAB:\DZA
+0FAC:\DZHA
+0FAD:\WA
+0FAE:\ZHA
+0FAF:\ZA
+0FB0:\-A
+0FB1:\YA
+0FB2:\RA
+0FB3:\LA
+0FB4:\SHA
+0FB5:\SSA
+0FB6:\SA
+0FB7:\HA
+0FB8:\A
+0FB9:\KSSA
+0FBA:\FIXED-FORM WA
+0FBB:\FIXED-FORM YA
+0FBC:\FIXED-FORM RA
+0FBE:\5 KU RU KHA
+0FBF:\5 KU RU KHA BZHI MIG CAN
+0FC0:\5 CANTILL\”\‚ \Å BEAT
+0FC1:\5 CANTILL\”\‚ L\¼ BEAT
+0FC2:\5 CANTILL\”\‚ CANG TE-U
+0FC3:\5 CANTILL\”\‚ SBUB -CHAL
+0FC4:\5 \ DRIL BU
+0FC5:\5 \ RDO RJE
+0FC6:\5 \ PADMA GDAN
+0FC7:\5 \ RDO RJE RGYA GRAM
+0FC8:\5 \ PHUR PA
+0FC9:\5 \ NOR BU
+0FCA:\5 \ NOR BU NYIS -KHYIL
+0FCB:\5 \ NOR BU GSUM -KHYIL
+0FCC:\5 \ NOR BU BZHI -KHYIL
+0FCF:\5\‚ RDEL NAG GSUM
+1000:\½\@KA
+1001:\½\@KHA
+1002:\½\@GA
+1003:\½\@GHA
+1004:\½\@NGA
+1005:\½\@CA
+1006:\½\@CHA
+1007:\½\@JA
+1008:\½\@JHA
+1009:\½\@NYA
+100A:\½\@NNYA
+100B:\½\@TTA
+100C:\½\@TTHA
+100D:\½\@DDA
+100E:\½\@DDHA
+100F:\½\@NNA
+1010:\½\@TA
+1011:\½\@THA
+1012:\½\@DA
+1013:\½\@DHA
+1014:\½\@NA
+1015:\½\@PA
+1016:\½\@PHA
+1017:\½\@BA
+1018:\½\@BHA
+1019:\½\@MA
+101A:\½\@YA
+101B:\½\@RA
+101C:\½\@LA
+101D:\½\@WA
+101E:\½\@SA
+101F:\½\@HA
+1020:\½\@LLA
+1021:\½\@A
+1023:\½\@I
+1024:\½\@II
+1025:\½\@U
+1026:\½\@UU
+1027:\½\@E
+1029:\½\@O
+102A:\½\@AU
+102C:\½\bAA
+102D:\½\bI
+102E:\½\bII
+102F:\½\bU
+1030:\½\bUU
+1031:\½\bE
+1032:\½\bAI
+1036:\½\‚ ANUSVARA
+1037:\½\‚ DOT\…
+1038:\½\‚ VISARGA
+1039:\½\‚ VIRAMA
+1040:\½\hZERO
+1041:\½\hONE
+1042:\½\hTWO
+1043:\½\hTHREE
+1044:\½\hFOUR
+1045:\½\hFIVE
+1046:\½\hSIX
+1047:\½\hSEVEN
+1048:\½\hE\¼
+1049:\½\hNINE
+104A:\½\‚ LITTLE SECTION
+104B:\½\‚ SECTION
+104C:\½ \ LOCATIVE
+104D:\½ \ COMPLETED
+104E:\½ \ AFOREMENTIONED
+104F:\½ \ GENITIVE
+1050:\½\@SHA
+1051:\½\@SSA
+1052:\½\@\ÎR
+1053:\½\@\ÎRR
+1054:\½\@\ÎL
+1055:\½\@\ÎLL
+1056:\½\b\ÎR
+1057:\½\b\ÎRR
+1058:\½\b\ÎL
+1059:\½\b\ÎLL
+10A0:GEORGIAN\ãAN
+10A1:GEORGIAN\ãBAN
+10A2:GEORGIAN\ãGAN
+10A3:GEORGIAN\ãDON
+10A4:GEORGIAN\ãEN
+10A5:GEORGIAN\ãVIN
+10A6:GEORGIAN\ãZEN
+10A7:GEORGIAN\ãTAN
+10A8:GEORGIAN\ãIN
+10A9:GEORGIAN\ãKAN
+10AA:GEORGIAN\ãLAS
+10AB:GEORGIAN\ãMAN
+10AC:GEORGIAN\ãNAR
+10AD:GEORGIAN\ãON
+10AE:GEORGIAN\ãPAR
+10AF:GEORGIAN\ãZHAR
+10B0:GEORGIAN\ãRAE
+10B1:GEORGIAN\ãSAN
+10B2:GEORGIAN\ãTAR
+10B3:GEORGIAN\ãUN
+10B4:GEORGIAN\ãPHAR
+10B5:GEORGIAN\ãKHAR
+10B6:GEORGIAN\ãGHAN
+10B7:GEORGIAN\ãQAR
+10B8:GEORGIAN\ãSHIN
+10B9:GEORGIAN\ãCHIN
+10BA:GEORGIAN\ãCAN
+10BB:GEORGIAN\ãJIL
+10BC:GEORGIAN\ãCIL
+10BD:GEORGIAN\ãCHAR
+10BE:GEORGIAN\ãXAN
+10BF:GEORGIAN\ãJHAN
+10C0:GEORGIAN\ãHAE
+10C1:GEORGIAN\ãHE
+10C2:GEORGIAN\ãHIE
+10C3:GEORGIAN\ãWE
+10C4:GEORGIAN\ãHAR
+10C5:GEORGIAN\ãHOE
+10D0:GEORGIAN\@AN
+10D1:GEORGIAN\@BAN
+10D2:GEORGIAN\@GAN
+10D3:GEORGIAN\@DON
+10D4:GEORGIAN\@EN
+10D5:GEORGIAN\@VIN
+10D6:GEORGIAN\@ZEN
+10D7:GEORGIAN\@TAN
+10D8:GEORGIAN\@IN
+10D9:GEORGIAN\@KAN
+10DA:GEORGIAN\@LAS
+10DB:GEORGIAN\@MAN
+10DC:GEORGIAN\@NAR
+10DD:GEORGIAN\@ON
+10DE:GEORGIAN\@PAR
+10DF:GEORGIAN\@ZHAR
+10E0:GEORGIAN\@RAE
+10E1:GEORGIAN\@SAN
+10E2:GEORGIAN\@TAR
+10E3:GEORGIAN\@UN
+10E4:GEORGIAN\@PHAR
+10E5:GEORGIAN\@KHAR
+10E6:GEORGIAN\@GHAN
+10E7:GEORGIAN\@QAR
+10E8:GEORGIAN\@SHIN
+10E9:GEORGIAN\@CHIN
+10EA:GEORGIAN\@CAN
+10EB:GEORGIAN\@JIL
+10EC:GEORGIAN\@CIL
+10ED:GEORGIAN\@CHAR
+10EE:GEORGIAN\@XAN
+10EF:GEORGIAN\@JHAN
+10F0:GEORGIAN\@HAE
+10F1:GEORGIAN\@HE
+10F2:GEORGIAN\@HIE
+10F3:GEORGIAN\@WE
+10F4:GEORGIAN\@HAR
+10F5:GEORGIAN\@HOE
+10F6:GEORGIAN\@FI
+10F7:GEORGIAN\@YN
+10F8:GEORGIAN\@ELIFI
+10FB:GEORGIAN PARAGRAPH SEPARATOR
+1100:\™KIYEOK
+1101:\™SSANGKIYEOK
+1102:\™N\ÆN
+1103:\™TIKEUT
+1104:\™SSANGTIKEUT
+1105:\™R\ÆL
+1106:\™M\ÆM
+1107:\™P\ÆP
+1108:\™SSANGP\ÆP
+1109:\™SIOS
+110A:\™SSANGSIOS
+110B:\™\ÆNG
+110C:\™C\ÆC
+110D:\™SSANGC\ÆC
+110E:\™CH\ÆCH
+110F:\™KH\ÆKH
+1110:\™TH\ÆTH
+1111:\™PH\ÆPH
+1112:\™H\ÆH
+1113:\™N\ÆN-KIYEOK
+1114:\™SSANGN\ÆN
+1115:\™N\ÆN-TIKEUT
+1116:\™N\ÆN-P\ÆP
+1117:\™TIKEUT-KIYEOK
+1118:\™R\ÆL-N\ÆN
+1119:\™SSANGR\ÆL
+111A:\™R\ÆL-H\ÆH
+111B:\™KAPYEOUNR\ÆL
+111C:\™M\ÆM-P\ÆP
+111D:\™KAPYEOUNM\ÆM
+111E:\™P\ÆP-KIYEOK
+111F:\™P\ÆP-N\ÆN
+1120:\™P\ÆP-TIKEUT
+1121:\™P\ÆP-SIOS
+1122:\™P\ÆP-SIOS-KIYEOK
+1123:\™P\ÆP-SIOS-TIKEUT
+1124:\™P\ÆP-SIOS-P\ÆP
+1125:\™P\ÆP-SSANGSIOS
+1126:\™P\ÆP-SIOS-C\ÆC
+1127:\™P\ÆP-C\ÆC
+1128:\™P\ÆP-CH\ÆCH
+1129:\™P\ÆP-TH\ÆTH
+112A:\™P\ÆP-PH\ÆPH
+112B:\™KAPYEOUNP\ÆP
+112C:\™KAPYEOUNSSANGP\ÆP
+112D:\™SIOS-KIYEOK
+112E:\™SIOS-N\ÆN
+112F:\™SIOS-TIKEUT
+1130:\™SIOS-R\ÆL
+1131:\™SIOS-M\ÆM
+1132:\™SIOS-P\ÆP
+1133:\™SIOS-P\ÆP-KIYEOK
+1134:\™SIOS-SSANGSIOS
+1135:\™SIOS-\ÆNG
+1136:\™SIOS-C\ÆC
+1137:\™SIOS-CH\ÆCH
+1138:\™SIOS-KH\ÆKH
+1139:\™SIOS-TH\ÆTH
+113A:\™SIOS-PH\ÆPH
+113B:\™SIOS-H\ÆH
+113C:\™CHITUEUMSIOS
+113D:\™CHITUEUMSSANGSIOS
+113E:\™CEONGCH\ÆMSIOS
+113F:\™CEONGCH\ÆMSSANGSIOS
+1140:\™PANSIOS
+1141:\™\ÆNG-KIYEOK
+1142:\™\ÆNG-TIKEUT
+1143:\™\ÆNG-M\ÆM
+1144:\™\ÆNG-P\ÆP
+1145:\™\ÆNG-SIOS
+1146:\™\ÆNG-PANSIOS
+1147:\™SSANG\ÆNG
+1148:\™\ÆNG-C\ÆC
+1149:\™\ÆNG-CH\ÆCH
+114A:\™\ÆNG-TH\ÆTH
+114B:\™\ÆNG-PH\ÆPH
+114C:\™YES\ÆNG
+114D:\™C\ÆC-\ÆNG
+114E:\™CHITUEUMC\ÆC
+114F:\™CHITUEUMSSANGC\ÆC
+1150:\™CEONGCH\ÆMC\ÆC
+1151:\™CEONGCH\ÆMSSANGC\ÆC
+1152:\™CH\ÆCH-KH\ÆKH
+1153:\™CH\ÆCH-H\ÆH
+1154:\™CHITUEUMCH\ÆCH
+1155:\™CEONGCH\ÆMCH\ÆCH
+1156:\™PH\ÆPH-P\ÆP
+1157:\™KAPYEOUNPH\ÆPH
+1158:\™SSANGH\ÆH
+1159:\™YEORINH\ÆH
+115F:\™FILLER
+1160:\«FILLER
+1161:\«A
+1162:\«AE
+1163:\«YA
+1164:\«YAE
+1165:\«EO
+1166:\«E
+1167:\«YEO
+1168:\«YE
+1169:\«O
+116A:\«WA
+116B:\«WAE
+116C:\«OE
+116D:\«YO
+116E:\«U
+116F:\«WEO
+1170:\«WE
+1171:\«WI
+1172:\«YU
+1173:\«EU
+1174:\«YI
+1175:\«I
+1176:\«A-O
+1177:\«A-U
+1178:\«YA-O
+1179:\«YA-YO
+117A:\«EO-O
+117B:\«EO-U
+117C:\«EO-EU
+117D:\«YEO-O
+117E:\«YEO-U
+117F:\«O-EO
+1180:\«O-E
+1181:\«O-YE
+1182:\«O-O
+1183:\«O-U
+1184:\«YO-YA
+1185:\«YO-YAE
+1186:\«YO-YEO
+1187:\«YO-O
+1188:\«YO-I
+1189:\«U-A
+118A:\«U-AE
+118B:\«U-EO-EU
+118C:\«U-YE
+118D:\«U-U
+118E:\«YU-A
+118F:\«YU-EO
+1190:\«YU-E
+1191:\«YU-YEO
+1192:\«YU-YE
+1193:\«YU-U
+1194:\«YU-I
+1195:\«EU-U
+1196:\«EU-EU
+1197:\«YI-U
+1198:\«I-A
+1199:\«I-YA
+119A:\«I-O
+119B:\«I-U
+119C:\«I-EU
+119D:\«I-ARAEA
+119E:\«ARAEA
+119F:\«ARAEA-EO
+11A0:\«ARAEA-U
+11A1:\«ARAEA-I
+11A2:\«SSANGARAEA
+11A8:\“KIYEOK
+11A9:\“SSANGKIYEOK
+11AA:\“KIYEOK-SIOS
+11AB:\“N\ÆN
+11AC:\“N\ÆN-C\ÆC
+11AD:\“N\ÆN-H\ÆH
+11AE:\“TIKEUT
+11AF:\“R\ÆL
+11B0:\“R\ÆL-KIYEOK
+11B1:\“R\ÆL-M\ÆM
+11B2:\“R\ÆL-P\ÆP
+11B3:\“R\ÆL-SIOS
+11B4:\“R\ÆL-TH\ÆTH
+11B5:\“R\ÆL-PH\ÆPH
+11B6:\“R\ÆL-H\ÆH
+11B7:\“M\ÆM
+11B8:\“P\ÆP
+11B9:\“P\ÆP-SIOS
+11BA:\“SIOS
+11BB:\“SSANGSIOS
+11BC:\“\ÆNG
+11BD:\“C\ÆC
+11BE:\“CH\ÆCH
+11BF:\“KH\ÆKH
+11C0:\“TH\ÆTH
+11C1:\“PH\ÆPH
+11C2:\“H\ÆH
+11C3:\“KIYEOK-R\ÆL
+11C4:\“KIYEOK-SIOS-KIYEOK
+11C5:\“N\ÆN-KIYEOK
+11C6:\“N\ÆN-TIKEUT
+11C7:\“N\ÆN-SIOS
+11C8:\“N\ÆN-PANSIOS
+11C9:\“N\ÆN-TH\ÆTH
+11CA:\“TIKEUT-KIYEOK
+11CB:\“TIKEUT-R\ÆL
+11CC:\“R\ÆL-KIYEOK-SIOS
+11CD:\“R\ÆL-N\ÆN
+11CE:\“R\ÆL-TIKEUT
+11CF:\“R\ÆL-TIKEUT-H\ÆH
+11D0:\“SSANGR\ÆL
+11D1:\“R\ÆL-M\ÆM-KIYEOK
+11D2:\“R\ÆL-M\ÆM-SIOS
+11D3:\“R\ÆL-P\ÆP-SIOS
+11D4:\“R\ÆL-P\ÆP-H\ÆH
+11D5:\“R\ÆL-KAPYEOUNP\ÆP
+11D6:\“R\ÆL-SSANGSIOS
+11D7:\“R\ÆL-PANSIOS
+11D8:\“R\ÆL-KH\ÆKH
+11D9:\“R\ÆL-YEORINH\ÆH
+11DA:\“M\ÆM-KIYEOK
+11DB:\“M\ÆM-R\ÆL
+11DC:\“M\ÆM-P\ÆP
+11DD:\“M\ÆM-SIOS
+11DE:\“M\ÆM-SSANGSIOS
+11DF:\“M\ÆM-PANSIOS
+11E0:\“M\ÆM-CH\ÆCH
+11E1:\“M\ÆM-H\ÆH
+11E2:\“KAPYEOUNM\ÆM
+11E3:\“P\ÆP-R\ÆL
+11E4:\“P\ÆP-PH\ÆPH
+11E5:\“P\ÆP-H\ÆH
+11E6:\“KAPYEOUNP\ÆP
+11E7:\“SIOS-KIYEOK
+11E8:\“SIOS-TIKEUT
+11E9:\“SIOS-R\ÆL
+11EA:\“SIOS-P\ÆP
+11EB:\“PANSIOS
+11EC:\“\ÆNG-KIYEOK
+11ED:\“\ÆNG-SSANGKIYEOK
+11EE:\“SSANG\ÆNG
+11EF:\“\ÆNG-KH\ÆKH
+11F0:\“YES\ÆNG
+11F1:\“YES\ÆNG-SIOS
+11F2:\“YES\ÆNG-PANSIOS
+11F3:\“PH\ÆPH-P\ÆP
+11F4:\“KAPYEOUNPH\ÆPH
+11F5:\“H\ÆH-N\ÆN
+11F6:\“H\ÆH-R\ÆL
+11F7:\“H\ÆH-M\ÆM
+11F8:\“H\ÆH-P\ÆP
+11F9:\“YEORINH\ÆH
+1200:\VHA
+1201:\VHU
+1202:\VHI
+1203:\VHAA
+1204:\VHEE
+1205:\VHE
+1206:\VHO
+1208:\VLA
+1209:\VLU
+120A:\VLI
+120B:\VLAA
+120C:\VLEE
+120D:\VLE
+120E:\VLO
+120F:\VLWA
+1210:\VHHA
+1211:\VHHU
+1212:\VHHI
+1213:\VHHAA
+1214:\VHHEE
+1215:\VHHE
+1216:\VHHO
+1217:\VHHWA
+1218:\VMA
+1219:\VMU
+121A:\VMI
+121B:\VMAA
+121C:\VMEE
+121D:\VME
+121E:\VMO
+121F:\VMWA
+1220:\VSZA
+1221:\VSZU
+1222:\VSZI
+1223:\VSZAA
+1224:\VSZEE
+1225:\VSZE
+1226:\VSZO
+1227:\VSZWA
+1228:\VRA
+1229:\VRU
+122A:\VRI
+122B:\VRAA
+122C:\VREE
+122D:\VRE
+122E:\VRO
+122F:\VRWA
+1230:\VSA
+1231:\VSU
+1232:\VSI
+1233:\VSAA
+1234:\VSEE
+1235:\VSE
+1236:\VSO
+1237:\VSWA
+1238:\VSHA
+1239:\VSHU
+123A:\VSHI
+123B:\VSHAA
+123C:\VSHEE
+123D:\VSHE
+123E:\VSHO
+123F:\VSHWA
+1240:\VQA
+1241:\VQU
+1242:\VQI
+1243:\VQAA
+1244:\VQEE
+1245:\VQE
+1246:\VQO
+1248:\VQWA
+124A:\VQWI
+124B:\VQWAA
+124C:\VQWEE
+124D:\VQWE
+1250:\VQHA
+1251:\VQHU
+1252:\VQHI
+1253:\VQHAA
+1254:\VQHEE
+1255:\VQHE
+1256:\VQHO
+1258:\VQHWA
+125A:\VQHWI
+125B:\VQHWAA
+125C:\VQHWEE
+125D:\VQHWE
+1260:\VBA
+1261:\VBU
+1262:\VBI
+1263:\VBAA
+1264:\VBEE
+1265:\VBE
+1266:\VBO
+1267:\VBWA
+1268:\VVA
+1269:\VVU
+126A:\VVI
+126B:\VVAA
+126C:\VVEE
+126D:\VVE
+126E:\VVO
+126F:\VVWA
+1270:\VTA
+1271:\VTU
+1272:\VTI
+1273:\VTAA
+1274:\VTEE
+1275:\VTE
+1276:\VTO
+1277:\VTWA
+1278:\VCA
+1279:\VCU
+127A:\VCI
+127B:\VCAA
+127C:\VCEE
+127D:\VCE
+127E:\VCO
+127F:\VCWA
+1280:\VXA
+1281:\VXU
+1282:\VXI
+1283:\VXAA
+1284:\VXEE
+1285:\VXE
+1286:\VXO
+1288:\VXWA
+128A:\VXWI
+128B:\VXWAA
+128C:\VXWEE
+128D:\VXWE
+1290:\VNA
+1291:\VNU
+1292:\VNI
+1293:\VNAA
+1294:\VNEE
+1295:\VNE
+1296:\VNO
+1297:\VNWA
+1298:\VNYA
+1299:\VNYU
+129A:\VNYI
+129B:\VNYAA
+129C:\VNYEE
+129D:\VNYE
+129E:\VNYO
+129F:\VNYWA
+12A0:\VGLOTTAL A
+12A1:\VGLOTTAL U
+12A2:\VGLOTTAL I
+12A3:\VGLOTTAL AA
+12A4:\VGLOTTAL EE
+12A5:\VGLOTTAL E
+12A6:\VGLOTTAL O
+12A7:\VGLOTTAL WA
+12A8:\VKA
+12A9:\VKU
+12AA:\VKI
+12AB:\VKAA
+12AC:\VKEE
+12AD:\VKE
+12AE:\VKO
+12B0:\VKWA
+12B2:\VKWI
+12B3:\VKWAA
+12B4:\VKWEE
+12B5:\VKWE
+12B8:\VKXA
+12B9:\VKXU
+12BA:\VKXI
+12BB:\VKXAA
+12BC:\VKXEE
+12BD:\VKXE
+12BE:\VKXO
+12C0:\VKXWA
+12C2:\VKXWI
+12C3:\VKXWAA
+12C4:\VKXWEE
+12C5:\VKXWE
+12C8:\VWA
+12C9:\VWU
+12CA:\VWI
+12CB:\VWAA
+12CC:\VWEE
+12CD:\VWE
+12CE:\VWO
+12D0:\VPHARYNGEAL A
+12D1:\VPHARYNGEAL U
+12D2:\VPHARYNGEAL I
+12D3:\VPHARYNGEAL AA
+12D4:\VPHARYNGEAL EE
+12D5:\VPHARYNGEAL E
+12D6:\VPHARYNGEAL O
+12D8:\VZA
+12D9:\VZU
+12DA:\VZI
+12DB:\VZAA
+12DC:\VZEE
+12DD:\VZE
+12DE:\VZO
+12DF:\VZWA
+12E0:\VZHA
+12E1:\VZHU
+12E2:\VZHI
+12E3:\VZHAA
+12E4:\VZHEE
+12E5:\VZHE
+12E6:\VZHO
+12E7:\VZHWA
+12E8:\VYA
+12E9:\VYU
+12EA:\VYI
+12EB:\VYAA
+12EC:\VYEE
+12ED:\VYE
+12EE:\VYO
+12F0:\VDA
+12F1:\VDU
+12F2:\VDI
+12F3:\VDAA
+12F4:\VDEE
+12F5:\VDE
+12F6:\VDO
+12F7:\VDWA
+12F8:\VDDA
+12F9:\VDDU
+12FA:\VDDI
+12FB:\VDDAA
+12FC:\VDDEE
+12FD:\VDDE
+12FE:\VDDO
+12FF:\VDDWA
+1300:\VJA
+1301:\VJU
+1302:\VJI
+1303:\VJAA
+1304:\VJEE
+1305:\VJE
+1306:\VJO
+1307:\VJWA
+1308:\VGA
+1309:\VGU
+130A:\VGI
+130B:\VGAA
+130C:\VGEE
+130D:\VGE
+130E:\VGO
+1310:\VGWA
+1312:\VGWI
+1313:\VGWAA
+1314:\VGWEE
+1315:\VGWE
+1318:\VGGA
+1319:\VGGU
+131A:\VGGI
+131B:\VGGAA
+131C:\VGGEE
+131D:\VGGE
+131E:\VGGO
+1320:\VTHA
+1321:\VTHU
+1322:\VTHI
+1323:\VTHAA
+1324:\VTHEE
+1325:\VTHE
+1326:\VTHO
+1327:\VTHWA
+1328:\VCHA
+1329:\VCHU
+132A:\VCHI
+132B:\VCHAA
+132C:\VCHEE
+132D:\VCHE
+132E:\VCHO
+132F:\VCHWA
+1330:\VPHA
+1331:\VPHU
+1332:\VPHI
+1333:\VPHAA
+1334:\VPHEE
+1335:\VPHE
+1336:\VPHO
+1337:\VPHWA
+1338:\VTSA
+1339:\VTSU
+133A:\VTSI
+133B:\VTSAA
+133C:\VTSEE
+133D:\VTSE
+133E:\VTSO
+133F:\VTSWA
+1340:\VTZA
+1341:\VTZU
+1342:\VTZI
+1343:\VTZAA
+1344:\VTZEE
+1345:\VTZE
+1346:\VTZO
+1348:\VFA
+1349:\VFU
+134A:\VFI
+134B:\VFAA
+134C:\VFEE
+134D:\VFE
+134E:\VFO
+134F:\VFWA
+1350:\VPA
+1351:\VPU
+1352:\VPI
+1353:\VPAA
+1354:\VPEE
+1355:\VPE
+1356:\VPO
+1357:\VPWA
+1358:\VRYA
+1359:\VMYA
+135A:\VFYA
+1361:ETHIOPIC WORDSPACE
+1362:ETHIOPIC\é
+1363:ETHIOPIC COMMA
+1364:ETHIOPIC SEMICOLON
+1365:ETHIOPIC COLON
+1366:ETHIOPIC PREFACE COLON
+1367:ETHIOPIC QUESTION\¥
+1368:ETHIOPIC PARAGRAPH SEPARATOR
+1369:ETHIOPIC\hONE
+136A:ETHIOPIC\hTWO
+136B:ETHIOPIC\hTHREE
+136C:ETHIOPIC\hFOUR
+136D:ETHIOPIC\hFIVE
+136E:ETHIOPIC\hSIX
+136F:ETHIOPIC\hSEVEN
+1370:ETHIOPIC\hE\¼
+1371:ETHIOPIC\hNINE
+1372:ETHIOPIC \­TEN
+1373:ETHIOPIC \­TWENTY
+1374:ETHIOPIC \­THIRTY
+1375:ETHIOPIC \­FORTY
+1376:ETHIOPIC \­FIFTY
+1377:ETHIOPIC \­SIXTY
+1378:ETHIOPIC \­SEVENTY
+1379:ETHIOPIC \­E\¼Y
+137A:ETHIOPIC \­NINETY
+137B:ETHIOPIC \­HUNDRED
+137C:ETHIOPIC \­TEN THOUSAND
+13A0:\ŒA
+13A1:\ŒE
+13A2:\ŒI
+13A3:\ŒO
+13A4:\ŒU
+13A5:\ŒV
+13A6:\ŒGA
+13A7:\ŒKA
+13A8:\ŒGE
+13A9:\ŒGI
+13AA:\ŒGO
+13AB:\ŒGU
+13AC:\ŒGV
+13AD:\ŒHA
+13AE:\ŒHE
+13AF:\ŒHI
+13B0:\ŒHO
+13B1:\ŒHU
+13B2:\ŒHV
+13B3:\ŒLA
+13B4:\ŒLE
+13B5:\ŒLI
+13B6:\ŒLO
+13B7:\ŒLU
+13B8:\ŒLV
+13B9:\ŒMA
+13BA:\ŒME
+13BB:\ŒMI
+13BC:\ŒMO
+13BD:\ŒMU
+13BE:\ŒNA
+13BF:\ŒHNA
+13C0:\ŒNAH
+13C1:\ŒNE
+13C2:\ŒNI
+13C3:\ŒNO
+13C4:\ŒNU
+13C5:\ŒNV
+13C6:\ŒQUA
+13C7:\ŒQUE
+13C8:\ŒQUI
+13C9:\ŒQUO
+13CA:\ŒQUU
+13CB:\ŒQUV
+13CC:\ŒSA
+13CD:\ŒS
+13CE:\ŒSE
+13CF:\ŒSI
+13D0:\ŒSO
+13D1:\ŒSU
+13D2:\ŒSV
+13D3:\ŒDA
+13D4:\ŒTA
+13D5:\ŒDE
+13D6:\ŒTE
+13D7:\ŒDI
+13D8:\ŒTI
+13D9:\ŒDO
+13DA:\ŒDU
+13DB:\ŒDV
+13DC:\ŒDLA
+13DD:\ŒTLA
+13DE:\ŒTLE
+13DF:\ŒTLI
+13E0:\ŒTLO
+13E1:\ŒTLU
+13E2:\ŒTLV
+13E3:\ŒTSA
+13E4:\ŒTSE
+13E5:\ŒTSI
+13E6:\ŒTSO
+13E7:\ŒTSU
+13E8:\ŒTSV
+13E9:\ŒWA
+13EA:\ŒWE
+13EB:\ŒWI
+13EC:\ŒWO
+13ED:\ŒWU
+13EE:\ŒWV
+13EF:\ŒYA
+13F0:\ŒYE
+13F1:\ŒYI
+13F2:\ŒYO
+13F3:\ŒYU
+13F4:\ŒYV
+1401:\FE
+1402:\FAAI
+1403:\FI
+1404:\FII
+1405:\FO
+1406:\FOO
+1407:\FY-CREE OO
+1408:\kEE
+1409:\kI
+140A:\FA
+140B:\FAA
+140C:\FWE
+140D:\WE
+140E:\FWI
+140F:\WI
+1410:\FWII
+1411:\WII
+1412:\FWO
+1413:\WO
+1414:\FWOO
+1415:\WOO
+1416:\FNASKAPI WOO
+1417:\FWA
+1418:\WA
+1419:\FWAA
+141A:\WAA
+141B:\FNASKAPI WAA
+141C:\FAI
+141D:\FY-CREE W
+141E:\FGLOTTAL STOP
+141F:\FFINAL \Ü
+1420:\FFINAL GRAVE
+1421:\FFINAL BOTTOM HALF R\ô
+1422:\FFINAL TOP HALF R\ô
+1423:\FFINAL \ùHALF R\ô
+1424:\FFINAL R\ô
+1425:\FFINAL \0 \Ü
+1426:\FFINAL \0 SHORT \€ \ÁS
+1427:\FFINAL MIDDLE DOT
+1428:\FFINAL SHORT \ \Á
+1429:\FFINAL PLUS
+142A:\FFINAL \Ë TACK
+142B:\FEN
+142C:\FIN
+142D:\FON
+142E:\FAN
+142F:\FPE
+1430:\FPAAI
+1431:\FPI
+1432:\FPII
+1433:\FPO
+1434:\FPOO
+1435:\FY-CREE POO
+1436:\kHEE
+1437:\kHI
+1438:\FPA
+1439:\FPAA
+143A:\FPWE
+143B:\PWE
+143C:\FPWI
+143D:\PWI
+143E:\FPWII
+143F:\PWII
+1440:\FPWO
+1441:\PWO
+1442:\FPWOO
+1443:\PWOO
+1444:\FPWA
+1445:\PWA
+1446:\FPWAA
+1447:\PWAA
+1448:\FY-CREE PWAA
+1449:\FP
+144A:\P
+144B:\kH
+144C:\FTE
+144D:\FTAAI
+144E:\FTI
+144F:\FTII
+1450:\FTO
+1451:\FTOO
+1452:\FY-CREE TOO
+1453:\kDEE
+1454:\kDI
+1455:\FTA
+1456:\FTAA
+1457:\FTWE
+1458:\TWE
+1459:\FTWI
+145A:\TWI
+145B:\FTWII
+145C:\TWII
+145D:\FTWO
+145E:\TWO
+145F:\FTWOO
+1460:\TWOO
+1461:\FTWA
+1462:\TWA
+1463:\FTWAA
+1464:\TWAA
+1465:\FNASKAPI TWAA
+1466:\FT
+1467:\FTTE
+1468:\FTTI
+1469:\FTTO
+146A:\FTTA
+146B:\FKE
+146C:\FKAAI
+146D:\FKI
+146E:\FKII
+146F:\FKO
+1470:\FKOO
+1471:\FY-CREE KOO
+1472:\FKA
+1473:\FKAA
+1474:\FKWE
+1475:\KWE
+1476:\FKWI
+1477:\KWI
+1478:\FKWII
+1479:\KWII
+147A:\FKWO
+147B:\KWO
+147C:\FKWOO
+147D:\KWOO
+147E:\FKWA
+147F:\KWA
+1480:\FKWAA
+1481:\KWAA
+1482:\FNASKAPI KWAA
+1483:\FK
+1484:\FKW
+1485:\FSOUTH-SLAVEY KEH
+1486:\FSOUTH-SLAVEY KIH
+1487:\FSOUTH-SLAVEY KOH
+1488:\FSOUTH-SLAVEY KAH
+1489:\FCE
+148A:\FCAAI
+148B:\FCI
+148C:\FCII
+148D:\FCO
+148E:\FCOO
+148F:\FY-CREE COO
+1490:\FCA
+1491:\FCAA
+1492:\FCWE
+1493:\CWE
+1494:\FCWI
+1495:\CWI
+1496:\FCWII
+1497:\CWII
+1498:\FCWO
+1499:\CWO
+149A:\FCWOO
+149B:\CWOO
+149C:\FCWA
+149D:\CWA
+149E:\FCWAA
+149F:\CWAA
+14A0:\FNASKAPI CWAA
+14A1:\FC
+14A2:\FSAYISI TH
+14A3:\FME
+14A4:\FMAAI
+14A5:\FMI
+14A6:\FMII
+14A7:\FMO
+14A8:\FMOO
+14A9:\FY-CREE MOO
+14AA:\FMA
+14AB:\FMAA
+14AC:\FMWE
+14AD:\MWE
+14AE:\FMWI
+14AF:\MWI
+14B0:\FMWII
+14B1:\MWII
+14B2:\FMWO
+14B3:\MWO
+14B4:\FMWOO
+14B5:\MWOO
+14B6:\FMWA
+14B7:\MWA
+14B8:\FMWAA
+14B9:\MWAA
+14BA:\FNASKAPI MWAA
+14BB:\FM
+14BC:\M
+14BD:\FMH
+14BE:\FATHAPASCAN M
+14BF:\FSAYISI M
+14C0:\FNE
+14C1:\FNAAI
+14C2:\FNI
+14C3:\FNII
+14C4:\FNO
+14C5:\FNOO
+14C6:\FY-CREE NOO
+14C7:\FNA
+14C8:\FNAA
+14C9:\FNWE
+14CA:\NWE
+14CB:\FNWA
+14CC:\NWA
+14CD:\FNWAA
+14CE:\NWAA
+14CF:\FNASKAPI NWAA
+14D0:\FN
+14D1:\kNG
+14D2:\FNH
+14D3:\FLE
+14D4:\FLAAI
+14D5:\FLI
+14D6:\FLII
+14D7:\FLO
+14D8:\FLOO
+14D9:\FY-CREE LOO
+14DA:\FLA
+14DB:\FLAA
+14DC:\FLWE
+14DD:\LWE
+14DE:\FLWI
+14DF:\LWI
+14E0:\FLWII
+14E1:\LWII
+14E2:\FLWO
+14E3:\LWO
+14E4:\FLWOO
+14E5:\LWOO
+14E6:\FLWA
+14E7:\LWA
+14E8:\FLWAA
+14E9:\LWAA
+14EA:\FL
+14EB:\L
+14EC:\FMEDIAL L
+14ED:\FSE
+14EE:\FSAAI
+14EF:\FSI
+14F0:\FSII
+14F1:\FSO
+14F2:\FSOO
+14F3:\FY-CREE SOO
+14F4:\FSA
+14F5:\FSAA
+14F6:\FSWE
+14F7:\SWE
+14F8:\FSWI
+14F9:\SWI
+14FA:\FSWII
+14FB:\SWII
+14FC:\FSWO
+14FD:\SWO
+14FE:\FSWOO
+14FF:\SWOO
+1500:\FSWA
+1501:\SWA
+1502:\FSWAA
+1503:\SWAA
+1504:\FNASKAPI SWAA
+1505:\FS
+1506:\FATHAPASCAN S
+1507:\FSW
+1508:\F\¬FOOT S
+1509:\FMOOSE-CREE SK
+150A:\FNASKAPI SKW
+150B:\FNASKAPI S-W
+150C:\FNASKAPI SPWA
+150D:\FNASKAPI STWA
+150E:\FNASKAPI SKWA
+150F:\FNASKAPI SCWA
+1510:\FSHE
+1511:\FSHI
+1512:\FSHII
+1513:\FSHO
+1514:\FSHOO
+1515:\FSHA
+1516:\FSHAA
+1517:\FSHWE
+1518:\SHWE
+1519:\FSHWI
+151A:\SHWI
+151B:\FSHWII
+151C:\SHWII
+151D:\FSHWO
+151E:\SHWO
+151F:\FSHWOO
+1520:\SHWOO
+1521:\FSHWA
+1522:\SHWA
+1523:\FSHWAA
+1524:\SHWAA
+1525:\FSH
+1526:\FYE
+1527:\FYAAI
+1528:\FYI
+1529:\FYII
+152A:\FYO
+152B:\FYOO
+152C:\FY-CREE YOO
+152D:\FYA
+152E:\FYAA
+152F:\FYWE
+1530:\YWE
+1531:\FYWI
+1532:\YWI
+1533:\FYWII
+1534:\YWII
+1535:\FYWO
+1536:\YWO
+1537:\FYWOO
+1538:\YWOO
+1539:\FYWA
+153A:\YWA
+153B:\FYWAA
+153C:\YWAA
+153D:\FNASKAPI YWAA
+153E:\FY
+153F:\FBIBLE-CREE Y
+1540:\Y
+1541:\FSAYISI YI
+1542:\FRE
+1543:\FR-CREE RE
+1544:\LE
+1545:\FRAAI
+1546:\FRI
+1547:\FRII
+1548:\FRO
+1549:\FROO
+154A:\LO
+154B:\FRA
+154C:\FRAA
+154D:\LA
+154E:\FRWAA
+154F:\RWAA
+1550:\FR
+1551:\R
+1552:\FMEDIAL R
+1553:\FFE
+1554:\FFAAI
+1555:\FFI
+1556:\FFII
+1557:\FFO
+1558:\FFOO
+1559:\FFA
+155A:\FFAA
+155B:\FFWAA
+155C:\FWAA
+155D:\FF
+155E:\FTHE
+155F:\FN-CREE THE
+1560:\FTHI
+1561:\FN-CREE THI
+1562:\FTHII
+1563:\FN-CREE THII
+1564:\FTHO
+1565:\FTHOO
+1566:\FTHA
+1567:\FTHAA
+1568:\FTHWAA
+1569:\THWAA
+156A:\FTH
+156B:\FTTHE
+156C:\FTTHI
+156D:\FTTHO
+156E:\FTTHA
+156F:\FTTH
+1570:\FTYE
+1571:\FTYI
+1572:\FTYO
+1573:\FTYA
+1574:\FNUNAVIK HE
+1575:\FNUNAVIK HI
+1576:\FNUNAVIK HII
+1577:\FNUNAVIK HO
+1578:\FNUNAVIK HOO
+1579:\FNUNAVIK HA
+157A:\FNUNAVIK HAA
+157B:\FNUNAVIK H
+157C:\FNUNAVUT H
+157D:\FHK
+157E:\FQAAI
+157F:\FQI
+1580:\FQII
+1581:\FQO
+1582:\FQOO
+1583:\FQA
+1584:\FQAA
+1585:\FQ
+1586:\FTLHE
+1587:\FTLHI
+1588:\FTLHO
+1589:\FTLHA
+158A:\RE
+158B:\RI
+158C:\RO
+158D:\RA
+158E:\FNGAAI
+158F:\FNGI
+1590:\FNGII
+1591:\FNGO
+1592:\FNGOO
+1593:\FNGA
+1594:\FNGAA
+1595:\FNG
+1596:\FNNG
+1597:\FSAYISI SHE
+1598:\FSAYISI SHI
+1599:\FSAYISI SHO
+159A:\FSAYISI SHA
+159B:\FWOODS-CREE THE
+159C:\FWOODS-CREE THI
+159D:\FWOODS-CREE THO
+159E:\FWOODS-CREE THA
+159F:\FWOODS-CREE TH
+15A0:\FLHI
+15A1:\FLHII
+15A2:\FLHO
+15A3:\FLHOO
+15A4:\FLHA
+15A5:\FLHAA
+15A6:\FLH
+15A7:\FTH-CREE THE
+15A8:\FTH-CREE THI
+15A9:\FTH-CREE THII
+15AA:\FTH-CREE THO
+15AB:\FTH-CREE THOO
+15AC:\FTH-CREE THA
+15AD:\FTH-CREE THAA
+15AE:\FTH-CREE TH
+15AF:\FAIVILIK B
+15B0:\F\¬FOOT E
+15B1:\F\¬FOOT I
+15B2:\F\¬FOOT O
+15B3:\F\¬FOOT A
+15B4:\F\¬FOOT WE
+15B5:\F\¬FOOT WI
+15B6:\F\¬FOOT WO
+15B7:\F\¬FOOT WA
+15B8:\F\¬FOOT NE
+15B9:\F\¬FOOT NI
+15BA:\F\¬FOOT NO
+15BB:\F\¬FOOT NA
+15BC:\F\¬FOOT KE
+15BD:\F\¬FOOT KI
+15BE:\F\¬FOOT KO
+15BF:\F\¬FOOT KA
+15C0:\FSAYISI HE
+15C1:\FSAYISI HI
+15C2:\FSAYISI HO
+15C3:\FSAYISI HA
+15C4:\kGHU
+15C5:\kGHO
+15C6:\kGHE
+15C7:\kGHEE
+15C8:\kGHI
+15C9:\kGHA
+15CA:\kRU
+15CB:\kRO
+15CC:\kRE
+15CD:\kREE
+15CE:\kRI
+15CF:\kRA
+15D0:\kWU
+15D1:\kWO
+15D2:\kWE
+15D3:\kWEE
+15D4:\kWI
+15D5:\kWA
+15D6:\kHWU
+15D7:\kHWO
+15D8:\kHWE
+15D9:\kHWEE
+15DA:\kHWI
+15DB:\kHWA
+15DC:\kTHU
+15DD:\kTHO
+15DE:\kTHE
+15DF:\kTHEE
+15E0:\kTHI
+15E1:\kTHA
+15E2:\kTTU
+15E3:\kTTO
+15E4:\kTTE
+15E5:\kTTEE
+15E6:\kTTI
+15E7:\kTTA
+15E8:\kPU
+15E9:\kPO
+15EA:\kPE
+15EB:\kPEE
+15EC:\kPI
+15ED:\kPA
+15EE:\kP
+15EF:\kGU
+15F0:\kGO
+15F1:\kGE
+15F2:\kGEE
+15F3:\kGI
+15F4:\kGA
+15F5:\kKHU
+15F6:\kKHO
+15F7:\kKHE
+15F8:\kKHEE
+15F9:\kKHI
+15FA:\kKHA
+15FB:\kKKU
+15FC:\kKKO
+15FD:\kKKE
+15FE:\kKKEE
+15FF:\kKKI
+1600:\kKKA
+1601:\kKK
+1602:\kNU
+1603:\kNO
+1604:\kNE
+1605:\kNEE
+1606:\kNI
+1607:\kNA
+1608:\kMU
+1609:\kMO
+160A:\kME
+160B:\kMEE
+160C:\kMI
+160D:\kMA
+160E:\kYU
+160F:\kYO
+1610:\kYE
+1611:\kYEE
+1612:\kYI
+1613:\kYA
+1614:\kJU
+1615:\FSAYISI JU
+1616:\kJO
+1617:\kJE
+1618:\kJEE
+1619:\kJI
+161A:\FSAYISI JI
+161B:\kJA
+161C:\kJJU
+161D:\kJJO
+161E:\kJJE
+161F:\kJJEE
+1620:\kJJI
+1621:\kJJA
+1622:\kLU
+1623:\kLO
+1624:\kLE
+1625:\kLEE
+1626:\kLI
+1627:\kLA
+1628:\kDLU
+1629:\kDLO
+162A:\kDLE
+162B:\kDLEE
+162C:\kDLI
+162D:\kDLA
+162E:\kLHU
+162F:\kLHO
+1630:\kLHE
+1631:\kLHEE
+1632:\kLHI
+1633:\kLHA
+1634:\kTLHU
+1635:\kTLHO
+1636:\kTLHE
+1637:\kTLHEE
+1638:\kTLHI
+1639:\kTLHA
+163A:\kTLU
+163B:\kTLO
+163C:\kTLE
+163D:\kTLEE
+163E:\kTLI
+163F:\kTLA
+1640:\kZU
+1641:\kZO
+1642:\kZE
+1643:\kZEE
+1644:\kZI
+1645:\kZA
+1646:\kZ
+1647:\kINITIAL Z
+1648:\kDZU
+1649:\kDZO
+164A:\kDZE
+164B:\kDZEE
+164C:\kDZI
+164D:\kDZA
+164E:\kSU
+164F:\kSO
+1650:\kSE
+1651:\kSEE
+1652:\kSI
+1653:\kSA
+1654:\kSHU
+1655:\kSHO
+1656:\kSHE
+1657:\kSHEE
+1658:\kSHI
+1659:\kSHA
+165A:\kSH
+165B:\kTSU
+165C:\kTSO
+165D:\kTSE
+165E:\kTSEE
+165F:\kTSI
+1660:\kTSA
+1661:\kCHU
+1662:\kCHO
+1663:\kCHE
+1664:\kCHEE
+1665:\kCHI
+1666:\kCHA
+1667:\kTTSU
+1668:\kTTSO
+1669:\kTTSE
+166A:\kTTSEE
+166B:\kTTSI
+166C:\kTTSA
+166D:\FCHI\‚
+166E:\FFULL STOP
+166F:\FQAI
+1670:\FNGAI
+1671:\FNNGI
+1672:\FNNGII
+1673:\FNNGO
+1674:\FNNGOO
+1675:\FNNGA
+1676:\FNNGAA
+1680:OGHAM SPACE\¥
+1681:OGHAM\@BEITH
+1682:OGHAM\@LUIS
+1683:OGHAM\@FEARN
+1684:OGHAM\@SAIL
+1685:OGHAM\@NION
+1686:OGHAM\@UATH
+1687:OGHAM\@DAIR
+1688:OGHAM\@TINNE
+1689:OGHAM\@COLL
+168A:OGHAM\@CEIRT
+168B:OGHAM\@MUIN
+168C:OGHAM\@GORT
+168D:OGHAM\@NGEADAL
+168E:OGHAM\@STRAIF
+168F:OGHAM\@RUIS
+1690:OGHAM\@AILM
+1691:OGHAM\@ONN
+1692:OGHAM\@UR
+1693:OGHAM\@EADHADH
+1694:OGHAM\@IODHADH
+1695:OGHAM\@EABHADH
+1696:OGHAM\@OR
+1697:OGHAM\@UILLEANN
+1698:OGHAM\@IFIN
+1699:OGHAM\@EAMHANCHOLL
+169A:OGHAM\@PEITH
+169B:OGHAM FEATHER\¥
+169C:OGHAM \öFEATHER\¥
+16A0:\ÀFEHU FEOH FE F
+16A1:\ÀV
+16A2:\ÀURUZ UR U
+16A3:\ÀYR
+16A4:\ÀY
+16A5:\ÀW
+16A6:\ÀTHURISAZ THURS THORN
+16A7:\ÀETH
+16A8:\ÀANSUZ A
+16A9:\ÀOS O
+16AA:\ÀAC A
+16AB:\ÀAESC
+16AC:\ÀLONG-BRANCH-OSS O
+16AD:\ÀSHORT-TWIG-OSS O
+16AE:\ÀO
+16AF:\ÀOE
+16B0:\ÀON
+16B1:\ÀRAIDO RAD REID R
+16B2:\ÀKAUNA
+16B3:\ÀCEN
+16B4:\ÀKAUN K
+16B5:\ÀG
+16B6:\ÀENG
+16B7:\ÀGEBO GYFU G
+16B8:\ÀGAR
+16B9:\ÀWUNJO WYNN W
+16BA:\ÀHAGLAZ H
+16BB:\ÀHAEGL H
+16BC:\ÀLONG-BRANCH-HAGALL H
+16BD:\ÀSHORT-TWIG-HAGALL H
+16BE:\ÀNAUDIZ NYD NAUD N
+16BF:\ÀSHORT-TWIG-NAUD N
+16C0:\ÀDOTTED-N
+16C1:\ÀISAZ IS ISS I
+16C2:\ÀE
+16C3:\ÀJERAN J
+16C4:\ÀGER
+16C5:\ÀLONG-BRANCH-AR AE
+16C6:\ÀSHORT-TWIG-AR A
+16C7:\ÀIWAZ EOH
+16C8:\ÀPERTHO PEORTH P
+16C9:\ÀALGIZ EOLHX
+16CA:\ÀSOWILO S
+16CB:\ÀSIGEL LONG-BRANCH-SOL S
+16CC:\ÀSHORT-TWIG-SOL S
+16CD:\ÀC
+16CE:\ÀZ
+16CF:\ÀTIWAZ TIR TYR T
+16D0:\ÀSHORT-TWIG-TYR T
+16D1:\ÀD
+16D2:\ÀBERKANAN BEORC BJARKAN B
+16D3:\ÀSHORT-TWIG-BJARKAN B
+16D4:\ÀDOTTED-P
+16D5:\ÀOPEN-P
+16D6:\ÀEHWAZ EH E
+16D7:\ÀMANNAZ MAN M
+16D8:\ÀLONG-BRANCH-MADR M
+16D9:\ÀSHORT-TWIG-MADR M
+16DA:\ÀLAUKAZ LAGU LOGR L
+16DB:\ÀDOTTED-L
+16DC:\À\ôWAZ
+16DD:\À\ô
+16DE:\ÀDAGAZ DAEG D
+16DF:\ÀOTHALAN ETHEL O
+16E0:\ÀEAR
+16E1:\ÀIOR
+16E2:\ÀCWEORTH
+16E3:\ÀCALC
+16E4:\ÀCEALC
+16E5:\ÀSTAN
+16E6:\ÀLONG-BRANCH-YR
+16E7:\ÀSHORT-TWIG-YR
+16E8:\ÀICELANDIC-YR
+16E9:\ÀQ
+16EA:\ÀX
+16EB:RUNIC S\ôLE PUNCTU\”
+16EC:RUNIC MULTIPLE PUNCTU\”
+16ED:RUNIC CROSS PUNCTU\”
+16EE:RUNIC ARLAUG \
+16EF:RUNIC TVIMADUR \
+16F0:RUNIC BELGTHOR \
+1700:TAGALOG\@A
+1701:TAGALOG\@I
+1702:TAGALOG\@U
+1703:TAGALOG\@KA
+1704:TAGALOG\@GA
+1705:TAGALOG\@NGA
+1706:TAGALOG\@TA
+1707:TAGALOG\@DA
+1708:TAGALOG\@NA
+1709:TAGALOG\@PA
+170A:TAGALOG\@BA
+170B:TAGALOG\@MA
+170C:TAGALOG\@YA
+170E:TAGALOG\@LA
+170F:TAGALOG\@WA
+1710:TAGALOG\@SA
+1711:TAGALOG\@HA
+1712:TAGALOG\bI
+1713:TAGALOG\bU
+1714:TAGALOG\‚ VIRAMA
+1720:HANUNOO\@A
+1721:HANUNOO\@I
+1722:HANUNOO\@U
+1723:HANUNOO\@KA
+1724:HANUNOO\@GA
+1725:HANUNOO\@NGA
+1726:HANUNOO\@TA
+1727:HANUNOO\@DA
+1728:HANUNOO\@NA
+1729:HANUNOO\@PA
+172A:HANUNOO\@BA
+172B:HANUNOO\@MA
+172C:HANUNOO\@YA
+172D:HANUNOO\@RA
+172E:HANUNOO\@LA
+172F:HANUNOO\@WA
+1730:HANUNOO\@SA
+1731:HANUNOO\@HA
+1732:HANUNOO\bI
+1733:HANUNOO\bU
+1734:HANUNOO\‚ PAMUDPOD
+1735:PHILIPPINE S\ôLE PUNCTU\”
+1736:PHILIPPINE \0 PUNCTU\”
+1740:BUHID\@A
+1741:BUHID\@I
+1742:BUHID\@U
+1743:BUHID\@KA
+1744:BUHID\@GA
+1745:BUHID\@NGA
+1746:BUHID\@TA
+1747:BUHID\@DA
+1748:BUHID\@NA
+1749:BUHID\@PA
+174A:BUHID\@BA
+174B:BUHID\@MA
+174C:BUHID\@YA
+174D:BUHID\@RA
+174E:BUHID\@LA
+174F:BUHID\@WA
+1750:BUHID\@SA
+1751:BUHID\@HA
+1752:BUHID\bI
+1753:BUHID\bU
+1760:TAGBANWA\@A
+1761:TAGBANWA\@I
+1762:TAGBANWA\@U
+1763:TAGBANWA\@KA
+1764:TAGBANWA\@GA
+1765:TAGBANWA\@NGA
+1766:TAGBANWA\@TA
+1767:TAGBANWA\@DA
+1768:TAGBANWA\@NA
+1769:TAGBANWA\@PA
+176A:TAGBANWA\@BA
+176B:TAGBANWA\@MA
+176C:TAGBANWA\@YA
+176E:TAGBANWA\@LA
+176F:TAGBANWA\@WA
+1770:TAGBANWA\@SA
+1772:TAGBANWA\bI
+1773:TAGBANWA\bU
+1780:\Ý\@KA
+1781:\Ý\@KHA
+1782:\Ý\@KO
+1783:\Ý\@KHO
+1784:\Ý\@NGO
+1785:\Ý\@CA
+1786:\Ý\@CHA
+1787:\Ý\@CO
+1788:\Ý\@CHO
+1789:\Ý\@NYO
+178A:\Ý\@DA
+178B:\Ý\@TTHA
+178C:\Ý\@DO
+178D:\Ý\@TTHO
+178E:\Ý\@NNO
+178F:\Ý\@TA
+1790:\Ý\@THA
+1791:\Ý\@TO
+1792:\Ý\@THO
+1793:\Ý\@NO
+1794:\Ý\@BA
+1795:\Ý\@PHA
+1796:\Ý\@PO
+1797:\Ý\@PHO
+1798:\Ý\@MO
+1799:\Ý\@YO
+179A:\Ý\@RO
+179B:\Ý\@LO
+179C:\Ý\@VO
+179D:\Ý\@SHA
+179E:\Ý\@SSO
+179F:\Ý\@SA
+17A0:\Ý\@HA
+17A1:\Ý\@LA
+17A2:\Ý\@QA
+17A3:\ÃQAQ
+17A4:\ÃQAA
+17A5:\ÃQI
+17A6:\ÃQII
+17A7:\ÃQU
+17A8:\ÃQUK
+17A9:\ÃQUU
+17AA:\ÃQUUV
+17AB:\ÃRY
+17AC:\ÃRYY
+17AD:\ÃLY
+17AE:\ÃLYY
+17AF:\ÃQE
+17B0:\ÃQAI
+17B1:\ÃQOO TYPE ONE
+17B2:\ÃQOO TYPE TWO
+17B3:\ÃQAU
+17B4:\Ý VOWEL INHERENT AQ
+17B5:\Ý VOWEL INHERENT AA
+17B6:\Ý\bAA
+17B7:\Ý\bI
+17B8:\Ý\bII
+17B9:\Ý\bY
+17BA:\Ý\bYY
+17BB:\Ý\bU
+17BC:\Ý\bUU
+17BD:\Ý\bUA
+17BE:\Ý\bOE
+17BF:\Ý\bYA
+17C0:\Ý\bIE
+17C1:\Ý\bE
+17C2:\Ý\bAE
+17C3:\Ý\bAI
+17C4:\Ý\bOO
+17C5:\Ý\bAU
+17C6:\Ý\‚ NIKAHIT
+17C7:\Ý\‚ REAHMUK
+17C8:\Ý\‚ YUUKALEAPINTU
+17C9:\Ý\‚ MUUSIKATOAN
+17CA:\Ý\‚ TRIISAP
+17CB:\Ý\‚ BANTOC
+17CC:\Ý\‚ ROBAT
+17CD:\Ý\‚ TOANDAKHIAT
+17CE:\Ý\‚ KAKABAT
+17CF:\Ý\‚ AHSDA
+17D0:\Ý\‚ SAMYOK SANNYA
+17D1:\Ý\‚ VIRIAM
+17D2:\Ý\‚ COENG
+17D3:\Ý\‚ BATHAMASAT
+17D4:\Ý\‚ KHAN
+17D5:\Ý\‚\ìIYOOSAN
+17D6:\Ý\‚ CAMNUC PII KUUH
+17D7:\Ý\‚ LEK TOO
+17D8:\Ý\‚ BEYYAL
+17D9:\Ý\‚ PHNAEK MUAN
+17DA:\Ý\‚ KOOMUUT
+17DB:\Ý CURRENCY \ RIEL
+17DC:\Ý\‚ AVAKRAHASANYA
+17E0:\Ý\hZERO
+17E1:\Ý\hONE
+17E2:\Ý\hTWO
+17E3:\Ý\hTHREE
+17E4:\Ý\hFOUR
+17E5:\Ý\hFIVE
+17E6:\Ý\hSIX
+17E7:\Ý\hSEVEN
+17E8:\Ý\hE\¼
+17E9:\Ý\hNINE
+1800:MONGOLIAN BIRGA
+1801:MONGOLIAN ELLIPSIS
+1802:MONGOLIAN COMMA
+1803:MONGOLIAN\é
+1804:MONGOLIAN COLON
+1805:MONGOLIAN FOUR DOTS
+1806:MONGOLIAN TODO SOFT HYPHEN
+1807:MONGOLIAN SIBE\CBOUNDARY\¥ER
+1808:MONGOLIAN MANCHU COMMA
+1809:MONGOLIAN MANCHU\é
+180A:MONGOLIAN NIRUGU
+180B:MONGOLIAN FREE \ç ONE
+180C:MONGOLIAN FREE \ç TWO
+180D:MONGOLIAN FREE \ç THREE
+180E:MONGOLIAN VOWEL SEPARATOR
+1810:MONGOLIAN\hZERO
+1811:MONGOLIAN\hONE
+1812:MONGOLIAN\hTWO
+1813:MONGOLIAN\hTHREE
+1814:MONGOLIAN\hFOUR
+1815:MONGOLIAN\hFIVE
+1816:MONGOLIAN\hSIX
+1817:MONGOLIAN\hSEVEN
+1818:MONGOLIAN\hE\¼
+1819:MONGOLIAN\hNINE
+1820:\xA
+1821:\xE
+1822:\xI
+1823:\xO
+1824:\xU
+1825:\xOE
+1826:\xUE
+1827:\xEE
+1828:\xNA
+1829:\xANG
+182A:\xBA
+182B:\xPA
+182C:\xQA
+182D:\xGA
+182E:\xMA
+182F:\xLA
+1830:\xSA
+1831:\xSHA
+1832:\xTA
+1833:\xDA
+1834:\xCHA
+1835:\xJA
+1836:\xYA
+1837:\xRA
+1838:\xWA
+1839:\xFA
+183A:\xKA
+183B:\xKHA
+183C:\xTSA
+183D:\xZA
+183E:\xHAA
+183F:\xZRA
+1840:\xLHA
+1841:\xZHI
+1842:\xCHI
+1843:\xTODO LONG VOWEL\‚
+1844:\xTODO E
+1845:\xTODO I
+1846:\xTODO O
+1847:\xTODO U
+1848:\xTODO OE
+1849:\xTODO UE
+184A:\xTODO ANG
+184B:\xTODO BA
+184C:\xTODO PA
+184D:\xTODO QA
+184E:\xTODO GA
+184F:\xTODO MA
+1850:\xTODO TA
+1851:\xTODO DA
+1852:\xTODO CHA
+1853:\xTODO JA
+1854:\xTODO TSA
+1855:\xTODO YA
+1856:\xTODO WA
+1857:\xTODO KA
+1858:\xTODO GAA
+1859:\xTODO HAA
+185A:\xTODO JIA
+185B:\xTODO NIA
+185C:\xTODO DZA
+185D:\xSIBE E
+185E:\xSIBE I
+185F:\xSIBE IY
+1860:\xSIBE UE
+1861:\xSIBE U
+1862:\xSIBE ANG
+1863:\xSIBE KA
+1864:\xSIBE GA
+1865:\xSIBE HA
+1866:\xSIBE PA
+1867:\xSIBE SHA
+1868:\xSIBE TA
+1869:\xSIBE DA
+186A:\xSIBE JA
+186B:\xSIBE FA
+186C:\xSIBE GAA
+186D:\xSIBE HAA
+186E:\xSIBE TSA
+186F:\xSIBE ZA
+1870:\xSIBE RAA
+1871:\xSIBE CHA
+1872:\xSIBE ZHA
+1873:\xMANCHU I
+1874:\xMANCHU KA
+1875:\xMANCHU RA
+1876:\xMANCHU FA
+1877:\xMANCHU ZHA
+1880:\x\ÕANUSVARA ONE
+1881:\x\ÕVISARGA ONE
+1882:\x\ÕDAMARU
+1883:\x\ÕUBADAMA
+1884:\x\ÕINVERT\ÂUBADAMA
+1885:\x\ÕBALUDA
+1886:\x\ÕTHREE BALUDA
+1887:\x\ÕA
+1888:\x\ÕI
+1889:\x\ÕKA
+188A:\x\ÕNGA
+188B:\x\ÕCA
+188C:\x\ÕTTA
+188D:\x\ÕTTHA
+188E:\x\ÕDDA
+188F:\x\ÕNNA
+1890:\x\ÕTA
+1891:\x\ÕDA
+1892:\x\ÕPA
+1893:\x\ÕPHA
+1894:\x\ÕSSA
+1895:\x\ÕZHA
+1896:\x\ÕZA
+1897:\x\ÕAH
+1898:\xTODO \ÕTA
+1899:\xTODO \ÕZHA
+189A:\xMANCHU \ÕGHA
+189B:\xMANCHU \ÕNGA
+189C:\xMANCHU \ÕCA
+189D:\xMANCHU \ÕJHA
+189E:\xMANCHU \ÕTTA
+189F:\xMANCHU \ÕDDHA
+18A0:\xMANCHU \ÕTA
+18A1:\xMANCHU \ÕDHA
+18A2:\xMANCHU \ÕSSA
+18A3:\xMANCHU \ÕCYA
+18A4:\xMANCHU \ÕZHA
+18A5:\xMANCHU \ÕZA
+18A6:\x\ÕHALF U
+18A7:\x\ÕHALF YA
+18A8:\xMANCHU \ÕBHA
+18A9:\x\ÕDAGALGA
+1E00:\PA\HR\ô\…
+1E01:\LA\HR\ô\…
+1E02:\PB\³\p
+1E03:\LB\³\p
+1E04:\PB\³\…
+1E05:\LB\³\…
+1E06:\PB\H\ä\…
+1E07:\LB\H\ä\…
+1E08:\PC\HCEDILLA\i\Ü
+1E09:\LC\HCEDILLA\i\Ü
+1E0A:\PD\³\p
+1E0B:\LD\³\p
+1E0C:\PD\³\…
+1E0D:\LD\³\…
+1E0E:\PD\H\ä\…
+1E0F:\LD\H\ä\…
+1E10:\PD\HCEDILLA
+1E11:\LD\HCEDILLA
+1E12:\PD\ˆ\…
+1E13:\LD\ˆ\…
+1E14:\PE\H\å\iGRAVE
+1E15:\LE\H\å\iGRAVE
+1E16:\PE\H\å\i\Ü
+1E17:\LE\H\å\i\Ü
+1E18:\PE\ˆ\…
+1E19:\LE\ˆ\…
+1E1A:\PE\H\æ\…
+1E1B:\LE\H\æ\…
+1E1C:\PE\HCEDILLA\iBREVE
+1E1D:\LE\HCEDILLA\iBREVE
+1E1E:\PF\³\p
+1E1F:\LF\³\p
+1E20:\PG\H\å
+1E21:\LG\H\å
+1E22:\PH\³\p
+1E23:\LH\³\p
+1E24:\PH\³\…
+1E25:\LH\³\…
+1E26:\PH\ž
+1E27:\LH\ž
+1E28:\PH\HCEDILLA
+1E29:\LH\HCEDILLA
+1E2A:\PH\HBREVE\…
+1E2B:\LH\HBREVE\…
+1E2C:\PI\H\æ\…
+1E2D:\LI\H\æ\…
+1E2E:\PI\ž\i\Ü
+1E2F:\LI\ž\i\Ü
+1E30:\PK\H\Ü
+1E31:\LK\H\Ü
+1E32:\PK\³\…
+1E33:\LK\³\…
+1E34:\PK\H\ä\…
+1E35:\LK\H\ä\…
+1E36:\PL\³\…
+1E37:\LL\³\…
+1E38:\PL\³\…\i\å
+1E39:\LL\³\…\i\å
+1E3A:\PL\H\ä\…
+1E3B:\LL\H\ä\…
+1E3C:\PL\ˆ\…
+1E3D:\LL\ˆ\…
+1E3E:\PM\H\Ü
+1E3F:\LM\H\Ü
+1E40:\PM\³\p
+1E41:\LM\³\p
+1E42:\PM\³\…
+1E43:\LM\³\…
+1E44:\PN\³\p
+1E45:\LN\³\p
+1E46:\PN\³\…
+1E47:\LN\³\…
+1E48:\PN\H\ä\…
+1E49:\LN\H\ä\…
+1E4A:\PN\ˆ\…
+1E4B:\LN\ˆ\…
+1E4C:\PO\H\æ\i\Ü
+1E4D:\LO\H\æ\i\Ü
+1E4E:\PO\H\æ\iDIAERESIS
+1E4F:\LO\H\æ\iDIAERESIS
+1E50:\PO\H\å\iGRAVE
+1E51:\LO\H\å\iGRAVE
+1E52:\PO\H\å\i\Ü
+1E53:\LO\H\å\i\Ü
+1E54:\PP\H\Ü
+1E55:\LP\H\Ü
+1E56:\PP\³\p
+1E57:\LP\³\p
+1E58:\PR\³\p
+1E59:\LR\³\p
+1E5A:\PR\³\…
+1E5B:\LR\³\…
+1E5C:\PR\³\…\i\å
+1E5D:\LR\³\…\i\å
+1E5E:\PR\H\ä\…
+1E5F:\LR\H\ä\…
+1E60:\PS\³\p
+1E61:\LS\³\p
+1E62:\PS\³\…
+1E63:\LS\³\…
+1E64:\PS\H\Ü\iDOT\p
+1E65:\LS\H\Ü\iDOT\p
+1E66:\PS\û\iDOT\p
+1E67:\LS\û\iDOT\p
+1E68:\PS\³\…\iDOT\p
+1E69:\LS\³\…\iDOT\p
+1E6A:\PT\³\p
+1E6B:\LT\³\p
+1E6C:\PT\³\…
+1E6D:\LT\³\…
+1E6E:\PT\H\ä\…
+1E6F:\LT\H\ä\…
+1E70:\PT\ˆ\…
+1E71:\LT\ˆ\…
+1E72:\PU\ž\…
+1E73:\LU\ž\…
+1E74:\PU\H\æ\…
+1E75:\LU\H\æ\…
+1E76:\PU\ˆ\…
+1E77:\LU\ˆ\…
+1E78:\PU\H\æ\i\Ü
+1E79:\LU\H\æ\i\Ü
+1E7A:\PU\H\å\iDIAERESIS
+1E7B:\LU\H\å\iDIAERESIS
+1E7C:\PV\H\æ
+1E7D:\LV\H\æ
+1E7E:\PV\³\…
+1E7F:\LV\³\…
+1E80:\PW\HGRAVE
+1E81:\LW\HGRAVE
+1E82:\PW\H\Ü
+1E83:\LW\H\Ü
+1E84:\PW\ž
+1E85:\LW\ž
+1E86:\PW\³\p
+1E87:\LW\³\p
+1E88:\PW\³\…
+1E89:\LW\³\…
+1E8A:\PX\³\p
+1E8B:\LX\³\p
+1E8C:\PX\ž
+1E8D:\LX\ž
+1E8E:\PY\³\p
+1E8F:\LY\³\p
+1E90:\PZ\ˆ
+1E91:\LZ\ˆ
+1E92:\PZ\³\…
+1E93:\LZ\³\…
+1E94:\PZ\H\ä\…
+1E95:\LZ\H\ä\…
+1E96:\LH\H\ä\…
+1E97:\LT\ž
+1E98:\LW\HR\ô\p
+1E99:\LY\HR\ô\p
+1E9A:\LA\H\ùHALF R\ô
+1E9B:\LLONG S\³\p
+1EA0:\PA\³\…
+1EA1:\LA\³\…
+1EA2:\PA\í\p
+1EA3:\LA\í\p
+1EA4:\PA\ˆ\i\Ü
+1EA5:\LA\ˆ\i\Ü
+1EA6:\PA\ˆ\iGRAVE
+1EA7:\LA\ˆ\iGRAVE
+1EA8:\PA\ˆ\iHOOK\p
+1EA9:\LA\ˆ\iHOOK\p
+1EAA:\PA\ˆ\i\æ
+1EAB:\LA\ˆ\i\æ
+1EAC:\PA\ˆ\iDOT\…
+1EAD:\LA\ˆ\iDOT\…
+1EAE:\PA\HBREVE\i\Ü
+1EAF:\LA\HBREVE\i\Ü
+1EB0:\PA\HBREVE\iGRAVE
+1EB1:\LA\HBREVE\iGRAVE
+1EB2:\PA\HBREVE\iHOOK\p
+1EB3:\LA\HBREVE\iHOOK\p
+1EB4:\PA\HBREVE\i\æ
+1EB5:\LA\HBREVE\i\æ
+1EB6:\PA\HBREVE\iDOT\…
+1EB7:\LA\HBREVE\iDOT\…
+1EB8:\PE\³\…
+1EB9:\LE\³\…
+1EBA:\PE\í\p
+1EBB:\LE\í\p
+1EBC:\PE\H\æ
+1EBD:\LE\H\æ
+1EBE:\PE\ˆ\i\Ü
+1EBF:\LE\ˆ\i\Ü
+1EC0:\PE\ˆ\iGRAVE
+1EC1:\LE\ˆ\iGRAVE
+1EC2:\PE\ˆ\iHOOK\p
+1EC3:\LE\ˆ\iHOOK\p
+1EC4:\PE\ˆ\i\æ
+1EC5:\LE\ˆ\i\æ
+1EC6:\PE\ˆ\iDOT\…
+1EC7:\LE\ˆ\iDOT\…
+1EC8:\PI\í\p
+1EC9:\LI\í\p
+1ECA:\PI\³\…
+1ECB:\LI\³\…
+1ECC:\PO\³\…
+1ECD:\LO\³\…
+1ECE:\PO\í\p
+1ECF:\LO\í\p
+1ED0:\PO\ˆ\i\Ü
+1ED1:\LO\ˆ\i\Ü
+1ED2:\PO\ˆ\iGRAVE
+1ED3:\LO\ˆ\iGRAVE
+1ED4:\PO\ˆ\iHOOK\p
+1ED5:\LO\ˆ\iHOOK\p
+1ED6:\PO\ˆ\i\æ
+1ED7:\LO\ˆ\i\æ
+1ED8:\PO\ˆ\iDOT\…
+1ED9:\LO\ˆ\iDOT\…
+1EDA:\PO\HHORN\i\Ü
+1EDB:\LO\HHORN\i\Ü
+1EDC:\PO\HHORN\iGRAVE
+1EDD:\LO\HHORN\iGRAVE
+1EDE:\PO\HHORN\iHOOK\p
+1EDF:\LO\HHORN\iHOOK\p
+1EE0:\PO\HHORN\i\æ
+1EE1:\LO\HHORN\i\æ
+1EE2:\PO\HHORN\iDOT\…
+1EE3:\LO\HHORN\iDOT\…
+1EE4:\PU\³\…
+1EE5:\LU\³\…
+1EE6:\PU\í\p
+1EE7:\LU\í\p
+1EE8:\PU\HHORN\i\Ü
+1EE9:\LU\HHORN\i\Ü
+1EEA:\PU\HHORN\iGRAVE
+1EEB:\LU\HHORN\iGRAVE
+1EEC:\PU\HHORN\iHOOK\p
+1EED:\LU\HHORN\iHOOK\p
+1EEE:\PU\HHORN\i\æ
+1EEF:\LU\HHORN\i\æ
+1EF0:\PU\HHORN\iDOT\…
+1EF1:\LU\HHORN\iDOT\…
+1EF2:\PY\HGRAVE
+1EF3:\LY\HGRAVE
+1EF4:\PY\³\…
+1EF5:\LY\³\…
+1EF6:\PY\í\p
+1EF7:\LY\í\p
+1EF8:\PY\H\æ
+1EF9:\LY\H\æ
+1F00:\y\þ\HPSILI
+1F01:\y\þ\HDASIA
+1F02:\y\þ\·VARIA
+1F03:\y\þ\±VARIA
+1F04:\y\þ\·OXIA
+1F05:\y\þ\±OXIA
+1F06:\y\þ\·\´
+1F07:\y\þ\±\´
+1F08:\9\þ\HPSILI
+1F09:\9\þ\HDASIA
+1F0A:\9\þ\·VARIA
+1F0B:\9\þ\±VARIA
+1F0C:\9\þ\·OXIA
+1F0D:\9\þ\±OXIA
+1F0E:\9\þ\·\´
+1F0F:\9\þ\±\´
+1F10:\yE\É\HPSILI
+1F11:\yE\É\HDASIA
+1F12:\yE\É\·VARIA
+1F13:\yE\É\±VARIA
+1F14:\yE\É\·OXIA
+1F15:\yE\É\±OXIA
+1F18:\9E\É\HPSILI
+1F19:\9E\É\HDASIA
+1F1A:\9E\É\·VARIA
+1F1B:\9E\É\±VARIA
+1F1C:\9E\É\·OXIA
+1F1D:\9E\É\±OXIA
+1F20:\yETA\HPSILI
+1F21:\yETA\HDASIA
+1F22:\yETA\·VARIA
+1F23:\yETA\±VARIA
+1F24:\yETA\·OXIA
+1F25:\yETA\±OXIA
+1F26:\yETA\·\´
+1F27:\yETA\±\´
+1F28:\9ETA\HPSILI
+1F29:\9ETA\HDASIA
+1F2A:\9ETA\·VARIA
+1F2B:\9ETA\±VARIA
+1F2C:\9ETA\·OXIA
+1F2D:\9ETA\±OXIA
+1F2E:\9ETA\·\´
+1F2F:\9ETA\±\´
+1F30:\yIOTA\HPSILI
+1F31:\yIOTA\HDASIA
+1F32:\yIOTA\·VARIA
+1F33:\yIOTA\±VARIA
+1F34:\yIOTA\·OXIA
+1F35:\yIOTA\±OXIA
+1F36:\yIOTA\·\´
+1F37:\yIOTA\±\´
+1F38:\9IOTA\HPSILI
+1F39:\9IOTA\HDASIA
+1F3A:\9IOTA\·VARIA
+1F3B:\9IOTA\±VARIA
+1F3C:\9IOTA\·OXIA
+1F3D:\9IOTA\±OXIA
+1F3E:\9IOTA\·\´
+1F3F:\9IOTA\±\´
+1F40:\yOMICRON\HPSILI
+1F41:\yOMICRON\HDASIA
+1F42:\yOMICRON\·VARIA
+1F43:\yOMICRON\±VARIA
+1F44:\yOMICRON\·OXIA
+1F45:\yOMICRON\±OXIA
+1F48:\9OMICRON\HPSILI
+1F49:\9OMICRON\HDASIA
+1F4A:\9OMICRON\·VARIA
+1F4B:\9OMICRON\±VARIA
+1F4C:\9OMICRON\·OXIA
+1F4D:\9OMICRON\±OXIA
+1F50:\yU\É\HPSILI
+1F51:\yU\É\HDASIA
+1F52:\yU\É\·VARIA
+1F53:\yU\É\±VARIA
+1F54:\yU\É\·OXIA
+1F55:\yU\É\±OXIA
+1F56:\yU\É\·\´
+1F57:\yU\É\±\´
+1F59:\9U\É\HDASIA
+1F5B:\9U\É\±VARIA
+1F5D:\9U\É\±OXIA
+1F5F:\9U\É\±\´
+1F60:\y\ü\HPSILI
+1F61:\y\ü\HDASIA
+1F62:\y\ü\·VARIA
+1F63:\y\ü\±VARIA
+1F64:\y\ü\·OXIA
+1F65:\y\ü\±OXIA
+1F66:\y\ü\·\´
+1F67:\y\ü\±\´
+1F68:\9\ü\HPSILI
+1F69:\9\ü\HDASIA
+1F6A:\9\ü\·VARIA
+1F6B:\9\ü\±VARIA
+1F6C:\9\ü\·OXIA
+1F6D:\9\ü\±OXIA
+1F6E:\9\ü\·\´
+1F6F:\9\ü\±\´
+1F70:\y\þ\HVARIA
+1F71:\y\þ\HOXIA
+1F72:\yE\É\HVARIA
+1F73:\yE\É\HOXIA
+1F74:\yETA\HVARIA
+1F75:\yETA\HOXIA
+1F76:\yIOTA\HVARIA
+1F77:\yIOTA\HOXIA
+1F78:\yOMICRON\HVARIA
+1F79:\yOMICRON\HOXIA
+1F7A:\yU\É\HVARIA
+1F7B:\yU\É\HOXIA
+1F7C:\y\ü\HVARIA
+1F7D:\y\ü\HOXIA
+1F80:\y\þ\·YPO\œ
+1F81:\y\þ\±YPO\œ
+1F82:\y\þ\·VARIA\iYPO\œ
+1F83:\y\þ\±VARIA\iYPO\œ
+1F84:\y\þ\·OXIA\iYPO\œ
+1F85:\y\þ\±OXIA\iYPO\œ
+1F86:\y\þ\·\´\iYPO\œ
+1F87:\y\þ\±\´\iYPO\œ
+1F88:\9\þ\·PROS\œ
+1F89:\9\þ\±PROS\œ
+1F8A:\9\þ\·VARIA\iPROS\œ
+1F8B:\9\þ\±VARIA\iPROS\œ
+1F8C:\9\þ\·OXIA\iPROS\œ
+1F8D:\9\þ\±OXIA\iPROS\œ
+1F8E:\9\þ\·\´\iPROS\œ
+1F8F:\9\þ\±\´\iPROS\œ
+1F90:\yETA\·YPO\œ
+1F91:\yETA\±YPO\œ
+1F92:\yETA\·VARIA\iYPO\œ
+1F93:\yETA\±VARIA\iYPO\œ
+1F94:\yETA\·OXIA\iYPO\œ
+1F95:\yETA\±OXIA\iYPO\œ
+1F96:\yETA\·\´\iYPO\œ
+1F97:\yETA\±\´\iYPO\œ
+1F98:\9ETA\·PROS\œ
+1F99:\9ETA\±PROS\œ
+1F9A:\9ETA\·VARIA\iPROS\œ
+1F9B:\9ETA\±VARIA\iPROS\œ
+1F9C:\9ETA\·OXIA\iPROS\œ
+1F9D:\9ETA\±OXIA\iPROS\œ
+1F9E:\9ETA\·\´\iPROS\œ
+1F9F:\9ETA\±\´\iPROS\œ
+1FA0:\y\ü\·YPO\œ
+1FA1:\y\ü\±YPO\œ
+1FA2:\y\ü\·VARIA\iYPO\œ
+1FA3:\y\ü\±VARIA\iYPO\œ
+1FA4:\y\ü\·OXIA\iYPO\œ
+1FA5:\y\ü\±OXIA\iYPO\œ
+1FA6:\y\ü\·\´\iYPO\œ
+1FA7:\y\ü\±\´\iYPO\œ
+1FA8:\9\ü\·PROS\œ
+1FA9:\9\ü\±PROS\œ
+1FAA:\9\ü\·VARIA\iPROS\œ
+1FAB:\9\ü\±VARIA\iPROS\œ
+1FAC:\9\ü\·OXIA\iPROS\œ
+1FAD:\9\ü\±OXIA\iPROS\œ
+1FAE:\9\ü\·\´\iPROS\œ
+1FAF:\9\ü\±\´\iPROS\œ
+1FB0:\y\þ\HVRACHY
+1FB1:\y\þ\H\å
+1FB2:\y\þ\HVARIA\iYPO\œ
+1FB3:\y\þ\HYPO\œ
+1FB4:\y\þ\HOXIA\iYPO\œ
+1FB6:\y\þ\H\´
+1FB7:\y\þ\H\´\iYPO\œ
+1FB8:\9\þ\HVRACHY
+1FB9:\9\þ\H\å
+1FBA:\9\þ\HVARIA
+1FBB:\9\þ\HOXIA
+1FBC:\9\þ\HPROS\œ
+1FBD:GREEK KORONIS
+1FBE:GREEK PROS\œ
+1FBF:GREEK PSILI
+1FC0:GREEK \´
+1FC1:GREEK DIALYTIKA\i\´
+1FC2:\yETA\HVARIA\iYPO\œ
+1FC3:\yETA\HYPO\œ
+1FC4:\yETA\HOXIA\iYPO\œ
+1FC6:\yETA\H\´
+1FC7:\yETA\H\´\iYPO\œ
+1FC8:\9E\É\HVARIA
+1FC9:\9E\É\HOXIA
+1FCA:\9ETA\HVARIA
+1FCB:\9ETA\HOXIA
+1FCC:\9ETA\HPROS\œ
+1FCD:GREEK PSILI\iVARIA
+1FCE:GREEK PSILI\iOXIA
+1FCF:GREEK PSILI\i\´
+1FD0:\yIOTA\HVRACHY
+1FD1:\yIOTA\H\å
+1FD2:\yIOTA\HDIALYTIKA\iVARIA
+1FD3:\yIOTA\HDIALYTIKA\iOXIA
+1FD6:\yIOTA\H\´
+1FD7:\yIOTA\HDIALYTIKA\i\´
+1FD8:\9IOTA\HVRACHY
+1FD9:\9IOTA\H\å
+1FDA:\9IOTA\HVARIA
+1FDB:\9IOTA\HOXIA
+1FDD:GREEK DASIA\iVARIA
+1FDE:GREEK DASIA\iOXIA
+1FDF:GREEK DASIA\i\´
+1FE0:\yU\É\HVRACHY
+1FE1:\yU\É\H\å
+1FE2:\yU\É\HDIALYTIKA\iVARIA
+1FE3:\yU\É\HDIALYTIKA\iOXIA
+1FE4:\yRHO\HPSILI
+1FE5:\yRHO\HDASIA
+1FE6:\yU\É\H\´
+1FE7:\yU\É\HDIALYTIKA\i\´
+1FE8:\9U\É\HVRACHY
+1FE9:\9U\É\H\å
+1FEA:\9U\É\HVARIA
+1FEB:\9U\É\HOXIA
+1FEC:\9RHO\HDASIA
+1FED:GREEK DIALYTIKA\iVARIA
+1FEE:GREEK DIALYTIKA\iOXIA
+1FEF:GREEK VARIA
+1FF2:\y\ü\HVARIA\iYPO\œ
+1FF3:\y\ü\HYPO\œ
+1FF4:\y\ü\HOXIA\iYPO\œ
+1FF6:\y\ü\H\´
+1FF7:\y\ü\H\´\iYPO\œ
+1FF8:\9OMICRON\HVARIA
+1FF9:\9OMICRON\HOXIA
+1FFA:\9\ü\HVARIA
+1FFB:\9\ü\HOXIA
+1FFC:\9\ü\HPROS\œ
+1FFD:GREEK OXIA
+1FFE:GREEK DASIA
+2000:EN QUAD
+2001:EM QUAD
+2002:EN SPACE
+2003:EM SPACE
+2004:THREE-PER-EM SPACE
+2005:FOUR-PER-EM SPACE
+2006:SIX-PER-EM SPACE
+2007:FIGURE SPACE
+2008:PUNCTU\” SPACE
+2009:THIN SPACE
+200A:HAIR SPACE
+200B:ZERO WIDTH SPACE
+200C:ZERO WIDTH NON-JOINER
+200D:ZERO WIDTH JOINER
+200E:\‰-TO-\ùMARK
+200F:\q-TO-\‰\¥
+2010:HYPHEN
+2011:NON-BREAK\ô HYPHEN
+2012:FIGURE DASH
+2013:EN DASH
+2014:EM DASH
+2015:\\ì
+2016:\0 \€ \ä
+2017:\0 LOW \ä
+2018:\‰ S\ôLE QUOT\”\¥
+2019:\ùS\ôLE QUOT\”\¥
+201A:S\ôLE LOW-9 QUOT\”\¥
+201B:S\ôLE HIGH-REVERSED-9 QUOT\”\¥
+201C:\‰ \0 QUOT\”\¥
+201D:\ù\0 QUOT\”\¥
+201E:\0 LOW-9 QUOT\”\¥
+201F:\0 HIGH-REVERSED-9 QUOT\”\¥
+2020:DAGGER
+2021:\0 DAGGER
+2022:BULLET
+2023:TRIANGULAR BULLET
+2024:ONE DOT LEADER
+2025:TWO DOT LEADER
+2026:\ ELLIPSIS
+2027:HYPHEN\” POINT
+2028:\ä SEPARATOR
+2029:PARAGRAPH SEPARATOR
+202A:\‰-TO-\ùEMBEDD\ô
+202B:\q-TO-\‰ EMBEDD\ô
+202C:POP DIRECTION\XATT\ô
+202D:\‰-TO-\ùOVERRIDE
+202E:\q-TO-\‰ OVERRIDE
+202F:NARROW NO-BREAK SPACE
+2030:PER MILLE\‚
+2031:PER TEN THOUSAND\‚
+2032:PRIME
+2033:\0 PRIME
+2034:TRIPLE PRIME
+2035:\öPRIME
+2036:\ö\0 PRIME
+2037:\öTRIPLE PRIME
+2038:CARET
+2039:S\ôLE \‰-\ÄANGLE QUOT\”\¥
+203A:S\ôLE \q-\ÄANGLE QUOT\”\¥
+203B:REFERENCE\¥
+203C:\0 EXCLAM\”\¥
+203D:INTERROBANG
+203E:OVER\ä
+203F:UNDERTIE
+2040:CHARACTER TIE
+2041:CARET INSERTION POINT
+2042:ASTERISM
+2043:HYPHEN BULLET
+2044:FRACTION SLASH
+2045:\‰ \r\–\HQUILL
+2046:\ù\r\–\HQUILL
+2047:\0 QUESTION\¥
+2048:QUESTION EXCLAM\”\¥
+2049:EXCLAM\” QUESTION\¥
+204A:TIRONIAN\‚ ET
+204B:\öPILCROW\‚
+204C:\¬ \‰\Š BULLET
+204D:\¬ \q\Š BULLET
+204E:LOW ASTERISK
+204F:\öSEMICOLON
+2050:CLOSE UP
+2051:TWO ASTERISKS ALIGN\Â\€LY
+2052:COMMERCIAL MINUS\‚
+2057:QUADRUPLE PRIME
+205F:MEDIUM \ESPACE
+2060:WORD JOINER
+2061:FUNCTION APPLIC\”
+2062:INVISIBLE TIMES
+2063:INVISIBLE SEPARATOR
+206A:INHIBIT SYMMETRIC SWAPP\ô
+206B:ACTIVATE SYMMETRIC SWAPP\ô
+206C:INHIBIT \Ê FORM SHAP\ô
+206D:ACTIVATE \Ê FORM SHAP\ô
+206E:N\”AL\hSHAPES
+206F:NOMINAL\hSHAPES
+2070:SUPER\Ž ZERO
+2071:SUPER\Ž \LI
+2074:SUPER\Ž FOUR
+2075:SUPER\Ž FIVE
+2076:SUPER\Ž SIX
+2077:SUPER\Ž SEVEN
+2078:SUPER\Ž E\¼
+2079:SUPER\Ž NINE
+207A:SUPER\Ž PLUS\‚
+207B:SUPER\Ž MINUS
+207C:SUPER\Ž EQUALS\‚
+207D:SUPER\Ž \‰ \ÑS
+207E:SUPER\Ž \ù\ÑS
+207F:SUPER\Ž \LN
+2080:SUB\Ž ZERO
+2081:SUB\Ž ONE
+2082:SUB\Ž TWO
+2083:SUB\Ž THREE
+2084:SUB\Ž FOUR
+2085:SUB\Ž FIVE
+2086:SUB\Ž SIX
+2087:SUB\Ž SEVEN
+2088:SUB\Ž E\¼
+2089:SUB\Ž NINE
+208A:SUB\Ž PLUS\‚
+208B:SUB\Ž MINUS
+208C:SUB\Ž EQUALS\‚
+208D:SUB\Ž \‰ \ÑS
+208E:SUB\Ž \ù\ÑS
+20A0:EURO-CURRENCY\‚
+20A1:COLON\‚
+20A2:CRUZEIRO\‚
+20A3:FRENCH FRANC\‚
+20A4:LIRA\‚
+20A5:MILL\‚
+20A6:NAIRA\‚
+20A7:PESETA\‚
+20A8:RUPEE\‚
+20A9:WON\‚
+20AA:NEW SHEQEL\‚
+20AB:DONG\‚
+20AC:EURO\‚
+20AD:KIP\‚
+20AE:TUGRIK\‚
+20AF:DRACHMA\‚
+20B0:GERMAN PENNY\‚
+20B1:PESO\‚
+20D0:\o\‰ HARPOON\p
+20D1:\o\ùHARPOON\p
+20D2:\oLONG \€ \ä OVERLAY
+20D3:\oSHORT \€ \ä OVERLAY
+20D4:\oANTICLOCKWISE\u\p
+20D5:\oCLOCKWISE\u\p
+20D6:\o\‰\u\p
+20D7:\o\q\u\p
+20D8:\oR\ô OVERLAY
+20D9:\oCLOCKWISE R\ô OVERLAY
+20DA:\oANTICLOCKWISE R\ô OVERLAY
+20DB:\oTHREE DOTS\p
+20DC:\oFOUR DOTS\p
+20DD:\oENCLOS\ô \Ð
+20DE:\oENCLOS\ô \ý
+20DF:\oENCLOS\ô DIAMOND
+20E0:\oENCLOS\ô \Ð BACKSLASH
+20E1:\o\‰ \q\u\p
+20E2:\oENCLOS\ô SCREEN
+20E3:\oENCLOS\ô KEYCAP
+20E4:\oENCLOS\ô UPWARD \Ä\¾
+20E5:\oREVERSE SOLIDUS OVERLAY
+20E6:\o\0 \€ \Á OVERLAY
+20E7:\oANNUITY \
+20E8:\oTRIPLE UNDERDOT
+20E9:\oWIDE BRIDGE\p
+20EA:\o\‰\Š\u OVERLAY
+2100:ACCOUNT OF
+2101:ADDRESS\ÂTO THE SUBJECT
+2102:\¤\ÒC
+2103:DEGREE CELSIUS
+2104:CENTRE \ä \
+2105:CARE OF
+2106:CADA UNA
+2107:EULER CONSTANT
+2108:SCRUPLE
+2109:DEGREE FAHRENHEIT
+210A:\Ž\ÇG
+210B:\Ž\ÒH
+210C:\¬-LETTER\ÒH
+210D:\¤\ÒH
+210E:PLANCK CONSTANT
+210F:PLANCK CONSTANT OVER TWO PI
+2110:\Ž\ÒI
+2111:\¬-LETTER\ÒI
+2112:\Ž\ÒL
+2113:\Ž\ÇL
+2114:L B\ì \
+2115:\¤\ÒN
+2116:NUMERO\‚
+2117:SOUND RECORD\ô COPY\q
+2118:\Ž\ÒP
+2119:\¤\ÒP
+211A:\¤\ÒQ
+211B:\Ž\ÒR
+211C:\¬-LETTER\ÒR
+211D:\¤\ÒR
+211E:PRE\ŽION TAKE
+211F:RESPONSE
+2120:SERVICE\¥
+2121:TELEPHONE\‚
+2122:TRADE\¥\‚
+2123:VERSICLE
+2124:\¤\ÒZ
+2125:OUNCE\‚
+2126:OHM\‚
+2127:INVERT\ÂOHM\‚
+2128:\¬-LETTER\ÒZ
+2129:TURN\Â\yIOTA
+212A:KELVIN\‚
+212B:ANGSTROM\‚
+212C:\Ž\ÒB
+212D:\¬-LETTER\ÒC
+212E:ESTIMAT\Â\
+212F:\Ž\ÇE
+2130:\Ž\ÒE
+2131:\Ž\ÒF
+2132:TURNED\ÒF
+2133:\Ž\ÒM
+2134:\Ž\ÇO
+2135:ALEF \
+2136:BET \
+2137:GIMEL \
+2138:DALET \
+2139:INFORM\” SOURCE
+213A:ROTATED\ÒQ
+213D:\¤\ÇGAMMA
+213E:\¤\ÒGAMMA
+213F:\¤\ÒPI
+2140:\¤ N-ARY SUMM\”
+2141:TURN\ÂSANS-SERIF\ÒG
+2142:TURN\ÂSANS-SERIF\ÒL
+2143:\öSANS-SERIF\ÒL
+2144:TURN\ÂSANS-SERIF\ÒY
+2145:\¤ \›D
+2146:\¤ \—D
+2147:\¤ \—E
+2148:\¤ \—I
+2149:\¤ \—J
+214A:PROPERTY \ä
+214B:TURN\ÂAMPERSAND
+2153:\úONE THIRD
+2154:\úTWO THIRDS
+2155:\úONE FIFTH
+2156:\úTWO FIFTHS
+2157:\úTHREE FIFTHS
+2158:\úFOUR FIFTHS
+2159:\úONE SIXTH
+215A:\úFIVE SIXTHS
+215B:\úONE E\¼H
+215C:\úTHREE E\¼HS
+215D:\úFIVE E\¼HS
+215E:\úSEVEN E\¼HS
+215F:FRACTION NUMERATOR ONE
+2160:\²ONE
+2161:\²TWO
+2162:\²THREE
+2163:\²FOUR
+2164:\²FIVE
+2165:\²SIX
+2166:\²SEVEN
+2167:\²E\¼
+2168:\²NINE
+2169:\²TEN
+216A:\²ELEVEN
+216B:\²TWELVE
+216C:\²FIFTY
+216D:\²ONE HUNDRED
+216E:\²FIVE HUNDRED
+216F:\²ONE THOUSAND
+2170:\§\²ONE
+2171:\§\²TWO
+2172:\§\²THREE
+2173:\§\²FOUR
+2174:\§\²FIVE
+2175:\§\²SIX
+2176:\§\²SEVEN
+2177:\§\²E\¼
+2178:\§\²NINE
+2179:\§\²TEN
+217A:\§\²ELEVEN
+217B:\§\²TWELVE
+217C:\§\²FIFTY
+217D:\§\²ONE HUNDRED
+217E:\§\²FIVE HUNDRED
+217F:\§\²ONE THOUSAND
+2180:\²ONE THOUSAND C D
+2181:\²FIVE THOUSAND
+2182:\²TEN THOUSAND
+2183:\²\öONE HUNDRED
+2190:\‰\Š\u
+2191:UP\Š\u
+2192:\Ù
+2193:\Ë\Š\u
+2194:\‰ \q\u
+2195:UP \Ë\u
+2196:NORTH WEST\u
+2197:NORTH EAST\u
+2198:SOUTH EAST\u
+2199:SOUTH WEST\u
+219A:\‰\Š\u\H\Á
+219B:\Ù\H\Á
+219C:\‰\Š WAVE\u
+219D:\q\Š WAVE\u
+219E:\‰\Š TWO HEADED\u
+219F:UP\Š TWO HEADED\u
+21A0:\q\Š TWO HEADED\u
+21A1:\Ë\Š TWO HEADED\u
+21A2:\‰\Š\u\HTAIL
+21A3:\Ù\HTAIL
+21A4:\‰\Š\u FROM\ì
+21A5:UP\Š\u FROM\ì
+21A6:\Ù FROM\ì
+21A7:\Ë\Š\u FROM\ì
+21A8:UP \Ë\u\HBASE
+21A9:\‰\Š\u\í
+21AA:\Ù\í
+21AB:\‰\Š\u\HLOOP
+21AC:\Ù\HLOOP
+21AD:\‰ \ùWAVE\u
+21AE:\‰ \q\u\H\Á
+21AF:\Ë\Š ZIGZAG\u
+21B0:UP\Š\u\HTIP \‰\Š
+21B1:UP\Š\u\HTIP \q\Š
+21B2:\Ë\Š\u\HTIP \‰\Š
+21B3:\Ë\Š\u\HTIP \q\Š
+21B4:\Ù\HCORNER \Ë\Š
+21B5:\Ë\Š\u\HCORNER \‰\Š
+21B6:ANTICLOCKWISE TOP SEMI\Ð\u
+21B7:CLOCKWISE TOP SEMI\Ð\u
+21B8:NORTH WEST\u TO LONG\ì
+21B9:\‰\Š\u TO\ì OVER \Ù TO\ì
+21BA:ANTICLOCKWISE OPEN \Ð\u
+21BB:CLOCKWISE OPEN \Ð\u
+21BC:\‰\ƒUP\Š
+21BD:\‰\ƒ\Ë\Š
+21BE:UP\ƒ\q\Š
+21BF:UP\ƒ\‰\Š
+21C0:\q\ƒUP\Š
+21C1:\q\ƒ\Ë\Š
+21C2:\Ë\ƒ\q\Š
+21C3:\Ë\ƒ\‰\Š
+21C4:\Ù OVER \‰\Š\u
+21C5:UP\Š\u \‰\Š OF \Ë\Š\u
+21C6:\‰\Š\u OVER \Ù
+21C7:\‰\Š PAIRED\uS
+21C8:UP\Š PAIRED\uS
+21C9:\q\Š PAIRED\uS
+21CA:\Ë\Š PAIRED\uS
+21CB:\‰\Š HARPOON OVER \q\Š HARPOON
+21CC:\q\Š HARPOON OVER \‰\Š HARPOON
+21CD:\‰\Š \0\u\H\Á
+21CE:\‰ \ù\0\u\H\Á
+21CF:\q\Š \0\u\H\Á
+21D0:\‰\Š \0\u
+21D1:UP\Š \0\u
+21D2:\q\Š \0\u
+21D3:\Ë\Š \0\u
+21D4:\‰ \ù\0\u
+21D5:UP \Ë \0\u
+21D6:NORTH WEST \0\u
+21D7:NORTH EAST \0\u
+21D8:SOUTH EAST \0\u
+21D9:SOUTH WEST \0\u
+21DA:\‰\Š TRIPLE\u
+21DB:\q\Š TRIPLE\u
+21DC:\‰\Š SQUIGGLE\u
+21DD:\q\Š SQUIGGLE\u
+21DE:UP\Š\u\H\0 \Á
+21DF:\Ë\Š\u\H\0 \Á
+21E0:\‰\Š DASHED\u
+21E1:UP\Š DASHED\u
+21E2:\q\Š DASHED\u
+21E3:\Ë\Š DASHED\u
+21E4:\‰\Š\u TO\ì
+21E5:\Ù TO\ì
+21E6:\‰\Š WHITE\u
+21E7:UP\Š WHITE\u
+21E8:\q\Š WHITE\u
+21E9:\Ë\Š WHITE\u
+21EA:UP\Š WHITE\u FROM\ì
+21EB:UP\Š WHITE\u ON PEDESTAL
+21EC:UP\Š WHITE\u ON PEDESTAL\H\\ì
+21ED:UP\Š WHITE\u ON PEDESTAL\H\€\ì
+21EE:UP\Š \¦\0\u
+21EF:UP\Š \¦\0\u ON PEDESTAL
+21F0:\q\Š WHITE\u FROM WALL
+21F1:NORTH WEST\u TO CORNER
+21F2:SOUTH EAST\u TO CORNER
+21F3:UP \Ë WHITE\u
+21F4:\q\u WITH\Ç\Ð
+21F5:\Ë\Š\u \‰\Š OF UP\Š\u
+21F6:THREE \ÙS
+21F7:\‰\Š\u\H\€ \Á
+21F8:\Ù\H\€ \Á
+21F9:\‰ \q\u\H\€ \Á
+21FA:\‰\Š\u\H\0 \€ \Á
+21FB:\Ù\H\0 \€ \Á
+21FC:\‰ \q\u\H\0 \€ \Á
+21FD:\‰\Š OPEN-HEADED\u
+21FE:\q\Š OPEN-HEADED\u
+21FF:\‰ \ùOPEN-HEADED\u
+2200:FOR ALL
+2201:COMPLEMENT
+2202:PARTIAL DIFFERENTIAL
+2203:THERE EXISTS
+2204:THERE DOES NOT EXIST
+2205:EMPTY SET
+2206:INCREMENT
+2207:NABLA
+2208:ELEMENT OF
+2209:NOT AN ELEMENT OF
+220A:\§ELEMENT OF
+220B:CONTAINS AS MEMBER
+220C:DOES NOT CONTAIN AS MEMBER
+220D:\§CONTAINS AS MEMBER
+220E:END OF PROOF
+220F:N-ARY PRODUCT
+2210:N-ARY COPRODUCT
+2211:N-ARY SUMM\”
+2212:MINUS\‚
+2213:MINUS-OR-PLUS\‚
+2214:DOT PLUS
+2215:DIVISION SLASH
+2216:SET MINUS
+2217:ASTERISK\Ú
+2218:R\ô\Ú
+2219:BULLET\Ú
+221A:\rROOT
+221B:CUBE ROOT
+221C:FOURTH ROOT
+221D:PROPORTIONAL TO
+221E:INFINITY
+221F:\ùANGLE
+2220:ANGLE
+2221:MEASUR\ÂANGLE
+2222:SPHERICAL ANGLE
+2223:DIVIDES
+2224:DOES NOT DIVIDE
+2225:PARALLEL TO
+2226:NOT PARALLEL TO
+2227:LOGICAL AND
+2228:LOGICAL OR
+2229:INTERSECTION
+222A:UNION
+222B:INTEGRAL
+222C:\0 INTEGRAL
+222D:TRIPLE INTEGRAL
+222E:CONTOUR INTEGRAL
+222F:SURFACE INTEGRAL
+2230:VOLUME INTEGRAL
+2231:CLOCKWISE INTEGRAL
+2232:CLOCKWISE CONTOUR INTEGRAL
+2233:ANTICLOCKWISE CONTOUR INTEGRAL
+2234:THEREFORE
+2235:BECAUSE
+2236:RATIO
+2237:PROPORTION
+2238:DOT MINUS
+2239:EXCESS
+223A:GEOMETRIC PROPORTION
+223B:HOMOTHETIC
+223C:\æ\Ú
+223D:\ö\æ
+223E:INVERT\ÂLAZY S
+223F:SINE WAVE
+2240:WREATH PRODUCT
+2241:NOT \æ
+2242:MINUS \æ
+2243:ASYMPTOTICALLY\‘
+2244:NOT ASYMPTOTICALLY\‘
+2245:APPROXIMATELY\‘
+2246:APPROXIMATELY BUT NOT ACTUALLY\‘
+2247:NEITHER APPROXIMATELY NOR ACTUALLY\‘
+2248:ALMOST\‘
+2249:NOT ALMOST\‘
+224A:ALMOST EQUAL OR\‘
+224B:TRIPLE \æ
+224C:ALL\‘
+224D:EQUIVALENT TO
+224E:GEOMETRICALLY EQUIVALENT TO
+224F:DIFFERENCE BETWEEN
+2250:APPROACHES THE LIMIT
+2251:GEOMETRICALLY\‘
+2252:APPROXIMATELY\‘ OR THE IMAGE OF
+2253:IMAGE OF OR APPROXIMATELY\‘
+2254:COLON EQUALS
+2255:EQUALS COLON
+2256:R\ô IN\‘
+2257:R\ô\‘
+2258:CORRESPONDS TO
+2259:ESTIMATES
+225A:EQUIANGULAR TO
+225B:STAR EQUALS
+225C:DELTA\‘
+225D:EQUAL TO BY DEFINITION
+225E:MEASUR\ÂBY
+225F:QUESTIONED\‘
+2260:NOT\‘
+2261:IDENTICAL TO
+2262:NOT IDENTICAL TO
+2263:STRICTLY EQUIVALENT TO
+2264:\µ OR\‘
+2265:\’ OR\‘
+2266:\µ OVER\‘
+2267:\’ OVER\‘
+2268:\µ BUT NOT\‘
+2269:\’ BUT NOT\‘
+226A:MUCH \µ
+226B:MUCH \’
+226C:BETWEEN
+226D:NOT EQUIVALENT TO
+226E:NOT \µ
+226F:NOT \’
+2270:NEITHER \µ NOR\‘
+2271:NEITHER \’ NOR\‘
+2272:\µ OR EQUIVALENT TO
+2273:\’ OR EQUIVALENT TO
+2274:NEITHER \µ NOR EQUIVALENT TO
+2275:NEITHER \’ NOR EQUIVALENT TO
+2276:\µ OR \’
+2277:\’ OR \µ
+2278:NEITHER \µ NOR \’
+2279:NEITHER \’ NOR \µ
+227A:PRECEDES
+227B:SUCCEEDS
+227C:PRECEDES OR\‘
+227D:SUCCEEDS OR\‘
+227E:PRECEDES OR EQUIVALENT TO
+227F:SUCCEEDS OR EQUIVALENT TO
+2280:DOES NOT PRECEDE
+2281:DOES NOT SUCCEED
+2282:SUBSET OF
+2283:SUPERSET OF
+2284:NOT A SUBSET OF
+2285:NOT A SUPERSET OF
+2286:SUBSET OF OR\‘
+2287:SUPERSET OF OR\‘
+2288:NEITHER A SUBSET OF NOR\‘
+2289:NEITHER A SUPERSET OF NOR\‘
+228A:SUBSET OF\HNOT\‘
+228B:SUPERSET OF\HNOT\‘
+228C:MULTISET
+228D:MULTISET MULTIPLIC\”
+228E:MULTISET UNION
+228F:\rIMAGE OF
+2290:\rORIGINAL OF
+2291:\rIMAGE OF OR\‘
+2292:\rORIGINAL OF OR\‘
+2293:\rCAP
+2294:\rCUP
+2295:\cPLUS
+2296:\cMINUS
+2297:\cTIMES
+2298:\cDIVISION SLASH
+2299:\cDOT\Ú
+229A:\cR\ô\Ú
+229B:\cASTERISK\Ú
+229C:\cEQUALS
+229D:\cDASH
+229E:\ýD PLUS
+229F:\ýD MINUS
+22A0:\ýD TIMES
+22A1:\ýD DOT\Ú
+22A2:\ùTACK
+22A3:\‰ TACK
+22A4:\Ë TACK
+22A5:UP TACK
+22A6:ASSERTION
+22A7:MODELS
+22A8:TRUE
+22A9:FORCES
+22AA:TRIPLE \€\ì \ùTURNSTILE
+22AB:\0 \€\ì \0 \ùTURNSTILE
+22AC:DOES NOT PROVE
+22AD:NOT TRUE
+22AE:DOES NOT FORCE
+22AF:NEGAT\Â\0 \€\ì \0 \ùTURNSTILE
+22B0:PRECEDES UNDER REL\”
+22B1:SUCCEEDS UNDER REL\”
+22B2:NORMAL SUBGROUP OF
+22B3:CONTAINS AS NORMAL SUBGROUP
+22B4:NORMAL SUBGROUP OF OR\‘
+22B5:CONTAINS AS NORMAL SUBGROUP OR\‘
+22B6:ORIGINAL OF
+22B7:IMAGE OF
+22B8:MULTIMAP
+22B9:HERMITIAN CONJUGATE MATRIX
+22BA:INTERCALATE
+22BB:XOR
+22BC:NAND
+22BD:NOR
+22BE:\ùANGLE\HARC
+22BF:\ù\¾
+22C0:N-ARY LOGICAL AND
+22C1:N-ARY LOGICAL OR
+22C2:N-ARY INTERSECTION
+22C3:N-ARY UNION
+22C4:DIAMOND\Ú
+22C5:DOT\Ú
+22C6:STAR\Ú
+22C7:DIVISION TIMES
+22C8:BOWTIE
+22C9:\‰ NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA:\ùNORMAL FACTOR SEMIDIRECT PRODUCT
+22CB:\‰ SEMIDIRECT PRODUCT
+22CC:\ùSEMIDIRECT PRODUCT
+22CD:\ö\æ EQUALS
+22CE:CURLY LOGICAL OR
+22CF:CURLY LOGICAL AND
+22D0:\0 SUBSET
+22D1:\0 SUPERSET
+22D2:\0 INTERSECTION
+22D3:\0 UNION
+22D4:PITCHFORK
+22D5:EQUAL\iPARALLEL TO
+22D6:\µ\³
+22D7:\’\³
+22D8:VERY MUCH \µ
+22D9:VERY MUCH \’
+22DA:\µ\‘ OR \’
+22DB:\’\‘ OR \µ
+22DC:EQUAL TO OR \µ
+22DD:EQUAL TO OR \’
+22DE:EQUAL TO OR PRECEDES
+22DF:EQUAL TO OR SUCCEEDS
+22E0:DOES NOT PRECEDE OR EQUAL
+22E1:DOES NOT SUCCE\ÂOR EQUAL
+22E2:NOT \rIMAGE OF OR\‘
+22E3:NOT \rORIGINAL OF OR\‘
+22E4:\rIMAGE OF OR NOT\‘
+22E5:\rORIGINAL OF OR NOT\‘
+22E6:\µ BUT NOT EQUIVALENT TO
+22E7:\’ BUT NOT EQUIVALENT TO
+22E8:PRECEDES BUT NOT EQUIVALENT TO
+22E9:SUCCEEDS BUT NOT EQUIVALENT TO
+22EA:NOT NORMAL SUBGROUP OF
+22EB:DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC:NOT NORMAL SUBGROUP OF OR\‘
+22ED:DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE:\€ ELLIPSIS
+22EF:MID\ä \ ELLIPSIS
+22F0:UP \ùDIAGONAL ELLIPSIS
+22F1:\Ë \ùDIAGONAL ELLIPSIS
+22F2:ELEMENT OF\HLONG \ \Á
+22F3:ELEMENT OF\H\€\ì AT END OF \ \Á
+22F4:\§ELEMENT OF\H\€\ì AT END OF \ \Á
+22F5:ELEMENT OF\³\p
+22F6:ELEMENT OF\HOVERBAR
+22F7:\§ELEMENT OF\HOVERBAR
+22F8:ELEMENT OF\HUNDERBAR
+22F9:ELEMENT OF\HTWO \ \ÁS
+22FA:CONTAINS\HLONG \ \Á
+22FB:CONTAINS\H\€\ì AT END OF \ \Á
+22FC:\§CONTAINS\H\€\ì AT END OF \ \Á
+22FD:CONTAINS\HOVERBAR
+22FE:\§CONTAINS\HOVERBAR
+22FF:Z NOT\” BAG MEMBERSHIP
+2300:DIAMETER\‚
+2301:ELECTRIC\u
+2302:HOUSE
+2303:UP\uHEAD
+2304:\Ë\uHEAD
+2305:PROJECTIVE
+2306:PERSPECTIVE
+2307:WAVY \ä
+2308:\‰ CEIL\ô
+2309:\ùCEIL\ô
+230A:\‰ FLOOR
+230B:\ùFLOOR
+230C:BOTTOM \ùCROP
+230D:BOTTOM \‰ CROP
+230E:TOP \ùCROP
+230F:TOP \‰ CROP
+2310:\öNOT\‚
+2311:\rLOZENGE
+2312:ARC
+2313:SEGMENT
+2314:SECTOR
+2315:TELEPHONE RECORDER
+2316:POSITION INDICATOR
+2317:VIEWDATA \ý
+2318:PLACE OF INTEREST\‚
+2319:TURN\ÂNOT\‚
+231A:WATCH
+231B:HOURGLASS
+231C:TOP \‰ CORNER
+231D:TOP \ùCORNER
+231E:BOTTOM \‰ CORNER
+231F:BOTTOM \ùCORNER
+2320:TOP HALF INTEGRAL
+2321:BOTTOM HALF INTEGRAL
+2322:FROWN
+2323:SMILE
+2324:UP\uHEAD BETWEEN TWO \\ìS
+2325:OPTION KEY
+2326:ERASE TO THE \q
+2327:X IN A RECTANGLE BOX
+2328:KEYBOARD
+2329:\‰-\ÄANGLE \–
+232A:\q-\ÄANGLE \–
+232B:ERASE TO THE \‰
+232C:BENZENE R\ô
+232D:CYLINDRICITY
+232E:ALL AROUND-PROFILE
+232F:SYMMETRY
+2330:TOTAL RUNOUT
+2331:DIMENSION ORIGIN
+2332:CONICAL TAPER
+2333:SLOPE
+2334:COUNTERBORE
+2335:COUNTERSINK
+2336:\lI-BEAM
+2337:\lSQUISH QUAD
+2338:\lQUAD EQUAL
+2339:\lQUAD DIVIDE
+233A:\lQUAD DIAMOND
+233B:\lQUAD JOT
+233C:\lQUAD \Ð
+233D:\l\Ð STILE
+233E:\l\Ð JOT
+233F:\lSLASH\ì
+2340:\lBACKSLASH\ì
+2341:\lQUAD SLASH
+2342:\lQUAD BACKSLASH
+2343:\lQUAD \µ
+2344:\lQUAD \’
+2345:\l\‰\Š VANE
+2346:\l\q\Š VANE
+2347:\lQUAD \‰\Š\u
+2348:\lQUAD \Ù
+2349:\l\Ð BACKSLASH
+234A:\l\Ë TACK UNDERBAR
+234B:\lDELTA STILE
+234C:\lQUAD \Ë CARET
+234D:\lQUAD DELTA
+234E:\l\Ë TACK JOT
+234F:\lUP\Š VANE
+2350:\lQUAD UP\Š\u
+2351:\lUP TACK OVERBAR
+2352:\lDEL STILE
+2353:\lQUAD UP CARET
+2354:\lQUAD DEL
+2355:\lUP TACK JOT
+2356:\l\Ë\Š VANE
+2357:\lQUAD \Ë\Š\u
+2358:\lQUOTE UNDERBAR
+2359:\lDELTA UNDERBAR
+235A:\lDIAMOND UNDERBAR
+235B:\lJOT UNDERBAR
+235C:\l\Ð UNDERBAR
+235D:\lUP SHOE JOT
+235E:\lQUOTE QUAD
+235F:\l\Ð STAR
+2360:\lQUAD COLON
+2361:\lUP TACK DIAERESIS
+2362:\lDEL DIAERESIS
+2363:\lSTAR DIAERESIS
+2364:\lJOT DIAERESIS
+2365:\l\Ð DIAERESIS
+2366:\l\Ë SHOE STILE
+2367:\l\‰ SHOE STILE
+2368:\l\æ DIAERESIS
+2369:\l\’ DIAERESIS
+236A:\lCOMMA\ì
+236B:\lDEL \æ
+236C:\lZILDE
+236D:\lSTILE \æ
+236E:\lSEMICOLON UNDERBAR
+236F:\lQUAD NOT EQUAL
+2370:\lQUAD QUESTION
+2371:\l\Ë CARET \æ
+2372:\lUP CARET \æ
+2373:\lIOTA
+2374:\lRHO
+2375:\l\ü
+2376:\l\þ UNDERBAR
+2377:\lE\É UNDERBAR
+2378:\lIOTA UNDERBAR
+2379:\l\ü UNDERBAR
+237A:\l\þ
+237B:NOT CHECK\¥
+237C:\ùANGLE\H\Ë\Š ZIGZAG\u
+237D:SHOULDER\ÂOPEN BOX
+237E:BELL \
+237F:\€ \ä\HMIDDLE DOT
+2380:INSERTION \
+2381:CONTINUOUS UNDER\ä \
+2382:DISCONTINUOUS UNDER\ä \
+2383:EMPHASIS \
+2384:COMPOSITION \
+2385:\¦\rWITH CENTRE \€ \ä
+2386:ENTER \
+2387:ALTERNATIVE KEY \
+2388:HELM \
+2389:\c\\ì\HNOTCH
+238A:\c\¾ \Ë
+238B:BROKEN \Ð\HNORTHWEST\u
+238C:UNDO \
+238D:MONOSTABLE \
+238E:HYSTERESIS \
+238F:OPEN-CIRCUIT-OUTPUT H-TYPE \
+2390:OPEN-CIRCUIT-OUTPUT L-TYPE \
+2391:PASSIVE-PULL-\Ë-OUTPUT \
+2392:PASSIVE-PULL-UP-OUTPUT \
+2393:DIRECT CURRENT \ FORM TWO
+2394:SOFTWARE-FUNCTION \
+2395:\lQUAD
+2396:DECIMAL SEPARATOR KEY \
+2397:PREVIOUS PAGE
+2398:NEXT PAGE
+2399:PRINT SCREEN \
+239A:CLEAR SCREEN \
+239B:\‰ \ÑS \÷HOOK
+239C:\‰ \ÑS EXTENSION
+239D:\‰ \ÑS \ïHOOK
+239E:\ù\ÑS \÷HOOK
+239F:\ù\ÑS EXTENSION
+23A0:\ù\ÑS \ïHOOK
+23A1:\‰ \r\– \÷CORNER
+23A2:\‰ \r\– EXTENSION
+23A3:\‰ \r\– \ïCORNER
+23A4:\ù\r\– \÷CORNER
+23A5:\ù\r\– EXTENSION
+23A6:\ù\r\– \ïCORNER
+23A7:\‰ CURLY \– \÷HOOK
+23A8:\‰ CURLY \– MIDDLE PIECE
+23A9:\‰ CURLY \– \ïHOOK
+23AA:CURLY \– EXTENSION
+23AB:\ùCURLY \– \÷HOOK
+23AC:\ùCURLY \– MIDDLE PIECE
+23AD:\ùCURLY \– \ïHOOK
+23AE:INTEGRAL EXTENSION
+23AF:\ \ä EXTENSION
+23B0:\÷\‰ OR \ï\ùCURLY \– SECTION
+23B1:\÷\ùOR \ï\‰ CURLY \– SECTION
+23B2:SUMM\” TOP
+23B3:SUMM\” BOTTOM
+23B4:TOP \r\–
+23B5:BOTTOM \r\–
+23B6:BOTTOM \r\– OVER TOP \r\–
+23B7:RADICAL \ BOTTOM
+23B8:\‰ \€ BOX \ä
+23B9:\ù\€ BOX \ä
+23BA:\ SCAN \ä-1
+23BB:\ SCAN \ä-3
+23BC:\ SCAN \ä-7
+23BD:\ SCAN \ä-9
+23BE:\ó\€\iTOP \q
+23BF:\ó\€\iBOTTOM \q
+23C0:\ó\€\H\Ð
+23C1:\ó\Ë\i\\H\Ð
+23C2:\óUP\i\\H\Ð
+23C3:\ó\€\H\¾
+23C4:\ó\Ë\i\\H\¾
+23C5:\óUP\i\\H\¾
+23C6:\ó\€\iWAVE
+23C7:\ó\Ë\i\\HWAVE
+23C8:\óUP\i\\HWAVE
+23C9:\ó\Ë\i\
+23CA:\óUP\i\
+23CB:\ó\€\iTOP \‰
+23CC:\ó\€\iBOTTOM \‰
+23CD:\rFOOT
+23CE:RETURN \
+2400:\ñNULL
+2401:\ñSTART OF HEAD\ô
+2402:\ñSTART OF TEXT
+2403:\ñEND OF TEXT
+2404:\ñEND OF TRANSMISSION
+2405:\ñENQUIRY
+2406:\ñACKNOWLEDGE
+2407:\ñBELL
+2408:\ñBACKSPACE
+2409:\ñ\ TABUL\”
+240A:\ñ\ä FEED
+240B:\ñ\€ TABUL\”
+240C:\ñFORM FEED
+240D:\ñCARRIAGE RETURN
+240E:\ñSHIFT OUT
+240F:\ñSHIFT IN
+2410:\ñDATA LINK ESCAPE
+2411:\ñDEVICE CONTROL ONE
+2412:\ñDEVICE CONTROL TWO
+2413:\ñDEVICE CONTROL THREE
+2414:\ñDEVICE CONTROL FOUR
+2415:\ñNEGATIVE ACKNOWLEDGE
+2416:\ñSYNCHRONOUS IDLE
+2417:\ñEND OF TRANSMISSION BLOCK
+2418:\ñCANCEL
+2419:\ñEND OF MEDIUM
+241A:\ñSUBSTITUTE
+241B:\ñESCAPE
+241C:\ñFILE SEPARATOR
+241D:\ñGROUP SEPARATOR
+241E:\ñRECORD SEPARATOR
+241F:\ñUNIT SEPARATOR
+2420:\ñSPACE
+2421:\ñDELETE
+2422:BLANK \
+2423:OPEN BOX
+2424:\ñNEW\ä
+2425:\ñDELETE FORM TWO
+2426:\ñSUBSTITUTE FORM TWO
+2440:OCR HOOK
+2441:OCR CHAIR
+2442:OCR FORK
+2443:OCR INVERT\ÂFORK
+2444:OCR BELT BUCKLE
+2445:OCR BOW TIE
+2446:OCR BRANCH BANK IDENTIFIC\”
+2447:OCR AMOUNT OF CHECK
+2448:OCR DASH
+2449:OCR CUSTOMER ACCOUNT NUMBER
+244A:OCR \0 BACKSLASH
+2460:\cDIGIT ONE
+2461:\cDIGIT TWO
+2462:\cDIGIT THREE
+2463:\cDIGIT FOUR
+2464:\cDIGIT FIVE
+2465:\cDIGIT SIX
+2466:\cDIGIT SEVEN
+2467:\cDIGIT E\¼
+2468:\cDIGIT NINE
+2469:\c\­TEN
+246A:\c\­ELEVEN
+246B:\c\­TWELVE
+246C:\c\­THIRTEEN
+246D:\c\­FOURTEEN
+246E:\c\­FIFTEEN
+246F:\c\­SIXTEEN
+2470:\c\­SEVENTEEN
+2471:\c\­E\¼EEN
+2472:\c\­NINETEEN
+2473:\c\­TWENTY
+2474:\tDIGIT ONE
+2475:\tDIGIT TWO
+2476:\tDIGIT THREE
+2477:\tDIGIT FOUR
+2478:\tDIGIT FIVE
+2479:\tDIGIT SIX
+247A:\tDIGIT SEVEN
+247B:\tDIGIT E\¼
+247C:\tDIGIT NINE
+247D:\t\­TEN
+247E:\t\­ELEVEN
+247F:\t\­TWELVE
+2480:\t\­THIRTEEN
+2481:\t\­FOURTEEN
+2482:\t\­FIFTEEN
+2483:\t\­SIXTEEN
+2484:\t\­SEVENTEEN
+2485:\t\­E\¼EEN
+2486:\t\­NINETEEN
+2487:\t\­TWENTY
+2488:DIGIT ONE\é
+2489:DIGIT TWO\é
+248A:DIGIT THREE\é
+248B:DIGIT FOUR\é
+248C:DIGIT FIVE\é
+248D:DIGIT SIX\é
+248E:DIGIT SEVEN\é
+248F:DIGIT E\¼\é
+2490:DIGIT NINE\é
+2491:\­TEN\é
+2492:\­ELEVEN\é
+2493:\­TWELVE\é
+2494:\­THIRTEEN\é
+2495:\­FOURTEEN\é
+2496:\­FIFTEEN\é
+2497:\­SIXTEEN\é
+2498:\­SEVENTEEN\é
+2499:\­E\¼EEN\é
+249A:\­NINETEEN\é
+249B:\­TWENTY\é
+249C:\t\LA
+249D:\t\LB
+249E:\t\LC
+249F:\t\LD
+24A0:\t\LE
+24A1:\t\LF
+24A2:\t\LG
+24A3:\t\LH
+24A4:\t\LI
+24A5:\t\LJ
+24A6:\t\LK
+24A7:\t\LL
+24A8:\t\LM
+24A9:\t\LN
+24AA:\t\LO
+24AB:\t\LP
+24AC:\t\LQ
+24AD:\t\LR
+24AE:\t\LS
+24AF:\t\LT
+24B0:\t\LU
+24B1:\t\LV
+24B2:\t\LW
+24B3:\t\LX
+24B4:\t\LY
+24B5:\t\LZ
+24B6:\c\PA
+24B7:\c\PB
+24B8:\c\PC
+24B9:\c\PD
+24BA:\c\PE
+24BB:\c\PF
+24BC:\c\PG
+24BD:\c\PH
+24BE:\c\PI
+24BF:\c\PJ
+24C0:\c\PK
+24C1:\c\PL
+24C2:\c\PM
+24C3:\c\PN
+24C4:\c\PO
+24C5:\c\PP
+24C6:\c\PQ
+24C7:\c\PR
+24C8:\c\PS
+24C9:\c\PT
+24CA:\c\PU
+24CB:\c\PV
+24CC:\c\PW
+24CD:\c\PX
+24CE:\c\PY
+24CF:\c\PZ
+24D0:\c\LA
+24D1:\c\LB
+24D2:\c\LC
+24D3:\c\LD
+24D4:\c\LE
+24D5:\c\LF
+24D6:\c\LG
+24D7:\c\LH
+24D8:\c\LI
+24D9:\c\LJ
+24DA:\c\LK
+24DB:\c\LL
+24DC:\c\LM
+24DD:\c\LN
+24DE:\c\LO
+24DF:\c\LP
+24E0:\c\LQ
+24E1:\c\LR
+24E2:\c\LS
+24E3:\c\LT
+24E4:\c\LU
+24E5:\c\LV
+24E6:\c\LW
+24E7:\c\LX
+24E8:\c\LY
+24E9:\c\LZ
+24EA:\cDIGIT ZERO
+24EB:NEGATIVE \c\­ELEVEN
+24EC:NEGATIVE \c\­TWELVE
+24ED:NEGATIVE \c\­THIRTEEN
+24EE:NEGATIVE \c\­FOURTEEN
+24EF:NEGATIVE \c\­FIFTEEN
+24F0:NEGATIVE \c\­SIXTEEN
+24F1:NEGATIVE \c\­SEVENTEEN
+24F2:NEGATIVE \c\­E\¼EEN
+24F3:NEGATIVE \c\­NINETEEN
+24F4:NEGATIVE \c\­TWENTY
+24F5:\0 \cDIGIT ONE
+24F6:\0 \cDIGIT TWO
+24F7:\0 \cDIGIT THREE
+24F8:\0 \cDIGIT FOUR
+24F9:\0 \cDIGIT FIVE
+24FA:\0 \cDIGIT SIX
+24FB:\0 \cDIGIT SEVEN
+24FC:\0 \cDIGIT E\¼
+24FD:\0 \cDIGIT NINE
+24FE:\0 \c\­TEN
+2500:\jL\¼ \
+2501:\j\Å \
+2502:\jL\¼ \€
+2503:\j\Å \€
+2504:\jL\¼ TRIPLE DASH \
+2505:\j\Å TRIPLE DASH \
+2506:\jL\¼ TRIPLE DASH \€
+2507:\j\Å TRIPLE DASH \€
+2508:\jL\¼ QUADRUPLE DASH \
+2509:\j\Å QUADRUPLE DASH \
+250A:\jL\¼ QUADRUPLE DASH \€
+250B:\j\Å QUADRUPLE DASH \€
+250C:\jL\¼ \Ë\i\q
+250D:\j\Ë L\¼\i\ù\Å
+250E:\j\Ë \Å\i\ùL\¼
+250F:\j\Å \Ë\i\q
+2510:\jL\¼ \Ë\i\‰
+2511:\j\Ë L\¼\i\‰ \Å
+2512:\j\Ë \Å\i\‰ L\¼
+2513:\j\Å \Ë\i\‰
+2514:\jL\¼ UP\i\q
+2515:\jUP L\¼\i\ù\Å
+2516:\jUP \Å\i\ùL\¼
+2517:\j\Å UP\i\q
+2518:\jL\¼ UP\i\‰
+2519:\jUP L\¼\i\‰ \Å
+251A:\jUP \Å\i\‰ L\¼
+251B:\j\Å UP\i\‰
+251C:\jL\¼ \€\i\q
+251D:\j\€ L\¼\i\ù\Å
+251E:\jUP \Å\i\ù\Ë L\¼
+251F:\j\Ë \Å\i\ùUP L\¼
+2520:\j\€ \Å\i\ùL\¼
+2521:\j\Ë L\¼\i\ùUP \Å
+2522:\jUP L\¼\i\ù\Ë \Å
+2523:\j\Å \€\i\q
+2524:\jL\¼ \€\i\‰
+2525:\j\€ L\¼\i\‰ \Å
+2526:\jUP \Å\i\‰ \Ë L\¼
+2527:\j\Ë \Å\i\‰ UP L\¼
+2528:\j\€ \Å\i\‰ L\¼
+2529:\j\Ë L\¼\i\‰ UP \Å
+252A:\jUP L\¼\i\‰ \Ë \Å
+252B:\j\Å \€\i\‰
+252C:\jL\¼ \Ë\i\
+252D:\j\‰ \Å\i\ù\Ë L\¼
+252E:\j\ù\Å\i\‰ \Ë L\¼
+252F:\j\Ë L\¼\i\ \Å
+2530:\j\Ë \Å\i\ L\¼
+2531:\j\ùL\¼\i\‰ \Ë \Å
+2532:\j\‰ L\¼\i\ù\Ë \Å
+2533:\j\Å \Ë\i\
+2534:\jL\¼ UP\i\
+2535:\j\‰ \Å\i\ùUP L\¼
+2536:\j\ù\Å\i\‰ UP L\¼
+2537:\jUP L\¼\i\ \Å
+2538:\jUP \Å\i\ L\¼
+2539:\j\ùL\¼\i\‰ UP \Å
+253A:\j\‰ L\¼\i\ùUP \Å
+253B:\j\Å UP\i\
+253C:\jL\¼ \€\i\
+253D:\j\‰ \Å\i\ù\€ L\¼
+253E:\j\ù\Å\i\‰ \€ L\¼
+253F:\j\€ L\¼\i\ \Å
+2540:\jUP \Å\i\Ë \ L\¼
+2541:\j\Ë \Å\iUP \ L\¼
+2542:\j\€ \Å\i\ L\¼
+2543:\j\‰ UP \Å\i\ù\Ë L\¼
+2544:\j\ùUP \Å\i\‰ \Ë L\¼
+2545:\j\‰ \Ë \Å\i\ùUP L\¼
+2546:\j\ù\Ë \Å\i\‰ UP L\¼
+2547:\j\Ë L\¼\iUP \ \Å
+2548:\jUP L\¼\i\Ë \ \Å
+2549:\j\ùL\¼\i\‰ \€ \Å
+254A:\j\‰ L\¼\i\ù\€ \Å
+254B:\j\Å \€\i\
+254C:\jL\¼ \0 DASH \
+254D:\j\Å \0 DASH \
+254E:\jL\¼ \0 DASH \€
+254F:\j\Å \0 DASH \€
+2550:\j\0 \
+2551:\j\0 \€
+2552:\j\Ë S\ôLE\i\ù\0
+2553:\j\Ë \0\i\ùS\ôLE
+2554:\j\0 \Ë\i\q
+2555:\j\Ë S\ôLE\i\‰ \0
+2556:\j\Ë \0\i\‰ S\ôLE
+2557:\j\0 \Ë\i\‰
+2558:\jUP S\ôLE\i\ù\0
+2559:\jUP \0\i\ùS\ôLE
+255A:\j\0 UP\i\q
+255B:\jUP S\ôLE\i\‰ \0
+255C:\jUP \0\i\‰ S\ôLE
+255D:\j\0 UP\i\‰
+255E:\j\€ S\ôLE\i\ù\0
+255F:\j\€ \0\i\ùS\ôLE
+2560:\j\0 \€\i\q
+2561:\j\€ S\ôLE\i\‰ \0
+2562:\j\€ \0\i\‰ S\ôLE
+2563:\j\0 \€\i\‰
+2564:\j\Ë S\ôLE\i\ \0
+2565:\j\Ë \0\i\ S\ôLE
+2566:\j\0 \Ë\i\
+2567:\jUP S\ôLE\i\ \0
+2568:\jUP \0\i\ S\ôLE
+2569:\j\0 UP\i\
+256A:\j\€ S\ôLE\i\ \0
+256B:\j\€ \0\i\ S\ôLE
+256C:\j\0 \€\i\
+256D:\jL\¼ ARC \Ë\i\q
+256E:\jL\¼ ARC \Ë\i\‰
+256F:\jL\¼ ARC UP\i\‰
+2570:\jL\¼ ARC UP\i\q
+2571:\jL\¼ DIAGONAL \÷\ùTO \ï\‰
+2572:\jL\¼ DIAGONAL \÷\‰ TO \ï\q
+2573:\jL\¼ DIAGONAL CROSS
+2574:\jL\¼ \‰
+2575:\jL\¼ UP
+2576:\jL\¼ \q
+2577:\jL\¼ \Ë
+2578:\j\Å \‰
+2579:\j\Å UP
+257A:\j\Å \q
+257B:\j\Å \Ë
+257C:\jL\¼ \‰\i\Å \q
+257D:\jL\¼ UP\i\Å \Ë
+257E:\j\Å \‰\iL\¼ \q
+257F:\j\Å UP\iL\¼ \Ë
+2580:\÷HALF BLOCK
+2581:\ïONE E\¼H BLOCK
+2582:\ïONE QUARTER BLOCK
+2583:\ïTHREE E\¼HS BLOCK
+2584:\ïHALF BLOCK
+2585:\ïFIVE E\¼HS BLOCK
+2586:\ïTHREE QUARTERS BLOCK
+2587:\ïSEVEN E\¼HS BLOCK
+2588:FULL BLOCK
+2589:\‰ SEVEN E\¼HS BLOCK
+258A:\‰ THREE QUARTERS BLOCK
+258B:\‰ FIVE E\¼HS BLOCK
+258C:\‰ HALF BLOCK
+258D:\‰ THREE E\¼HS BLOCK
+258E:\‰ ONE QUARTER BLOCK
+258F:\‰ ONE E\¼H BLOCK
+2590:\ùHALF BLOCK
+2591:L\¼ SHADE
+2592:MEDIUM SHADE
+2593:DARK SHADE
+2594:\÷ONE E\¼H BLOCK
+2595:\ùONE E\¼H BLOCK
+2596:QUADRANT \ï\‰
+2597:QUADRANT \ï\q
+2598:QUADRANT \÷\‰
+2599:QUADRANT \÷\‰\i\ï\‰\i\ï\q
+259A:QUADRANT \÷\‰\i\ï\q
+259B:QUADRANT \÷\‰\i\÷\ùAND \ï\‰
+259C:QUADRANT \÷\‰\i\÷\ùAND \ï\q
+259D:QUADRANT \÷\q
+259E:QUADRANT \÷\ùAND \ï\‰
+259F:QUADRANT \÷\ùAND \ï\‰\i\ï\q
+25A0:\¬ \ý
+25A1:\¦\ý
+25A2:\¦\rWITH ROUND\ÂCORNERS
+25A3:\¦\rCONTAIN\ô \¬\Ç\ý
+25A4:\rWITH \ FILL
+25A5:\rWITH \€ FILL
+25A6:\rWITH ORTHOGONAL CROSSHATCH FILL
+25A7:\rWITH \÷\‰ TO \ï\ùFILL
+25A8:\rWITH \÷\ùTO \ï\‰ FILL
+25A9:\rWITH DIAGONAL CROSSHATCH FILL
+25AA:\¬\Ç\ý
+25AB:WHITE\Ç\ý
+25AC:\¬ RECTANGLE
+25AD:\¦RECTANGLE
+25AE:\¬ \€ RECTANGLE
+25AF:\¦\€ RECTANGLE
+25B0:\¬ PARALLELOGRAM
+25B1:\¦PARALLELOGRAM
+25B2:\¬ UP-\Ä\¾
+25B3:\¦UP-\Ä\¾
+25B4:\¬ UP-\Ä\§\¾
+25B5:\¦UP-\Ä\§\¾
+25B6:\¬ \q-\Ä\¾
+25B7:\¦\q-\Ä\¾
+25B8:\¬ \q-\Ä\§\¾
+25B9:\¦\q-\Ä\§\¾
+25BA:\¬ \q-\ÄPOINTER
+25BB:\¦\q-\ÄPOINTER
+25BC:\¬ \Ë-\Ä\¾
+25BD:\¦\Ë-\Ä\¾
+25BE:\¬ \Ë-\Ä\§\¾
+25BF:\¦\Ë-\Ä\§\¾
+25C0:\¬ \‰-\Ä\¾
+25C1:\¦\‰-\Ä\¾
+25C2:\¬ \‰-\Ä\§\¾
+25C3:\¦\‰-\Ä\§\¾
+25C4:\¬ \‰-\ÄPOINTER
+25C5:\¦\‰-\ÄPOINTER
+25C6:\¬ DIAMOND
+25C7:\¦DIAMOND
+25C8:\¦DIAMOND CONTAIN\ô \¬\ÇDIAMOND
+25C9:FISHEYE
+25CA:LOZENGE
+25CB:\¦\Ð
+25CC:DOTT\Â\Ð
+25CD:\Ð\H\€ FILL
+25CE:BULLSEYE
+25CF:\¬ \Ð
+25D0:\Ð\H\‰ HALF \¬
+25D1:\Ð\H\ùHALF \¬
+25D2:\Ð\H\ïHALF \¬
+25D3:\Ð\H\÷HALF \¬
+25D4:\Ð\H\÷\ùQUADRANT \¬
+25D5:\Ð\HALL BUT \÷\‰ QUADRANT \¬
+25D6:\‰ HALF \¬ \Ð
+25D7:\ùHALF \¬ \Ð
+25D8:INVERSE BULLET
+25D9:INVERSE \¦\Ð
+25DA:\÷HALF INVERSE \¦\Ð
+25DB:\ïHALF INVERSE \¦\Ð
+25DC:\÷\‰ QUADRANT CIRCULAR ARC
+25DD:\÷\ùQUADRANT CIRCULAR ARC
+25DE:\ï\ùQUADRANT CIRCULAR ARC
+25DF:\ï\‰ QUADRANT CIRCULAR ARC
+25E0:\÷HALF \Ð
+25E1:\ïHALF \Ð
+25E2:\¬ \ï\ù\¾
+25E3:\¬ \ï\‰ \¾
+25E4:\¬ \÷\‰ \¾
+25E5:\¬ \÷\ù\¾
+25E6:\¦BULLET
+25E7:\rWITH \‰ HALF \¬
+25E8:\rWITH \ùHALF \¬
+25E9:\rWITH \÷\‰ DIAGONAL HALF \¬
+25EA:\rWITH \ï\ùDIAGONAL HALF \¬
+25EB:\¦\rWITH \€ BISECT\ô \ä
+25EC:\¦UP-\Ä\¾\³
+25ED:UP-\Ä\¾\H\‰ HALF \¬
+25EE:UP-\Ä\¾\H\ùHALF \¬
+25EF:LARGE \Ð
+25F0:\¦\rWITH \÷\‰ QUADRANT
+25F1:\¦\rWITH \ï\‰ QUADRANT
+25F2:\¦\rWITH \ï\ùQUADRANT
+25F3:\¦\rWITH \÷\ùQUADRANT
+25F4:\¦\Ð\H\÷\‰ QUADRANT
+25F5:\¦\Ð\H\ï\‰ QUADRANT
+25F6:\¦\Ð\H\ï\ùQUADRANT
+25F7:\¦\Ð\H\÷\ùQUADRANT
+25F8:\÷\‰ \¾
+25F9:\÷\ù\¾
+25FA:\ï\‰ \¾
+25FB:\¦MEDIUM \ý
+25FC:\¬ MEDIUM \ý
+25FD:\¦MEDIUM\Ç\ý
+25FE:\¬ MEDIUM\Ç\ý
+25FF:\ï\ù\¾
+2600:\¬ SUN\HRAYS
+2601:CLOUD
+2602:UMBRELLA
+2603:SNOWMAN
+2604:COMET
+2605:\¬ STAR
+2606:\¦STAR
+2607:L\¼N\ô
+2608:THUNDERSTORM
+2609:SUN
+260A:ASCEND\ô NODE
+260B:DESCEND\ô NODE
+260C:CONJUNCTION
+260D:OPPOSITION
+260E:\¬ TELEPHONE
+260F:\¦TELEPHONE
+2610:BALLOT BOX
+2611:BALLOT BOX\HCHECK
+2612:BALLOT BOX\HX
+2613:SALTIRE
+2616:\¦SHOGI PIECE
+2617:\¬ SHOGI PIECE
+2619:\öROTAT\ÂFLORAL HEART BULLET
+261A:\¬ \‰ \ÄINDEX
+261B:\¬ \ù\ÄINDEX
+261C:\¦\‰ \ÄINDEX
+261D:\¦UP \ÄINDEX
+261E:\¦\ù\ÄINDEX
+261F:\¦\Ë \ÄINDEX
+2620:SKULL\iCROSSBONES
+2621:CAUTION\‚
+2622:RADIOACTIVE\‚
+2623:BIOHAZARD\‚
+2624:CADUCEUS
+2625:ANKH
+2626:ORTHODOX CROSS
+2627:CHI RHO
+2628:CROSS OF LORRAINE
+2629:CROSS OF JERUSALEM
+262A:STAR\iCRESCENT
+262B:FARSI \
+262C:ADI SHAKTI
+262D:HAMMER\iSICKLE
+262E:PEACE \
+262F:YIN YANG
+2630:TRIGRAM FOR HEAVEN
+2631:TRIGRAM FOR LAKE
+2632:TRIGRAM FOR FIRE
+2633:TRIGRAM FOR THUNDER
+2634:TRIGRAM FOR WIND
+2635:TRIGRAM FOR WATER
+2636:TRIGRAM FOR MOUNTAIN
+2637:TRIGRAM FOR EARTH
+2638:WHEEL OF DHARMA
+2639:\¦FROWN\ô FACE
+263A:\¦SMIL\ô FACE
+263B:\¬ SMIL\ô FACE
+263C:\¦SUN\HRAYS
+263D:FIRST QUARTER MOON
+263E:LAST QUARTER MOON
+263F:MERCURY
+2640:FEMALE\‚
+2641:EARTH
+2642:MALE\‚
+2643:JUPITER
+2644:SATURN
+2645:URANUS
+2646:NEPTUNE
+2647:PLUTO
+2648:ARIES
+2649:TAURUS
+264A:GEMINI
+264B:CANCER
+264C:LEO
+264D:VIRGO
+264E:LIBRA
+264F:SCORPIUS
+2650:SAGITTARIUS
+2651:CAPRICORN
+2652:AQUARIUS
+2653:PISCES
+2654:\¦CHESS K\ô
+2655:\¦CHESS QUEEN
+2656:\¦CHESS ROOK
+2657:\¦CHESS BISHOP
+2658:\¦CHESS KN\¼
+2659:\¦CHESS PAWN
+265A:\¬ CHESS K\ô
+265B:\¬ CHESS QUEEN
+265C:\¬ CHESS ROOK
+265D:\¬ CHESS BISHOP
+265E:\¬ CHESS KN\¼
+265F:\¬ CHESS PAWN
+2660:\¬ SPADE SUIT
+2661:\¦HEART SUIT
+2662:\¦DIAMOND SUIT
+2663:\¬ CLUB SUIT
+2664:\¦SPADE SUIT
+2665:\¬ HEART SUIT
+2666:\¬ DIAMOND SUIT
+2667:\¦CLUB SUIT
+2668:HOT SPR\ôS
+2669:QUARTER NOTE
+266A:E\¼H NOTE
+266B:BEAM\ÂE\¼H NOTES
+266C:BEAM\ÂSIXTEENTH NOTES
+266D:MUSIC FLAT\‚
+266E:MUSIC NATURAL\‚
+266F:MUSIC SHARP\‚
+2670:WEST \Ó CROSS
+2671:EAST \Ó CROSS
+2672:UNIVERSAL RECYCL\ô \
+2673:RECYCL\ô \ñTYPE-1 PLASTICS
+2674:RECYCL\ô \ñTYPE-2 PLASTICS
+2675:RECYCL\ô \ñTYPE-3 PLASTICS
+2676:RECYCL\ô \ñTYPE-4 PLASTICS
+2677:RECYCL\ô \ñTYPE-5 PLASTICS
+2678:RECYCL\ô \ñTYPE-6 PLASTICS
+2679:RECYCL\ô \ñTYPE-7 PLASTICS
+267A:RECYCL\ô \ñGENERIC MATERIALS
+267B:\¬ UNIVERSAL RECYCL\ô \
+267C:RECYCL\ÂPAPER \
+267D:PARTIALLY-RECYCL\ÂPAPER \
+2680:DIE FACE-1
+2681:DIE FACE-2
+2682:DIE FACE-3
+2683:DIE FACE-4
+2684:DIE FACE-5
+2685:DIE FACE-6
+2686:\¦\Ð\³ \q
+2687:\¦\Ð\HTWO DOTS
+2688:\¬ \Ð\H\¦DOT \q
+2689:\¬ \Ð\HTWO \¦DOTS
+2701:\÷BLADE SCISSORS
+2702:\¬ SCISSORS
+2703:\ïBLADE SCISSORS
+2704:\¦SCISSORS
+2706:TELEPHONE LOC\”\‚
+2707:TAPE DRIVE
+2708:AIRPLANE
+2709:ENVELOPE
+270C:VICTORY HAND
+270D:WRIT\ô HAND
+270E:\ï\ùPENCIL
+270F:PENCIL
+2710:\÷\ùPENCIL
+2711:\¦NIB
+2712:\¬ NIB
+2713:CHECK\¥
+2714:\Å CHECK\¥
+2715:MULTIPLIC\” X
+2716:\Å MULTIPLIC\” X
+2717:BALLOT X
+2718:\Å BALLOT X
+2719:OUT\äD GREEK CROSS
+271A:\Å GREEK CROSS
+271B:OPEN CENTRE CROSS
+271C:\Å OPEN CENTRE CROSS
+271D:LATIN CROSS
+271E:SHADOW\Â\¦LATIN CROSS
+271F:OUT\äD LATIN CROSS
+2720:MALTESE CROSS
+2721:STAR OF DAVID
+2722:FOUR TEARDROP-SPOK\ÂASTERISK
+2723:FOUR BALLOON-SPOK\ÂASTERISK
+2724:\Å FOUR BALLOON-SPOK\ÂASTERISK
+2725:FOUR CLUB-SPOK\ÂASTERISK
+2726:\¬ FOUR POINT\ÂSTAR
+2727:\¦FOUR POINT\ÂSTAR
+2729:STRESS OUT\äD \¦STAR
+272A:\c\¦STAR
+272B:OPEN CENTRE \¬ STAR
+272C:\¬ CENTRE \¦STAR
+272D:OUT\äD \¬ STAR
+272E:\Å OUT\äD \¬ STAR
+272F:PINWHEEL STAR
+2730:SHADOW\Â\¦STAR
+2731:\Å ASTERISK
+2732:OPEN CENTRE ASTERISK
+2733:E\¼ SPOK\ÂASTERISK
+2734:E\¼ POINT\Â\¬ STAR
+2735:E\¼ POINT\ÂPINWHEEL STAR
+2736:SIX POINT\Â\¬ STAR
+2737:E\¼ POINT\ÂRECTI\äAR \¬ STAR
+2738:\Å E\¼ POINT\ÂRECTI\äAR \¬ STAR
+2739:TWELVE POINT\Â\¬ STAR
+273A:SIXTEEN POINT\ÂASTERISK
+273B:TEARDROP-SPOK\ÂASTERISK
+273C:OPEN CENTRE TEARDROP-SPOK\ÂASTERISK
+273D:\Å TEARDROP-SPOK\ÂASTERISK
+273E:SIX PETALL\Â\¬\i\¦FLORETTE
+273F:\¬ FLORETTE
+2740:\¦FLORETTE
+2741:E\¼ PETALL\ÂOUT\äD \¬ FLORETTE
+2742:\cOPEN CENTRE E\¼ POINT\ÂSTAR
+2743:\Å TEARDROP-SPOK\ÂPINWHEEL ASTERISK
+2744:SNOWFLAKE
+2745:T\¼ TRIFOLIATE SNOWFLAKE
+2746:\Å CHEVRON SNOWFLAKE
+2747:SPARKLE
+2748:\Å SPARKLE
+2749:BALLOON-SPOK\ÂASTERISK
+274A:E\¼ TEARDROP-SPOK\ÂPROPELLER ASTERISK
+274B:\Å E\¼ TEARDROP-SPOK\ÂPROPELLER ASTERISK
+274D:SHADOW\Â\¦\Ð
+274F:\ï\ùDROP-SHADOW\Â\¦\ý
+2750:\÷\ùDROP-SHADOW\Â\¦\ý
+2751:\ï\ùSHADOW\Â\¦\ý
+2752:\÷\ùSHADOW\Â\¦\ý
+2756:\¬ DIAMOND MINUS \¦X
+2758:L\¼ \€\ì
+2759:MEDIUM \€\ì
+275A:\Å \€\ì
+275B:\Å S\ôLE TURN\ÂCOMMA QUOT\”\¥ ORNAMENT
+275C:\Å S\ôLE COMMA QUOT\”\¥ ORNAMENT
+275D:\Å \0 TURN\ÂCOMMA QUOT\”\¥ ORNAMENT
+275E:\Å \0 COMMA QUOT\”\¥ ORNAMENT
+2761:CURV\ÂSTEM PARAGRAPH\‚ ORNAMENT
+2762:\Å EXCLAM\”\¥ ORNAMENT
+2763:\Å HEART EXCLAM\”\¥ ORNAMENT
+2764:\Å \¬ HEART
+2765:ROTAT\Â\Å \¬ HEART BULLET
+2766:FLORAL HEART
+2767:ROTAT\ÂFLORAL HEART BULLET
+2768:MEDIUM \‰ \ÑS ORNAMENT
+2769:MEDIUM \ù\ÑS ORNAMENT
+276A:MEDIUM FLATTEN\Â\‰ \ÑS ORNAMENT
+276B:MEDIUM FLATTEN\Â\ù\ÑS ORNAMENT
+276C:MEDIUM \‰-\ÄANGLE \– ORNAMENT
+276D:MEDIUM \q-\ÄANGLE \– ORNAMENT
+276E:\Å \‰-\ÄANGLE QUOT\”\¥ ORNAMENT
+276F:\Å \q-\ÄANGLE QUOT\”\¥ ORNAMENT
+2770:\Å \‰-\ÄANGLE \– ORNAMENT
+2771:\Å \q-\ÄANGLE \– ORNAMENT
+2772:L\¼ \‰ TORTOISE SHELL \– ORNAMENT
+2773:L\¼ \ùTORTOISE SHELL \– ORNAMENT
+2774:MEDIUM \‰ CURLY \– ORNAMENT
+2775:MEDIUM \ùCURLY \– ORNAMENT
+2776:\ÌDIGIT ONE
+2777:\ÌDIGIT TWO
+2778:\ÌDIGIT THREE
+2779:\ÌDIGIT FOUR
+277A:\ÌDIGIT FIVE
+277B:\ÌDIGIT SIX
+277C:\ÌDIGIT SEVEN
+277D:\ÌDIGIT E\¼
+277E:\ÌDIGIT NINE
+277F:\Ì\­TEN
+2780:D\ôBAT \cSANS-SERIF\hONE
+2781:D\ôBAT \cSANS-SERIF\hTWO
+2782:D\ôBAT \cSANS-SERIF\hTHREE
+2783:D\ôBAT \cSANS-SERIF\hFOUR
+2784:D\ôBAT \cSANS-SERIF\hFIVE
+2785:D\ôBAT \cSANS-SERIF\hSIX
+2786:D\ôBAT \cSANS-SERIF\hSEVEN
+2787:D\ôBAT \cSANS-SERIF\hE\¼
+2788:D\ôBAT \cSANS-SERIF\hNINE
+2789:D\ôBAT \cSANS-SERIF \­TEN
+278A:\ÌSANS-SERIF\hONE
+278B:\ÌSANS-SERIF\hTWO
+278C:\ÌSANS-SERIF\hTHREE
+278D:\ÌSANS-SERIF\hFOUR
+278E:\ÌSANS-SERIF\hFIVE
+278F:\ÌSANS-SERIF\hSIX
+2790:\ÌSANS-SERIF\hSEVEN
+2791:\ÌSANS-SERIF\hE\¼
+2792:\ÌSANS-SERIF\hNINE
+2793:\ÌSANS-SERIF \­TEN
+2794:\Å WIDE-HEAD\Â\Ù
+2798:\Å SOUTH EAST\u
+2799:\Å \Ù
+279A:\Å NORTH EAST\u
+279B:DRAFT\ô POINT \Ù
+279C:\Å ROUND-TIPP\Â\Ù
+279D:\¾-HEAD\Â\Ù
+279E:\Å \¾-HEAD\Â\Ù
+279F:DASH\Â\¾-HEAD\Â\Ù
+27A0:\Å DASH\Â\¾-HEAD\Â\Ù
+27A1:\¬ \Ù
+27A2:THREE-D TOP-L\¼\Â\ÙHEAD
+27A3:THREE-D BOTTOM-L\¼\Â\ÙHEAD
+27A4:\¬ \ÙHEAD
+27A5:\Å \¬ CURV\Â\Ë\Š\i\Ù
+27A6:\Å \¬ CURV\ÂUP\Š\i\Ù
+27A7:SQUAT \¬ \Ù
+27A8:\Å CONCAVE-POINT\Â\¬ \Ù
+27A9:\q-SHAD\Â\¦\Ù
+27AA:\‰-SHAD\Â\¦\Ù
+27AB:BACK-TILT\ÂSHADOW\Â\¦\Ù
+27AC:FRONT-TILT\ÂSHADOW\Â\¦\Ù
+27AD:\Å \ï\q-SHADOW\Â\¦\Ù
+27AE:\Å \÷\q-SHADOW\Â\¦\Ù
+27AF:NOTCH\Â\ï\q-SHADOW\Â\¦\Ù
+27B1:NOTCH\Â\÷\q-SHADOW\Â\¦\Ù
+27B2:\c\Å \¦\Ù
+27B3:WHITE-FEATHER\Â\Ù
+27B4:\¬-FEATHER\ÂSOUTH EAST\u
+27B5:\¬-FEATHER\Â\Ù
+27B6:\¬-FEATHER\ÂNORTH EAST\u
+27B7:\Å \¬-FEATHER\ÂSOUTH EAST\u
+27B8:\Å \¬-FEATHER\Â\Ù
+27B9:\Å \¬-FEATHER\ÂNORTH EAST\u
+27BA:TEARDROP-BARB\Â\Ù
+27BB:\Å TEARDROP-SHANK\Â\Ù
+27BC:WEDGE-TAIL\Â\Ù
+27BD:\Å WEDGE-TAIL\Â\Ù
+27BE:OPEN-OUT\äD \Ù
+27D0:\¦DIAMOND\HCENTR\ÂDOT
+27D1:AND\³
+27D2:ELEMENT OF OPEN\ô UP\Š
+27D3:\ï\ùCORNER\³
+27D4:\÷\‰ CORNER\³
+27D5:\‰ OUTER JOIN
+27D6:\ùOUTER JOIN
+27D7:FULL OUTER JOIN
+27D8:LARGE UP TACK
+27D9:LARGE \Ë TACK
+27DA:\‰\i\ù\0 TURNSTILE
+27DB:\‰\i\ùTACK
+27DC:\‰ MULTIMAP
+27DD:LONG \ùTACK
+27DE:LONG \‰ TACK
+27DF:UP TACK\H\Ð\p
+27E0:LOZENGE DIVID\ÂBY \ RULE
+27E1:\¦CONCAVE-SID\ÂDIAMOND
+27E2:\¦CONCAVE-SID\ÂDIAMOND\H\‰\Š TICK
+27E3:\¦CONCAVE-SID\ÂDIAMOND\H\q\Š TICK
+27E4:\¦\rWITH \‰\Š TICK
+27E5:\¦\rWITH \q\Š TICK
+27E6:\E\‰ \¦\r\–
+27E7:\E\ù\¦\r\–
+27E8:\E\‰ ANGLE \–
+27E9:\E\ùANGLE \–
+27EA:\E\‰ \0 ANGLE \–
+27EB:\E\ù\0 ANGLE \–
+27F0:UP\Š QUADRUPLE\u
+27F1:\Ë\Š QUADRUPLE\u
+27F2:ANTICLOCKWISE GAPP\Â\Ð\u
+27F3:CLOCKWISE GAPP\Â\Ð\u
+27F4:\q\u\H\cPLUS
+27F5:LONG \‰\Š\u
+27F6:LONG \Ù
+27F7:LONG \‰ \q\u
+27F8:LONG \‰\Š \0\u
+27F9:LONG \q\Š \0\u
+27FA:LONG \‰ \ù\0\u
+27FB:LONG \‰\Š\u FROM\ì
+27FC:LONG \Ù FROM\ì
+27FD:LONG \‰\Š \0\u FROM\ì
+27FE:LONG \q\Š \0\u FROM\ì
+27FF:LONG \q\Š SQUIGGLE\u
+2800:BRAILLE PATTERN BLANK
+2801:\M1
+2802:\M2
+2803:\M12
+2804:\M3
+2805:\M13
+2806:\M23
+2807:\M123
+2808:\M4
+2809:\M14
+280A:\M24
+280B:\M124
+280C:\M34
+280D:\M134
+280E:\M234
+280F:\M1234
+2810:\M5
+2811:\M15
+2812:\M25
+2813:\M125
+2814:\M35
+2815:\M135
+2816:\M235
+2817:\M1235
+2818:\M45
+2819:\M145
+281A:\M245
+281B:\M1245
+281C:\M345
+281D:\M1345
+281E:\M2345
+281F:\M12345
+2820:\M6
+2821:\M16
+2822:\M26
+2823:\M126
+2824:\M36
+2825:\M136
+2826:\M236
+2827:\M1236
+2828:\M46
+2829:\M146
+282A:\M246
+282B:\M1246
+282C:\M346
+282D:\M1346
+282E:\M2346
+282F:\M12346
+2830:\M56
+2831:\M156
+2832:\M256
+2833:\M1256
+2834:\M356
+2835:\M1356
+2836:\M2356
+2837:\M12356
+2838:\M456
+2839:\M1456
+283A:\M2456
+283B:\M12456
+283C:\M3456
+283D:\M13456
+283E:\M23456
+283F:\M123456
+2840:\M7
+2841:\M17
+2842:\M27
+2843:\M127
+2844:\M37
+2845:\M137
+2846:\M237
+2847:\M1237
+2848:\M47
+2849:\M147
+284A:\M247
+284B:\M1247
+284C:\M347
+284D:\M1347
+284E:\M2347
+284F:\M12347
+2850:\M57
+2851:\M157
+2852:\M257
+2853:\M1257
+2854:\M357
+2855:\M1357
+2856:\M2357
+2857:\M12357
+2858:\M457
+2859:\M1457
+285A:\M2457
+285B:\M12457
+285C:\M3457
+285D:\M13457
+285E:\M23457
+285F:\M123457
+2860:\M67
+2861:\M167
+2862:\M267
+2863:\M1267
+2864:\M367
+2865:\M1367
+2866:\M2367
+2867:\M12367
+2868:\M467
+2869:\M1467
+286A:\M2467
+286B:\M12467
+286C:\M3467
+286D:\M13467
+286E:\M23467
+286F:\M123467
+2870:\M567
+2871:\M1567
+2872:\M2567
+2873:\M12567
+2874:\M3567
+2875:\M13567
+2876:\M23567
+2877:\M123567
+2878:\M4567
+2879:\M14567
+287A:\M24567
+287B:\M124567
+287C:\M34567
+287D:\M134567
+287E:\M234567
+287F:\M1234567
+2880:\M8
+2881:\M18
+2882:\M28
+2883:\M128
+2884:\M38
+2885:\M138
+2886:\M238
+2887:\M1238
+2888:\M48
+2889:\M148
+288A:\M248
+288B:\M1248
+288C:\M348
+288D:\M1348
+288E:\M2348
+288F:\M12348
+2890:\M58
+2891:\M158
+2892:\M258
+2893:\M1258
+2894:\M358
+2895:\M1358
+2896:\M2358
+2897:\M12358
+2898:\M458
+2899:\M1458
+289A:\M2458
+289B:\M12458
+289C:\M3458
+289D:\M13458
+289E:\M23458
+289F:\M123458
+28A0:\M68
+28A1:\M168
+28A2:\M268
+28A3:\M1268
+28A4:\M368
+28A5:\M1368
+28A6:\M2368
+28A7:\M12368
+28A8:\M468
+28A9:\M1468
+28AA:\M2468
+28AB:\M12468
+28AC:\M3468
+28AD:\M13468
+28AE:\M23468
+28AF:\M123468
+28B0:\M568
+28B1:\M1568
+28B2:\M2568
+28B3:\M12568
+28B4:\M3568
+28B5:\M13568
+28B6:\M23568
+28B7:\M123568
+28B8:\M4568
+28B9:\M14568
+28BA:\M24568
+28BB:\M124568
+28BC:\M34568
+28BD:\M134568
+28BE:\M234568
+28BF:\M1234568
+28C0:\M78
+28C1:\M178
+28C2:\M278
+28C3:\M1278
+28C4:\M378
+28C5:\M1378
+28C6:\M2378
+28C7:\M12378
+28C8:\M478
+28C9:\M1478
+28CA:\M2478
+28CB:\M12478
+28CC:\M3478
+28CD:\M13478
+28CE:\M23478
+28CF:\M123478
+28D0:\M578
+28D1:\M1578
+28D2:\M2578
+28D3:\M12578
+28D4:\M3578
+28D5:\M13578
+28D6:\M23578
+28D7:\M123578
+28D8:\M4578
+28D9:\M14578
+28DA:\M24578
+28DB:\M124578
+28DC:\M34578
+28DD:\M134578
+28DE:\M234578
+28DF:\M1234578
+28E0:\M678
+28E1:\M1678
+28E2:\M2678
+28E3:\M12678
+28E4:\M3678
+28E5:\M13678
+28E6:\M23678
+28E7:\M123678
+28E8:\M4678
+28E9:\M14678
+28EA:\M24678
+28EB:\M124678
+28EC:\M34678
+28ED:\M134678
+28EE:\M234678
+28EF:\M1234678
+28F0:\M5678
+28F1:\M15678
+28F2:\M25678
+28F3:\M125678
+28F4:\M35678
+28F5:\M135678
+28F6:\M235678
+28F7:\M1235678
+28F8:\M45678
+28F9:\M145678
+28FA:\M245678
+28FB:\M1245678
+28FC:\M345678
+28FD:\M1345678
+28FE:\M2345678
+28FF:\M12345678
+2900:\q\Š TWO-HEADED\u\H\€ \Á
+2901:\q\Š TWO-HEADED\u\H\0 \€ \Á
+2902:\‰\Š \0\u\H\€ \Á
+2903:\q\Š \0\u\H\€ \Á
+2904:\‰ \ù\0\u\H\€ \Á
+2905:\q\Š TWO-HEADED\u FROM\ì
+2906:\‰\Š \0\u FROM\ì
+2907:\q\Š \0\u FROM\ì
+2908:\Ë\Š\u\H\ \Á
+2909:UP\Š\u\H\ \Á
+290A:UP\Š TRIPLE\u
+290B:\Ë\Š TRIPLE\u
+290C:\‰\Š \0 DASH\u
+290D:\q\Š \0 DASH\u
+290E:\‰\Š TRIPLE DASH\u
+290F:\q\Š TRIPLE DASH\u
+2910:\q\Š TWO-HEAD\ÂTRIPLE DASH\u
+2911:\Ù\³T\ÂSTEM
+2912:UP\Š\u TO\ì
+2913:\Ë\Š\u TO\ì
+2914:\Ù\HTAIL\H\€ \Á
+2915:\Ù\HTAIL\H\0 \€ \Á
+2916:\q\Š TWO-HEADED\u\HTAIL
+2917:\q\Š TWO-HEADED\u\HTAIL\H\€ \Á
+2918:\q\Š TWO-HEADED\u\HTAIL\H\0 \€ \Á
+2919:\‰\Š\u-TAIL
+291A:\Ù-TAIL
+291B:\‰\Š \0\u-TAIL
+291C:\q\Š \0\u-TAIL
+291D:\‰\Š\u TO \¬ DIAMOND
+291E:\Ù TO \¬ DIAMOND
+291F:\‰\Š\u FROM\ì TO \¬ DIAMOND
+2920:\Ù FROM\ì TO \¬ DIAMOND
+2921:NORTH WEST\iSOUTH EAST\u
+2922:NORTH EAST\iSOUTH WEST\u
+2923:NORTH WEST\u\í
+2924:NORTH EAST\u\í
+2925:SOUTH EAST\u\í
+2926:SOUTH WEST\u\í
+2927:NORTH WEST\u\iNORTH EAST\u
+2928:NORTH EAST\u\iSOUTH EAST\u
+2929:SOUTH EAST\u\iSOUTH WEST\u
+292A:SOUTH WEST\u\iNORTH WEST\u
+292B:RIS\ô DIAGONAL CROSS\ô FALL\ô DIAGONAL
+292C:FALL\ô DIAGONAL CROSS\ô RIS\ô DIAGONAL
+292D:SOUTH EAST\u CROSS\ô NORTH EAST\u
+292E:NORTH EAST\u CROSS\ô SOUTH EAST\u
+292F:FALL\ô DIAGONAL CROSS\ô NORTH EAST\u
+2930:RIS\ô DIAGONAL CROSS\ô SOUTH EAST\u
+2931:NORTH EAST\u CROSS\ô NORTH WEST\u
+2932:NORTH WEST\u CROSS\ô NORTH EAST\u
+2933:WAVE\u \ÄDIRECTLY \q
+2934:ARROW \Ä\q\Š THEN CURV\ô UP\Š
+2935:ARROW \Ä\q\Š THEN CURV\ô \Ë\Š
+2936:ARROW \Ä\Ë\Š THEN CURV\ô \‰\Š
+2937:ARROW \Ä\Ë\Š THEN CURV\ô \q\Š
+2938:\q-SIDE ARC CLOCKWISE\u
+2939:\‰-SIDE ARC ANTICLOCKWISE\u
+293A:TOP ARC ANTICLOCKWISE\u
+293B:BOTTOM ARC ANTICLOCKWISE\u
+293C:TOP ARC CLOCKWISE\u\HMINUS
+293D:TOP ARC ANTICLOCKWISE\u\HPLUS
+293E:\ï\ùSEMICIRCULAR CLOCKWISE\u
+293F:\ï\‰ SEMICIRCULAR ANTICLOCKWISE\u
+2940:ANTICLOCKWISE CLOS\Â\Ð\u
+2941:CLOCKWISE CLOS\Â\Ð\u
+2942:\Ù\p SHORT \‰\Š\u
+2943:\‰\Š\u\p SHORT \Ù
+2944:SHORT \Ù\p \‰\Š\u
+2945:\Ù\HPLUS\…
+2946:\‰\Š\u\HPLUS\…
+2947:\Ù THROUGH X
+2948:\‰ \q\u THROUGH\Ç\Ð
+2949:UP\Š TWO-HEADED\u FROM\Ç\Ð
+294A:\‰\ìB UP \ùBARB \Ë HARPOON
+294B:\‰\ìB \Ë \ùBARB UP HARPOON
+294C:UP\ìB \ù\Ë\ìB \‰ HARPOON
+294D:UP\ìB \‰ \Ë\ìB \ùHARPOON
+294E:\‰\ìB UP \ùBARB UP HARPOON
+294F:UP\ìB \ù\Ë\ìB \ùHARPOON
+2950:\‰\ìB \Ë \ùBARB \Ë HARPOON
+2951:UP\ìB \‰ \Ë\ìB \‰ HARPOON
+2952:\‰\ƒUP TO\ì
+2953:\q\ƒUP TO\ì
+2954:UP\ƒ\ùTO\ì
+2955:\Ë\ƒ\ùTO\ì
+2956:\‰\ƒ\Ë TO\ì
+2957:\q\ƒ\Ë TO\ì
+2958:UP\ƒ\‰ TO\ì
+2959:\Ë\ƒ\‰ TO\ì
+295A:\‰\ƒUP FROM\ì
+295B:\q\ƒUP FROM\ì
+295C:UP\ƒ\ùFROM\ì
+295D:\Ë\ƒ\ùFROM\ì
+295E:\‰\ƒ\Ë FROM\ì
+295F:\q\ƒ\Ë FROM\ì
+2960:UP\ƒ\‰ FROM\ì
+2961:\Ë\ƒ\‰ FROM\ì
+2962:\‰\ƒUP\p \‰\ƒ\Ë
+2963:UP\ƒ\‰ BESIDE UP\ƒ\q
+2964:\q\ƒUP\p \q\ƒ\Ë
+2965:\Ë\ƒ\‰ BESIDE \Ë\ƒ\q
+2966:\‰\ƒUP\p \q\ƒUP
+2967:\‰\ƒ\Ë\p \q\ƒ\Ë
+2968:\q\ƒUP\p \‰\ƒUP
+2969:\q\ƒ\Ë\p \‰\ƒ\Ë
+296A:\‰\ƒUP\p LONG DASH
+296B:\‰\ƒ\Ë\… LONG DASH
+296C:\q\ƒUP\p LONG DASH
+296D:\q\ƒ\Ë\… LONG DASH
+296E:UP\ƒ\‰ BESIDE \Ë\ƒ\q
+296F:\Ë\ƒ\‰ BESIDE UP\ƒ\q
+2970:\ù\0\u\HROUND\ÂHEAD
+2971:EQUALS\‚\p \Ù
+2972:\æ\Ú\p \Ù
+2973:\‰\Š\u\p \æ\Ú
+2974:\Ù\p \æ\Ú
+2975:\Ù\p ALMOST\‘
+2976:\µ\p \‰\Š\u
+2977:\‰\Š\u THROUGH \µ
+2978:\’\p \Ù
+2979:SUBSET\p \Ù
+297A:\‰\Š\u THROUGH SUBSET
+297B:SUPERSET\p \‰\Š\u
+297C:\‰ FISH TAIL
+297D:\ùFISH TAIL
+297E:UP FISH TAIL
+297F:\Ë FISH TAIL
+2980:TRIPLE \€\ì DELIMITER
+2981:Z NOT\” SPOT
+2982:Z NOT\” TYPE COLON
+2983:\‰ \¦CURLY \–
+2984:\ù\¦CURLY \–
+2985:\‰ \¦\ÑS
+2986:\ù\¦\ÑS
+2987:Z NOT\” \‰ IMAGE \–
+2988:Z NOT\” \ùIMAGE \–
+2989:Z NOT\” \‰ BIND\ô \–
+298A:Z NOT\” \ùBIND\ô \–
+298B:\‰ \r\–\HUNDERBAR
+298C:\ù\r\–\HUNDERBAR
+298D:\‰ \r\–\HTICK IN TOP CORNER
+298E:\ù\r\–\HTICK IN BOTTOM CORNER
+298F:\‰ \r\–\HTICK IN BOTTOM CORNER
+2990:\ù\r\–\HTICK IN TOP CORNER
+2991:\‰ ANGLE \–\³
+2992:\ùANGLE \–\³
+2993:\‰ ARC \µ \–
+2994:\ùARC \’ \–
+2995:\0 \‰ ARC \’ \–
+2996:\0 \ùARC \µ \–
+2997:\‰ \¬ TORTOISE SHELL \–
+2998:\ù\¬ TORTOISE SHELL \–
+2999:DOTT\ÂFENCE
+299A:\€ ZIGZAG \ä
+299B:MEASUR\ÂANGLE OPEN\ô \‰
+299C:\ùANGLE VARIANT\H\ý
+299D:MEASUR\Â\ùANGLE\³
+299E:ANGLE\HS INSIDE
+299F:\Ü ANGLE
+29A0:SPHERICAL ANGLE OPEN\ô \‰
+29A1:SPHERICAL ANGLE OPEN\ô UP
+29A2:TURN\ÂANGLE
+29A3:\öANGLE
+29A4:ANGLE\HUNDERBAR
+29A5:\öANGLE\HUNDERBAR
+29A6:OBLIQUE ANGLE OPEN\ô UP
+29A7:OBLIQUE ANGLE OPEN\ô \Ë
+29A8:\àUP\i\q
+29A9:\àUP\i\‰
+29AA:\à\Ë\i\q
+29AB:\à\Ë\i\‰
+29AC:\à\ùAND UP
+29AD:\à\‰\iUP
+29AE:\à\ùAND \Ë
+29AF:\à\‰\i\Ë
+29B0:\öEMPTY SET
+29B1:EMPTY SET\HOVERBAR
+29B2:EMPTY SET WITH\Ç\Ð\p
+29B3:EMPTY SET\H\q\u\p
+29B4:EMPTY SET\H\‰\u\p
+29B5:\Ð\H\\ì
+29B6:\c\€\ì
+29B7:\cPARALLEL
+29B8:\cREVERSE SOLIDUS
+29B9:\cPERPENDICULAR
+29BA:\Ð DIVID\ÂBY \\ì\iTOP HALF DIVID\ÂBY \€\ì
+29BB:\Ð\HSUPERIMPOS\ÂX
+29BC:\cANTICLOCKWISE-ROTAT\ÂDIVISION\‚
+29BD:UP\u THROUGH \Ð
+29BE:\c\¦BULLET
+29BF:\cBULLET
+29C0:\c\µ
+29C1:\c\’
+29C2:\Ð WITH\Ç\Ð TO THE \q
+29C3:\Ð\HTWO \ \ÁS TO THE \q
+29C4:\ýD RIS\ô DIAGONAL SLASH
+29C5:\ýD FALL\ô DIAGONAL SLASH
+29C6:\ýD ASTERISK
+29C7:\ýD\Ç\Ð
+29C8:\ýD \ý
+29C9:TWO JOIN\Â\ýS
+29CA:\¾\³\p
+29CB:\¾\HUNDERBAR
+29CC:S IN \¾
+29CD:\¾\HSERIFS AT BOTTOM
+29CE:\ù\¾\p \‰ \¾
+29CF:\‰ \¾ BESIDE \€\ì
+29D0:\€\ì BESIDE \ù\¾
+29D1:BOWTIE\H\‰ HALF \¬
+29D2:BOWTIE\H\ùHALF \¬
+29D3:\¬ BOWTIE
+29D4:TIMES\H\‰ HALF \¬
+29D5:TIMES\H\ùHALF \¬
+29D6:\¦HOURGLASS
+29D7:\¬ HOURGLASS
+29D8:\‰ WIGGLY FENCE
+29D9:\ùWIGGLY FENCE
+29DA:\‰ \0 WIGGLY FENCE
+29DB:\ù\0 WIGGLY FENCE
+29DC:INCOMPLETE INFINITY
+29DD:TIE OVER INFINITY
+29DE:INFINITY NEGATED\H\€\ì
+29DF:\0-END\ÂMULTIMAP
+29E0:\rWITH CONTOUR\ÂOUT\ä
+29E1:INCREASES AS
+29E2:SHUFFLE PRODUCT
+29E3:EQUALS\‚\iSLANT\ÂPARALLEL
+29E4:EQUALS\‚\iSLANT\ÂPARALLEL\H\æ\p
+29E5:IDENTICAL TO\iSLANT\ÂPARALLEL
+29E6:GLEICH STARK
+29E7:THERMODYNAMIC
+29E8:\Ë-\Ä\¾\H\‰ HALF \¬
+29E9:\Ë-\Ä\¾\H\ùHALF \¬
+29EA:\¬ DIAMOND\H\Ë\u
+29EB:\¬ LOZENGE
+29EC:\¦\Ð\H\Ë\u
+29ED:\¬ \Ð\H\Ë\u
+29EE:ERROR-BARR\Â\¦\ý
+29EF:ERROR-BARR\Â\¬ \ý
+29F0:ERROR-BARR\Â\¦DIAMOND
+29F1:ERROR-BARR\Â\¬ DIAMOND
+29F2:ERROR-BARR\Â\¦\Ð
+29F3:ERROR-BARR\Â\¬ \Ð
+29F4:RULE-DELAYED
+29F5:REVERSE SOLIDUS\Ú
+29F6:SOLIDUS\HOVERBAR
+29F7:REVERSE SOLIDUS\H\ \Á
+29F8:BIG SOLIDUS
+29F9:BIG REVERSE SOLIDUS
+29FA:\0 PLUS
+29FB:TRIPLE PLUS
+29FC:\‰-\ÄCURV\ÂANGLE \–
+29FD:\q-\ÄCURV\ÂANGLE \–
+29FE:TINY
+29FF:MINY
+2A00:N-ARY \cDOT\Ú
+2A01:N-ARY \cPLUS\Ú
+2A02:N-ARY \cTIMES\Ú
+2A03:N-ARY UNION\Ú\³
+2A04:N-ARY UNION\Ú\HPLUS
+2A05:N-ARY \rINTERSECTION\Ú
+2A06:N-ARY \rUNION\Ú
+2A07:TWO LOGICAL AND\Ú
+2A08:TWO LOGICAL OR\Ú
+2A09:N-ARY TIMES\Ú
+2A0A:MODULO TWO SUM
+2A0B:SUMM\”\HINTEGRAL
+2A0C:QUADRUPLE INTEGRAL\Ú
+2A0D:FINITE PART INTEGRAL
+2A0E:INTEGRAL\H\0 \Á
+2A0F:INTEGRAL AVERAGE\HSLASH
+2A10:CIRCUL\” FUNCTION
+2A11:ANTICLOCKWISE INTEGR\”
+2A12:\ä INTEGR\”\HRECTANGULAR PATH AROUND POLE
+2A13:\ä INTEGR\”\HSEMICIRCULAR PATH AROUND POLE
+2A14:\ä INTEGR\” NOT INCLUD\ô THE POLE
+2A15:INTEGRAL AROUND A POINT\Ú
+2A16:QUATERNION INTEGRAL\Ú
+2A17:INTEGRAL\H\‰\Š\u\í
+2A18:INTEGRAL\HTIMES\‚
+2A19:INTEGRAL\HINTERSECTION
+2A1A:INTEGRAL\HUNION
+2A1B:INTEGRAL\HOVERBAR
+2A1C:INTEGRAL\HUNDERBAR
+2A1D:JOIN
+2A1E:LARGE \‰ \¾\Ú
+2A1F:Z NOT\” SCHEMA COMPOSITION
+2A20:Z NOT\” SCHEMA PIP\ô
+2A21:Z NOT\” SCHEMA PROJECTION
+2A22:PLUS\‚ WITH\Ç\Ð\p
+2A23:PLUS\‚\ˆ\×\p
+2A24:PLUS\‚\H\æ\p
+2A25:PLUS\‚\³\…
+2A26:PLUS\‚\H\æ\…
+2A27:PLUS\‚\HSUB\Ž TWO
+2A28:PLUS\‚\H\¬ \¾
+2A29:MINUS\‚\HCOMMA\p
+2A2A:MINUS\‚\³\…
+2A2B:MINUS\‚\HFALL\ô DOTS
+2A2C:MINUS\‚\HRIS\ô DOTS
+2A2D:PLUS\‚ IN \‰ HALF \Ð
+2A2E:PLUS\‚ IN \ùHALF \Ð
+2A2F:VECTOR OR CROSS PRODUCT
+2A30:MULTIPLIC\”\‚\³\p
+2A31:MULTIPLIC\”\‚\HUNDERBAR
+2A32:SEMIDIRECT PRODUCT\HBOTTOM CLOSED
+2A33:SMASH PRODUCT
+2A34:MULTIPLIC\”\‚ IN \‰ HALF \Ð
+2A35:MULTIPLIC\”\‚ IN \ùHALF \Ð
+2A36:\cMULTIPLIC\”\‚\ˆ\×
+2A37:MULTIPLIC\”\‚ IN \0 \Ð
+2A38:\cDIVISION\‚
+2A39:PLUS\‚ IN \¾
+2A3A:MINUS\‚ IN \¾
+2A3B:MULTIPLIC\”\‚ IN \¾
+2A3C:INTERIOR PRODUCT
+2A3D:\qHAND INTERIOR PRODUCT
+2A3E:Z NOT\” REL\”AL COMPOSITION
+2A3F:AMALGAM\” OR COPRODUCT
+2A40:INTERSECTION\³
+2A41:UNION\HMINUS\‚
+2A42:UNION\HOVERBAR
+2A43:INTERSECTION\HOVERBAR
+2A44:INTERSECTION\HLOGICAL AND
+2A45:UNION\HLOGICAL OR
+2A46:UNION\p INTERSECTION
+2A47:INTERSECTION\p UNION
+2A48:UNION\p\ì\p INTERSECTION
+2A49:INTERSECTION\p\ì\p UNION
+2A4A:UNION BESIDE\iJOINED\HUNION
+2A4B:INTERSECTION BESIDE\iJOINED\HINTERSECTION
+2A4C:CLOS\ÂUNION\HSERIFS
+2A4D:CLOS\ÂINTERSECTION\HSERIFS
+2A4E:\0 \rINTERSECTION
+2A4F:\0 \rUNION
+2A50:CLOS\ÂUNION\HSERIFS\iSMASH PRODUCT
+2A51:LOGICAL AND\³\p
+2A52:LOGICAL OR\³\p
+2A53:\0 LOGICAL AND
+2A54:\0 LOGICAL OR
+2A55:TWO INTERSECT\ô LOGICAL AND
+2A56:TWO INTERSECT\ô LOGICAL OR
+2A57:SLOP\ô LARGE OR
+2A58:SLOP\ô LARGE AND
+2A59:LOGICAL OR OVERLAPP\ô LOGICAL AND
+2A5A:LOGICAL AND\HMIDDLE STEM
+2A5B:LOGICAL OR\HMIDDLE STEM
+2A5C:LOGICAL AND\H\ DASH
+2A5D:LOGICAL OR\H\ DASH
+2A5E:LOGICAL AND\H\0 OVERBAR
+2A5F:LOGICAL AND\HUNDERBAR
+2A60:LOGICAL AND\H\0 UNDERBAR
+2A61:\§VEE\HUNDERBAR
+2A62:LOGICAL OR\H\0 OVERBAR
+2A63:LOGICAL OR\H\0 UNDERBAR
+2A64:Z NOT\” DOMAIN ANTIRESTRICTION
+2A65:Z NOT\” RANGE ANTIRESTRICTION
+2A66:EQUALS\‚\³\…
+2A67:IDENTICAL\³\p
+2A68:TRIPLE \\ì\H\0 \€ \Á
+2A69:TRIPLE \\ì\HTRIPLE \€ \Á
+2A6A:\æ\Ú\³\p
+2A6B:\æ\Ú\HRIS\ô DOTS
+2A6C:SIMILAR MINUS SIMILAR
+2A6D:CONGRUENT\³\p
+2A6E:EQUALS\HASTERISK
+2A6F:ALMOST\‘\ˆ\×
+2A70:APPROXIMATELY EQUAL OR\‘
+2A71:EQUALS\‚\p PLUS\‚
+2A72:PLUS\‚\p EQUALS\‚
+2A73:EQUALS\‚\p \æ\Ú
+2A74:\0 COLON EQUAL
+2A75:TWO CONSECUTIVE EQUALS\‚S
+2A76:THREE CONSECUTIVE EQUALS\‚S
+2A77:EQUALS\‚\HTWO DOTS\p\iTWO DOTS\…
+2A78:EQUIVALENT\HFOUR DOTS\p
+2A79:\µ\H\Ð INSIDE
+2A7A:\’\H\Ð INSIDE
+2A7B:\µ\HQUESTION\¥\p
+2A7C:\’\HQUESTION\¥\p
+2A7D:\µ OR SLANTED\‘
+2A7E:\’ OR SLANTED\‘
+2A7F:\µ OR SLANTED\‘\³ INSIDE
+2A80:\’ OR SLANTED\‘\³ INSIDE
+2A81:\µ OR SLANTED\‘\³\p
+2A82:\’ OR SLANTED\‘\³\p
+2A83:\µ OR SLANTED\‘\³\p \q
+2A84:\’ OR SLANTED\‘\³\p \‰
+2A85:\µ OR APPROXIMATE
+2A86:\’ OR APPROXIMATE
+2A87:\µ\iS\ôLE-\ä NOT\‘
+2A88:\’\iS\ôLE-\ä NOT\‘
+2A89:\µ\iNOT APPROXIMATE
+2A8A:\’\iNOT APPROXIMATE
+2A8B:\µ\p \0-\ä EQUAL\p \’
+2A8C:\’\p \0-\ä EQUAL\p \µ
+2A8D:\µ\p SIMILAR OR EQUAL
+2A8E:\’\p SIMILAR OR EQUAL
+2A8F:\µ\p SIMILAR\p \’
+2A90:\’\p SIMILAR\p \µ
+2A91:\µ\p \’\p \0-\ä EQUAL
+2A92:\’\p \µ\p \0-\ä EQUAL
+2A93:\µ\p SLANT\ÂEQUAL\p \’\p SLANT\ÂEQUAL
+2A94:\’\p SLANT\ÂEQUAL\p \µ\p SLANT\ÂEQUAL
+2A95:SLANTED\‘ OR \µ
+2A96:SLANTED\‘ OR \’
+2A97:SLANTED\‘ OR \µ\³ INSIDE
+2A98:SLANTED\‘ OR \’\³ INSIDE
+2A99:\0-\ä\‘ OR \µ
+2A9A:\0-\ä\‘ OR \’
+2A9B:\0-\ä SLANTED\‘ OR \µ
+2A9C:\0-\ä SLANTED\‘ OR \’
+2A9D:SIMILAR OR \µ
+2A9E:SIMILAR OR \’
+2A9F:SIMILAR\p \µ\p EQUALS\‚
+2AA0:SIMILAR\p \’\p EQUALS\‚
+2AA1:\0 NEST\Â\µ
+2AA2:\0 NEST\Â\’
+2AA3:\0 NEST\Â\µ\HUNDERBAR
+2AA4:\’ OVERLAPP\ô \µ
+2AA5:\’ BESIDE \µ
+2AA6:\µ CLOS\ÂBY CURVE
+2AA7:\’ CLOS\ÂBY CURVE
+2AA8:\µ CLOS\ÂBY CURVE\p SLANT\ÂEQUAL
+2AA9:\’ CLOS\ÂBY CURVE\p SLANT\ÂEQUAL
+2AAA:SMALLER THAN
+2AAB:LARGER THAN
+2AAC:SMALLER THAN OR\‘
+2AAD:LARGER THAN OR\‘
+2AAE:EQUALS\‚\HBUMPY\p
+2AAF:PRECEDES\p S\ôLE-\ä EQUALS\‚
+2AB0:SUCCEEDS\p S\ôLE-\ä EQUALS\‚
+2AB1:PRECEDES\p S\ôLE-\ä NOT\‘
+2AB2:SUCCEEDS\p S\ôLE-\ä NOT\‘
+2AB3:PRECEDES\p EQUALS\‚
+2AB4:SUCCEEDS\p EQUALS\‚
+2AB5:PRECEDES\p NOT\‘
+2AB6:SUCCEEDS\p NOT\‘
+2AB7:PRECEDES\p ALMOST\‘
+2AB8:SUCCEEDS\p ALMOST\‘
+2AB9:PRECEDES\p NOT ALMOST\‘
+2ABA:SUCCEEDS\p NOT ALMOST\‘
+2ABB:\0 PRECEDES
+2ABC:\0 SUCCEEDS
+2ABD:SUBSET\³
+2ABE:SUPERSET\³
+2ABF:SUBSET\HPLUS\‚\…
+2AC0:SUPERSET\HPLUS\‚\…
+2AC1:SUBSET\HMULTIPLIC\”\‚\…
+2AC2:SUPERSET\HMULTIPLIC\”\‚\…
+2AC3:SUBSET OF OR\‘\³\p
+2AC4:SUPERSET OF OR\‘\³\p
+2AC5:SUBSET OF\p EQUALS\‚
+2AC6:SUPERSET OF\p EQUALS\‚
+2AC7:SUBSET OF\p \æ\Ú
+2AC8:SUPERSET OF\p \æ\Ú
+2AC9:SUBSET OF\p ALMOST\‘
+2ACA:SUPERSET OF\p ALMOST\‘
+2ACB:SUBSET OF\p NOT\‘
+2ACC:SUPERSET OF\p NOT\‘
+2ACD:\r\‰ OPEN BOX\Ú
+2ACE:\r\ùOPEN BOX\Ú
+2ACF:CLOS\ÂSUBSET
+2AD0:CLOS\ÂSUPERSET
+2AD1:CLOS\ÂSUBSET OR\‘
+2AD2:CLOS\ÂSUPERSET OR\‘
+2AD3:SUBSET\p SUPERSET
+2AD4:SUPERSET\p SUBSET
+2AD5:SUBSET\p SUBSET
+2AD6:SUPERSET\p SUPERSET
+2AD7:SUPERSET BESIDE SUBSET
+2AD8:SUPERSET BESIDE\iJOIN\ÂBY DASH\HSUBSET
+2AD9:ELEMENT OF OPEN\ô \Ë\Š
+2ADA:PITCHFORK\HTEE TOP
+2ADB:TRANSVERSAL INTERSECTION
+2ADC:FORK\ô
+2ADD:NONFORK\ô
+2ADE:SHORT \‰ TACK
+2ADF:SHORT \Ë TACK
+2AE0:SHORT UP TACK
+2AE1:PERPENDICULAR\HS
+2AE2:\€\ì TRIPLE \ùTURNSTILE
+2AE3:\0 \€\ì \‰ TURNSTILE
+2AE4:\€\ì \0 \‰ TURNSTILE
+2AE5:\0 \€\ì \0 \‰ TURNSTILE
+2AE6:LONG DASH FROM \‰ MEMBER OF \0 \€
+2AE7:SHORT \Ë TACK\HOVERBAR
+2AE8:SHORT UP TACK\HUNDERBAR
+2AE9:SHORT UP TACK\p SHORT \Ë TACK
+2AEA:\0 \Ë TACK
+2AEB:\0 UP TACK
+2AEC:\0 \Á NOT\‚
+2AED:\ö\0 \Á NOT\‚
+2AEE:DOES NOT DIVIDE\H\öNEG\” SLASH
+2AEF:\€ \ä\H\Ð\p
+2AF0:\€ \ä\H\Ð\…
+2AF1:\Ë TACK\H\Ð\…
+2AF2:PARALLEL\H\ \Á
+2AF3:PARALLEL\H\æ\Ú
+2AF4:TRIPLE \€\ì BINARY REL\”
+2AF5:TRIPLE \€\ì\H\ \Á
+2AF6:TRIPLE COLON\Ú
+2AF7:TRIPLE NEST\Â\µ
+2AF8:TRIPLE NEST\Â\’
+2AF9:\0-\ä SLANT\Â\µ OR\‘
+2AFA:\0-\ä SLANT\Â\’ OR\‘
+2AFB:TRIPLE SOLIDUS BINARY REL\”
+2AFC:LARGE TRIPLE \€\ì\Ú
+2AFD:\0 SOLIDUS\Ú
+2AFE:\¦\€\ì
+2AFF:N-ARY \¦\€\ì
+2E80:CJK\vREPEAT
+2E81:CJK\vCLIFF
+2E82:CJK\vSECOND ONE
+2E83:CJK\vSECOND TWO
+2E84:CJK\vSECOND THREE
+2E85:CJK\vPERSON
+2E86:CJK\vBOX
+2E87:CJK\vTABLE
+2E88:CJK\vKNIFE ONE
+2E89:CJK\vKNIFE TWO
+2E8A:CJK\vDIVIN\”
+2E8B:CJK\vSEAL
+2E8C:CJK\v\§ONE
+2E8D:CJK\v\§TWO
+2E8E:CJK\vLAME ONE
+2E8F:CJK\vLAME TWO
+2E90:CJK\vLAME THREE
+2E91:CJK\vLAME FOUR
+2E92:CJK\vSNAKE
+2E93:CJK\vTHREAD
+2E94:CJK\vSNOUT ONE
+2E95:CJK\vSNOUT TWO
+2E96:CJK\vHEART ONE
+2E97:CJK\vHEART TWO
+2E98:CJK\vHAND
+2E99:CJK\vRAP
+2E9B:CJK\vCHOKE
+2E9C:CJK\vSUN
+2E9D:CJK\vMOON
+2E9E:CJK\vDEATH
+2E9F:CJK\vMOTHER
+2EA0:CJK\vCIVILIAN
+2EA1:CJK\vWATER ONE
+2EA2:CJK\vWATER TWO
+2EA3:CJK\vFIRE
+2EA4:CJK\vPAW ONE
+2EA5:CJK\vPAW TWO
+2EA6:CJK\vSIMPLIFI\ÂHALF TREE TRUNK
+2EA7:CJK\vCOW
+2EA8:CJK\vDOG
+2EA9:CJK\vJADE
+2EAA:CJK\vBOLT OF CLOTH
+2EAB:CJK\vEYE
+2EAC:CJK\vSPIRIT ONE
+2EAD:CJK\vSPIRIT TWO
+2EAE:CJK\vBAMBOO
+2EAF:CJK\vSILK
+2EB0:CJK\vC-SIMPLIFI\ÂSILK
+2EB1:CJK\vNET ONE
+2EB2:CJK\vNET TWO
+2EB3:CJK\vNET THREE
+2EB4:CJK\vNET FOUR
+2EB5:CJK\vMESH
+2EB6:CJK\vSHEEP
+2EB7:CJK\vRAM
+2EB8:CJK\vEWE
+2EB9:CJK\vOLD
+2EBA:CJK\vBRUSH ONE
+2EBB:CJK\vBRUSH TWO
+2EBC:CJK\vMEAT
+2EBD:CJK\vMORTAR
+2EBE:CJK\vGRASS ONE
+2EBF:CJK\vGRASS TWO
+2EC0:CJK\vGRASS THREE
+2EC1:CJK\vTIGER
+2EC2:CJK\vCLOTHES
+2EC3:CJK\vWEST ONE
+2EC4:CJK\vWEST TWO
+2EC5:CJK\vC-SIMPLIFI\ÂSEE
+2EC6:CJK\vSIMPLIFI\ÂHORN
+2EC7:CJK\vHORN
+2EC8:CJK\vC-SIMPLIFI\ÂSPEECH
+2EC9:CJK\vC-SIMPLIFI\ÂSHELL
+2ECA:CJK\vFOOT
+2ECB:CJK\vC-SIMPLIFI\ÂCART
+2ECC:CJK\vSIMPLIFI\ÂWALK
+2ECD:CJK\vWALK ONE
+2ECE:CJK\vWALK TWO
+2ECF:CJK\vCITY
+2ED0:CJK\vC-SIMPLIFI\ÂGOLD
+2ED1:CJK\vLONG ONE
+2ED2:CJK\vLONG TWO
+2ED3:CJK\vC-SIMPLIFI\ÂLONG
+2ED4:CJK\vC-SIMPLIFI\ÂGATE
+2ED5:CJK\vMOUND ONE
+2ED6:CJK\vMOUND TWO
+2ED7:CJK\vRAIN
+2ED8:CJK\vBLUE
+2ED9:CJK\vC-SIMPLIFI\ÂTANN\ÂLEATHER
+2EDA:CJK\vC-SIMPLIFI\ÂLEAF
+2EDB:CJK\vC-SIMPLIFI\ÂWIND
+2EDC:CJK\vC-SIMPLIFI\ÂFLY
+2EDD:CJK\vEAT ONE
+2EDE:CJK\vEAT TWO
+2EDF:CJK\vEAT THREE
+2EE0:CJK\vC-SIMPLIFI\ÂEAT
+2EE1:CJK\vHEAD
+2EE2:CJK\vC-SIMPLIFI\ÂHORSE
+2EE3:CJK\vBONE
+2EE4:CJK\vGHOST
+2EE5:CJK\vC-SIMPLIFI\ÂFISH
+2EE6:CJK\vC-SIMPLIFI\ÂBIRD
+2EE7:CJK\vC-SIMPLIFI\ÂSALT
+2EE8:CJK\vSIMPLIFI\ÂWHEAT
+2EE9:CJK\vSIMPLIFI\ÂYELLOW
+2EEA:CJK\vC-SIMPLIFI\ÂFROG
+2EEB:CJK\vJ-SIMPLIFI\ÂEVEN
+2EEC:CJK\vC-SIMPLIFI\ÂEVEN
+2EED:CJK\vJ-SIMPLIFI\ÂTOOTH
+2EEE:CJK\vC-SIMPLIFI\ÂTOOTH
+2EEF:CJK\vJ-SIMPLIFI\ÂDRAGON
+2EF0:CJK\vC-SIMPLIFI\ÂDRAGON
+2EF1:CJK\vTURTLE
+2EF2:CJK\vJ-SIMPLIFI\ÂTURTLE
+2EF3:CJK\vC-SIMPLIFI\ÂTURTLE
+2F00:\UONE
+2F01:\U\ä
+2F02:\UDOT
+2F03:\USLASH
+2F04:\USECOND
+2F05:\UHOOK
+2F06:\UTWO
+2F07:\ULID
+2F08:\UMAN
+2F09:\ULEGS
+2F0A:\UENTER
+2F0B:\UE\¼
+2F0C:\U\Ë BOX
+2F0D:\UCOVER
+2F0E:\UICE
+2F0F:\UTABLE
+2F10:\UOPEN BOX
+2F11:\UKNIFE
+2F12:\UPOWER
+2F13:\UWRAP
+2F14:\USPOON
+2F15:\U\ùOPEN BOX
+2F16:\UHID\ô ENCLOSURE
+2F17:\UTEN
+2F18:\UDIVIN\”
+2F19:\USEAL
+2F1A:\UCLIFF
+2F1B:\UPRIVATE
+2F1C:\UAGAIN
+2F1D:\UMOUTH
+2F1E:\UENCLOSURE
+2F1F:\UEARTH
+2F20:\USCHOLAR
+2F21:\UGO
+2F22:\UGO SLOWLY
+2F23:\UEVEN\ô
+2F24:\UBIG
+2F25:\UWOMAN
+2F26:\UCHILD
+2F27:\UROOF
+2F28:\UINCH
+2F29:\USMALL
+2F2A:\ULAME
+2F2B:\UCORPSE
+2F2C:\USPROUT
+2F2D:\UMOUNTAIN
+2F2E:\URIVER
+2F2F:\UWORK
+2F30:\UONESELF
+2F31:\UTURBAN
+2F32:\UDRY
+2F33:\USHORT THREAD
+2F34:\UDOTT\ÂCLIFF
+2F35:\ULONG STRIDE
+2F36:\UTWO HANDS
+2F37:\USHOOT
+2F38:\UBOW
+2F39:\USNOUT
+2F3A:\UBRISTLE
+2F3B:\USTEP
+2F3C:\UHEART
+2F3D:\UHALBERD
+2F3E:\UDOOR
+2F3F:\UHAND
+2F40:\UBRANCH
+2F41:\URAP
+2F42:\U\Ž
+2F43:\UDIPPER
+2F44:\UAXE
+2F45:\U\ý
+2F46:\UNOT
+2F47:\USUN
+2F48:\USAY
+2F49:\UMOON
+2F4A:\UTREE
+2F4B:\ULACK
+2F4C:\USTOP
+2F4D:\UDEATH
+2F4E:\UWEAPON
+2F4F:\UDO NOT
+2F50:\UCOMPARE
+2F51:\UFUR
+2F52:\UCLAN
+2F53:\USTEAM
+2F54:\UWATER
+2F55:\UFIRE
+2F56:\UCLAW
+2F57:\UFATHER
+2F58:\U\0 X
+2F59:\UHALF TREE TRUNK
+2F5A:\USLICE
+2F5B:\UFANG
+2F5C:\UCOW
+2F5D:\UDOG
+2F5E:\UPROFOUND
+2F5F:\UJADE
+2F60:\UMELON
+2F61:\UTILE
+2F62:\USWEET
+2F63:\ULIFE
+2F64:\UUSE
+2F65:\UFIELD
+2F66:\UBOLT OF CLOTH
+2F67:\USICKNESS
+2F68:\UDOTT\ÂTENT
+2F69:\UWHITE
+2F6A:\USKIN
+2F6B:\UDISH
+2F6C:\UEYE
+2F6D:\USPEAR
+2F6E:\UARROW
+2F6F:\USTONE
+2F70:\USPIRIT
+2F71:\UTRACK
+2F72:\UGRAIN
+2F73:\UCAVE
+2F74:\USTAND
+2F75:\UBAMBOO
+2F76:\URICE
+2F77:\USILK
+2F78:\UJAR
+2F79:\UNET
+2F7A:\USHEEP
+2F7B:\UFEATHER
+2F7C:\UOLD
+2F7D:\UAND
+2F7E:\UPLOW
+2F7F:\UEAR
+2F80:\UBRUSH
+2F81:\UMEAT
+2F82:\UMINISTER
+2F83:\USELF
+2F84:\UARRIVE
+2F85:\UMORTAR
+2F86:\UTONGUE
+2F87:\UOPPOSE
+2F88:\UBOAT
+2F89:\USTOPP\ô
+2F8A:\UCOLOR
+2F8B:\UGRASS
+2F8C:\UTIGER
+2F8D:\UINSECT
+2F8E:\UBLOOD
+2F8F:\UWALK ENCLOSURE
+2F90:\UCLOTHES
+2F91:\UWEST
+2F92:\USEE
+2F93:\UHORN
+2F94:\USPEECH
+2F95:\UVALLEY
+2F96:\UBEAN
+2F97:\UPIG
+2F98:\UBADGER
+2F99:\USHELL
+2F9A:\URED
+2F9B:\URUN
+2F9C:\UFOOT
+2F9D:\UBODY
+2F9E:\UCART
+2F9F:\UBITTER
+2FA0:\UMORN\ô
+2FA1:\UWALK
+2FA2:\UCITY
+2FA3:\UWINE
+2FA4:\UDIST\ôUISH
+2FA5:\UVILLAGE
+2FA6:\UGOLD
+2FA7:\ULONG
+2FA8:\UGATE
+2FA9:\UMOUND
+2FAA:\USLAVE
+2FAB:\USHORT TAIL\ÂBIRD
+2FAC:\URAIN
+2FAD:\UBLUE
+2FAE:\UWRONG
+2FAF:\UFACE
+2FB0:\ULEATHER
+2FB1:\UTANN\ÂLEATHER
+2FB2:\ULEEK
+2FB3:\USOUND
+2FB4:\ULEAF
+2FB5:\UWIND
+2FB6:\UFLY
+2FB7:\UEAT
+2FB8:\UHEAD
+2FB9:\UFRAGRANT
+2FBA:\UHORSE
+2FBB:\UBONE
+2FBC:\UTALL
+2FBD:\UHAIR
+2FBE:\UF\¼
+2FBF:\USACRIFICIAL WINE
+2FC0:\UCAULDRON
+2FC1:\UGHOST
+2FC2:\UFISH
+2FC3:\UBIRD
+2FC4:\USALT
+2FC5:\UDEER
+2FC6:\UWHEAT
+2FC7:\UHEMP
+2FC8:\UYELLOW
+2FC9:\UMILLET
+2FCA:\U\¬
+2FCB:\UEMBROIDERY
+2FCC:\UFROG
+2FCD:\UTRIPOD
+2FCE:\UDRUM
+2FCF:\URAT
+2FD0:\UNOSE
+2FD1:\UEVEN
+2FD2:\UTOOTH
+2FD3:\UDRAGON
+2FD4:\UTURTLE
+2FD5:\UFLUTE
+2FF0:\ð \‰ TO \q
+2FF1:\ð\p TO\…
+2FF2:\ð \‰ TO MIDDLE\i\q
+2FF3:\ð\p TO MIDDLE AND\…
+2FF4:\ð FULL SURROUND
+2FF5:\ð SURROUND FROM\p
+2FF6:\ð SURROUND FROM\…
+2FF7:\ð SURROUND FROM \‰
+2FF8:\ð SURROUND FROM \÷\‰
+2FF9:\ð SURROUND FROM \÷\q
+2FFA:\ð SURROUND FROM \ï\‰
+2FFB:\ð OVERLAID
+3000:\8IC SPACE
+3001:\8IC COMMA
+3002:\8IC\é
+3003:DITTO\¥
+3004:JAPANESE INDUSTRIAL STANDARD \
+3005:\8IC ITER\”\¥
+3006:\8IC CLOS\ô\¥
+3007:\8IC \­ZERO
+3008:\‰ ANGLE \–
+3009:\ùANGLE \–
+300A:\‰ \0 ANGLE \–
+300B:\ù\0 ANGLE \–
+300C:\‰ CORNER \–
+300D:\ùCORNER \–
+300E:\‰ \¦CORNER \–
+300F:\ù\¦CORNER \–
+3010:\‰ \¬ LENTICULAR \–
+3011:\ù\¬ LENTICULAR \–
+3012:POSTAL\¥
+3013:GETA\¥
+3014:\‰ TORTOISE SHELL \–
+3015:\ùTORTOISE SHELL \–
+3016:\‰ \¦LENTICULAR \–
+3017:\ù\¦LENTICULAR \–
+3018:\‰ \¦TORTOISE SHELL \–
+3019:\ù\¦TORTOISE SHELL \–
+301A:\‰ \¦\r\–
+301B:\ù\¦\r\–
+301C:WAVE DASH
+301D:\ö\0 PRIME QUOT\”\¥
+301E:\0 PRIME QUOT\”\¥
+301F:LOW \0 PRIME QUOT\”\¥
+3020:POSTAL\¥ FACE
+3021:HANGZHOU NUMERAL ONE
+3022:HANGZHOU NUMERAL TWO
+3023:HANGZHOU NUMERAL THREE
+3024:HANGZHOU NUMERAL FOUR
+3025:HANGZHOU NUMERAL FIVE
+3026:HANGZHOU NUMERAL SIX
+3027:HANGZHOU NUMERAL SEVEN
+3028:HANGZHOU NUMERAL E\¼
+3029:HANGZHOU NUMERAL NINE
+302A:\8IC LEVEL TONE\¥
+302B:\8IC RIS\ô TONE\¥
+302C:\8IC DEPART\ô TONE\¥
+302D:\8IC ENTER\ô TONE\¥
+302E:\e S\ôLE DOT TONE\¥
+302F:\e \0 DOT TONE\¥
+3030:WAVY DASH
+3031:\€ KANA REPEAT\¥
+3032:\€ KANA REPEAT\HVOIC\ÂSOUND\¥
+3033:\€ KANA REPEAT\¥ \÷HALF
+3034:\€ KANA REPEAT\HVOIC\ÂSOUND\¥ \÷HALF
+3035:\€ KANA REPEAT\¥ \ïHALF
+3036:\cPOSTAL\¥
+3037:\8IC TELEGRAPH \ä FE\ÂSEPARATOR \
+3038:HANGZHOU NUMERAL TEN
+3039:HANGZHOU NUMERAL TWENTY
+303A:HANGZHOU NUMERAL THIRTY
+303B:\€ \8IC ITER\”\¥
+303C:MASU\¥
+303D:PART ALTERN\”\¥
+303E:\8IC VARI\” INDICATOR
+303F:\8IC HALF FILL SPACE
+3041:\‹\§A
+3042:\‹A
+3043:\‹\§I
+3044:\‹I
+3045:\‹\§U
+3046:\‹U
+3047:\‹\§E
+3048:\‹E
+3049:\‹\§O
+304A:\‹O
+304B:\‹KA
+304C:\‹GA
+304D:\‹KI
+304E:\‹GI
+304F:\‹KU
+3050:\‹GU
+3051:\‹KE
+3052:\‹GE
+3053:\‹KO
+3054:\‹GO
+3055:\‹SA
+3056:\‹ZA
+3057:\‹SI
+3058:\‹ZI
+3059:\‹SU
+305A:\‹ZU
+305B:\‹SE
+305C:\‹ZE
+305D:\‹SO
+305E:\‹ZO
+305F:\‹TA
+3060:\‹DA
+3061:\‹TI
+3062:\‹DI
+3063:\‹\§TU
+3064:\‹TU
+3065:\‹DU
+3066:\‹TE
+3067:\‹DE
+3068:\‹TO
+3069:\‹DO
+306A:\‹NA
+306B:\‹NI
+306C:\‹NU
+306D:\‹NE
+306E:\‹NO
+306F:\‹HA
+3070:\‹BA
+3071:\‹PA
+3072:\‹HI
+3073:\‹BI
+3074:\‹PI
+3075:\‹HU
+3076:\‹BU
+3077:\‹PU
+3078:\‹HE
+3079:\‹BE
+307A:\‹PE
+307B:\‹HO
+307C:\‹BO
+307D:\‹PO
+307E:\‹MA
+307F:\‹MI
+3080:\‹MU
+3081:\‹ME
+3082:\‹MO
+3083:\‹\§YA
+3084:\‹YA
+3085:\‹\§YU
+3086:\‹YU
+3087:\‹\§YO
+3088:\‹YO
+3089:\‹RA
+308A:\‹RI
+308B:\‹RU
+308C:\‹RE
+308D:\‹RO
+308E:\‹\§WA
+308F:\‹WA
+3090:\‹WI
+3091:\‹WE
+3092:\‹WO
+3093:\‹N
+3094:\‹VU
+3095:\‹\§KA
+3096:\‹\§KE
+3099:\o\n-HIRAGANA VOIC\ÂSOUND\¥
+309A:\o\n-HIRAGANA SEMI-VOIC\ÂSOUND\¥
+309B:\n-HIRAGANA VOIC\ÂSOUND\¥
+309C:\n-HIRAGANA SEMI-VOIC\ÂSOUND\¥
+309D:HIRAGANA ITER\”\¥
+309E:HIRAGANA VOIC\ÂITER\”\¥
+309F:HIRAGANA DIGRAPH YORI
+30A0:\n-HIRAGANA \0 HYPHEN
+30A1:\Í\§A
+30A2:\ÍA
+30A3:\Í\§I
+30A4:\ÍI
+30A5:\Í\§U
+30A6:\ÍU
+30A7:\Í\§E
+30A8:\ÍE
+30A9:\Í\§O
+30AA:\ÍO
+30AB:\ÍKA
+30AC:\ÍGA
+30AD:\ÍKI
+30AE:\ÍGI
+30AF:\ÍKU
+30B0:\ÍGU
+30B1:\ÍKE
+30B2:\ÍGE
+30B3:\ÍKO
+30B4:\ÍGO
+30B5:\ÍSA
+30B6:\ÍZA
+30B7:\ÍSI
+30B8:\ÍZI
+30B9:\ÍSU
+30BA:\ÍZU
+30BB:\ÍSE
+30BC:\ÍZE
+30BD:\ÍSO
+30BE:\ÍZO
+30BF:\ÍTA
+30C0:\ÍDA
+30C1:\ÍTI
+30C2:\ÍDI
+30C3:\Í\§TU
+30C4:\ÍTU
+30C5:\ÍDU
+30C6:\ÍTE
+30C7:\ÍDE
+30C8:\ÍTO
+30C9:\ÍDO
+30CA:\ÍNA
+30CB:\ÍNI
+30CC:\ÍNU
+30CD:\ÍNE
+30CE:\ÍNO
+30CF:\ÍHA
+30D0:\ÍBA
+30D1:\ÍPA
+30D2:\ÍHI
+30D3:\ÍBI
+30D4:\ÍPI
+30D5:\ÍHU
+30D6:\ÍBU
+30D7:\ÍPU
+30D8:\ÍHE
+30D9:\ÍBE
+30DA:\ÍPE
+30DB:\ÍHO
+30DC:\ÍBO
+30DD:\ÍPO
+30DE:\ÍMA
+30DF:\ÍMI
+30E0:\ÍMU
+30E1:\ÍME
+30E2:\ÍMO
+30E3:\Í\§YA
+30E4:\ÍYA
+30E5:\Í\§YU
+30E6:\ÍYU
+30E7:\Í\§YO
+30E8:\ÍYO
+30E9:\ÍRA
+30EA:\ÍRI
+30EB:\ÍRU
+30EC:\ÍRE
+30ED:\ÍRO
+30EE:\Í\§WA
+30EF:\ÍWA
+30F0:\ÍWI
+30F1:\ÍWE
+30F2:\ÍWO
+30F3:\ÍN
+30F4:\ÍVU
+30F5:\Í\§KA
+30F6:\Í\§KE
+30F7:\ÍVA
+30F8:\ÍVI
+30F9:\ÍVE
+30FA:\ÍVO
+30FB:\n MIDDLE DOT
+30FC:\n-HIRAGANA PROLONG\ÂSOUND\¥
+30FD:\n ITER\”\¥
+30FE:\n VOIC\ÂITER\”\¥
+30FF:\n DIGRAPH KOTO
+3105:\©B
+3106:\©P
+3107:\©M
+3108:\©F
+3109:\©D
+310A:\©T
+310B:\©N
+310C:\©L
+310D:\©G
+310E:\©K
+310F:\©H
+3110:\©J
+3111:\©Q
+3112:\©X
+3113:\©ZH
+3114:\©CH
+3115:\©SH
+3116:\©R
+3117:\©Z
+3118:\©C
+3119:\©S
+311A:\©A
+311B:\©O
+311C:\©E
+311D:\©EH
+311E:\©AI
+311F:\©EI
+3120:\©AU
+3121:\©OU
+3122:\©AN
+3123:\©EN
+3124:\©ANG
+3125:\©ENG
+3126:\©ER
+3127:\©I
+3128:\©U
+3129:\©IU
+312A:\©V
+312B:\©NG
+312C:\©GN
+3131:\ÖKIYEOK
+3132:\ÖSSANGKIYEOK
+3133:\ÖKIYEOK-SIOS
+3134:\ÖN\ÆN
+3135:\ÖN\ÆN-C\ÆC
+3136:\ÖN\ÆN-H\ÆH
+3137:\ÖTIKEUT
+3138:\ÖSSANGTIKEUT
+3139:\ÖR\ÆL
+313A:\ÖR\ÆL-KIYEOK
+313B:\ÖR\ÆL-M\ÆM
+313C:\ÖR\ÆL-P\ÆP
+313D:\ÖR\ÆL-SIOS
+313E:\ÖR\ÆL-TH\ÆTH
+313F:\ÖR\ÆL-PH\ÆPH
+3140:\ÖR\ÆL-H\ÆH
+3141:\ÖM\ÆM
+3142:\ÖP\ÆP
+3143:\ÖSSANGP\ÆP
+3144:\ÖP\ÆP-SIOS
+3145:\ÖSIOS
+3146:\ÖSSANGSIOS
+3147:\Ö\ÆNG
+3148:\ÖC\ÆC
+3149:\ÖSSANGC\ÆC
+314A:\ÖCH\ÆCH
+314B:\ÖKH\ÆKH
+314C:\ÖTH\ÆTH
+314D:\ÖPH\ÆPH
+314E:\ÖH\ÆH
+314F:\ÖA
+3150:\ÖAE
+3151:\ÖYA
+3152:\ÖYAE
+3153:\ÖEO
+3154:\ÖE
+3155:\ÖYEO
+3156:\ÖYE
+3157:\ÖO
+3158:\ÖWA
+3159:\ÖWAE
+315A:\ÖOE
+315B:\ÖYO
+315C:\ÖU
+315D:\ÖWEO
+315E:\ÖWE
+315F:\ÖWI
+3160:\ÖYU
+3161:\ÖEU
+3162:\ÖYI
+3163:\ÖI
+3164:\e FILLER
+3165:\ÖSSANGN\ÆN
+3166:\ÖN\ÆN-TIKEUT
+3167:\ÖN\ÆN-SIOS
+3168:\ÖN\ÆN-PANSIOS
+3169:\ÖR\ÆL-KIYEOK-SIOS
+316A:\ÖR\ÆL-TIKEUT
+316B:\ÖR\ÆL-P\ÆP-SIOS
+316C:\ÖR\ÆL-PANSIOS
+316D:\ÖR\ÆL-YEORINH\ÆH
+316E:\ÖM\ÆM-P\ÆP
+316F:\ÖM\ÆM-SIOS
+3170:\ÖM\ÆM-PANSIOS
+3171:\ÖKAPYEOUNM\ÆM
+3172:\ÖP\ÆP-KIYEOK
+3173:\ÖP\ÆP-TIKEUT
+3174:\ÖP\ÆP-SIOS-KIYEOK
+3175:\ÖP\ÆP-SIOS-TIKEUT
+3176:\ÖP\ÆP-C\ÆC
+3177:\ÖP\ÆP-TH\ÆTH
+3178:\ÖKAPYEOUNP\ÆP
+3179:\ÖKAPYEOUNSSANGP\ÆP
+317A:\ÖSIOS-KIYEOK
+317B:\ÖSIOS-N\ÆN
+317C:\ÖSIOS-TIKEUT
+317D:\ÖSIOS-P\ÆP
+317E:\ÖSIOS-C\ÆC
+317F:\ÖPANSIOS
+3180:\ÖSSANG\ÆNG
+3181:\ÖYES\ÆNG
+3182:\ÖYES\ÆNG-SIOS
+3183:\ÖYES\ÆNG-PANSIOS
+3184:\ÖKAPYEOUNPH\ÆPH
+3185:\ÖSSANGH\ÆH
+3186:\ÖYEORINH\ÆH
+3187:\ÖYO-YA
+3188:\ÖYO-YAE
+3189:\ÖYO-I
+318A:\ÖYU-YEO
+318B:\ÖYU-YE
+318C:\ÖYU-I
+318D:\ÖARAEA
+318E:\ÖARAEAE
+3190:\8IC ANNOT\” LINK\ô\¥
+3191:\8IC ANNOT\” REVERSE\¥
+3192:\8IC ANNOT\” ONE\¥
+3193:\8IC ANNOT\” TWO\¥
+3194:\8IC ANNOT\” THREE\¥
+3195:\8IC ANNOT\” FOUR\¥
+3196:\8IC ANNOT\” TOP\¥
+3197:\8IC ANNOT\” MIDDLE\¥
+3198:\8IC ANNOT\” BOTTOM\¥
+3199:\8IC ANNOT\” FIRST\¥
+319A:\8IC ANNOT\” SECOND\¥
+319B:\8IC ANNOT\” THIRD\¥
+319C:\8IC ANNOT\” FOURTH\¥
+319D:\8IC ANNOT\” HEAVEN\¥
+319E:\8IC ANNOT\” EARTH\¥
+319F:\8IC ANNOT\” MAN\¥
+31A0:\©BU
+31A1:\©ZI
+31A2:\©JI
+31A3:\©GU
+31A4:\©EE
+31A5:\©ENN
+31A6:\©OO
+31A7:\©ONN
+31A8:\©IR
+31A9:\©ANN
+31AA:\©INN
+31AB:\©UNN
+31AC:\©IM
+31AD:\©NGG
+31AE:\©AINN
+31AF:\©AUNN
+31B0:\©AM
+31B1:\©OM
+31B2:\©ONG
+31B3:\©INNN
+31B4:BOPOMOFO FINAL\@P
+31B5:BOPOMOFO FINAL\@T
+31B6:BOPOMOFO FINAL\@K
+31B7:BOPOMOFO FINAL\@H
+31F0:\Í\§KU
+31F1:\Í\§SI
+31F2:\Í\§SU
+31F3:\Í\§TO
+31F4:\Í\§NU
+31F5:\Í\§HA
+31F6:\Í\§HI
+31F7:\Í\§HU
+31F8:\Í\§HE
+31F9:\Í\§HO
+31FA:\Í\§MU
+31FB:\Í\§RA
+31FC:\Í\§RI
+31FD:\Í\§RU
+31FE:\Í\§RE
+31FF:\Í\§RO
+3200:\t\e KIYEOK
+3201:\t\e N\ÆN
+3202:\t\e TIKEUT
+3203:\t\e R\ÆL
+3204:\t\e M\ÆM
+3205:\t\e P\ÆP
+3206:\t\e SIOS
+3207:\t\e \ÆNG
+3208:\t\e C\ÆC
+3209:\t\e CH\ÆCH
+320A:\t\e KH\ÆKH
+320B:\t\e TH\ÆTH
+320C:\t\e PH\ÆPH
+320D:\t\e H\ÆH
+320E:\t\e KIYEOK A
+320F:\t\e N\ÆN A
+3210:\t\e TIKEUT A
+3211:\t\e R\ÆL A
+3212:\t\e M\ÆM A
+3213:\t\e P\ÆP A
+3214:\t\e SIOS A
+3215:\t\e \ÆNG A
+3216:\t\e C\ÆC A
+3217:\t\e CH\ÆCH A
+3218:\t\e KH\ÆKH A
+3219:\t\e TH\ÆTH A
+321A:\t\e PH\ÆPH A
+321B:\t\e H\ÆH A
+321C:\t\e C\ÆC U
+3220:\t\8 ONE
+3221:\t\8 TWO
+3222:\t\8 THREE
+3223:\t\8 FOUR
+3224:\t\8 FIVE
+3225:\t\8 SIX
+3226:\t\8 SEVEN
+3227:\t\8 E\¼
+3228:\t\8 NINE
+3229:\t\8 TEN
+322A:\t\8 MOON
+322B:\t\8 FIRE
+322C:\t\8 WATER
+322D:\t\8 WOOD
+322E:\t\8 METAL
+322F:\t\8 EARTH
+3230:\t\8 SUN
+3231:\t\8 STOCK
+3232:\t\8 HAVE
+3233:\t\8 SOCIETY
+3234:\t\8 NAME
+3235:\t\8 SPECIAL
+3236:\t\8 FINANCIAL
+3237:\t\8 CONGRATUL\”
+3238:\t\8 LABOR
+3239:\t\8 REPRESENT
+323A:\t\8 CALL
+323B:\t\8 STUDY
+323C:\t\8 SUPERVISE
+323D:\t\8 ENTERPRISE
+323E:\t\8 RESOURCE
+323F:\t\8 ALLIANCE
+3240:\t\8 FESTIVAL
+3241:\t\8 REST
+3242:\t\8 SELF
+3243:\t\8 REACH
+3251:\c\­TWENTY ONE
+3252:\c\­TWENTY TWO
+3253:\c\­TWENTY THREE
+3254:\c\­TWENTY FOUR
+3255:\c\­TWENTY FIVE
+3256:\c\­TWENTY SIX
+3257:\c\­TWENTY SEVEN
+3258:\c\­TWENTY E\¼
+3259:\c\­TWENTY NINE
+325A:\c\­THIRTY
+325B:\c\­THIRTY ONE
+325C:\c\­THIRTY TWO
+325D:\c\­THIRTY THREE
+325E:\c\­THIRTY FOUR
+325F:\c\­THIRTY FIVE
+3260:\c\e KIYEOK
+3261:\c\e N\ÆN
+3262:\c\e TIKEUT
+3263:\c\e R\ÆL
+3264:\c\e M\ÆM
+3265:\c\e P\ÆP
+3266:\c\e SIOS
+3267:\c\e \ÆNG
+3268:\c\e C\ÆC
+3269:\c\e CH\ÆCH
+326A:\c\e KH\ÆKH
+326B:\c\e TH\ÆTH
+326C:\c\e PH\ÆPH
+326D:\c\e H\ÆH
+326E:\c\e KIYEOK A
+326F:\c\e N\ÆN A
+3270:\c\e TIKEUT A
+3271:\c\e R\ÆL A
+3272:\c\e M\ÆM A
+3273:\c\e P\ÆP A
+3274:\c\e SIOS A
+3275:\c\e \ÆNG A
+3276:\c\e C\ÆC A
+3277:\c\e CH\ÆCH A
+3278:\c\e KH\ÆKH A
+3279:\c\e TH\ÆTH A
+327A:\c\e PH\ÆPH A
+327B:\c\e H\ÆH A
+327F:KOREAN STANDARD \
+3280:\c\8 ONE
+3281:\c\8 TWO
+3282:\c\8 THREE
+3283:\c\8 FOUR
+3284:\c\8 FIVE
+3285:\c\8 SIX
+3286:\c\8 SEVEN
+3287:\c\8 E\¼
+3288:\c\8 NINE
+3289:\c\8 TEN
+328A:\c\8 MOON
+328B:\c\8 FIRE
+328C:\c\8 WATER
+328D:\c\8 WOOD
+328E:\c\8 METAL
+328F:\c\8 EARTH
+3290:\c\8 SUN
+3291:\c\8 STOCK
+3292:\c\8 HAVE
+3293:\c\8 SOCIETY
+3294:\c\8 NAME
+3295:\c\8 SPECIAL
+3296:\c\8 FINANCIAL
+3297:\c\8 CONGRATUL\”
+3298:\c\8 LABOR
+3299:\c\8 SECRET
+329A:\c\8 MALE
+329B:\c\8 FEMALE
+329C:\c\8 SUITABLE
+329D:\c\8 EXCELLENT
+329E:\c\8 PRINT
+329F:\c\8 ATTENTION
+32A0:\c\8 ITEM
+32A1:\c\8 REST
+32A2:\c\8 COPY
+32A3:\c\8 CORRECT
+32A4:\c\8 HIGH
+32A5:\c\8 CENTRE
+32A6:\c\8 LOW
+32A7:\c\8 \‰
+32A8:\c\8 \q
+32A9:\c\8 MEDICINE
+32AA:\c\8 RELIGION
+32AB:\c\8 STUDY
+32AC:\c\8 SUPERVISE
+32AD:\c\8 ENTERPRISE
+32AE:\c\8 RESOURCE
+32AF:\c\8 ALLIANCE
+32B0:\c\8 N\¼
+32B1:\c\­THIRTY SIX
+32B2:\c\­THIRTY SEVEN
+32B3:\c\­THIRTY E\¼
+32B4:\c\­THIRTY NINE
+32B5:\c\­FORTY
+32B6:\c\­FORTY ONE
+32B7:\c\­FORTY TWO
+32B8:\c\­FORTY THREE
+32B9:\c\­FORTY FOUR
+32BA:\c\­FORTY FIVE
+32BB:\c\­FORTY SIX
+32BC:\c\­FORTY SEVEN
+32BD:\c\­FORTY E\¼
+32BE:\c\­FORTY NINE
+32BF:\c\­FIFTY
+32C0:\_JANUARY
+32C1:\_FEBRUARY
+32C2:\_MARCH
+32C3:\_APRIL
+32C4:\_MAY
+32C5:\_JUNE
+32C6:\_JULY
+32C7:\_AUGUST
+32C8:\_SEPTEMBER
+32C9:\_OCTOBER
+32CA:\_NOVEMBER
+32CB:\_DECEMBER
+32D0:\c\n A
+32D1:\c\n I
+32D2:\c\n U
+32D3:\c\n E
+32D4:\c\n O
+32D5:\c\n KA
+32D6:\c\n KI
+32D7:\c\n KU
+32D8:\c\n KE
+32D9:\c\n KO
+32DA:\c\n SA
+32DB:\c\n SI
+32DC:\c\n SU
+32DD:\c\n SE
+32DE:\c\n SO
+32DF:\c\n TA
+32E0:\c\n TI
+32E1:\c\n TU
+32E2:\c\n TE
+32E3:\c\n TO
+32E4:\c\n NA
+32E5:\c\n NI
+32E6:\c\n NU
+32E7:\c\n NE
+32E8:\c\n NO
+32E9:\c\n HA
+32EA:\c\n HI
+32EB:\c\n HU
+32EC:\c\n HE
+32ED:\c\n HO
+32EE:\c\n MA
+32EF:\c\n MI
+32F0:\c\n MU
+32F1:\c\n ME
+32F2:\c\n MO
+32F3:\c\n YA
+32F4:\c\n YU
+32F5:\c\n YO
+32F6:\c\n RA
+32F7:\c\n RI
+32F8:\c\n RU
+32F9:\c\n RE
+32FA:\c\n RO
+32FB:\c\n WA
+32FC:\c\n WI
+32FD:\c\n WE
+32FE:\c\n WO
+3300:\rAPAATO
+3301:\rARUHUA
+3302:\rANPEA
+3303:\rAARU
+3304:\rIN\ôU
+3305:\rINTI
+3306:\rUON
+3307:\rESUKUUDO
+3308:\rEEKAA
+3309:\rONSU
+330A:\rOOMU
+330B:\rKAIRI
+330C:\rKARATTO
+330D:\rKARORII
+330E:\rGARON
+330F:\rGANMA
+3310:\rGIGA
+3311:\rGINII
+3312:\rKYURII
+3313:\rGIRUDAA
+3314:\rKIRO
+3315:\rKIROGURAMU
+3316:\rKIROMEETORU
+3317:\rKIROWATTO
+3318:\rGURAMU
+3319:\rGURAMUTON
+331A:\rKURUZEIRO
+331B:\rKUROONE
+331C:\rKEESU
+331D:\rKORUNA
+331E:\rKOOPO
+331F:\rSAIKURU
+3320:\rSANTIIMU
+3321:\rSIR\ôU
+3322:\rSENTI
+3323:\rSENTO
+3324:\rDAASU
+3325:\rDESI
+3326:\rDORU
+3327:\rTON
+3328:\rNANO
+3329:\rNOTTO
+332A:\rHAITU
+332B:\rPAASENTO
+332C:\rPAATU
+332D:\rBAARERU
+332E:\rPIASUTORU
+332F:\rPIKURU
+3330:\rPIKO
+3331:\rBIRU
+3332:\rHUARADDO
+3333:\rHUIITO
+3334:\rBUSSYERU
+3335:\rHURAN
+3336:\rHEKUTAARU
+3337:\rPESO
+3338:\rPENIHI
+3339:\rHERUTU
+333A:\rPENSU
+333B:\rPEEZI
+333C:\rBEETA
+333D:\rPOINTO
+333E:\rBORUTO
+333F:\rHON
+3340:\rPONDO
+3341:\rHOORU
+3342:\rHOON
+3343:\rMAIKURO
+3344:\rMAIRU
+3345:\rMAHHA
+3346:\rMARUKU
+3347:\rMANSYON
+3348:\rMIKURON
+3349:\rMIRI
+334A:\rMIRIBAARU
+334B:\rMEGA
+334C:\rMEGATON
+334D:\rMEETORU
+334E:\rYAADO
+334F:\rYAARU
+3350:\rYUAN
+3351:\rRITTORU
+3352:\rRIRA
+3353:\rRUPII
+3354:\rRUUBURU
+3355:\rREMU
+3356:\rRENTOGEN
+3357:\rWATTO
+3358:\_HOUR ZERO
+3359:\_HOUR ONE
+335A:\_HOUR TWO
+335B:\_HOUR THREE
+335C:\_HOUR FOUR
+335D:\_HOUR FIVE
+335E:\_HOUR SIX
+335F:\_HOUR SEVEN
+3360:\_HOUR E\¼
+3361:\_HOUR NINE
+3362:\_HOUR TEN
+3363:\_HOUR ELEVEN
+3364:\_HOUR TWELVE
+3365:\_HOUR THIRTEEN
+3366:\_HOUR FOURTEEN
+3367:\_HOUR FIFTEEN
+3368:\_HOUR SIXTEEN
+3369:\_HOUR SEVENTEEN
+336A:\_HOUR E\¼EEN
+336B:\_HOUR NINETEEN
+336C:\_HOUR TWENTY
+336D:\_HOUR TWENTY-ONE
+336E:\_HOUR TWENTY-TWO
+336F:\_HOUR TWENTY-THREE
+3370:\_HOUR TWENTY-FOUR
+3371:\rHPA
+3372:\rDA
+3373:\rAU
+3374:\rBAR
+3375:\rOV
+3376:\rPC
+337B:\rERA NAME HEISEI
+337C:\rERA NAME SYOUWA
+337D:\rERA NAME TAISYOU
+337E:\rERA NAME MEIZI
+337F:\rCORPOR\”
+3380:\rPA AMPS
+3381:\rNA
+3382:\rMU A
+3383:\rMA
+3384:\rKA
+3385:\rKB
+3386:\rMB
+3387:\rGB
+3388:\rCAL
+3389:\rKCAL
+338A:\rPF
+338B:\rNF
+338C:\rMU F
+338D:\rMU G
+338E:\rMG
+338F:\rKG
+3390:\rHZ
+3391:\rKHZ
+3392:\rMHZ
+3393:\rGHZ
+3394:\rTHZ
+3395:\rMU L
+3396:\rML
+3397:\rDL
+3398:\rKL
+3399:\rFM
+339A:\rNM
+339B:\rMU M
+339C:\rMM
+339D:\rCM
+339E:\rKM
+339F:\rMM \ýD
+33A0:\rCM \ýD
+33A1:\rM \ýD
+33A2:\rKM \ýD
+33A3:\rMM CUBED
+33A4:\rCM CUBED
+33A5:\rM CUBED
+33A6:\rKM CUBED
+33A7:\rM OVER S
+33A8:\rM OVER S \ýD
+33A9:\rPA
+33AA:\rKPA
+33AB:\rMPA
+33AC:\rGPA
+33AD:\rRAD
+33AE:\rRAD OVER S
+33AF:\rRAD OVER S \ýD
+33B0:\rPS
+33B1:\rNS
+33B2:\rMU S
+33B3:\rMS
+33B4:\rPV
+33B5:\rNV
+33B6:\rMU V
+33B7:\rMV
+33B8:\rKV
+33B9:\rMV MEGA
+33BA:\rPW
+33BB:\rNW
+33BC:\rMU W
+33BD:\rMW
+33BE:\rKW
+33BF:\rMW MEGA
+33C0:\rK OHM
+33C1:\rM OHM
+33C2:\rAM
+33C3:\rBQ
+33C4:\rCC
+33C5:\rCD
+33C6:\rC OVER KG
+33C7:\rCO
+33C8:\rDB
+33C9:\rGY
+33CA:\rHA
+33CB:\rHP
+33CC:\rIN
+33CD:\rKK
+33CE:\rKM\I
+33CF:\rKT
+33D0:\rLM
+33D1:\rLN
+33D2:\rLOG
+33D3:\rLX
+33D4:\rMB\N
+33D5:\rMIL
+33D6:\rMOL
+33D7:\rPH
+33D8:\rPM
+33D9:\rPPM
+33DA:\rPR
+33DB:\rSR
+33DC:\rSV
+33DD:\rWB
+33E0:\_DAY ONE
+33E1:\_DAY TWO
+33E2:\_DAY THREE
+33E3:\_DAY FOUR
+33E4:\_DAY FIVE
+33E5:\_DAY SIX
+33E6:\_DAY SEVEN
+33E7:\_DAY E\¼
+33E8:\_DAY NINE
+33E9:\_DAY TEN
+33EA:\_DAY ELEVEN
+33EB:\_DAY TWELVE
+33EC:\_DAY THIRTEEN
+33ED:\_DAY FOURTEEN
+33EE:\_DAY FIFTEEN
+33EF:\_DAY SIXTEEN
+33F0:\_DAY SEVENTEEN
+33F1:\_DAY E\¼EEN
+33F2:\_DAY NINETEEN
+33F3:\_DAY TWENTY
+33F4:\_DAY TWENTY-ONE
+33F5:\_DAY TWENTY-TWO
+33F6:\_DAY TWENTY-THREE
+33F7:\_DAY TWENTY-FOUR
+33F8:\_DAY TWENTY-FIVE
+33F9:\_DAY TWENTY-SIX
+33FA:\_DAY TWENTY-SEVEN
+33FB:\_DAY TWENTY-E\¼
+33FC:\_DAY TWENTY-NINE
+33FD:\_DAY THIRTY
+33FE:\_DAY THIRTY-ONE
+3400-4DB5:<CJK Ideograph Extension A>
+4E00-9FA5:<CJK Ideograph>
+A000:\ZIT
+A001:\ZIX
+A002:\ZI
+A003:\ZIP
+A004:\ZIET
+A005:\ZIEX
+A006:\ZIE
+A007:\ZIEP
+A008:\ZAT
+A009:\ZAX
+A00A:\ZA
+A00B:\ZAP
+A00C:\ZUOX
+A00D:\ZUO
+A00E:\ZUOP
+A00F:\ZOT
+A010:\ZOX
+A011:\ZO
+A012:\ZOP
+A013:\ZEX
+A014:\ZE
+A015:\ZWU
+A016:\ZBIT
+A017:\ZBIX
+A018:\ZBI
+A019:\ZBIP
+A01A:\ZBIET
+A01B:\ZBIEX
+A01C:\ZBIE
+A01D:\ZBIEP
+A01E:\ZBAT
+A01F:\ZBAX
+A020:\ZBA
+A021:\ZBAP
+A022:\ZBUOX
+A023:\ZBUO
+A024:\ZBUOP
+A025:\ZBOT
+A026:\ZBOX
+A027:\ZBO
+A028:\ZBOP
+A029:\ZBEX
+A02A:\ZBE
+A02B:\ZBEP
+A02C:\ZBUT
+A02D:\ZBUX
+A02E:\ZBU
+A02F:\ZBUP
+A030:\ZBURX
+A031:\ZBUR
+A032:\ZBYT
+A033:\ZBYX
+A034:\ZBY
+A035:\ZBYP
+A036:\ZBYRX
+A037:\ZBYR
+A038:\ZPIT
+A039:\ZPIX
+A03A:\ZPI
+A03B:\ZPIP
+A03C:\ZPIEX
+A03D:\ZPIE
+A03E:\ZPIEP
+A03F:\ZPAT
+A040:\ZPAX
+A041:\ZPA
+A042:\ZPAP
+A043:\ZPUOX
+A044:\ZPUO
+A045:\ZPUOP
+A046:\ZPOT
+A047:\ZPOX
+A048:\ZPO
+A049:\ZPOP
+A04A:\ZPUT
+A04B:\ZPUX
+A04C:\ZPU
+A04D:\ZPUP
+A04E:\ZPURX
+A04F:\ZPUR
+A050:\ZPYT
+A051:\ZPYX
+A052:\ZPY
+A053:\ZPYP
+A054:\ZPYRX
+A055:\ZPYR
+A056:\ZBBIT
+A057:\ZBBIX
+A058:\ZBBI
+A059:\ZBBIP
+A05A:\ZBBIET
+A05B:\ZBBIEX
+A05C:\ZBBIE
+A05D:\ZBBIEP
+A05E:\ZBBAT
+A05F:\ZBBAX
+A060:\ZBBA
+A061:\ZBBAP
+A062:\ZBBUOX
+A063:\ZBBUO
+A064:\ZBBUOP
+A065:\ZBBOT
+A066:\ZBBOX
+A067:\ZBBO
+A068:\ZBBOP
+A069:\ZBBEX
+A06A:\ZBBE
+A06B:\ZBBEP
+A06C:\ZBBUT
+A06D:\ZBBUX
+A06E:\ZBBU
+A06F:\ZBBUP
+A070:\ZBBURX
+A071:\ZBBUR
+A072:\ZBBYT
+A073:\ZBBYX
+A074:\ZBBY
+A075:\ZBBYP
+A076:\ÿBIT
+A077:\ÿBIX
+A078:\ÿBI
+A079:\ÿBIP
+A07A:\ÿBIEX
+A07B:\ÿBIE
+A07C:\ÿBIEP
+A07D:\ÿBAT
+A07E:\ÿBAX
+A07F:\ÿBA
+A080:\ÿBAP
+A081:\ÿBOT
+A082:\ÿBOX
+A083:\ÿBO
+A084:\ÿBOP
+A085:\ÿBUT
+A086:\ÿBUX
+A087:\ÿBU
+A088:\ÿBUP
+A089:\ÿBURX
+A08A:\ÿBUR
+A08B:\ÿBYT
+A08C:\ÿBYX
+A08D:\ÿBY
+A08E:\ÿBYP
+A08F:\ÿBYRX
+A090:\ÿBYR
+A091:\ZHMIT
+A092:\ZHMIX
+A093:\ZHMI
+A094:\ZHMIP
+A095:\ZHMIEX
+A096:\ZHMIE
+A097:\ZHMIEP
+A098:\ZHMAT
+A099:\ZHMAX
+A09A:\ZHMA
+A09B:\ZHMAP
+A09C:\ZHMUOX
+A09D:\ZHMUO
+A09E:\ZHMUOP
+A09F:\ZHMOT
+A0A0:\ZHMOX
+A0A1:\ZHMO
+A0A2:\ZHMOP
+A0A3:\ZHMUT
+A0A4:\ZHMUX
+A0A5:\ZHMU
+A0A6:\ZHMUP
+A0A7:\ZHMURX
+A0A8:\ZHMUR
+A0A9:\ZHMYX
+A0AA:\ZHMY
+A0AB:\ZHMYP
+A0AC:\ZHMYRX
+A0AD:\ZHMYR
+A0AE:\ZMIT
+A0AF:\ZMIX
+A0B0:\ZMI
+A0B1:\ZMIP
+A0B2:\ZMIEX
+A0B3:\ZMIE
+A0B4:\ZMIEP
+A0B5:\ZMAT
+A0B6:\ZMAX
+A0B7:\ZMA
+A0B8:\ZMAP
+A0B9:\ZMUOT
+A0BA:\ZMUOX
+A0BB:\ZMUO
+A0BC:\ZMUOP
+A0BD:\ZMOT
+A0BE:\ZMOX
+A0BF:\ZMO
+A0C0:\ZMOP
+A0C1:\ZMEX
+A0C2:\ZME
+A0C3:\ZMUT
+A0C4:\ZMUX
+A0C5:\ZMU
+A0C6:\ZMUP
+A0C7:\ZMURX
+A0C8:\ZMUR
+A0C9:\ZMYT
+A0CA:\ZMYX
+A0CB:\ZMY
+A0CC:\ZMYP
+A0CD:\ZFIT
+A0CE:\ZFIX
+A0CF:\ZFI
+A0D0:\ZFIP
+A0D1:\ZFAT
+A0D2:\ZFAX
+A0D3:\ZFA
+A0D4:\ZFAP
+A0D5:\ZFOX
+A0D6:\ZFO
+A0D7:\ZFOP
+A0D8:\ZFUT
+A0D9:\ZFUX
+A0DA:\ZFU
+A0DB:\ZFUP
+A0DC:\ZFURX
+A0DD:\ZFUR
+A0DE:\ZFYT
+A0DF:\ZFYX
+A0E0:\ZFY
+A0E1:\ZFYP
+A0E2:\ZVIT
+A0E3:\ZVIX
+A0E4:\ZVI
+A0E5:\ZVIP
+A0E6:\ZVIET
+A0E7:\ZVIEX
+A0E8:\ZVIE
+A0E9:\ZVIEP
+A0EA:\ZVAT
+A0EB:\ZVAX
+A0EC:\ZVA
+A0ED:\ZVAP
+A0EE:\ZVOT
+A0EF:\ZVOX
+A0F0:\ZVO
+A0F1:\ZVOP
+A0F2:\ZVEX
+A0F3:\ZVEP
+A0F4:\ZVUT
+A0F5:\ZVUX
+A0F6:\ZVU
+A0F7:\ZVUP
+A0F8:\ZVURX
+A0F9:\ZVUR
+A0FA:\ZVYT
+A0FB:\ZVYX
+A0FC:\ZVY
+A0FD:\ZVYP
+A0FE:\ZVYRX
+A0FF:\ZVYR
+A100:\ZDIT
+A101:\ZDIX
+A102:\ZDI
+A103:\ZDIP
+A104:\ZDIEX
+A105:\ZDIE
+A106:\ZDIEP
+A107:\ZDAT
+A108:\ZDAX
+A109:\ZDA
+A10A:\ZDAP
+A10B:\ZDUOX
+A10C:\ZDUO
+A10D:\ZDOT
+A10E:\ZDOX
+A10F:\ZDO
+A110:\ZDOP
+A111:\ZDEX
+A112:\ZDE
+A113:\ZDEP
+A114:\ZDUT
+A115:\ZDUX
+A116:\ZDU
+A117:\ZDUP
+A118:\ZDURX
+A119:\ZDUR
+A11A:\ZTIT
+A11B:\ZTIX
+A11C:\ZTI
+A11D:\ZTIP
+A11E:\ZTIEX
+A11F:\ZTIE
+A120:\ZTIEP
+A121:\ZTAT
+A122:\ZTAX
+A123:\ZTA
+A124:\ZTAP
+A125:\ZTUOT
+A126:\ZTUOX
+A127:\ZTUO
+A128:\ZTUOP
+A129:\ZTOT
+A12A:\ZTOX
+A12B:\ZTO
+A12C:\ZTOP
+A12D:\ZTEX
+A12E:\ZTE
+A12F:\ZTEP
+A130:\ZTUT
+A131:\ZTUX
+A132:\ZTU
+A133:\ZTUP
+A134:\ZTURX
+A135:\ZTUR
+A136:\ZDDIT
+A137:\ZDDIX
+A138:\ZDDI
+A139:\ZDDIP
+A13A:\ZDDIEX
+A13B:\ZDDIE
+A13C:\ZDDIEP
+A13D:\ZDDAT
+A13E:\ZDDAX
+A13F:\ZDDA
+A140:\ZDDAP
+A141:\ZDDUOX
+A142:\ZDDUO
+A143:\ZDDUOP
+A144:\ZDDOT
+A145:\ZDDOX
+A146:\ZDDO
+A147:\ZDDOP
+A148:\ZDDEX
+A149:\ZDDE
+A14A:\ZDDEP
+A14B:\ZDDUT
+A14C:\ZDDUX
+A14D:\ZDDU
+A14E:\ZDDUP
+A14F:\ZDDURX
+A150:\ZDDUR
+A151:\ÿDIT
+A152:\ÿDIX
+A153:\ÿDI
+A154:\ÿDIP
+A155:\ÿDIEX
+A156:\ÿDIE
+A157:\ÿDAT
+A158:\ÿDAX
+A159:\ÿDA
+A15A:\ÿDAP
+A15B:\ÿDOT
+A15C:\ÿDOX
+A15D:\ÿDO
+A15E:\ÿDOP
+A15F:\ÿDEX
+A160:\ÿDE
+A161:\ÿDEP
+A162:\ÿDUT
+A163:\ÿDUX
+A164:\ÿDU
+A165:\ÿDUP
+A166:\ÿDURX
+A167:\ÿDUR
+A168:\ZHNIT
+A169:\ZHNIX
+A16A:\ZHNI
+A16B:\ZHNIP
+A16C:\ZHNIET
+A16D:\ZHNIEX
+A16E:\ZHNIE
+A16F:\ZHNIEP
+A170:\ZHNAT
+A171:\ZHNAX
+A172:\ZHNA
+A173:\ZHNAP
+A174:\ZHNUOX
+A175:\ZHNUO
+A176:\ZHNOT
+A177:\ZHNOX
+A178:\ZHNOP
+A179:\ZHNEX
+A17A:\ZHNE
+A17B:\ZHNEP
+A17C:\ZHNUT
+A17D:\ÿIT
+A17E:\ÿIX
+A17F:\ÿI
+A180:\ÿIP
+A181:\ÿIEX
+A182:\ÿIE
+A183:\ÿIEP
+A184:\ÿAX
+A185:\ÿA
+A186:\ÿAP
+A187:\ÿUOX
+A188:\ÿUO
+A189:\ÿUOP
+A18A:\ÿOT
+A18B:\ÿOX
+A18C:\ÿO
+A18D:\ÿOP
+A18E:\ÿEX
+A18F:\ÿE
+A190:\ÿEP
+A191:\ÿUT
+A192:\ÿUX
+A193:\ÿU
+A194:\ÿUP
+A195:\ÿURX
+A196:\ÿUR
+A197:\ZHLIT
+A198:\ZHLIX
+A199:\ZHLI
+A19A:\ZHLIP
+A19B:\ZHLIEX
+A19C:\ZHLIE
+A19D:\ZHLIEP
+A19E:\ZHLAT
+A19F:\ZHLAX
+A1A0:\ZHLA
+A1A1:\ZHLAP
+A1A2:\ZHLUOX
+A1A3:\ZHLUO
+A1A4:\ZHLUOP
+A1A5:\ZHLOX
+A1A6:\ZHLO
+A1A7:\ZHLOP
+A1A8:\ZHLEX
+A1A9:\ZHLE
+A1AA:\ZHLEP
+A1AB:\ZHLUT
+A1AC:\ZHLUX
+A1AD:\ZHLU
+A1AE:\ZHLUP
+A1AF:\ZHLURX
+A1B0:\ZHLUR
+A1B1:\ZHLYT
+A1B2:\ZHLYX
+A1B3:\ZHLY
+A1B4:\ZHLYP
+A1B5:\ZHLYRX
+A1B6:\ZHLYR
+A1B7:\ZLIT
+A1B8:\ZLIX
+A1B9:\ZLI
+A1BA:\ZLIP
+A1BB:\ZLIET
+A1BC:\ZLIEX
+A1BD:\ZLIE
+A1BE:\ZLIEP
+A1BF:\ZLAT
+A1C0:\ZLAX
+A1C1:\ZLA
+A1C2:\ZLAP
+A1C3:\ZLUOT
+A1C4:\ZLUOX
+A1C5:\ZLUO
+A1C6:\ZLUOP
+A1C7:\ZLOT
+A1C8:\ZLOX
+A1C9:\ZLO
+A1CA:\ZLOP
+A1CB:\ZLEX
+A1CC:\ZLE
+A1CD:\ZLEP
+A1CE:\ZLUT
+A1CF:\ZLUX
+A1D0:\ZLU
+A1D1:\ZLUP
+A1D2:\ZLURX
+A1D3:\ZLUR
+A1D4:\ZLYT
+A1D5:\ZLYX
+A1D6:\ZLY
+A1D7:\ZLYP
+A1D8:\ZLYRX
+A1D9:\ZLYR
+A1DA:\ZGIT
+A1DB:\ZGIX
+A1DC:\ZGI
+A1DD:\ZGIP
+A1DE:\ZGIET
+A1DF:\ZGIEX
+A1E0:\ZGIE
+A1E1:\ZGIEP
+A1E2:\ZGAT
+A1E3:\ZGAX
+A1E4:\ZGA
+A1E5:\ZGAP
+A1E6:\ZGUOT
+A1E7:\ZGUOX
+A1E8:\ZGUO
+A1E9:\ZGUOP
+A1EA:\ZGOT
+A1EB:\ZGOX
+A1EC:\ZGO
+A1ED:\ZGOP
+A1EE:\ZGET
+A1EF:\ZGEX
+A1F0:\ZGE
+A1F1:\ZGEP
+A1F2:\ZGUT
+A1F3:\ZGUX
+A1F4:\ZGU
+A1F5:\ZGUP
+A1F6:\ZGURX
+A1F7:\ZGUR
+A1F8:\ZKIT
+A1F9:\ZKIX
+A1FA:\ZKI
+A1FB:\ZKIP
+A1FC:\ZKIEX
+A1FD:\ZKIE
+A1FE:\ZKIEP
+A1FF:\ZKAT
+A200:\ZKAX
+A201:\ZKA
+A202:\ZKAP
+A203:\ZKUOX
+A204:\ZKUO
+A205:\ZKUOP
+A206:\ZKOT
+A207:\ZKOX
+A208:\ZKO
+A209:\ZKOP
+A20A:\ZKET
+A20B:\ZKEX
+A20C:\ZKE
+A20D:\ZKEP
+A20E:\ZKUT
+A20F:\ZKUX
+A210:\ZKU
+A211:\ZKUP
+A212:\ZKURX
+A213:\ZKUR
+A214:\ZGGIT
+A215:\ZGGIX
+A216:\ZGGI
+A217:\ZGGIEX
+A218:\ZGGIE
+A219:\ZGGIEP
+A21A:\ZGGAT
+A21B:\ZGGAX
+A21C:\ZGGA
+A21D:\ZGGAP
+A21E:\ZGGUOT
+A21F:\ZGGUOX
+A220:\ZGGUO
+A221:\ZGGUOP
+A222:\ZGGOT
+A223:\ZGGOX
+A224:\ZGGO
+A225:\ZGGOP
+A226:\ZGGET
+A227:\ZGGEX
+A228:\ZGGE
+A229:\ZGGEP
+A22A:\ZGGUT
+A22B:\ZGGUX
+A22C:\ZGGU
+A22D:\ZGGUP
+A22E:\ZGGURX
+A22F:\ZGGUR
+A230:\ZMGIEX
+A231:\ZMGIE
+A232:\ZMGAT
+A233:\ZMGAX
+A234:\ZMGA
+A235:\ZMGAP
+A236:\ZMGUOX
+A237:\ZMGUO
+A238:\ZMGUOP
+A239:\ZMGOT
+A23A:\ZMGOX
+A23B:\ZMGO
+A23C:\ZMGOP
+A23D:\ZMGEX
+A23E:\ZMGE
+A23F:\ZMGEP
+A240:\ZMGUT
+A241:\ZMGUX
+A242:\ZMGU
+A243:\ZMGUP
+A244:\ZMGURX
+A245:\ZMGUR
+A246:\ZHXIT
+A247:\ZHXIX
+A248:\ZHXI
+A249:\ZHXIP
+A24A:\ZHXIET
+A24B:\ZHXIEX
+A24C:\ZHXIE
+A24D:\ZHXIEP
+A24E:\ZHXAT
+A24F:\ZHXAX
+A250:\ZHXA
+A251:\ZHXAP
+A252:\ZHXUOT
+A253:\ZHXUOX
+A254:\ZHXUO
+A255:\ZHXUOP
+A256:\ZHXOT
+A257:\ZHXOX
+A258:\ZHXO
+A259:\ZHXOP
+A25A:\ZHXEX
+A25B:\ZHXE
+A25C:\ZHXEP
+A25D:\ÿGIEX
+A25E:\ÿGIE
+A25F:\ÿGIEP
+A260:\ÿGAT
+A261:\ÿGAX
+A262:\ÿGA
+A263:\ÿGAP
+A264:\ÿGUOT
+A265:\ÿGUOX
+A266:\ÿGUO
+A267:\ÿGOT
+A268:\ÿGOX
+A269:\ÿGO
+A26A:\ÿGOP
+A26B:\ÿGEX
+A26C:\ÿGE
+A26D:\ÿGEP
+A26E:\ZHIT
+A26F:\ZHIEX
+A270:\ZHIE
+A271:\ZHAT
+A272:\ZHAX
+A273:\ZHA
+A274:\ZHAP
+A275:\ZHUOT
+A276:\ZHUOX
+A277:\ZHUO
+A278:\ZHUOP
+A279:\ZHOT
+A27A:\ZHOX
+A27B:\ZHO
+A27C:\ZHOP
+A27D:\ZHEX
+A27E:\ZHE
+A27F:\ZHEP
+A280:\ZWAT
+A281:\ZWAX
+A282:\ZWA
+A283:\ZWAP
+A284:\ZWUOX
+A285:\ZWUO
+A286:\ZWUOP
+A287:\ZWOX
+A288:\ZWO
+A289:\ZWOP
+A28A:\ZWEX
+A28B:\ZWE
+A28C:\ZWEP
+A28D:\ZZIT
+A28E:\ZZIX
+A28F:\ZZI
+A290:\ZZIP
+A291:\ZZIEX
+A292:\ZZIE
+A293:\ZZIEP
+A294:\ZZAT
+A295:\ZZAX
+A296:\ZZA
+A297:\ZZAP
+A298:\ZZUOX
+A299:\ZZUO
+A29A:\ZZUOP
+A29B:\ZZOT
+A29C:\ZZOX
+A29D:\ZZO
+A29E:\ZZOP
+A29F:\ZZEX
+A2A0:\ZZE
+A2A1:\ZZEP
+A2A2:\ZZUT
+A2A3:\ZZUX
+A2A4:\ZZU
+A2A5:\ZZUP
+A2A6:\ZZURX
+A2A7:\ZZUR
+A2A8:\ZZYT
+A2A9:\ZZYX
+A2AA:\ZZY
+A2AB:\ZZYP
+A2AC:\ZZYRX
+A2AD:\ZZYR
+A2AE:\ZCIT
+A2AF:\ZCIX
+A2B0:\ZCI
+A2B1:\ZCIP
+A2B2:\ZCIET
+A2B3:\ZCIEX
+A2B4:\ZCIE
+A2B5:\ZCIEP
+A2B6:\ZCAT
+A2B7:\ZCAX
+A2B8:\ZCA
+A2B9:\ZCAP
+A2BA:\ZCUOX
+A2BB:\ZCUO
+A2BC:\ZCUOP
+A2BD:\ZCOT
+A2BE:\ZCOX
+A2BF:\ZCO
+A2C0:\ZCOP
+A2C1:\ZCEX
+A2C2:\ZCE
+A2C3:\ZCEP
+A2C4:\ZCUT
+A2C5:\ZCUX
+A2C6:\ZCU
+A2C7:\ZCUP
+A2C8:\ZCURX
+A2C9:\ZCUR
+A2CA:\ZCYT
+A2CB:\ZCYX
+A2CC:\ZCY
+A2CD:\ZCYP
+A2CE:\ZCYRX
+A2CF:\ZCYR
+A2D0:\ZZZIT
+A2D1:\ZZZIX
+A2D2:\ZZZI
+A2D3:\ZZZIP
+A2D4:\ZZZIET
+A2D5:\ZZZIEX
+A2D6:\ZZZIE
+A2D7:\ZZZIEP
+A2D8:\ZZZAT
+A2D9:\ZZZAX
+A2DA:\ZZZA
+A2DB:\ZZZAP
+A2DC:\ZZZOX
+A2DD:\ZZZO
+A2DE:\ZZZOP
+A2DF:\ZZZEX
+A2E0:\ZZZE
+A2E1:\ZZZEP
+A2E2:\ZZZUX
+A2E3:\ZZZU
+A2E4:\ZZZUP
+A2E5:\ZZZURX
+A2E6:\ZZZUR
+A2E7:\ZZZYT
+A2E8:\ZZZYX
+A2E9:\ZZZY
+A2EA:\ZZZYP
+A2EB:\ZZZYRX
+A2EC:\ZZZYR
+A2ED:\ÿZIT
+A2EE:\ÿZIX
+A2EF:\ÿZI
+A2F0:\ÿZIP
+A2F1:\ÿZIEX
+A2F2:\ÿZIE
+A2F3:\ÿZIEP
+A2F4:\ÿZAT
+A2F5:\ÿZAX
+A2F6:\ÿZA
+A2F7:\ÿZAP
+A2F8:\ÿZUOX
+A2F9:\ÿZUO
+A2FA:\ÿZOX
+A2FB:\ÿZOP
+A2FC:\ÿZEX
+A2FD:\ÿZE
+A2FE:\ÿZUX
+A2FF:\ÿZU
+A300:\ÿZUP
+A301:\ÿZURX
+A302:\ÿZUR
+A303:\ÿZYT
+A304:\ÿZYX
+A305:\ÿZY
+A306:\ÿZYP
+A307:\ÿZYRX
+A308:\ÿZYR
+A309:\ZSIT
+A30A:\ZSIX
+A30B:\ZSI
+A30C:\ZSIP
+A30D:\ZSIEX
+A30E:\ZSIE
+A30F:\ZSIEP
+A310:\ZSAT
+A311:\ZSAX
+A312:\ZSA
+A313:\ZSAP
+A314:\ZSUOX
+A315:\ZSUO
+A316:\ZSUOP
+A317:\ZSOT
+A318:\ZSOX
+A319:\ZSO
+A31A:\ZSOP
+A31B:\ZSEX
+A31C:\ZSE
+A31D:\ZSEP
+A31E:\ZSUT
+A31F:\ZSUX
+A320:\ZSU
+A321:\ZSUP
+A322:\ZSURX
+A323:\ZSUR
+A324:\ZSYT
+A325:\ZSYX
+A326:\ZSY
+A327:\ZSYP
+A328:\ZSYRX
+A329:\ZSYR
+A32A:\ZSSIT
+A32B:\ZSSIX
+A32C:\ZSSI
+A32D:\ZSSIP
+A32E:\ZSSIEX
+A32F:\ZSSIE
+A330:\ZSSIEP
+A331:\ZSSAT
+A332:\ZSSAX
+A333:\ZSSA
+A334:\ZSSAP
+A335:\ZSSOT
+A336:\ZSSOX
+A337:\ZSSO
+A338:\ZSSOP
+A339:\ZSSEX
+A33A:\ZSSE
+A33B:\ZSSEP
+A33C:\ZSSUT
+A33D:\ZSSUX
+A33E:\ZSSU
+A33F:\ZSSUP
+A340:\ZSSYT
+A341:\ZSSYX
+A342:\ZSSY
+A343:\ZSSYP
+A344:\ZSSYRX
+A345:\ZSSYR
+A346:\ZZHAT
+A347:\ZZHAX
+A348:\ZZHA
+A349:\ZZHAP
+A34A:\ZZHUOX
+A34B:\ZZHUO
+A34C:\ZZHUOP
+A34D:\ZZHOT
+A34E:\ZZHOX
+A34F:\ZZHO
+A350:\ZZHOP
+A351:\ZZHET
+A352:\ZZHEX
+A353:\ZZHE
+A354:\ZZHEP
+A355:\ZZHUT
+A356:\ZZHUX
+A357:\ZZHU
+A358:\ZZHUP
+A359:\ZZHURX
+A35A:\ZZHUR
+A35B:\ZZHYT
+A35C:\ZZHYX
+A35D:\ZZHY
+A35E:\ZZHYP
+A35F:\ZZHYRX
+A360:\ZZHYR
+A361:\ZCHAT
+A362:\ZCHAX
+A363:\ZCHA
+A364:\ZCHAP
+A365:\ZCHUOT
+A366:\ZCHUOX
+A367:\ZCHUO
+A368:\ZCHUOP
+A369:\ZCHOT
+A36A:\ZCHOX
+A36B:\ZCHO
+A36C:\ZCHOP
+A36D:\ZCHET
+A36E:\ZCHEX
+A36F:\ZCHE
+A370:\ZCHEP
+A371:\ZCHUX
+A372:\ZCHU
+A373:\ZCHUP
+A374:\ZCHURX
+A375:\ZCHUR
+A376:\ZCHYT
+A377:\ZCHYX
+A378:\ZCHY
+A379:\ZCHYP
+A37A:\ZCHYRX
+A37B:\ZCHYR
+A37C:\ZRRAX
+A37D:\ZRRA
+A37E:\ZRRUOX
+A37F:\ZRRUO
+A380:\ZRROT
+A381:\ZRROX
+A382:\ZRRO
+A383:\ZRROP
+A384:\ZRRET
+A385:\ZRREX
+A386:\ZRRE
+A387:\ZRREP
+A388:\ZRRUT
+A389:\ZRRUX
+A38A:\ZRRU
+A38B:\ZRRUP
+A38C:\ZRRURX
+A38D:\ZRRUR
+A38E:\ZRRYT
+A38F:\ZRRYX
+A390:\ZRRY
+A391:\ZRRYP
+A392:\ZRRYRX
+A393:\ZRRYR
+A394:\ÿRAT
+A395:\ÿRAX
+A396:\ÿRA
+A397:\ÿRAP
+A398:\ÿROX
+A399:\ÿRO
+A39A:\ÿROP
+A39B:\ÿRET
+A39C:\ÿREX
+A39D:\ÿRE
+A39E:\ÿREP
+A39F:\ÿRUT
+A3A0:\ÿRUX
+A3A1:\ÿRU
+A3A2:\ÿRUP
+A3A3:\ÿRURX
+A3A4:\ÿRUR
+A3A5:\ÿRYT
+A3A6:\ÿRYX
+A3A7:\ÿRY
+A3A8:\ÿRYP
+A3A9:\ÿRYRX
+A3AA:\ÿRYR
+A3AB:\ZSHAT
+A3AC:\ZSHAX
+A3AD:\ZSHA
+A3AE:\ZSHAP
+A3AF:\ZSHUOX
+A3B0:\ZSHUO
+A3B1:\ZSHUOP
+A3B2:\ZSHOT
+A3B3:\ZSHOX
+A3B4:\ZSHO
+A3B5:\ZSHOP
+A3B6:\ZSHET
+A3B7:\ZSHEX
+A3B8:\ZSHE
+A3B9:\ZSHEP
+A3BA:\ZSHUT
+A3BB:\ZSHUX
+A3BC:\ZSHU
+A3BD:\ZSHUP
+A3BE:\ZSHURX
+A3BF:\ZSHUR
+A3C0:\ZSHYT
+A3C1:\ZSHYX
+A3C2:\ZSHY
+A3C3:\ZSHYP
+A3C4:\ZSHYRX
+A3C5:\ZSHYR
+A3C6:\ZRAT
+A3C7:\ZRAX
+A3C8:\ZRA
+A3C9:\ZRAP
+A3CA:\ZRUOX
+A3CB:\ZRUO
+A3CC:\ZRUOP
+A3CD:\ZROT
+A3CE:\ZROX
+A3CF:\ZRO
+A3D0:\ZROP
+A3D1:\ZREX
+A3D2:\ZRE
+A3D3:\ZREP
+A3D4:\ZRUT
+A3D5:\ZRUX
+A3D6:\ZRU
+A3D7:\ZRUP
+A3D8:\ZRURX
+A3D9:\ZRUR
+A3DA:\ZRYT
+A3DB:\ZRYX
+A3DC:\ZRY
+A3DD:\ZRYP
+A3DE:\ZRYRX
+A3DF:\ZRYR
+A3E0:\ZJIT
+A3E1:\ZJIX
+A3E2:\ZJI
+A3E3:\ZJIP
+A3E4:\ZJIET
+A3E5:\ZJIEX
+A3E6:\ZJIE
+A3E7:\ZJIEP
+A3E8:\ZJUOT
+A3E9:\ZJUOX
+A3EA:\ZJUO
+A3EB:\ZJUOP
+A3EC:\ZJOT
+A3ED:\ZJOX
+A3EE:\ZJO
+A3EF:\ZJOP
+A3F0:\ZJUT
+A3F1:\ZJUX
+A3F2:\ZJU
+A3F3:\ZJUP
+A3F4:\ZJURX
+A3F5:\ZJUR
+A3F6:\ZJYT
+A3F7:\ZJYX
+A3F8:\ZJY
+A3F9:\ZJYP
+A3FA:\ZJYRX
+A3FB:\ZJYR
+A3FC:\ZQIT
+A3FD:\ZQIX
+A3FE:\ZQI
+A3FF:\ZQIP
+A400:\ZQIET
+A401:\ZQIEX
+A402:\ZQIE
+A403:\ZQIEP
+A404:\ZQUOT
+A405:\ZQUOX
+A406:\ZQUO
+A407:\ZQUOP
+A408:\ZQOT
+A409:\ZQOX
+A40A:\ZQO
+A40B:\ZQOP
+A40C:\ZQUT
+A40D:\ZQUX
+A40E:\ZQU
+A40F:\ZQUP
+A410:\ZQURX
+A411:\ZQUR
+A412:\ZQYT
+A413:\ZQYX
+A414:\ZQY
+A415:\ZQYP
+A416:\ZQYRX
+A417:\ZQYR
+A418:\ZJJIT
+A419:\ZJJIX
+A41A:\ZJJI
+A41B:\ZJJIP
+A41C:\ZJJIET
+A41D:\ZJJIEX
+A41E:\ZJJIE
+A41F:\ZJJIEP
+A420:\ZJJUOX
+A421:\ZJJUO
+A422:\ZJJUOP
+A423:\ZJJOT
+A424:\ZJJOX
+A425:\ZJJO
+A426:\ZJJOP
+A427:\ZJJUT
+A428:\ZJJUX
+A429:\ZJJU
+A42A:\ZJJUP
+A42B:\ZJJURX
+A42C:\ZJJUR
+A42D:\ZJJYT
+A42E:\ZJJYX
+A42F:\ZJJY
+A430:\ZJJYP
+A431:\ÿJIT
+A432:\ÿJIX
+A433:\ÿJI
+A434:\ÿJIP
+A435:\ÿJIET
+A436:\ÿJIEX
+A437:\ÿJIE
+A438:\ÿJIEP
+A439:\ÿJUOX
+A43A:\ÿJUO
+A43B:\ÿJOT
+A43C:\ÿJOX
+A43D:\ÿJO
+A43E:\ÿJOP
+A43F:\ÿJUX
+A440:\ÿJU
+A441:\ÿJUP
+A442:\ÿJURX
+A443:\ÿJUR
+A444:\ÿJYT
+A445:\ÿJYX
+A446:\ÿJY
+A447:\ÿJYP
+A448:\ÿJYRX
+A449:\ÿJYR
+A44A:\ÿYIT
+A44B:\ÿYIX
+A44C:\ÿYI
+A44D:\ÿYIP
+A44E:\ÿYIET
+A44F:\ÿYIEX
+A450:\ÿYIE
+A451:\ÿYIEP
+A452:\ÿYUOX
+A453:\ÿYUO
+A454:\ÿYUOP
+A455:\ÿYOT
+A456:\ÿYOX
+A457:\ÿYO
+A458:\ÿYOP
+A459:\ÿYUT
+A45A:\ÿYUX
+A45B:\ÿYU
+A45C:\ÿYUP
+A45D:\ZXIT
+A45E:\ZXIX
+A45F:\ZXI
+A460:\ZXIP
+A461:\ZXIET
+A462:\ZXIEX
+A463:\ZXIE
+A464:\ZXIEP
+A465:\ZXUOX
+A466:\ZXUO
+A467:\ZXOT
+A468:\ZXOX
+A469:\ZXO
+A46A:\ZXOP
+A46B:\ZXYT
+A46C:\ZXYX
+A46D:\ZXY
+A46E:\ZXYP
+A46F:\ZXYRX
+A470:\ZXYR
+A471:\ZYIT
+A472:\ZYIX
+A473:\ZYI
+A474:\ZYIP
+A475:\ZYIET
+A476:\ZYIEX
+A477:\ZYIE
+A478:\ZYIEP
+A479:\ZYUOT
+A47A:\ZYUOX
+A47B:\ZYUO
+A47C:\ZYUOP
+A47D:\ZYOT
+A47E:\ZYOX
+A47F:\ZYO
+A480:\ZYOP
+A481:\ZYUT
+A482:\ZYUX
+A483:\ZYU
+A484:\ZYUP
+A485:\ZYURX
+A486:\ZYUR
+A487:\ZYYT
+A488:\ZYYX
+A489:\ZYY
+A48A:\ZYYP
+A48B:\ZYYRX
+A48C:\ZYYR
+A490:YI\vQOT
+A491:YI\vLI
+A492:YI\vKIT
+A493:YI\vNYIP
+A494:YI\vCYP
+A495:YI\vSSI
+A496:YI\vGGOP
+A497:YI\vGEP
+A498:YI\vMI
+A499:YI\vHXIT
+A49A:YI\vLYR
+A49B:YI\vBBUT
+A49C:YI\vMOP
+A49D:YI\vYO
+A49E:YI\vPUT
+A49F:YI\vHXUO
+A4A0:YI\vTAT
+A4A1:YI\vGA
+A4A2:YI\vZUP
+A4A3:YI\vCYT
+A4A4:YI\vDDUR
+A4A5:YI\vBUR
+A4A6:YI\vGGUO
+A4A7:YI\vNYOP
+A4A8:YI\vTU
+A4A9:YI\vOP
+A4AA:YI\vJJUT
+A4AB:YI\vZOT
+A4AC:YI\vPYT
+A4AD:YI\vHMO
+A4AE:YI\vYIT
+A4AF:YI\vVUR
+A4B0:YI\vSHY
+A4B1:YI\vVEP
+A4B2:YI\vZA
+A4B3:YI\vJO
+A4B4:YI\vNZUP
+A4B5:YI\vJJY
+A4B6:YI\vGOT
+A4B7:YI\vJJIE
+A4B8:YI\vWO
+A4B9:YI\vDU
+A4BA:YI\vSHUR
+A4BB:YI\vLIE
+A4BC:YI\vCY
+A4BD:YI\vCUOP
+A4BE:YI\vCIP
+A4BF:YI\vHXOP
+A4C0:YI\vSHAT
+A4C1:YI\vZUR
+A4C2:YI\vSHOP
+A4C3:YI\vCHE
+A4C4:YI\vZZIET
+A4C5:YI\vNBIE
+A4C6:YI\vKE
+AC00-D7A3:<Hangul Syllable>
+D800-DB7F:<Non Private Use High Surrogate>
+DB80-DBFF:<Private Use High Surrogate>
+DC00-DFFF:<Low Surrogate>
+E000-F8FF:<Private Use>
+F900:\ 00
+F901:\ 01
+F902:\ 02
+F903:\ 03
+F904:\ 04
+F905:\ 05
+F906:\ 06
+F907:\ 07
+F908:\ 08
+F909:\ 09
+F90A:\ 0A
+F90B:\ 0B
+F90C:\ 0C
+F90D:\ 0D
+F90E:\ 0E
+F90F:\ 0F
+F910:\ 10
+F911:\ 11
+F912:\ 12
+F913:\ 13
+F914:\ 14
+F915:\ 15
+F916:\ 16
+F917:\ 17
+F918:\ 18
+F919:\ 19
+F91A:\ 1A
+F91B:\ 1B
+F91C:\ 1C
+F91D:\ 1D
+F91E:\ 1E
+F91F:\ 1F
+F920:\ 20
+F921:\ 21
+F922:\ 22
+F923:\ 23
+F924:\ 24
+F925:\ 25
+F926:\ 26
+F927:\ 27
+F928:\ 28
+F929:\ 29
+F92A:\ 2A
+F92B:\ 2B
+F92C:\ 2C
+F92D:\ 2D
+F92E:\ 2E
+F92F:\ 2F
+F930:\ 30
+F931:\ 31
+F932:\ 32
+F933:\ 33
+F934:\ 34
+F935:\ 35
+F936:\ 36
+F937:\ 37
+F938:\ 38
+F939:\ 39
+F93A:\ 3A
+F93B:\ 3B
+F93C:\ 3C
+F93D:\ 3D
+F93E:\ 3E
+F93F:\ 3F
+F940:\ 40
+F941:\ 41
+F942:\ 42
+F943:\ 43
+F944:\ 44
+F945:\ 45
+F946:\ 46
+F947:\ 47
+F948:\ 48
+F949:\ 49
+F94A:\ 4A
+F94B:\ 4B
+F94C:\ 4C
+F94D:\ 4D
+F94E:\ 4E
+F94F:\ 4F
+F950:\ 50
+F951:\ 51
+F952:\ 52
+F953:\ 53
+F954:\ 54
+F955:\ 55
+F956:\ 56
+F957:\ 57
+F958:\ 58
+F959:\ 59
+F95A:\ 5A
+F95B:\ 5B
+F95C:\ 5C
+F95D:\ 5D
+F95E:\ 5E
+F95F:\ 5F
+F960:\ 60
+F961:\ 61
+F962:\ 62
+F963:\ 63
+F964:\ 64
+F965:\ 65
+F966:\ 66
+F967:\ 67
+F968:\ 68
+F969:\ 69
+F96A:\ 6A
+F96B:\ 6B
+F96C:\ 6C
+F96D:\ 6D
+F96E:\ 6E
+F96F:\ 6F
+F970:\ 70
+F971:\ 71
+F972:\ 72
+F973:\ 73
+F974:\ 74
+F975:\ 75
+F976:\ 76
+F977:\ 77
+F978:\ 78
+F979:\ 79
+F97A:\ 7A
+F97B:\ 7B
+F97C:\ 7C
+F97D:\ 7D
+F97E:\ 7E
+F97F:\ 7F
+F980:\ 80
+F981:\ 81
+F982:\ 82
+F983:\ 83
+F984:\ 84
+F985:\ 85
+F986:\ 86
+F987:\ 87
+F988:\ 88
+F989:\ 89
+F98A:\ 8A
+F98B:\ 8B
+F98C:\ 8C
+F98D:\ 8D
+F98E:\ 8E
+F98F:\ 8F
+F990:\ 90
+F991:\ 91
+F992:\ 92
+F993:\ 93
+F994:\ 94
+F995:\ 95
+F996:\ 96
+F997:\ 97
+F998:\ 98
+F999:\ 99
+F99A:\ 9A
+F99B:\ 9B
+F99C:\ 9C
+F99D:\ 9D
+F99E:\ 9E
+F99F:\ 9F
+F9A0:\ A0
+F9A1:\ A1
+F9A2:\ A2
+F9A3:\ A3
+F9A4:\ A4
+F9A5:\ A5
+F9A6:\ A6
+F9A7:\ A7
+F9A8:\ A8
+F9A9:\ A9
+F9AA:\ AA
+F9AB:\ AB
+F9AC:\ AC
+F9AD:\ AD
+F9AE:\ AE
+F9AF:\ AF
+F9B0:\ B0
+F9B1:\ B1
+F9B2:\ B2
+F9B3:\ B3
+F9B4:\ B4
+F9B5:\ B5
+F9B6:\ B6
+F9B7:\ B7
+F9B8:\ B8
+F9B9:\ B9
+F9BA:\ BA
+F9BB:\ BB
+F9BC:\ BC
+F9BD:\ BD
+F9BE:\ BE
+F9BF:\ BF
+F9C0:\ C0
+F9C1:\ C1
+F9C2:\ C2
+F9C3:\ C3
+F9C4:\ C4
+F9C5:\ C5
+F9C6:\ C6
+F9C7:\ C7
+F9C8:\ C8
+F9C9:\ C9
+F9CA:\ CA
+F9CB:\ CB
+F9CC:\ CC
+F9CD:\ CD
+F9CE:\ CE
+F9CF:\ CF
+F9D0:\ D0
+F9D1:\ D1
+F9D2:\ D2
+F9D3:\ D3
+F9D4:\ D4
+F9D5:\ D5
+F9D6:\ D6
+F9D7:\ D7
+F9D8:\ D8
+F9D9:\ D9
+F9DA:\ DA
+F9DB:\ DB
+F9DC:\ DC
+F9DD:\ DD
+F9DE:\ DE
+F9DF:\ DF
+F9E0:\ E0
+F9E1:\ E1
+F9E2:\ E2
+F9E3:\ E3
+F9E4:\ E4
+F9E5:\ E5
+F9E6:\ E6
+F9E7:\ E7
+F9E8:\ E8
+F9E9:\ E9
+F9EA:\ EA
+F9EB:\ EB
+F9EC:\ EC
+F9ED:\ ED
+F9EE:\ EE
+F9EF:\ EF
+F9F0:\ F0
+F9F1:\ F1
+F9F2:\ F2
+F9F3:\ F3
+F9F4:\ F4
+F9F5:\ F5
+F9F6:\ F6
+F9F7:\ F7
+F9F8:\ F8
+F9F9:\ F9
+F9FA:\ FA
+F9FB:\ FB
+F9FC:\ FC
+F9FD:\ FD
+F9FE:\ FE
+F9FF:\ FF
+FA00:\õ00
+FA01:\õ01
+FA02:\õ02
+FA03:\õ03
+FA04:\õ04
+FA05:\õ05
+FA06:\õ06
+FA07:\õ07
+FA08:\õ08
+FA09:\õ09
+FA0A:\õ0A
+FA0B:\õ0B
+FA0C:\õ0C
+FA0D:\õ0D
+FA0E:\õ0E
+FA0F:\õ0F
+FA10:\õ10
+FA11:\õ11
+FA12:\õ12
+FA13:\õ13
+FA14:\õ14
+FA15:\õ15
+FA16:\õ16
+FA17:\õ17
+FA18:\õ18
+FA19:\õ19
+FA1A:\õ1A
+FA1B:\õ1B
+FA1C:\õ1C
+FA1D:\õ1D
+FA1E:\õ1E
+FA1F:\õ1F
+FA20:\õ20
+FA21:\õ21
+FA22:\õ22
+FA23:\õ23
+FA24:\õ24
+FA25:\õ25
+FA26:\õ26
+FA27:\õ27
+FA28:\õ28
+FA29:\õ29
+FA2A:\õ2A
+FA2B:\õ2B
+FA2C:\õ2C
+FA2D:\õ2D
+FA30:\õ30
+FA31:\õ31
+FA32:\õ32
+FA33:\õ33
+FA34:\õ34
+FA35:\õ35
+FA36:\õ36
+FA37:\õ37
+FA38:\õ38
+FA39:\õ39
+FA3A:\õ3A
+FA3B:\õ3B
+FA3C:\õ3C
+FA3D:\õ3D
+FA3E:\õ3E
+FA3F:\õ3F
+FA40:\õ40
+FA41:\õ41
+FA42:\õ42
+FA43:\õ43
+FA44:\õ44
+FA45:\õ45
+FA46:\õ46
+FA47:\õ47
+FA48:\õ48
+FA49:\õ49
+FA4A:\õ4A
+FA4B:\õ4B
+FA4C:\õ4C
+FA4D:\õ4D
+FA4E:\õ4E
+FA4F:\õ4F
+FA50:\õ50
+FA51:\õ51
+FA52:\õ52
+FA53:\õ53
+FA54:\õ54
+FA55:\õ55
+FA56:\õ56
+FA57:\õ57
+FA58:\õ58
+FA59:\õ59
+FA5A:\õ5A
+FA5B:\õ5B
+FA5C:\õ5C
+FA5D:\õ5D
+FA5E:\õ5E
+FA5F:\õ5F
+FA60:\õ60
+FA61:\õ61
+FA62:\õ62
+FA63:\õ63
+FA64:\õ64
+FA65:\õ65
+FA66:\õ66
+FA67:\õ67
+FA68:\õ68
+FA69:\õ69
+FA6A:\õ6A
+FB00:LATIN\Ç\òFF
+FB01:LATIN\Ç\òFI
+FB02:LATIN\Ç\òFL
+FB03:LATIN\Ç\òFFI
+FB04:LATIN\Ç\òFFL
+FB05:LATIN\Ç\òLONG S T
+FB06:LATIN\Ç\òST
+FB13:ARMENIAN\Ç\òMEN NOW
+FB14:ARMENIAN\Ç\òMEN ECH
+FB15:ARMENIAN\Ç\òMEN INI
+FB16:ARMENIAN\Ç\òVEW NOW
+FB17:ARMENIAN\Ç\òMEN XEH
+FB1D:\Ÿ\@YOD\HHIRIQ
+FB1E:\Ÿ POINT JUDEO-SPANISH VARIKA
+FB1F:\Ÿ \òYIDDISH YOD YOD PATAH
+FB20:\Ÿ\@ALTERNATIVE AYIN
+FB21:\Ÿ\@WIDE ALEF
+FB22:\Ÿ\@WIDE DALET
+FB23:\Ÿ\@WIDE HE
+FB24:\Ÿ\@WIDE KAF
+FB25:\Ÿ\@WIDE LAMED
+FB26:\Ÿ\@WIDE FINAL MEM
+FB27:\Ÿ\@WIDE RESH
+FB28:\Ÿ\@WIDE TAV
+FB29:\Ÿ\@ALTERNATIVE PLUS\‚
+FB2A:\Ÿ\@SHIN\HSHIN DOT
+FB2B:\Ÿ\@SHIN\HSIN DOT
+FB2C:\Ÿ\@SHIN\HDAGESH\iSHIN DOT
+FB2D:\Ÿ\@SHIN\HDAGESH\iSIN DOT
+FB2E:\Ÿ\@ALEF\HPATAH
+FB2F:\Ÿ\@ALEF\HQAMATS
+FB30:\Ÿ\@ALEF\HMAPIQ
+FB31:\Ÿ\@BET\HDAGESH
+FB32:\Ÿ\@GIMEL\HDAGESH
+FB33:\Ÿ\@DALET\HDAGESH
+FB34:\Ÿ\@HE\HMAPIQ
+FB35:\Ÿ\@VAV\HDAGESH
+FB36:\Ÿ\@ZAYIN\HDAGESH
+FB38:\Ÿ\@TET\HDAGESH
+FB39:\Ÿ\@YOD\HDAGESH
+FB3A:\Ÿ\@FINAL KAF\HDAGESH
+FB3B:\Ÿ\@KAF\HDAGESH
+FB3C:\Ÿ\@LAMED\HDAGESH
+FB3E:\Ÿ\@MEM\HDAGESH
+FB40:\Ÿ\@NUN\HDAGESH
+FB41:\Ÿ\@SAMEKH\HDAGESH
+FB43:\Ÿ\@FINAL PE\HDAGESH
+FB44:\Ÿ\@PE\HDAGESH
+FB46:\Ÿ\@TSADI\HDAGESH
+FB47:\Ÿ\@QOF\HDAGESH
+FB48:\Ÿ\@RESH\HDAGESH
+FB49:\Ÿ\@SHIN\HDAGESH
+FB4A:\Ÿ\@TAV\HDAGESH
+FB4B:\Ÿ\@VAV\HHOLAM
+FB4C:\Ÿ\@BET\HRAFE
+FB4D:\Ÿ\@KAF\HRAFE
+FB4E:\Ÿ\@PE\HRAFE
+FB4F:\Ÿ \òALEF LAMED
+FB50:\^ALEF WASLA\Q
+FB51:\^ALEF WASLA\6
+FB52:\^BEEH\Q
+FB53:\^BEEH\6
+FB54:\^BEEH\2
+FB55:\^BEEH MEDI\X
+FB56:\^PEH\Q
+FB57:\^PEH\6
+FB58:\^PEH\2
+FB59:\^PEH MEDI\X
+FB5A:\^BEHEH\Q
+FB5B:\^BEHEH\6
+FB5C:\^BEHEH\2
+FB5D:\^BEHEH MEDI\X
+FB5E:\^TTEHEH\Q
+FB5F:\^TTEHEH\6
+FB60:\^TTEHEH\2
+FB61:\^TTEHEH MEDI\X
+FB62:\^TEHEH\Q
+FB63:\^TEHEH\6
+FB64:\^TEHEH\2
+FB65:\^TEHEH MEDI\X
+FB66:\^TTEH\Q
+FB67:\^TTEH\6
+FB68:\^TTEH\2
+FB69:\^TTEH MEDI\X
+FB6A:\^VEH\Q
+FB6B:\^VEH\6
+FB6C:\^VEH\2
+FB6D:\^VEH MEDI\X
+FB6E:\^PEHEH\Q
+FB6F:\^PEHEH\6
+FB70:\^PEHEH\2
+FB71:\^PEHEH MEDI\X
+FB72:\^DYEH\Q
+FB73:\^DYEH\6
+FB74:\^DYEH\2
+FB75:\^DYEH MEDI\X
+FB76:\^NYEH\Q
+FB77:\^NYEH\6
+FB78:\^NYEH\2
+FB79:\^NYEH MEDI\X
+FB7A:\^TCHEH\Q
+FB7B:\^TCHEH\6
+FB7C:\^TCHEH\2
+FB7D:\^TCHEH MEDI\X
+FB7E:\^TCHEHEH\Q
+FB7F:\^TCHEHEH\6
+FB80:\^TCHEHEH\2
+FB81:\^TCHEHEH MEDI\X
+FB82:\^DDAHAL\Q
+FB83:\^DDAHAL\6
+FB84:\^DAHAL\Q
+FB85:\^DAHAL\6
+FB86:\^DUL\Q
+FB87:\^DUL\6
+FB88:\^DDAL\Q
+FB89:\^DDAL\6
+FB8A:\^JEH\Q
+FB8B:\^JEH\6
+FB8C:\^RREH\Q
+FB8D:\^RREH\6
+FB8E:\^KEHEH\Q
+FB8F:\^KEHEH\6
+FB90:\^KEHEH\2
+FB91:\^KEHEH MEDI\X
+FB92:\^GAF\Q
+FB93:\^GAF\6
+FB94:\^GAF\2
+FB95:\^GAF MEDI\X
+FB96:\^GUEH\Q
+FB97:\^GUEH\6
+FB98:\^GUEH\2
+FB99:\^GUEH MEDI\X
+FB9A:\^NGOEH\Q
+FB9B:\^NGOEH\6
+FB9C:\^NGOEH\2
+FB9D:\^NGOEH MEDI\X
+FB9E:\^NOON GHUNNA\Q
+FB9F:\^NOON GHUNNA\6
+FBA0:\^RNOON\Q
+FBA1:\^RNOON\6
+FBA2:\^RNOON\2
+FBA3:\^RNOON MEDI\X
+FBA4:\^HEH\HYEH\p\Q
+FBA5:\^HEH\HYEH\p\6
+FBA6:\^HEH GOAL\Q
+FBA7:\^HEH GOAL\6
+FBA8:\^HEH GOAL\2
+FBA9:\^HEH GOAL MEDI\X
+FBAA:\^HEH DOACHASHMEE\Q
+FBAB:\^HEH DOACHASHMEE\6
+FBAC:\^HEH DOACHASHMEE\2
+FBAD:\^HEH DOACHASHMEE MEDI\X
+FBAE:\^YEH\ìREE\Q
+FBAF:\^YEH\ìREE\6
+FBB0:\^YEH\ìREE\HHAMZA\p\Q
+FBB1:\^YEH\ìREE\HHAMZA\p\6
+FBD3:\^NG\Q
+FBD4:\^NG\6
+FBD5:\^NG\2
+FBD6:\^NG MEDI\X
+FBD7:\^U\Q
+FBD8:\^U\6
+FBD9:\^OE\Q
+FBDA:\^OE\6
+FBDB:\^YU\Q
+FBDC:\^YU\6
+FBDD:\^U\HHAMZA\p\Q
+FBDE:\^VE\Q
+FBDF:\^VE\6
+FBE0:\^KIRGHIZ OE\Q
+FBE1:\^KIRGHIZ OE\6
+FBE2:\^KIRGHIZ YU\Q
+FBE3:\^KIRGHIZ YU\6
+FBE4:\^E\Q
+FBE5:\^E\6
+FBE6:\^E\2
+FBE7:\^E MEDI\X
+FBE8:\^UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA\2
+FBE9:\^UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDI\X
+FBEA:\J\º\HALEF\Q
+FBEB:\J\º\HALEF\6
+FBEC:\J\º\HAE\Q
+FBED:\J\º\HAE\6
+FBEE:\J\º\HWAW\Q
+FBEF:\J\º\HWAW\6
+FBF0:\J\º\HU\Q
+FBF1:\J\º\HU\6
+FBF2:\J\º\HOE\Q
+FBF3:\J\º\HOE\6
+FBF4:\J\º\HYU\Q
+FBF5:\J\º\HYU\6
+FBF6:\J\º\HE\Q
+FBF7:\J\º\HE\6
+FBF8:\J\º\HE\2
+FBF9:\JUIGHUR KIRGHIZ \º\‡\Q
+FBFA:\JUIGHUR KIRGHIZ \º\‡\6
+FBFB:\JUIGHUR KIRGHIZ \º\‡\2
+FBFC:\^FARSI YEH\Q
+FBFD:\^FARSI YEH\6
+FBFE:\^FARSI YEH\2
+FBFF:\^FARSI YEH MEDI\X
+FC00:\J\º\Ô\Q
+FC01:\J\º\HHAH\Q
+FC02:\J\º\\Q
+FC03:\J\º\‡\Q
+FC04:\J\º\HYEH\Q
+FC05:\JBEH\Ô\Q
+FC06:\JBEH\HHAH\Q
+FC07:\JBEH\HKHAH\Q
+FC08:\JBEH\\Q
+FC09:\JBEH\‡\Q
+FC0A:\JBEH\HYEH\Q
+FC0B:\JTEH\Ô\Q
+FC0C:\JTEH\HHAH\Q
+FC0D:\JTEH\HKHAH\Q
+FC0E:\JTEH\\Q
+FC0F:\JTEH\‡\Q
+FC10:\JTEH\HYEH\Q
+FC11:\JTHEH\Ô\Q
+FC12:\JTHEH\\Q
+FC13:\JTHEH\‡\Q
+FC14:\JTHEH\HYEH\Q
+FC15:\JJEEM\HHAH\Q
+FC16:\JJEEM\\Q
+FC17:\JHAH\Ô\Q
+FC18:\JHAH\\Q
+FC19:\JKHAH\Ô\Q
+FC1A:\JKHAH\HHAH\Q
+FC1B:\JKHAH\\Q
+FC1C:\JSEEN\Ô\Q
+FC1D:\JSEEN\HHAH\Q
+FC1E:\JSEEN\HKHAH\Q
+FC1F:\JSEEN\\Q
+FC20:\JSAD\HHAH\Q
+FC21:\JSAD\\Q
+FC22:\JDAD\Ô\Q
+FC23:\JDAD\HHAH\Q
+FC24:\JDAD\HKHAH\Q
+FC25:\JDAD\\Q
+FC26:\JTAH\HHAH\Q
+FC27:\JTAH\\Q
+FC28:\JZAH\\Q
+FC29:\JAIN\Ô\Q
+FC2A:\JAIN\\Q
+FC2B:\JGHAIN\Ô\Q
+FC2C:\JGHAIN\\Q
+FC2D:\JFEH\Ô\Q
+FC2E:\JFEH\HHAH\Q
+FC2F:\JFEH\HKHAH\Q
+FC30:\JFEH\\Q
+FC31:\JFEH\‡\Q
+FC32:\JFEH\HYEH\Q
+FC33:\JQAF\HHAH\Q
+FC34:\JQAF\\Q
+FC35:\JQAF\‡\Q
+FC36:\JQAF\HYEH\Q
+FC37:\JKAF\HALEF\Q
+FC38:\JKAF\Ô\Q
+FC39:\JKAF\HHAH\Q
+FC3A:\JKAF\HKHAH\Q
+FC3B:\JKAF\HLAM\Q
+FC3C:\JKAF\\Q
+FC3D:\JKAF\‡\Q
+FC3E:\JKAF\HYEH\Q
+FC3F:\JLAM\Ô\Q
+FC40:\JLAM\HHAH\Q
+FC41:\JLAM\HKHAH\Q
+FC42:\JLAM\\Q
+FC43:\JLAM\‡\Q
+FC44:\JLAM\HYEH\Q
+FC45:\JMEEM\Ô\Q
+FC46:\JMEEM\HHAH\Q
+FC47:\JMEEM\HKHAH\Q
+FC48:\JMEEM\\Q
+FC49:\JMEEM\‡\Q
+FC4A:\JMEEM\HYEH\Q
+FC4B:\JNOON\Ô\Q
+FC4C:\JNOON\HHAH\Q
+FC4D:\JNOON\HKHAH\Q
+FC4E:\JNOON\\Q
+FC4F:\JNOON\‡\Q
+FC50:\JNOON\HYEH\Q
+FC51:\JHEH\Ô\Q
+FC52:\JHEH\\Q
+FC53:\JHEH\‡\Q
+FC54:\JHEH\HYEH\Q
+FC55:\JYEH\Ô\Q
+FC56:\JYEH\HHAH\Q
+FC57:\JYEH\HKHAH\Q
+FC58:\JYEH\\Q
+FC59:\JYEH\‡\Q
+FC5A:\JYEH\HYEH\Q
+FC5B:\JTHAL\HSUPER\Ž ALEF\Q
+FC5C:\JREH\HSUPER\Ž ALEF\Q
+FC5D:\JALEF MAKSURA\HSUPER\Ž ALEF\Q
+FC5E:\JSHADDA\HDAMMATAN\Q
+FC5F:\JSHADDA\HKASRATAN\Q
+FC60:\JSHADDA\HFATHA\Q
+FC61:\JSHADDA\HDAMMA\Q
+FC62:\JSHADDA\HKASRA\Q
+FC63:\JSHADDA\HSUPER\Ž ALEF\Q
+FC64:\J\º\HREH\6
+FC65:\J\º\HZAIN\6
+FC66:\J\º\\6
+FC67:\J\º\HNOON\6
+FC68:\J\º\‡\6
+FC69:\J\º\Û
+FC6A:\JBEH\HREH\6
+FC6B:\JBEH\HZAIN\6
+FC6C:\JBEH\\6
+FC6D:\JBEH\HNOON\6
+FC6E:\JBEH\‡\6
+FC6F:\JBEH\Û
+FC70:\JTEH\HREH\6
+FC71:\JTEH\HZAIN\6
+FC72:\JTEH\\6
+FC73:\JTEH\HNOON\6
+FC74:\JTEH\‡\6
+FC75:\JTEH\Û
+FC76:\JTHEH\HREH\6
+FC77:\JTHEH\HZAIN\6
+FC78:\JTHEH\\6
+FC79:\JTHEH\HNOON\6
+FC7A:\JTHEH\‡\6
+FC7B:\JTHEH\Û
+FC7C:\JFEH\‡\6
+FC7D:\JFEH\Û
+FC7E:\JQAF\‡\6
+FC7F:\JQAF\Û
+FC80:\JKAF\HALEF\6
+FC81:\JKAF\HLAM\6
+FC82:\JKAF\\6
+FC83:\JKAF\‡\6
+FC84:\JKAF\Û
+FC85:\JLAM\\6
+FC86:\JLAM\‡\6
+FC87:\JLAM\Û
+FC88:\JMEEM\HALEF\6
+FC89:\JMEEM\\6
+FC8A:\JNOON\HREH\6
+FC8B:\JNOON\HZAIN\6
+FC8C:\JNOON\\6
+FC8D:\JNOON\HNOON\6
+FC8E:\JNOON\‡\6
+FC8F:\JNOON\Û
+FC90:\JALEF MAKSURA\HSUPER\Ž ALEF\6
+FC91:\JYEH\HREH\6
+FC92:\JYEH\HZAIN\6
+FC93:\JYEH\\6
+FC94:\JYEH\HNOON\6
+FC95:\JYEH\‡\6
+FC96:\JYEH\Û
+FC97:\J\º\Ô\2
+FC98:\J\º\HHAH\2
+FC99:\J\º\HKHAH\2
+FC9A:\J\º\\2
+FC9B:\J\º\HHEH\2
+FC9C:\JBEH\Ô\2
+FC9D:\JBEH\HHAH\2
+FC9E:\JBEH\HKHAH\2
+FC9F:\JBEH\\2
+FCA0:\JBEH\HHEH\2
+FCA1:\JTEH\Ô\2
+FCA2:\JTEH\HHAH\2
+FCA3:\JTEH\HKHAH\2
+FCA4:\JTEH\\2
+FCA5:\JTEH\HHEH\2
+FCA6:\JTHEH\\2
+FCA7:\JJEEM\HHAH\2
+FCA8:\JJEEM\\2
+FCA9:\JHAH\Ô\2
+FCAA:\JHAH\\2
+FCAB:\JKHAH\Ô\2
+FCAC:\JKHAH\\2
+FCAD:\JSEEN\Ô\2
+FCAE:\JSEEN\HHAH\2
+FCAF:\JSEEN\HKHAH\2
+FCB0:\JSEEN\\2
+FCB1:\JSAD\HHAH\2
+FCB2:\JSAD\HKHAH\2
+FCB3:\JSAD\\2
+FCB4:\JDAD\Ô\2
+FCB5:\JDAD\HHAH\2
+FCB6:\JDAD\HKHAH\2
+FCB7:\JDAD\\2
+FCB8:\JTAH\HHAH\2
+FCB9:\JZAH\\2
+FCBA:\JAIN\Ô\2
+FCBB:\JAIN\\2
+FCBC:\JGHAIN\Ô\2
+FCBD:\JGHAIN\\2
+FCBE:\JFEH\Ô\2
+FCBF:\JFEH\HHAH\2
+FCC0:\JFEH\HKHAH\2
+FCC1:\JFEH\\2
+FCC2:\JQAF\HHAH\2
+FCC3:\JQAF\\2
+FCC4:\JKAF\Ô\2
+FCC5:\JKAF\HHAH\2
+FCC6:\JKAF\HKHAH\2
+FCC7:\JKAF\HLAM\2
+FCC8:\JKAF\\2
+FCC9:\JLAM\Ô\2
+FCCA:\JLAM\HHAH\2
+FCCB:\JLAM\HKHAH\2
+FCCC:\JLAM\\2
+FCCD:\JLAM\HHEH\2
+FCCE:\JMEEM\Ô\2
+FCCF:\JMEEM\HHAH\2
+FCD0:\JMEEM\HKHAH\2
+FCD1:\JMEEM\\2
+FCD2:\JNOON\Ô\2
+FCD3:\JNOON\HHAH\2
+FCD4:\JNOON\HKHAH\2
+FCD5:\JNOON\\2
+FCD6:\JNOON\HHEH\2
+FCD7:\JHEH\Ô\2
+FCD8:\JHEH\\2
+FCD9:\JHEH\HSUPER\Ž ALEF\2
+FCDA:\JYEH\Ô\2
+FCDB:\JYEH\HHAH\2
+FCDC:\JYEH\HKHAH\2
+FCDD:\JYEH\\2
+FCDE:\JYEH\HHEH\2
+FCDF:\J\º\ MEDI\X
+FCE0:\J\º\HHEH MEDI\X
+FCE1:\JBEH\ MEDI\X
+FCE2:\JBEH\HHEH MEDI\X
+FCE3:\JTEH\ MEDI\X
+FCE4:\JTEH\HHEH MEDI\X
+FCE5:\JTHEH\ MEDI\X
+FCE6:\JTHEH\HHEH MEDI\X
+FCE7:\JSEEN\ MEDI\X
+FCE8:\JSEEN\HHEH MEDI\X
+FCE9:\JSHEEN\ MEDI\X
+FCEA:\JSHEEN\HHEH MEDI\X
+FCEB:\JKAF\HLAM MEDI\X
+FCEC:\JKAF\ MEDI\X
+FCED:\JLAM\ MEDI\X
+FCEE:\JNOON\ MEDI\X
+FCEF:\JNOON\HHEH MEDI\X
+FCF0:\JYEH\ MEDI\X
+FCF1:\JYEH\HHEH MEDI\X
+FCF2:\JSHADDA\HFATHA MEDI\X
+FCF3:\JSHADDA\HDAMMA MEDI\X
+FCF4:\JSHADDA\HKASRA MEDI\X
+FCF5:\JTAH\‡\Q
+FCF6:\JTAH\HYEH\Q
+FCF7:\JAIN\‡\Q
+FCF8:\JAIN\HYEH\Q
+FCF9:\JGHAIN\‡\Q
+FCFA:\JGHAIN\HYEH\Q
+FCFB:\JSEEN\‡\Q
+FCFC:\JSEEN\HYEH\Q
+FCFD:\JSHEEN\‡\Q
+FCFE:\JSHEEN\HYEH\Q
+FCFF:\JHAH\‡\Q
+FD00:\JHAH\HYEH\Q
+FD01:\JJEEM\‡\Q
+FD02:\JJEEM\HYEH\Q
+FD03:\JKHAH\‡\Q
+FD04:\JKHAH\HYEH\Q
+FD05:\JSAD\‡\Q
+FD06:\JSAD\HYEH\Q
+FD07:\JDAD\‡\Q
+FD08:\JDAD\HYEH\Q
+FD09:\JSHEEN\Ô\Q
+FD0A:\JSHEEN\HHAH\Q
+FD0B:\JSHEEN\HKHAH\Q
+FD0C:\JSHEEN\\Q
+FD0D:\JSHEEN\HREH\Q
+FD0E:\JSEEN\HREH\Q
+FD0F:\JSAD\HREH\Q
+FD10:\JDAD\HREH\Q
+FD11:\JTAH\‡\6
+FD12:\JTAH\Û
+FD13:\JAIN\‡\6
+FD14:\JAIN\Û
+FD15:\JGHAIN\‡\6
+FD16:\JGHAIN\Û
+FD17:\JSEEN\‡\6
+FD18:\JSEEN\Û
+FD19:\JSHEEN\‡\6
+FD1A:\JSHEEN\Û
+FD1B:\JHAH\‡\6
+FD1C:\JHAH\Û
+FD1D:\JJEEM\‡\6
+FD1E:\JJEEM\Û
+FD1F:\JKHAH\‡\6
+FD20:\JKHAH\Û
+FD21:\JSAD\‡\6
+FD22:\JSAD\Û
+FD23:\JDAD\‡\6
+FD24:\JDAD\Û
+FD25:\JSHEEN\Ô\6
+FD26:\JSHEEN\HHAH\6
+FD27:\JSHEEN\HKHAH\6
+FD28:\JSHEEN\\6
+FD29:\JSHEEN\HREH\6
+FD2A:\JSEEN\HREH\6
+FD2B:\JSAD\HREH\6
+FD2C:\JDAD\HREH\6
+FD2D:\JSHEEN\Ô\2
+FD2E:\JSHEEN\HHAH\2
+FD2F:\JSHEEN\HKHAH\2
+FD30:\JSHEEN\\2
+FD31:\JSEEN\HHEH\2
+FD32:\JSHEEN\HHEH\2
+FD33:\JTAH\\2
+FD34:\JSEEN\Ô MEDI\X
+FD35:\JSEEN\HHAH MEDI\X
+FD36:\JSEEN\HKHAH MEDI\X
+FD37:\JSHEEN\Ô MEDI\X
+FD38:\JSHEEN\HHAH MEDI\X
+FD39:\JSHEEN\HKHAH MEDI\X
+FD3A:\JTAH\ MEDI\X
+FD3B:\JZAH\ MEDI\X
+FD3C:\JALEF\HFATHATAN\6
+FD3D:\JALEF\HFATHATAN\Q
+FD3E:ORNATE \‰ \ÑS
+FD3F:ORNATE \ù\ÑS
+FD50:\JTEH\Ô\\2
+FD51:\JTEH\HHAH\Ô\6
+FD52:\JTEH\HHAH\Ô\2
+FD53:\JTEH\HHAH\\2
+FD54:\JTEH\HKHAH\\2
+FD55:\JTEH\\Ô\2
+FD56:\JTEH\\HHAH\2
+FD57:\JTEH\\HKHAH\2
+FD58:\JJEEM\\HHAH\6
+FD59:\JJEEM\\HHAH\2
+FD5A:\JHAH\\Û
+FD5B:\JHAH\\‡\6
+FD5C:\JSEEN\HHAH\Ô\2
+FD5D:\JSEEN\Ô\HHAH\2
+FD5E:\JSEEN\Ô\‡\6
+FD5F:\JSEEN\\HHAH\6
+FD60:\JSEEN\\HHAH\2
+FD61:\JSEEN\\Ô\2
+FD62:\JSEEN\\\6
+FD63:\JSEEN\\\2
+FD64:\JSAD\HHAH\HHAH\6
+FD65:\JSAD\HHAH\HHAH\2
+FD66:\JSAD\\\6
+FD67:\JSHEEN\HHAH\\6
+FD68:\JSHEEN\HHAH\\2
+FD69:\JSHEEN\Ô\Û
+FD6A:\JSHEEN\\HKHAH\6
+FD6B:\JSHEEN\\HKHAH\2
+FD6C:\JSHEEN\\\6
+FD6D:\JSHEEN\\\2
+FD6E:\JDAD\HHAH\‡\6
+FD6F:\JDAD\HKHAH\\6
+FD70:\JDAD\HKHAH\\2
+FD71:\JTAH\\HHAH\6
+FD72:\JTAH\\HHAH\2
+FD73:\JTAH\\\2
+FD74:\JTAH\\Û
+FD75:\JAIN\Ô\\6
+FD76:\JAIN\\\6
+FD77:\JAIN\\\2
+FD78:\JAIN\\‡\6
+FD79:\JGHAIN\\\6
+FD7A:\JGHAIN\\Û
+FD7B:\JGHAIN\\‡\6
+FD7C:\JFEH\HKHAH\\6
+FD7D:\JFEH\HKHAH\\2
+FD7E:\JQAF\\HHAH\6
+FD7F:\JQAF\\\6
+FD80:\JLAM\HHAH\\6
+FD81:\JLAM\HHAH\Û
+FD82:\JLAM\HHAH\‡\6
+FD83:\JLAM\Ô\Ô\2
+FD84:\JLAM\Ô\Ô\6
+FD85:\JLAM\HKHAH\\6
+FD86:\JLAM\HKHAH\\2
+FD87:\JLAM\\HHAH\6
+FD88:\JLAM\\HHAH\2
+FD89:\JMEEM\HHAH\Ô\2
+FD8A:\JMEEM\HHAH\\2
+FD8B:\JMEEM\HHAH\Û
+FD8C:\JMEEM\Ô\HHAH\2
+FD8D:\JMEEM\Ô\\2
+FD8E:\JMEEM\HKHAH\Ô\2
+FD8F:\JMEEM\HKHAH\\2
+FD92:\JMEEM\Ô\HKHAH\2
+FD93:\JHEH\\Ô\2
+FD94:\JHEH\\\2
+FD95:\JNOON\HHAH\\2
+FD96:\JNOON\HHAH\‡\6
+FD97:\JNOON\Ô\\6
+FD98:\JNOON\Ô\\2
+FD99:\JNOON\Ô\‡\6
+FD9A:\JNOON\\Û
+FD9B:\JNOON\\‡\6
+FD9C:\JYEH\\\6
+FD9D:\JYEH\\\2
+FD9E:\JBEH\HKHAH\Û
+FD9F:\JTEH\Ô\Û
+FDA0:\JTEH\Ô\‡\6
+FDA1:\JTEH\HKHAH\Û
+FDA2:\JTEH\HKHAH\‡\6
+FDA3:\JTEH\\Û
+FDA4:\JTEH\\‡\6
+FDA5:\JJEEM\\Û
+FDA6:\JJEEM\HHAH\‡\6
+FDA7:\JJEEM\\‡\6
+FDA8:\JSEEN\HKHAH\‡\6
+FDA9:\JSAD\HHAH\Û
+FDAA:\JSHEEN\HHAH\Û
+FDAB:\JDAD\HHAH\Û
+FDAC:\JLAM\Ô\Û
+FDAD:\JLAM\\Û
+FDAE:\JYEH\HHAH\Û
+FDAF:\JYEH\Ô\Û
+FDB0:\JYEH\\Û
+FDB1:\JMEEM\\Û
+FDB2:\JQAF\\Û
+FDB3:\JNOON\HHAH\Û
+FDB4:\JQAF\\HHAH\2
+FDB5:\JLAM\HHAH\\2
+FDB6:\JAIN\\Û
+FDB7:\JKAF\\Û
+FDB8:\JNOON\Ô\HHAH\2
+FDB9:\JMEEM\HKHAH\Û
+FDBA:\JLAM\Ô\\2
+FDBB:\JKAF\\\6
+FDBC:\JLAM\Ô\\6
+FDBD:\JNOON\Ô\HHAH\6
+FDBE:\JJEEM\HHAH\Û
+FDBF:\JHAH\Ô\Û
+FDC0:\JMEEM\Ô\Û
+FDC1:\JFEH\\Û
+FDC2:\JBEH\HHAH\Û
+FDC3:\JKAF\\\2
+FDC4:\JAIN\Ô\\2
+FDC5:\JSAD\\\2
+FDC6:\JSEEN\HKHAH\Û
+FDC7:\JNOON\Ô\Û
+FDF0:\JSALLA US\ÂAS KORANIC STOP\‚\Q
+FDF1:\JQALA US\ÂAS KORANIC STOP\‚\Q
+FDF2:\JALLAH\Q
+FDF3:\JAKBAR\Q
+FDF4:\JMOHAMMAD\Q
+FDF5:\JSALAM\Q
+FDF6:\JRASOUL\Q
+FDF7:\JALAYHE\Q
+FDF8:\JWASALLAM\Q
+FDF9:\JSALLA\Q
+FDFA:\JSALLALLAHOU ALAYHE WASALLAM
+FDFB:\JJALLAJALALOUHOU
+FDFC:RIAL\‚
+FE00:\ç-1
+FE01:\ç-2
+FE02:\ç-3
+FE03:\ç-4
+FE04:\ç-5
+FE05:\ç-6
+FE06:\ç-7
+FE07:\ç-8
+FE08:\ç-9
+FE09:\ç-10
+FE0A:\ç-11
+FE0B:\ç-12
+FE0C:\ç-13
+FE0D:\ç-14
+FE0E:\ç-15
+FE0F:\ç-16
+FE20:\o\ò\‰ HALF
+FE21:\o\ò\ùHALF
+FE22:\o\0 \æ \‰ HALF
+FE23:\o\0 \æ \ùHALF
+FE30:\¹TWO DOT LEADER
+FE31:\¹EM DASH
+FE32:\¹EN DASH
+FE33:\¹LOW \ä
+FE34:\¹WAVY LOW \ä
+FE35:\¹\‰ \ÑS
+FE36:\¹\ù\ÑS
+FE37:\¹\‰ CURLY \–
+FE38:\¹\ùCURLY \–
+FE39:\¹\‰ TORTOISE SHELL \–
+FE3A:\¹\ùTORTOISE SHELL \–
+FE3B:\¹\‰ \¬ LENTICULAR \–
+FE3C:\¹\ù\¬ LENTICULAR \–
+FE3D:\¹\‰ \0 ANGLE \–
+FE3E:\¹\ù\0 ANGLE \–
+FE3F:\¹\‰ ANGLE \–
+FE40:\¹\ùANGLE \–
+FE41:\¹\‰ CORNER \–
+FE42:\¹\ùCORNER \–
+FE43:\¹\‰ \¦CORNER \–
+FE44:\¹\ù\¦CORNER \–
+FE45:SESAME DOT
+FE46:\¦SESAME DOT
+FE49:DASH\ÂOVER\ä
+FE4A:CENTRE\ä OVER\ä
+FE4B:WAVY OVER\ä
+FE4C:\0 WAVY OVER\ä
+FE4D:DASH\ÂLOW \ä
+FE4E:CENTRE\ä LOW \ä
+FE4F:WAVY LOW \ä
+FE50:\§COMMA
+FE51:\§\8IC COMMA
+FE52:SMALL\é
+FE54:\§SEMICOLON
+FE55:\§COLON
+FE56:\§QUESTION\¥
+FE57:\§EXCLAM\”\¥
+FE58:\§EM DASH
+FE59:\§\‰ \ÑS
+FE5A:\§\ù\ÑS
+FE5B:\§\‰ CURLY \–
+FE5C:\§\ùCURLY \–
+FE5D:\§\‰ TORTOISE SHELL \–
+FE5E:\§\ùTORTOISE SHELL \–
+FE5F:\§\­SIGN
+FE60:\§AMPERSAND
+FE61:\§ASTERISK
+FE62:\§PLUS\‚
+FE63:\§HYPHEN-MINUS
+FE64:\§\µ\‚
+FE65:\§\’\‚
+FE66:\§EQUALS\‚
+FE68:\§REVERSE SOLIDUS
+FE69:\§DOLLAR\‚
+FE6A:\§PERCENT\‚
+FE6B:\§COMMERCIAL AT
+FE70:\Ê FATHATAN\Q
+FE71:\Ê TATWEEL\HFATHATAN\p
+FE72:\Ê DAMMATAN\Q
+FE73:\Ê TAIL FRAGMENT
+FE74:\Ê KASRATAN\Q
+FE76:\Ê FATHA\Q
+FE77:\Ê FATHA MEDI\X
+FE78:\Ê DAMMA\Q
+FE79:\Ê DAMMA MEDI\X
+FE7A:\Ê KASRA\Q
+FE7B:\Ê KASRA MEDI\X
+FE7C:\Ê SHADDA\Q
+FE7D:\Ê SHADDA MEDI\X
+FE7E:\Ê SUKUN\Q
+FE7F:\Ê SUKUN MEDI\X
+FE80:\^HAMZA\Q
+FE81:\^ALEF\HMADDA\p\Q
+FE82:\^ALEF\HMADDA\p\6
+FE83:\^ALEF\HHAMZA\p\Q
+FE84:\^ALEF\HHAMZA\p\6
+FE85:\^WAW\HHAMZA\p\Q
+FE86:\^WAW\HHAMZA\p\6
+FE87:\^ALEF\HHAMZA\…\Q
+FE88:\^ALEF\HHAMZA\…\6
+FE89:\^\º\Q
+FE8A:\^\º\6
+FE8B:\^\º\2
+FE8C:\^\º MEDI\X
+FE8D:\^ALEF\Q
+FE8E:\^ALEF\6
+FE8F:\^BEH\Q
+FE90:\^BEH\6
+FE91:\^BEH\2
+FE92:\^BEH MEDI\X
+FE93:\^TEH MARBUTA\Q
+FE94:\^TEH MARBUTA\6
+FE95:\^TEH\Q
+FE96:\^TEH\6
+FE97:\^TEH\2
+FE98:\^TEH MEDI\X
+FE99:\^THEH\Q
+FE9A:\^THEH\6
+FE9B:\^THEH\2
+FE9C:\^THEH MEDI\X
+FE9D:\^JEEM\Q
+FE9E:\^JEEM\6
+FE9F:\^JEEM\2
+FEA0:\^JEEM MEDI\X
+FEA1:\^HAH\Q
+FEA2:\^HAH\6
+FEA3:\^HAH\2
+FEA4:\^HAH MEDI\X
+FEA5:\^KHAH\Q
+FEA6:\^KHAH\6
+FEA7:\^KHAH\2
+FEA8:\^KHAH MEDI\X
+FEA9:\^DAL\Q
+FEAA:\^DAL\6
+FEAB:\^THAL\Q
+FEAC:\^THAL\6
+FEAD:\^REH\Q
+FEAE:\^REH\6
+FEAF:\^ZAIN\Q
+FEB0:\^ZAIN\6
+FEB1:\^SEEN\Q
+FEB2:\^SEEN\6
+FEB3:\^SEEN\2
+FEB4:\^SEEN MEDI\X
+FEB5:\^SHEEN\Q
+FEB6:\^SHEEN\6
+FEB7:\^SHEEN\2
+FEB8:\^SHEEN MEDI\X
+FEB9:\^SAD\Q
+FEBA:\^SAD\6
+FEBB:\^SAD\2
+FEBC:\^SAD MEDI\X
+FEBD:\^DAD\Q
+FEBE:\^DAD\6
+FEBF:\^DAD\2
+FEC0:\^DAD MEDI\X
+FEC1:\^TAH\Q
+FEC2:\^TAH\6
+FEC3:\^TAH\2
+FEC4:\^TAH MEDI\X
+FEC5:\^ZAH\Q
+FEC6:\^ZAH\6
+FEC7:\^ZAH\2
+FEC8:\^ZAH MEDI\X
+FEC9:\^AIN\Q
+FECA:\^AIN\6
+FECB:\^AIN\2
+FECC:\^AIN MEDI\X
+FECD:\^GHAIN\Q
+FECE:\^GHAIN\6
+FECF:\^GHAIN\2
+FED0:\^GHAIN MEDI\X
+FED1:\^FEH\Q
+FED2:\^FEH\6
+FED3:\^FEH\2
+FED4:\^FEH MEDI\X
+FED5:\^QAF\Q
+FED6:\^QAF\6
+FED7:\^QAF\2
+FED8:\^QAF MEDI\X
+FED9:\^KAF\Q
+FEDA:\^KAF\6
+FEDB:\^KAF\2
+FEDC:\^KAF MEDI\X
+FEDD:\^LAM\Q
+FEDE:\^LAM\6
+FEDF:\^LAM\2
+FEE0:\^LAM MEDI\X
+FEE1:\^MEEM\Q
+FEE2:\^MEEM\6
+FEE3:\^MEEM\2
+FEE4:\^MEEM MEDI\X
+FEE5:\^NOON\Q
+FEE6:\^NOON\6
+FEE7:\^NOON\2
+FEE8:\^NOON MEDI\X
+FEE9:\^HEH\Q
+FEEA:\^HEH\6
+FEEB:\^HEH\2
+FEEC:\^HEH MEDI\X
+FEED:\^WAW\Q
+FEEE:\^WAW\6
+FEEF:\^ALEF MAKSURA\Q
+FEF0:\^ALEF MAKSURA\6
+FEF1:\^YEH\Q
+FEF2:\^YEH\6
+FEF3:\^YEH\2
+FEF4:\^YEH MEDI\X
+FEF5:\JLAM\HALEF\HMADDA\p\Q
+FEF6:\JLAM\HALEF\HMADDA\p\6
+FEF7:\JLAM\HALEF\HHAMZA\p\Q
+FEF8:\JLAM\HALEF\HHAMZA\p\6
+FEF9:\JLAM\HALEF\HHAMZA\…\Q
+FEFA:\JLAM\HALEF\HHAMZA\…\6
+FEFB:\JLAM\HALEF\Q
+FEFC:\JLAM\HALEF\6
+FEFF:ZERO WIDTH NO-BREAK SPACE
+FF01:\†EXCLAM\”\¥
+FF02:\†QUOT\”\¥
+FF03:\†\­SIGN
+FF04:\†DOLLAR\‚
+FF05:\†PERCENT\‚
+FF06:\†AMPERSAND
+FF07:\†APOSTROPHE
+FF08:\†\‰ \ÑS
+FF09:\†\ù\ÑS
+FF0A:\†ASTERISK
+FF0B:\†PLUS\‚
+FF0C:\†COMMA
+FF0D:\†HYPHEN-MINUS
+FF0E:\†FULL STOP
+FF0F:\†SOLIDUS
+FF10:\†DIGIT ZERO
+FF11:\†DIGIT ONE
+FF12:\†DIGIT TWO
+FF13:\†DIGIT THREE
+FF14:\†DIGIT FOUR
+FF15:\†DIGIT FIVE
+FF16:\†DIGIT SIX
+FF17:\†DIGIT SEVEN
+FF18:\†DIGIT E\¼
+FF19:\†DIGIT NINE
+FF1A:\†COLON
+FF1B:\†SEMICOLON
+FF1C:\†\µ\‚
+FF1D:\†EQUALS\‚
+FF1E:\†\’\‚
+FF1F:\†QUESTION\¥
+FF20:\†COMMERCIAL AT
+FF21:\†\PA
+FF22:\†\PB
+FF23:\†\PC
+FF24:\†\PD
+FF25:\†\PE
+FF26:\†\PF
+FF27:\†\PG
+FF28:\†\PH
+FF29:\†\PI
+FF2A:\†\PJ
+FF2B:\†\PK
+FF2C:\†\PL
+FF2D:\†\PM
+FF2E:\†\PN
+FF2F:\†\PO
+FF30:\†\PP
+FF31:\†\PQ
+FF32:\†\PR
+FF33:\†\PS
+FF34:\†\PT
+FF35:\†\PU
+FF36:\†\PV
+FF37:\†\PW
+FF38:\†\PX
+FF39:\†\PY
+FF3A:\†\PZ
+FF3B:\†\‰ \r\–
+FF3C:\†REVERSE SOLIDUS
+FF3D:\†\ù\r\–
+FF3E:\†CIRCUMFLEX\×
+FF3F:\†LOW \ä
+FF40:\†GRAVE\×
+FF41:\†\LA
+FF42:\†\LB
+FF43:\†\LC
+FF44:\†\LD
+FF45:\†\LE
+FF46:\†\LF
+FF47:\†\LG
+FF48:\†\LH
+FF49:\†\LI
+FF4A:\†\LJ
+FF4B:\†\LK
+FF4C:\†\LL
+FF4D:\†\LM
+FF4E:\†\LN
+FF4F:\†\LO
+FF50:\†\LP
+FF51:\†\LQ
+FF52:\†\LR
+FF53:\†\LS
+FF54:\†\LT
+FF55:\†\LU
+FF56:\†\LV
+FF57:\†\LW
+FF58:\†\LX
+FF59:\†\LY
+FF5A:\†\LZ
+FF5B:\†\‰ CURLY \–
+FF5C:\†\€ \ä
+FF5D:\†\ùCURLY \–
+FF5E:\†\æ
+FF5F:\†\‰ \¦\ÑS
+FF60:\†\ù\¦\ÑS
+FF61:\4\8IC\é
+FF62:\4\‰ CORNER \–
+FF63:\4\ùCORNER \–
+FF64:\4\8IC COMMA
+FF65:\4\n MIDDLE DOT
+FF66:\4\ÍWO
+FF67:\4\Í\§A
+FF68:\4\Í\§I
+FF69:\4\Í\§U
+FF6A:\4\Í\§E
+FF6B:\4\Í\§O
+FF6C:\4\Í\§YA
+FF6D:\4\Í\§YU
+FF6E:\4\Í\§YO
+FF6F:\4\Í\§TU
+FF70:\4\n-HIRAGANA PROLONG\ÂSOUND\¥
+FF71:\4\ÍA
+FF72:\4\ÍI
+FF73:\4\ÍU
+FF74:\4\ÍE
+FF75:\4\ÍO
+FF76:\4\ÍKA
+FF77:\4\ÍKI
+FF78:\4\ÍKU
+FF79:\4\ÍKE
+FF7A:\4\ÍKO
+FF7B:\4\ÍSA
+FF7C:\4\ÍSI
+FF7D:\4\ÍSU
+FF7E:\4\ÍSE
+FF7F:\4\ÍSO
+FF80:\4\ÍTA
+FF81:\4\ÍTI
+FF82:\4\ÍTU
+FF83:\4\ÍTE
+FF84:\4\ÍTO
+FF85:\4\ÍNA
+FF86:\4\ÍNI
+FF87:\4\ÍNU
+FF88:\4\ÍNE
+FF89:\4\ÍNO
+FF8A:\4\ÍHA
+FF8B:\4\ÍHI
+FF8C:\4\ÍHU
+FF8D:\4\ÍHE
+FF8E:\4\ÍHO
+FF8F:\4\ÍMA
+FF90:\4\ÍMI
+FF91:\4\ÍMU
+FF92:\4\ÍME
+FF93:\4\ÍMO
+FF94:\4\ÍYA
+FF95:\4\ÍYU
+FF96:\4\ÍYO
+FF97:\4\ÍRA
+FF98:\4\ÍRI
+FF99:\4\ÍRU
+FF9A:\4\ÍRE
+FF9B:\4\ÍRO
+FF9C:\4\ÍWA
+FF9D:\4\ÍN
+FF9E:\4\n VOIC\ÂSOUND\¥
+FF9F:\4\n SEMI-VOIC\ÂSOUND\¥
+FFA0:\4\e FILLER
+FFA1:\4\ÖKIYEOK
+FFA2:\4\ÖSSANGKIYEOK
+FFA3:\4\ÖKIYEOK-SIOS
+FFA4:\4\ÖN\ÆN
+FFA5:\4\ÖN\ÆN-C\ÆC
+FFA6:\4\ÖN\ÆN-H\ÆH
+FFA7:\4\ÖTIKEUT
+FFA8:\4\ÖSSANGTIKEUT
+FFA9:\4\ÖR\ÆL
+FFAA:\4\ÖR\ÆL-KIYEOK
+FFAB:\4\ÖR\ÆL-M\ÆM
+FFAC:\4\ÖR\ÆL-P\ÆP
+FFAD:\4\ÖR\ÆL-SIOS
+FFAE:\4\ÖR\ÆL-TH\ÆTH
+FFAF:\4\ÖR\ÆL-PH\ÆPH
+FFB0:\4\ÖR\ÆL-H\ÆH
+FFB1:\4\ÖM\ÆM
+FFB2:\4\ÖP\ÆP
+FFB3:\4\ÖSSANGP\ÆP
+FFB4:\4\ÖP\ÆP-SIOS
+FFB5:\4\ÖSIOS
+FFB6:\4\ÖSSANGSIOS
+FFB7:\4\Ö\ÆNG
+FFB8:\4\ÖC\ÆC
+FFB9:\4\ÖSSANGC\ÆC
+FFBA:\4\ÖCH\ÆCH
+FFBB:\4\ÖKH\ÆKH
+FFBC:\4\ÖTH\ÆTH
+FFBD:\4\ÖPH\ÆPH
+FFBE:\4\ÖH\ÆH
+FFC2:\4\ÖA
+FFC3:\4\ÖAE
+FFC4:\4\ÖYA
+FFC5:\4\ÖYAE
+FFC6:\4\ÖEO
+FFC7:\4\ÖE
+FFCA:\4\ÖYEO
+FFCB:\4\ÖYE
+FFCC:\4\ÖO
+FFCD:\4\ÖWA
+FFCE:\4\ÖWAE
+FFCF:\4\ÖOE
+FFD2:\4\ÖYO
+FFD3:\4\ÖU
+FFD4:\4\ÖWEO
+FFD5:\4\ÖWE
+FFD6:\4\ÖWI
+FFD7:\4\ÖYU
+FFDA:\4\ÖEU
+FFDB:\4\ÖYI
+FFDC:\4\ÖI
+FFE0:\†CENT\‚
+FFE1:\†POUND\‚
+FFE2:\†NOT\‚
+FFE3:\†\å
+FFE4:\†BROKEN\ì
+FFE5:\†YEN\‚
+FFE6:\†WON\‚
+FFE8:\4FORMS L\¼ \€
+FFE9:\4\‰\Š\u
+FFEA:\4UP\Š\u
+FFEB:\4\Ù
+FFEC:\4\Ë\Š\u
+FFED:\4\¬ \ý
+FFEE:\4\¦\Ð
+FFF9:INTER\äAR ANNOT\” ANCHOR
+FFFA:INTER\äAR ANNOT\” SEPARATOR
+FFFB:INTER\äAR ANNOT\” TERMINATOR
+FFFC:OBJECT REPLACEMENT CHARACTER
+FFFD:REPLACEMENT CHARACTER
+10300:OLD \f\@A
+10301:OLD \f\@BE
+10302:OLD \f\@KE
+10303:OLD \f\@DE
+10304:OLD \f\@E
+10305:OLD \f\@VE
+10306:OLD \f\@ZE
+10307:OLD \f\@HE
+10308:OLD \f\@THE
+10309:OLD \f\@I
+1030A:OLD \f\@KA
+1030B:OLD \f\@EL
+1030C:OLD \f\@EM
+1030D:OLD \f\@EN
+1030E:OLD \f\@ESH
+1030F:OLD \f\@O
+10310:OLD \f\@PE
+10311:OLD \f\@SHE
+10312:OLD \f\@KU
+10313:OLD \f\@ER
+10314:OLD \f\@ES
+10315:OLD \f\@TE
+10316:OLD \f\@U
+10317:OLD \f\@EKS
+10318:OLD \f\@PHE
+10319:OLD \f\@KHE
+1031A:OLD \f\@EF
+1031B:OLD \f\@ERS
+1031C:OLD \f\@CHE
+1031D:OLD \f\@II
+1031E:OLD \f\@UU
+10320:OLD \f NUMERAL ONE
+10321:OLD \f NUMERAL FIVE
+10322:OLD \f NUMERAL TEN
+10323:OLD \f NUMERAL FIFTY
+10330:GOTHIC\@AHSA
+10331:GOTHIC\@BAIRKAN
+10332:GOTHIC\@GIBA
+10333:GOTHIC\@DAGS
+10334:GOTHIC\@AIHVUS
+10335:GOTHIC\@QAIRTHRA
+10336:GOTHIC\@IUJA
+10337:GOTHIC\@HAGL
+10338:GOTHIC\@THIUTH
+10339:GOTHIC\@EIS
+1033A:GOTHIC\@KUSMA
+1033B:GOTHIC\@LAGUS
+1033C:GOTHIC\@MANNA
+1033D:GOTHIC\@NAUTHS
+1033E:GOTHIC\@JER
+1033F:GOTHIC\@URUS
+10340:GOTHIC\@PAIRTHRA
+10341:GOTHIC\@NINETY
+10342:GOTHIC\@RAIDA
+10343:GOTHIC\@SAUIL
+10344:GOTHIC\@TEIWS
+10345:GOTHIC\@WINJA
+10346:GOTHIC\@FAIHU
+10347:GOTHIC\@IGGWS
+10348:GOTHIC\@HWAIR
+10349:GOTHIC\@OTHAL
+1034A:GOTHIC\@NINE HUNDRED
+10400:\¿\ãLONG I
+10401:\¿\ãLONG E
+10402:\¿\ãLONG A
+10403:\¿\ãLONG AH
+10404:\¿\ãLONG O
+10405:\¿\ãLONG OO
+10406:\¿\ãSHORT I
+10407:\¿\ãSHORT E
+10408:\¿\ãSHORT A
+10409:\¿\ãSHORT AH
+1040A:\¿\ãSHORT O
+1040B:\¿\ãSHORT OO
+1040C:\¿\ãAY
+1040D:\¿\ãOW
+1040E:\¿\ãWU
+1040F:\¿\ãYEE
+10410:\¿\ãH
+10411:\¿\ãPEE
+10412:\¿\ãBEE
+10413:\¿\ãTEE
+10414:\¿\ãDEE
+10415:\¿\ãCHEE
+10416:\¿\ãJEE
+10417:\¿\ãKAY
+10418:\¿\ãGAY
+10419:\¿\ãEF
+1041A:\¿\ãVEE
+1041B:\¿\ãETH
+1041C:\¿\ãTHEE
+1041D:\¿\ãES
+1041E:\¿\ãZEE
+1041F:\¿\ãESH
+10420:\¿\ãZHEE
+10421:\¿\ãER
+10422:\¿\ãEL
+10423:\¿\ãEM
+10424:\¿\ãEN
+10425:\¿\ãENG
+10428:\¿\N\@LONG I
+10429:\¿\N\@LONG E
+1042A:\¿\N\@LONG A
+1042B:\¿\N\@LONG AH
+1042C:\¿\N\@LONG O
+1042D:\¿\N\@LONG OO
+1042E:\¿\N\@SHORT I
+1042F:\¿\N\@SHORT E
+10430:\¿\N\@SHORT A
+10431:\¿\N\@SHORT AH
+10432:\¿\N\@SHORT O
+10433:\¿\N\@SHORT OO
+10434:\¿\N\@AY
+10435:\¿\N\@OW
+10436:\¿\N\@WU
+10437:\¿\N\@YEE
+10438:\¿\N\@H
+10439:\¿\N\@PEE
+1043A:\¿\N\@BEE
+1043B:\¿\N\@TEE
+1043C:\¿\N\@DEE
+1043D:\¿\N\@CHEE
+1043E:\¿\N\@JEE
+1043F:\¿\N\@KAY
+10440:\¿\N\@GAY
+10441:\¿\N\@EF
+10442:\¿\N\@VEE
+10443:\¿\N\@ETH
+10444:\¿\N\@THEE
+10445:\¿\N\@ES
+10446:\¿\N\@ZEE
+10447:\¿\N\@ESH
+10448:\¿\N\@ZHEE
+10449:\¿\N\@ER
+1044A:\¿\N\@EL
+1044B:\¿\N\@EM
+1044C:\¿\N\@EN
+1044D:\¿\N\@ENG
+1D000:\YPSILI
+1D001:\YDASEIA
+1D002:\Y\´
+1D003:\YOXEIA EKFONITIKON
+1D004:\YOXEIA DIPLI
+1D005:\YVAREIA EKFONITIKON
+1D006:\YVAREIA DIPLI
+1D007:\YKATHISTI
+1D008:\YSYRMATIKI
+1D009:\YPARAKLITIKI
+1D00A:\YYPOKRISIS
+1D00B:\YYPOKRISIS DIPLI
+1D00C:\YKREMASTI
+1D00D:\YAPESO EKFONITIKON
+1D00E:\YEXO EKFONITIKON
+1D00F:\YTELEIA
+1D010:\YKENTIMATA
+1D011:\YAPOSTROFOS
+1D012:\YAPOSTROFOS DIPLI
+1D013:\YSYNEVMA
+1D014:\YTHITA
+1D015:\YOLIGON ARCHAION
+1D016:\YGORGON ARCHAION
+1D017:\Y\É
+1D018:\YCHAMILON
+1D019:\YVATHY
+1D01A:\YISON ARCHAION
+1D01B:\YKENTIMA ARCHAION
+1D01C:\YKENTIMATA ARCHAION
+1D01D:\YSAXIMATA
+1D01E:\YPARICHON
+1D01F:\YSTAVROS APODEXIA
+1D020:\YOXEIAI ARCHAION
+1D021:\YVAREIAI ARCHAION
+1D022:\YAPODERMA ARCHAION
+1D023:\YAPOTHEMA
+1D024:\YKLASMA
+1D025:\YREVMA
+1D026:\YPIASMA ARCHAION
+1D027:\YTINAGMA
+1D028:\YANATRICHISMA
+1D029:\YSEISMA
+1D02A:\YSYNAGMA ARCHAION
+1D02B:\YSYNAGMA META STAVROU
+1D02C:\YOYRANISMA ARCHAION
+1D02D:\YTHEMA
+1D02E:\YLEMOI
+1D02F:\YDYO
+1D030:\YTRIA
+1D031:\YTESSERA
+1D032:\YKRATIMATA
+1D033:\YAPESO EXO NEO
+1D034:\YFTHORA ARCHAION
+1D035:\YIMIFTHORA
+1D036:\YTROMIKON ARCHAION
+1D037:\YKATAVA TROMIKON
+1D038:\YPELASTON
+1D039:\YPSIFISTON
+1D03A:\YKONTEVMA
+1D03B:\YCHOREVMA ARCHAION
+1D03C:\YRAPISMA
+1D03D:\YPARAKALESMA ARCHAION
+1D03E:\YPARAKLITIKI ARCHAION
+1D03F:\YICHADIN
+1D040:\YNANA
+1D041:\YPETASMA
+1D042:\YKONTEVMA ALLO
+1D043:\YTROMIKON ALLO
+1D044:\YSTRAGGISMATA
+1D045:\YGRONTHISMATA
+1D046:\YISON NEO
+1D047:\YOLIGON NEO
+1D048:\YOXEIA NEO
+1D049:\YPETASTI
+1D04A:\YKOUFISMA
+1D04B:\YPETASTOKOUFISMA
+1D04C:\YKRATIMOKOUFISMA
+1D04D:\YPELASTON NEO
+1D04E:\YKENTIMATA NEO ANO
+1D04F:\YKENTIMA NEO ANO
+1D050:\YYPSILI
+1D051:\YAPOSTROFOS NEO
+1D052:\YAPOSTROFOI SYNDESMOS NEO
+1D053:\YYPORROI
+1D054:\YKRATIMOYPORROON
+1D055:\YELAFRON
+1D056:\YCHAMILI
+1D057:\YMIKRON ISON
+1D058:\YVAREIA NEO
+1D059:\YPIASMA NEO
+1D05A:\YPSIFISTON NEO
+1D05B:\YOMALON
+1D05C:\YANTIKENOMA
+1D05D:\YLYGISMA
+1D05E:\YPARAKLITIKI NEO
+1D05F:\YPARAKALESMA NEO
+1D060:\YETERON PARAKALESMA
+1D061:\YKYLISMA
+1D062:\YANTIKENOKYLISMA
+1D063:\YTROMIKON NEO
+1D064:\YEKSTREPTON
+1D065:\YSYNAGMA NEO
+1D066:\YSYRMA
+1D067:\YCHOREVMA NEO
+1D068:\YEPEGERMA
+1D069:\YSEISMA NEO
+1D06A:\YXIRON KLASMA
+1D06B:\YTROMIKOPSIFISTON
+1D06C:\YPSIFISTOLYGISMA
+1D06D:\YTROMIKOLYGISMA
+1D06E:\YTROMIKOPARAKALESMA
+1D06F:\YPSIFISTOPARAKALESMA
+1D070:\YTROMIKOSYNAGMA
+1D071:\YPSIFISTOSYNAGMA
+1D072:\YGORGOSYNTHETON
+1D073:\YARGOSYNTHETON
+1D074:\YETERON ARGOSYNTHETON
+1D075:\YOYRANISMA NEO
+1D076:\YTHEMATISMOS ESO
+1D077:\YTHEMATISMOS EXO
+1D078:\YTHEMA APLOUN
+1D079:\YTHES KAI APOTHES
+1D07A:\YKATAVASMA
+1D07B:\YENDOFONON
+1D07C:\YYFEN KATO
+1D07D:\YYFEN ANO
+1D07E:\YSTAVROS
+1D07F:\YKLASMA ANO
+1D080:\YDIPLI ARCHAION
+1D081:\YKRATIMA ARCHAION
+1D082:\YKRATIMA ALLO
+1D083:\YKRATIMA NEO
+1D084:\YAPODERMA NEO
+1D085:\YAPLI
+1D086:\YDIPLI
+1D087:\YTRIPLI
+1D088:\YTETRAPLI
+1D089:\YKORONIS
+1D08A:\YLEIMMA ENOS CHRONOU
+1D08B:\YLEIMMA DYO CHRONON
+1D08C:\YLEIMMA TRION CHRONON
+1D08D:\YLEIMMA TESSARON CHRONON
+1D08E:\YLEIMMA IMISEOS CHRONOU
+1D08F:\YGORGON NEO ANO
+1D090:\YGORGON PARESTIGMENON ARISTERA
+1D091:\YGORGON PARESTIGMENON DEXIA
+1D092:\YDIGORGON
+1D093:\YDIGORGON PARESTIGMENON ARISTERA KATO
+1D094:\YDIGORGON PARESTIGMENON ARISTERA ANO
+1D095:\YDIGORGON PARESTIGMENON DEXIA
+1D096:\YTRIGORGON
+1D097:\YARGON
+1D098:\YIMIDIARGON
+1D099:\YDIARGON
+1D09A:\YAGOGI POLI ARGI
+1D09B:\YAGOGI ARGOTERI
+1D09C:\YAGOGI ARGI
+1D09D:\YAGOGI METRIA
+1D09E:\YAGOGI MESI
+1D09F:\YAGOGI GORGI
+1D0A0:\YAGOGI GORGOTERI
+1D0A1:\YAGOGI POLI GORGI
+1D0A2:\YMARTYRIA PROTOS ICHOS
+1D0A3:\YMARTYRIA ALLI PROTOS ICHOS
+1D0A4:\YMARTYRIA DEYTEROS ICHOS
+1D0A5:\YMARTYRIA ALLI DEYTEROS ICHOS
+1D0A6:\YMARTYRIA TRITOS ICHOS
+1D0A7:\YMARTYRIA TRIFONIAS
+1D0A8:\YMARTYRIA TETARTOS ICHOS
+1D0A9:\YMARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA:\YMARTYRIA LEGETOS ICHOS
+1D0AB:\YMARTYRIA PLAGIOS ICHOS
+1D0AC:\YISAKIA TELOUS ICHIMATOS
+1D0AD:\YAPOSTROFOI TELOUS ICHIMATOS
+1D0AE:\YFANEROSIS TETRAFONIAS
+1D0AF:\YFANEROSIS MONOFONIAS
+1D0B0:\YFANEROSIS DIFONIAS
+1D0B1:\YMARTYRIA VARYS ICHOS
+1D0B2:\YMARTYRIA PROTOVARYS ICHOS
+1D0B3:\YMARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4:\YGORTHMIKON N APLOUN
+1D0B5:\YGORTHMIKON N DIPLOUN
+1D0B6:\YENARXIS KAI FTHORA VOU
+1D0B7:\YIMIFONON
+1D0B8:\YIMIFTHORON
+1D0B9:\YFTHORA ARCHAION DEYTEROU ICHOU
+1D0BA:\YFTHORA DIATONIKI PA
+1D0BB:\YFTHORA DIATONIKI NANA
+1D0BC:\YFTHORA NAOS ICHOS
+1D0BD:\YFTHORA DIATONIKI DI
+1D0BE:\YFTHORA SKLIRON DIATONON DI
+1D0BF:\YFTHORA DIATONIKI KE
+1D0C0:\YFTHORA DIATONIKI ZO
+1D0C1:\YFTHORA DIATONIKI NI KATO
+1D0C2:\YFTHORA DIATONIKI NI ANO
+1D0C3:\YFTHORA MALAKON CHROMA DIFONIAS
+1D0C4:\YFTHORA MALAKON CHROMA MONOFONIAS
+1D0C5:\YFHTORA SKLIRON CHROMA VASIS
+1D0C6:\YFTHORA SKLIRON CHROMA SYNAFI
+1D0C7:\YFTHORA NENANO
+1D0C8:\YCHROA ZYGOS
+1D0C9:\YCHROA KLITON
+1D0CA:\YCHROA SPATHI
+1D0CB:\YFTHORA I YFESIS TETARTIMORION
+1D0CC:\YFTHORA ENARMONIOS ANTIFONIA
+1D0CD:\YYFESIS TRITIMORION
+1D0CE:\YDIESIS TRITIMORION
+1D0CF:\YDIESIS TETARTIMORION
+1D0D0:\YDIESIS APLI DYO DODEKATA
+1D0D1:\YDIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2:\YDIESIS DIGRAMMOS EX DODEKATA
+1D0D3:\YDIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4:\YYFESIS APLI DYO DODEKATA
+1D0D5:\YYFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6:\YYFESIS DIGRAMMOS EX DODEKATA
+1D0D7:\YYFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8:\YGENIKI DIESIS
+1D0D9:\YGENIKI YFESIS
+1D0DA:\YDIASTOLI APLI MIKRI
+1D0DB:\YDIASTOLI APLI MEGALI
+1D0DC:\YDIASTOLI DIPLI
+1D0DD:\YDIASTOLI THESEOS
+1D0DE:\YSIMANSIS THESEOS
+1D0DF:\YSIMANSIS THESEOS DISIMOU
+1D0E0:\YSIMANSIS THESEOS TRISIMOU
+1D0E1:\YSIMANSIS THESEOS TETRASIMOU
+1D0E2:\YSIMANSIS ARSEOS
+1D0E3:\YSIMANSIS ARSEOS DISIMOU
+1D0E4:\YSIMANSIS ARSEOS TRISIMOU
+1D0E5:\YSIMANSIS ARSEOS TETRASIMOU
+1D0E6:\YDIGRAMMA GG
+1D0E7:\YDIFTOGGOS OU
+1D0E8:\YSTIGMA
+1D0E9:\YARKTIKO PA
+1D0EA:\YARKTIKO VOU
+1D0EB:\YARKTIKO GA
+1D0EC:\YARKTIKO DI
+1D0ED:\YARKTIKO KE
+1D0EE:\YARKTIKO ZO
+1D0EF:\YARKTIKO NI
+1D0F0:\YKENTIMATA NEO MESO
+1D0F1:\YKENTIMA NEO MESO
+1D0F2:\YKENTIMATA NEO KATO
+1D0F3:\YKENTIMA NEO KATO
+1D0F4:\YKLASMA KATO
+1D0F5:\YGORGON NEO KATO
+1D100:\KS\ôLE\ì\ä
+1D101:\K\0\ì\ä
+1D102:\KFINAL\ì\ä
+1D103:\KREVERSE FINAL\ì\ä
+1D104:\KDASHED\ì\ä
+1D105:\KSHORT\ì\ä
+1D106:\K\‰ REPEAT\‚
+1D107:\K\ùREPEAT\‚
+1D108:\KREPEAT DOTS
+1D109:\KDAL SEGNO
+1D10A:\KDA CAPO
+1D10B:\KSEGNO
+1D10C:\KCODA
+1D10D:\KREPEAT\ÂFIGURE-1
+1D10E:\KREPEAT\ÂFIGURE-2
+1D10F:\KREPEAT\ÂFIGURE-3
+1D110:\KFERMATA
+1D111:\KFERMATA\…
+1D112:\KBREATH\¥
+1D113:\KCAESURA
+1D114:\KBRACE
+1D115:\K\–
+1D116:\KONE-\ä STAFF
+1D117:\KTWO-\ä STAFF
+1D118:\KTHREE-\ä STAFF
+1D119:\KFOUR-\ä STAFF
+1D11A:\KFIVE-\ä STAFF
+1D11B:\KSIX-\ä STAFF
+1D11C:\KSIX-STR\ô FRETBOARD
+1D11D:\KFOUR-STR\ô FRETBOARD
+1D11E:\KG CLEF
+1D11F:\KG CLEF OTTAVA ALTA
+1D120:\KG CLEF OTTAVA BASSA
+1D121:\KC CLEF
+1D122:\KF CLEF
+1D123:\KF CLEF OTTAVA ALTA
+1D124:\KF CLEF OTTAVA BASSA
+1D125:\KDRUM CLEF-1
+1D126:\KDRUM CLEF-2
+1D12A:\K\0 SHARP
+1D12B:\K\0 FLAT
+1D12C:\KFLAT UP
+1D12D:\KFLAT \Ë
+1D12E:\KNATURAL UP
+1D12F:\KNATURAL \Ë
+1D130:\KSHARP UP
+1D131:\KSHARP \Ë
+1D132:\KQUARTER TONE SHARP
+1D133:\KQUARTER TONE FLAT
+1D134:\KCOMMON TIME
+1D135:\KCUT TIME
+1D136:\KOTTAVA ALTA
+1D137:\KOTTAVA BASSA
+1D138:\KQUINDICESIMA ALTA
+1D139:\KQUINDICESIMA BASSA
+1D13A:\KMULTI REST
+1D13B:\KWHOLE REST
+1D13C:\KHALF REST
+1D13D:\KQUARTER REST
+1D13E:\KE\¼H REST
+1D13F:\KSIXTEENTH REST
+1D140:\KTHIRTY-SECOND REST
+1D141:\KSIXTY-FOURTH REST
+1D142:\KONE HUNDR\ÂTWENTY-E\¼H REST
+1D143:\KX NOTEHEAD
+1D144:\KPLUS NOTEHEAD
+1D145:\K\Ð X NOTEHEAD
+1D146:\K\rNOTEHEAD WHITE
+1D147:\K\rNOTEHEAD \¬
+1D148:\K\¾ NOTEHEAD UP WHITE
+1D149:\K\¾ NOTEHEAD UP \¬
+1D14A:\K\¾ NOTEHEAD \‰ WHITE
+1D14B:\K\¾ NOTEHEAD \‰ \¬
+1D14C:\K\¾ NOTEHEAD \ùWHITE
+1D14D:\K\¾ NOTEHEAD \ù\¬
+1D14E:\K\¾ NOTEHEAD \Ë WHITE
+1D14F:\K\¾ NOTEHEAD \Ë \¬
+1D150:\K\¾ NOTEHEAD UP \ùWHITE
+1D151:\K\¾ NOTEHEAD UP \ù\¬
+1D152:\KMOON NOTEHEAD WHITE
+1D153:\KMOON NOTEHEAD \¬
+1D154:\K\¾-ROUND NOTEHEAD \Ë WHITE
+1D155:\K\¾-ROUND NOTEHEAD \Ë \¬
+1D156:\K\ÑS NOTEHEAD
+1D157:\KVOID NOTEHEAD
+1D158:\KNOTEHEAD \¬
+1D159:\KNULL NOTEHEAD
+1D15A:\KCLUSTER NOTEHEAD WHITE
+1D15B:\KCLUSTER NOTEHEAD \¬
+1D15C:\KBREVE
+1D15D:\KWHOLE NOTE
+1D15E:\KHALF NOTE
+1D15F:\KQUARTER NOTE
+1D160:\KE\¼H NOTE
+1D161:\KSIXTEENTH NOTE
+1D162:\KTHIRTY-SECOND NOTE
+1D163:\KSIXTY-FOURTH NOTE
+1D164:\KONE HUNDR\ÂTWENTY-E\¼H NOTE
+1D165:\K\oSTEM
+1D166:\K\oSPRECHGESANG STEM
+1D167:\K\oTREMOLO-1
+1D168:\K\oTREMOLO-2
+1D169:\K\oTREMOLO-3
+1D16A:\KF\ôER\ÂTREMOLO-1
+1D16B:\KF\ôER\ÂTREMOLO-2
+1D16C:\KF\ôER\ÂTREMOLO-3
+1D16D:\K\oAUGMENT\” DOT
+1D16E:\K\oFLAG-1
+1D16F:\K\oFLAG-2
+1D170:\K\oFLAG-3
+1D171:\K\oFLAG-4
+1D172:\K\oFLAG-5
+1D173:\KBEGIN BEAM
+1D174:\KEND BEAM
+1D175:\KBEGIN TIE
+1D176:\KEND TIE
+1D177:\KBEGIN SLUR
+1D178:\KEND SLUR
+1D179:\KBEGIN PHRASE
+1D17A:\KEND PHRASE
+1D17B:\K\oACCENT
+1D17C:\K\oSTACCATO
+1D17D:\K\oTENUTO
+1D17E:\K\oSTACCATISSIMO
+1D17F:\K\oMARCATO
+1D180:\K\oMARCATO-STACCATO
+1D181:\K\oACCENT-STACCATO
+1D182:\K\oLOURE
+1D183:\KARPEGGIATO UP
+1D184:\KARPEGGIATO \Ë
+1D185:\K\oDOIT
+1D186:\K\oRIP
+1D187:\K\oFLIP
+1D188:\K\oSMEAR
+1D189:\K\oBEND
+1D18A:\K\o\0 TONGUE
+1D18B:\K\oTRIPLE TONGUE
+1D18C:\KRINFORZANDO
+1D18D:\KSUBITO
+1D18E:\KZ
+1D18F:\KPIANO
+1D190:\KMEZZO
+1D191:\KFORTE
+1D192:\KCRESCENDO
+1D193:\KDECRESCENDO
+1D194:\KGRACE NOTE SLASH
+1D195:\KGRACE NOTE NO SLASH
+1D196:\KTR
+1D197:\KTURN
+1D198:\KINVERT\ÂTURN
+1D199:\KTURN SLASH
+1D19A:\KTURN UP
+1D19B:\KORNAMENT \Á-1
+1D19C:\KORNAMENT \Á-2
+1D19D:\KORNAMENT \Á-3
+1D19E:\KORNAMENT \Á-4
+1D19F:\KORNAMENT \Á-5
+1D1A0:\KORNAMENT \Á-6
+1D1A1:\KORNAMENT \Á-7
+1D1A2:\KORNAMENT \Á-8
+1D1A3:\KORNAMENT \Á-9
+1D1A4:\KORNAMENT \Á-10
+1D1A5:\KORNAMENT \Á-11
+1D1A6:\KHAUPTSTIMME
+1D1A7:\KNEBENSTIMME
+1D1A8:\KEND OF STIMME
+1D1A9:\KDEGREE SLASH
+1D1AA:\K\o\Ë BOW
+1D1AB:\K\oUP BOW
+1D1AC:\K\oHARMONIC
+1D1AD:\K\oSNAP PIZZICATO
+1D1AE:\KPEDAL\¥
+1D1AF:\KPEDAL UP\¥
+1D1B0:\KHALF PEDAL\¥
+1D1B1:\KGLISSANDO UP
+1D1B2:\KGLISSANDO \Ë
+1D1B3:\KWITH F\ôERNAILS
+1D1B4:\KDAMP
+1D1B5:\KDAMP ALL
+1D1B6:\KMAXIMA
+1D1B7:\KLONGA
+1D1B8:\KBREVIS
+1D1B9:\KSEMIBREVIS WHITE
+1D1BA:\KSEMIBREVIS \¬
+1D1BB:\KMINIMA
+1D1BC:\KMINIMA \¬
+1D1BD:\KSEMIMINIMA WHITE
+1D1BE:\KSEMIMINIMA \¬
+1D1BF:\KFUSA WHITE
+1D1C0:\KFUSA \¬
+1D1C1:\KLONGA PERFECTA REST
+1D1C2:\KLONGA IMPERFECTA REST
+1D1C3:\KBREVIS REST
+1D1C4:\KSEMIBREVIS REST
+1D1C5:\KMINIMA REST
+1D1C6:\KSEMIMINIMA REST
+1D1C7:\KTEMPUS PERFECTUM CUM PROL\”E PERFECTA
+1D1C8:\KTEMPUS PERFECTUM CUM PROL\”E IMPERFECTA
+1D1C9:\KTEMPUS PERFECTUM CUM PROL\”E PERFECTA DIMINUTION-1
+1D1CA:\KTEMPUS IMPERFECTUM CUM PROL\”E PERFECTA
+1D1CB:\KTEMPUS IMPERFECTUM CUM PROL\”E IMPERFECTA
+1D1CC:\KTEMPUS IMPERFECTUM CUM PROL\”E IMPERFECTA DIMINUTION-1
+1D1CD:\KTEMPUS IMPERFECTUM CUM PROL\”E IMPERFECTA DIMINUTION-2
+1D1CE:\KTEMPUS IMPERFECTUM CUM PROL\”E IMPERFECTA DIMINUTION-3
+1D1CF:\KCROIX
+1D1D0:\KGREGORIAN C CLEF
+1D1D1:\KGREGORIAN F CLEF
+1D1D2:\K\rB
+1D1D3:\KVIRGA
+1D1D4:\KPODATUS
+1D1D5:\KCLIVIS
+1D1D6:\KSCANDICUS
+1D1D7:\KCLIMACUS
+1D1D8:\KTORCULUS
+1D1D9:\KPORRECTUS
+1D1DA:\KPORRECTUS FLEXUS
+1D1DB:\KSCANDICUS FLEXUS
+1D1DC:\KTORCULUS RESUPINUS
+1D1DD:\KPES SUBPUNCTIS
+1D400:\îCAPITAL A
+1D401:\îCAPITAL B
+1D402:\îCAPITAL C
+1D403:\îCAPITAL D
+1D404:\îCAPITAL E
+1D405:\îCAPITAL F
+1D406:\îCAPITAL G
+1D407:\îCAPITAL H
+1D408:\îCAPITAL I
+1D409:\îCAPITAL J
+1D40A:\îCAPITAL K
+1D40B:\îCAPITAL L
+1D40C:\îCAPITAL M
+1D40D:\îCAPITAL N
+1D40E:\îCAPITAL O
+1D40F:\îCAPITAL P
+1D410:\îCAPITAL Q
+1D411:\îCAPITAL R
+1D412:\îCAPITAL S
+1D413:\îCAPITAL T
+1D414:\îCAPITAL U
+1D415:\îCAPITAL V
+1D416:\îCAPITAL W
+1D417:\îCAPITAL X
+1D418:\îCAPITAL Y
+1D419:\îCAPITAL Z
+1D41A:\î\§A
+1D41B:\î\§B
+1D41C:\î\§C
+1D41D:\î\§D
+1D41E:\î\§E
+1D41F:\î\§F
+1D420:\î\§G
+1D421:\î\§H
+1D422:\î\§I
+1D423:\î\§J
+1D424:\î\§K
+1D425:\î\§L
+1D426:\î\§M
+1D427:\î\§N
+1D428:\î\§O
+1D429:\î\§P
+1D42A:\î\§Q
+1D42B:\î\§R
+1D42C:\î\§S
+1D42D:\î\§T
+1D42E:\î\§U
+1D42F:\î\§V
+1D430:\î\§W
+1D431:\î\§X
+1D432:\î\§Y
+1D433:\î\§Z
+1D434:\E\›A
+1D435:\E\›B
+1D436:\E\›C
+1D437:\E\›D
+1D438:\E\›E
+1D439:\E\›F
+1D43A:\E\›G
+1D43B:\E\›H
+1D43C:\E\›I
+1D43D:\E\›J
+1D43E:\E\›K
+1D43F:\E\›L
+1D440:\E\›M
+1D441:\E\›N
+1D442:\E\›O
+1D443:\E\›P
+1D444:\E\›Q
+1D445:\E\›R
+1D446:\E\›S
+1D447:\E\›T
+1D448:\E\›U
+1D449:\E\›V
+1D44A:\E\›W
+1D44B:\E\›X
+1D44C:\E\›Y
+1D44D:\E\›Z
+1D44E:\E\—A
+1D44F:\E\—B
+1D450:\E\—C
+1D451:\E\—D
+1D452:\E\—E
+1D453:\E\—F
+1D454:\E\—G
+1D456:\E\—I
+1D457:\E\—J
+1D458:\E\—K
+1D459:\E\—L
+1D45A:\E\—M
+1D45B:\E\—N
+1D45C:\E\—O
+1D45D:\E\—P
+1D45E:\E\—Q
+1D45F:\E\—R
+1D460:\E\—S
+1D461:\E\—T
+1D462:\E\—U
+1D463:\E\—V
+1D464:\E\—W
+1D465:\E\—X
+1D466:\E\—Y
+1D467:\E\—Z
+1D468:\î\›A
+1D469:\î\›B
+1D46A:\î\›C
+1D46B:\î\›D
+1D46C:\î\›E
+1D46D:\î\›F
+1D46E:\î\›G
+1D46F:\î\›H
+1D470:\î\›I
+1D471:\î\›J
+1D472:\î\›K
+1D473:\î\›L
+1D474:\î\›M
+1D475:\î\›N
+1D476:\î\›O
+1D477:\î\›P
+1D478:\î\›Q
+1D479:\î\›R
+1D47A:\î\›S
+1D47B:\î\›T
+1D47C:\î\›U
+1D47D:\î\›V
+1D47E:\î\›W
+1D47F:\î\›X
+1D480:\î\›Y
+1D481:\î\›Z
+1D482:\î\—A
+1D483:\î\—B
+1D484:\î\—C
+1D485:\î\—D
+1D486:\î\—E
+1D487:\î\—F
+1D488:\î\—G
+1D489:\î\—H
+1D48A:\î\—I
+1D48B:\î\—J
+1D48C:\î\—K
+1D48D:\î\—L
+1D48E:\î\—M
+1D48F:\î\—N
+1D490:\î\—O
+1D491:\î\—P
+1D492:\î\—Q
+1D493:\î\—R
+1D494:\î\—S
+1D495:\î\—T
+1D496:\î\—U
+1D497:\î\—V
+1D498:\î\—W
+1D499:\î\—X
+1D49A:\î\—Y
+1D49B:\î\—Z
+1D49C:\E\Ž\ÒA
+1D49E:\E\Ž\ÒC
+1D49F:\E\Ž\ÒD
+1D4A2:\E\Ž\ÒG
+1D4A5:\E\Ž\ÒJ
+1D4A6:\E\Ž\ÒK
+1D4A9:\E\Ž\ÒN
+1D4AA:\E\Ž\ÒO
+1D4AB:\E\Ž\ÒP
+1D4AC:\E\Ž\ÒQ
+1D4AE:\E\Ž\ÒS
+1D4AF:\E\Ž\ÒT
+1D4B0:\E\Ž\ÒU
+1D4B1:\E\Ž\ÒV
+1D4B2:\E\Ž\ÒW
+1D4B3:\E\Ž\ÒX
+1D4B4:\E\Ž\ÒY
+1D4B5:\E\Ž\ÒZ
+1D4B6:\E\Ž\ÇA
+1D4B7:\E\Ž\ÇB
+1D4B8:\E\Ž\ÇC
+1D4B9:\E\Ž\ÇD
+1D4BB:\E\Ž\ÇF
+1D4BD:\E\Ž\ÇH
+1D4BE:\E\Ž\ÇI
+1D4BF:\E\Ž\ÇJ
+1D4C0:\E\Ž\ÇK
+1D4C2:\E\Ž\ÇM
+1D4C3:\E\Ž\ÇN
+1D4C5:\E\Ž\ÇP
+1D4C6:\E\Ž\ÇQ
+1D4C7:\E\Ž\ÇR
+1D4C8:\E\Ž\ÇS
+1D4C9:\E\Ž\ÇT
+1D4CA:\E\Ž\ÇU
+1D4CB:\E\Ž\ÇV
+1D4CC:\E\Ž\ÇW
+1D4CD:\E\Ž\ÇX
+1D4CE:\E\Ž\ÇY
+1D4CF:\E\Ž\ÇZ
+1D4D0:\î\Ž\ÒA
+1D4D1:\î\Ž\ÒB
+1D4D2:\î\Ž\ÒC
+1D4D3:\î\Ž\ÒD
+1D4D4:\î\Ž\ÒE
+1D4D5:\î\Ž\ÒF
+1D4D6:\î\Ž\ÒG
+1D4D7:\î\Ž\ÒH
+1D4D8:\î\Ž\ÒI
+1D4D9:\î\Ž\ÒJ
+1D4DA:\î\Ž\ÒK
+1D4DB:\î\Ž\ÒL
+1D4DC:\î\Ž\ÒM
+1D4DD:\î\Ž\ÒN
+1D4DE:\î\Ž\ÒO
+1D4DF:\î\Ž\ÒP
+1D4E0:\î\Ž\ÒQ
+1D4E1:\î\Ž\ÒR
+1D4E2:\î\Ž\ÒS
+1D4E3:\î\Ž\ÒT
+1D4E4:\î\Ž\ÒU
+1D4E5:\î\Ž\ÒV
+1D4E6:\î\Ž\ÒW
+1D4E7:\î\Ž\ÒX
+1D4E8:\î\Ž\ÒY
+1D4E9:\î\Ž\ÒZ
+1D4EA:\î\Ž\ÇA
+1D4EB:\î\Ž\ÇB
+1D4EC:\î\Ž\ÇC
+1D4ED:\î\Ž\ÇD
+1D4EE:\î\Ž\ÇE
+1D4EF:\î\Ž\ÇF
+1D4F0:\î\Ž\ÇG
+1D4F1:\î\Ž\ÇH
+1D4F2:\î\Ž\ÇI
+1D4F3:\î\Ž\ÇJ
+1D4F4:\î\Ž\ÇK
+1D4F5:\î\Ž\ÇL
+1D4F6:\î\Ž\ÇM
+1D4F7:\î\Ž\ÇN
+1D4F8:\î\Ž\ÇO
+1D4F9:\î\Ž\ÇP
+1D4FA:\î\Ž\ÇQ
+1D4FB:\î\Ž\ÇR
+1D4FC:\î\Ž\ÇS
+1D4FD:\î\Ž\ÇT
+1D4FE:\î\Ž\ÇU
+1D4FF:\î\Ž\ÇV
+1D500:\î\Ž\ÇW
+1D501:\î\Ž\ÇX
+1D502:\î\Ž\ÇY
+1D503:\î\Ž\ÇZ
+1D504:\E\£\ÒA
+1D505:\E\£\ÒB
+1D507:\E\£\ÒD
+1D508:\E\£\ÒE
+1D509:\E\£\ÒF
+1D50A:\E\£\ÒG
+1D50D:\E\£\ÒJ
+1D50E:\E\£\ÒK
+1D50F:\E\£\ÒL
+1D510:\E\£\ÒM
+1D511:\E\£\ÒN
+1D512:\E\£\ÒO
+1D513:\E\£\ÒP
+1D514:\E\£\ÒQ
+1D516:\E\£\ÒS
+1D517:\E\£\ÒT
+1D518:\E\£\ÒU
+1D519:\E\£\ÒV
+1D51A:\E\£\ÒW
+1D51B:\E\£\ÒX
+1D51C:\E\£\ÒY
+1D51E:\E\£\ÇA
+1D51F:\E\£\ÇB
+1D520:\E\£\ÇC
+1D521:\E\£\ÇD
+1D522:\E\£\ÇE
+1D523:\E\£\ÇF
+1D524:\E\£\ÇG
+1D525:\E\£\ÇH
+1D526:\E\£\ÇI
+1D527:\E\£\ÇJ
+1D528:\E\£\ÇK
+1D529:\E\£\ÇL
+1D52A:\E\£\ÇM
+1D52B:\E\£\ÇN
+1D52C:\E\£\ÇO
+1D52D:\E\£\ÇP
+1D52E:\E\£\ÇQ
+1D52F:\E\£\ÇR
+1D530:\E\£\ÇS
+1D531:\E\£\ÇT
+1D532:\E\£\ÇU
+1D533:\E\£\ÇV
+1D534:\E\£\ÇW
+1D535:\E\£\ÇX
+1D536:\E\£\ÇY
+1D537:\E\£\ÇZ
+1D538:\E\¤\ÒA
+1D539:\E\¤\ÒB
+1D53B:\E\¤\ÒD
+1D53C:\E\¤\ÒE
+1D53D:\E\¤\ÒF
+1D53E:\E\¤\ÒG
+1D540:\E\¤\ÒI
+1D541:\E\¤\ÒJ
+1D542:\E\¤\ÒK
+1D543:\E\¤\ÒL
+1D544:\E\¤\ÒM
+1D546:\E\¤\ÒO
+1D54A:\E\¤\ÒS
+1D54B:\E\¤\ÒT
+1D54C:\E\¤\ÒU
+1D54D:\E\¤\ÒV
+1D54E:\E\¤\ÒW
+1D54F:\E\¤\ÒX
+1D550:\E\¤\ÒY
+1D552:\E\¤\ÇA
+1D553:\E\¤\ÇB
+1D554:\E\¤\ÇC
+1D555:\E\¤\ÇD
+1D556:\E\¤\ÇE
+1D557:\E\¤\ÇF
+1D558:\E\¤\ÇG
+1D559:\E\¤\ÇH
+1D55A:\E\¤\ÇI
+1D55B:\E\¤\ÇJ
+1D55C:\E\¤\ÇK
+1D55D:\E\¤\ÇL
+1D55E:\E\¤\ÇM
+1D55F:\E\¤\ÇN
+1D560:\E\¤\ÇO
+1D561:\E\¤\ÇP
+1D562:\E\¤\ÇQ
+1D563:\E\¤\ÇR
+1D564:\E\¤\ÇS
+1D565:\E\¤\ÇT
+1D566:\E\¤\ÇU
+1D567:\E\¤\ÇV
+1D568:\E\¤\ÇW
+1D569:\E\¤\ÇX
+1D56A:\E\¤\ÇY
+1D56B:\E\¤\ÇZ
+1D56C:\î\£\ÒA
+1D56D:\î\£\ÒB
+1D56E:\î\£\ÒC
+1D56F:\î\£\ÒD
+1D570:\î\£\ÒE
+1D571:\î\£\ÒF
+1D572:\î\£\ÒG
+1D573:\î\£\ÒH
+1D574:\î\£\ÒI
+1D575:\î\£\ÒJ
+1D576:\î\£\ÒK
+1D577:\î\£\ÒL
+1D578:\î\£\ÒM
+1D579:\î\£\ÒN
+1D57A:\î\£\ÒO
+1D57B:\î\£\ÒP
+1D57C:\î\£\ÒQ
+1D57D:\î\£\ÒR
+1D57E:\î\£\ÒS
+1D57F:\î\£\ÒT
+1D580:\î\£\ÒU
+1D581:\î\£\ÒV
+1D582:\î\£\ÒW
+1D583:\î\£\ÒX
+1D584:\î\£\ÒY
+1D585:\î\£\ÒZ
+1D586:\î\£\ÇA
+1D587:\î\£\ÇB
+1D588:\î\£\ÇC
+1D589:\î\£\ÇD
+1D58A:\î\£\ÇE
+1D58B:\î\£\ÇF
+1D58C:\î\£\ÇG
+1D58D:\î\£\ÇH
+1D58E:\î\£\ÇI
+1D58F:\î\£\ÇJ
+1D590:\î\£\ÇK
+1D591:\î\£\ÇL
+1D592:\î\£\ÇM
+1D593:\î\£\ÇN
+1D594:\î\£\ÇO
+1D595:\î\£\ÇP
+1D596:\î\£\ÇQ
+1D597:\î\£\ÇR
+1D598:\î\£\ÇS
+1D599:\î\£\ÇT
+1D59A:\î\£\ÇU
+1D59B:\î\£\ÇV
+1D59C:\î\£\ÇW
+1D59D:\î\£\ÇX
+1D59E:\î\£\ÇY
+1D59F:\î\£\ÇZ
+1D5A0:\z\ÒA
+1D5A1:\z\ÒB
+1D5A2:\z\ÒC
+1D5A3:\z\ÒD
+1D5A4:\z\ÒE
+1D5A5:\z\ÒF
+1D5A6:\z\ÒG
+1D5A7:\z\ÒH
+1D5A8:\z\ÒI
+1D5A9:\z\ÒJ
+1D5AA:\z\ÒK
+1D5AB:\z\ÒL
+1D5AC:\z\ÒM
+1D5AD:\z\ÒN
+1D5AE:\z\ÒO
+1D5AF:\z\ÒP
+1D5B0:\z\ÒQ
+1D5B1:\z\ÒR
+1D5B2:\z\ÒS
+1D5B3:\z\ÒT
+1D5B4:\z\ÒU
+1D5B5:\z\ÒV
+1D5B6:\z\ÒW
+1D5B7:\z\ÒX
+1D5B8:\z\ÒY
+1D5B9:\z\ÒZ
+1D5BA:\z\ÇA
+1D5BB:\z\ÇB
+1D5BC:\z\ÇC
+1D5BD:\z\ÇD
+1D5BE:\z\ÇE
+1D5BF:\z\ÇF
+1D5C0:\z\ÇG
+1D5C1:\z\ÇH
+1D5C2:\z\ÇI
+1D5C3:\z\ÇJ
+1D5C4:\z\ÇK
+1D5C5:\z\ÇL
+1D5C6:\z\ÇM
+1D5C7:\z\ÇN
+1D5C8:\z\ÇO
+1D5C9:\z\ÇP
+1D5CA:\z\ÇQ
+1D5CB:\z\ÇR
+1D5CC:\z\ÇS
+1D5CD:\z\ÇT
+1D5CE:\z\ÇU
+1D5CF:\z\ÇV
+1D5D0:\z\ÇW
+1D5D1:\z\ÇX
+1D5D2:\z\ÇY
+1D5D3:\z\ÇZ
+1D5D4:\O\ÒA
+1D5D5:\O\ÒB
+1D5D6:\O\ÒC
+1D5D7:\O\ÒD
+1D5D8:\O\ÒE
+1D5D9:\O\ÒF
+1D5DA:\O\ÒG
+1D5DB:\O\ÒH
+1D5DC:\O\ÒI
+1D5DD:\O\ÒJ
+1D5DE:\O\ÒK
+1D5DF:\O\ÒL
+1D5E0:\O\ÒM
+1D5E1:\O\ÒN
+1D5E2:\O\ÒO
+1D5E3:\O\ÒP
+1D5E4:\O\ÒQ
+1D5E5:\O\ÒR
+1D5E6:\O\ÒS
+1D5E7:\O\ÒT
+1D5E8:\O\ÒU
+1D5E9:\O\ÒV
+1D5EA:\O\ÒW
+1D5EB:\O\ÒX
+1D5EC:\O\ÒY
+1D5ED:\O\ÒZ
+1D5EE:\O\ÇA
+1D5EF:\O\ÇB
+1D5F0:\O\ÇC
+1D5F1:\O\ÇD
+1D5F2:\O\ÇE
+1D5F3:\O\ÇF
+1D5F4:\O\ÇG
+1D5F5:\O\ÇH
+1D5F6:\O\ÇI
+1D5F7:\O\ÇJ
+1D5F8:\O\ÇK
+1D5F9:\O\ÇL
+1D5FA:\O\ÇM
+1D5FB:\O\ÇN
+1D5FC:\O\ÇO
+1D5FD:\O\ÇP
+1D5FE:\O\ÇQ
+1D5FF:\O\ÇR
+1D600:\O\ÇS
+1D601:\O\ÇT
+1D602:\O\ÇU
+1D603:\O\ÇV
+1D604:\O\ÇW
+1D605:\O\ÇX
+1D606:\O\ÇY
+1D607:\O\ÇZ
+1D608:\z \›A
+1D609:\z \›B
+1D60A:\z \›C
+1D60B:\z \›D
+1D60C:\z \›E
+1D60D:\z \›F
+1D60E:\z \›G
+1D60F:\z \›H
+1D610:\z \›I
+1D611:\z \›J
+1D612:\z \›K
+1D613:\z \›L
+1D614:\z \›M
+1D615:\z \›N
+1D616:\z \›O
+1D617:\z \›P
+1D618:\z \›Q
+1D619:\z \›R
+1D61A:\z \›S
+1D61B:\z \›T
+1D61C:\z \›U
+1D61D:\z \›V
+1D61E:\z \›W
+1D61F:\z \›X
+1D620:\z \›Y
+1D621:\z \›Z
+1D622:\z \—A
+1D623:\z \—B
+1D624:\z \—C
+1D625:\z \—D
+1D626:\z \—E
+1D627:\z \—F
+1D628:\z \—G
+1D629:\z \—H
+1D62A:\z \—I
+1D62B:\z \—J
+1D62C:\z \—K
+1D62D:\z \—L
+1D62E:\z \—M
+1D62F:\z \—N
+1D630:\z \—O
+1D631:\z \—P
+1D632:\z \—Q
+1D633:\z \—R
+1D634:\z \—S
+1D635:\z \—T
+1D636:\z \—U
+1D637:\z \—V
+1D638:\z \—W
+1D639:\z \—X
+1D63A:\z \—Y
+1D63B:\z \—Z
+1D63C:\O \›A
+1D63D:\O \›B
+1D63E:\O \›C
+1D63F:\O \›D
+1D640:\O \›E
+1D641:\O \›F
+1D642:\O \›G
+1D643:\O \›H
+1D644:\O \›I
+1D645:\O \›J
+1D646:\O \›K
+1D647:\O \›L
+1D648:\O \›M
+1D649:\O \›N
+1D64A:\O \›O
+1D64B:\O \›P
+1D64C:\O \›Q
+1D64D:\O \›R
+1D64E:\O \›S
+1D64F:\O \›T
+1D650:\O \›U
+1D651:\O \›V
+1D652:\O \›W
+1D653:\O \›X
+1D654:\O \›Y
+1D655:\O \›Z
+1D656:\O \—A
+1D657:\O \—B
+1D658:\O \—C
+1D659:\O \—D
+1D65A:\O \—E
+1D65B:\O \—F
+1D65C:\O \—G
+1D65D:\O \—H
+1D65E:\O \—I
+1D65F:\O \—J
+1D660:\O \—K
+1D661:\O \—L
+1D662:\O \—M
+1D663:\O \—N
+1D664:\O \—O
+1D665:\O \—P
+1D666:\O \—Q
+1D667:\O \—R
+1D668:\O \—S
+1D669:\O \—T
+1D66A:\O \—U
+1D66B:\O \—V
+1D66C:\O \—W
+1D66D:\O \—X
+1D66E:\O \—Y
+1D66F:\O \—Z
+1D670:\•\ÒA
+1D671:\•\ÒB
+1D672:\•\ÒC
+1D673:\•\ÒD
+1D674:\•\ÒE
+1D675:\•\ÒF
+1D676:\•\ÒG
+1D677:\•\ÒH
+1D678:\•\ÒI
+1D679:\•\ÒJ
+1D67A:\•\ÒK
+1D67B:\•\ÒL
+1D67C:\•\ÒM
+1D67D:\•\ÒN
+1D67E:\•\ÒO
+1D67F:\•\ÒP
+1D680:\•\ÒQ
+1D681:\•\ÒR
+1D682:\•\ÒS
+1D683:\•\ÒT
+1D684:\•\ÒU
+1D685:\•\ÒV
+1D686:\•\ÒW
+1D687:\•\ÒX
+1D688:\•\ÒY
+1D689:\•\ÒZ
+1D68A:\•\ÇA
+1D68B:\•\ÇB
+1D68C:\•\ÇC
+1D68D:\•\ÇD
+1D68E:\•\ÇE
+1D68F:\•\ÇF
+1D690:\•\ÇG
+1D691:\•\ÇH
+1D692:\•\ÇI
+1D693:\•\ÇJ
+1D694:\•\ÇK
+1D695:\•\ÇL
+1D696:\•\ÇM
+1D697:\•\ÇN
+1D698:\•\ÇO
+1D699:\•\ÇP
+1D69A:\•\ÇQ
+1D69B:\•\ÇR
+1D69C:\•\ÇS
+1D69D:\•\ÇT
+1D69E:\•\ÇU
+1D69F:\•\ÇV
+1D6A0:\•\ÇW
+1D6A1:\•\ÇX
+1D6A2:\•\ÇY
+1D6A3:\•\ÇZ
+1D6A8:\îCAPITAL \þ
+1D6A9:\îCAPITAL BETA
+1D6AA:\îCAPITAL GAMMA
+1D6AB:\îCAPITAL DELTA
+1D6AC:\îCAPITAL E\É
+1D6AD:\îCAPITAL ZETA
+1D6AE:\îCAPITAL ETA
+1D6AF:\îCAPITAL THETA
+1D6B0:\îCAPITAL IOTA
+1D6B1:\îCAPITAL KAPPA
+1D6B2:\îCAPITAL LAMDA
+1D6B3:\îCAPITAL MU
+1D6B4:\îCAPITAL NU
+1D6B5:\îCAPITAL XI
+1D6B6:\îCAPITAL OMICRON
+1D6B7:\îCAPITAL PI
+1D6B8:\îCAPITAL RHO
+1D6B9:\îCAPITAL THETA \
+1D6BA:\îCAPITAL SIGMA
+1D6BB:\îCAPITAL TAU
+1D6BC:\îCAPITAL U\É
+1D6BD:\îCAPITAL PHI
+1D6BE:\îCAPITAL CHI
+1D6BF:\îCAPITAL PSI
+1D6C0:\îCAPITAL \ü
+1D6C1:\îNABLA
+1D6C2:\î\§\þ
+1D6C3:\î\§BETA
+1D6C4:\î\§GAMMA
+1D6C5:\î\§DELTA
+1D6C6:\î\§E\É
+1D6C7:\î\§ZETA
+1D6C8:\î\§ETA
+1D6C9:\î\§THETA
+1D6CA:\î\§IOTA
+1D6CB:\î\§KAPPA
+1D6CC:\î\§LAMDA
+1D6CD:\î\§MU
+1D6CE:\î\§NU
+1D6CF:\î\§XI
+1D6D0:\î\§OMICRON
+1D6D1:\î\§PI
+1D6D2:\î\§RHO
+1D6D3:\î\§FINAL SIGMA
+1D6D4:\î\§SIGMA
+1D6D5:\î\§TAU
+1D6D6:\î\§U\É
+1D6D7:\î\§PHI
+1D6D8:\î\§CHI
+1D6D9:\î\§PSI
+1D6DA:\î\§\ü
+1D6DB:\îPARTIAL DIFFERENTIAL
+1D6DC:\îE\É \
+1D6DD:\îTHETA \
+1D6DE:\îKAPPA \
+1D6DF:\îPHI \
+1D6E0:\îRHO \
+1D6E1:\îPI \
+1D6E2:\E\›\þ
+1D6E3:\E\›BETA
+1D6E4:\E\›GAMMA
+1D6E5:\E\›DELTA
+1D6E6:\E\›E\É
+1D6E7:\E\›ZETA
+1D6E8:\E\›ETA
+1D6E9:\E\›THETA
+1D6EA:\E\›IOTA
+1D6EB:\E\›KAPPA
+1D6EC:\E\›LAMDA
+1D6ED:\E\›MU
+1D6EE:\E\›NU
+1D6EF:\E\›XI
+1D6F0:\E\›OMICRON
+1D6F1:\E\›PI
+1D6F2:\E\›RHO
+1D6F3:\E\›THETA \
+1D6F4:\E\›SIGMA
+1D6F5:\E\›TAU
+1D6F6:\E\›U\É
+1D6F7:\E\›PHI
+1D6F8:\E\›CHI
+1D6F9:\E\›PSI
+1D6FA:\E\›\ü
+1D6FB:\E\f NABLA
+1D6FC:\E\—\þ
+1D6FD:\E\—BETA
+1D6FE:\E\—GAMMA
+1D6FF:\E\—DELTA
+1D700:\E\—E\É
+1D701:\E\—ZETA
+1D702:\E\—ETA
+1D703:\E\—THETA
+1D704:\E\—IOTA
+1D705:\E\—KAPPA
+1D706:\E\—LAMDA
+1D707:\E\—MU
+1D708:\E\—NU
+1D709:\E\—XI
+1D70A:\E\—OMICRON
+1D70B:\E\—PI
+1D70C:\E\—RHO
+1D70D:\E\—FINAL SIGMA
+1D70E:\E\—SIGMA
+1D70F:\E\—TAU
+1D710:\E\—U\É
+1D711:\E\—PHI
+1D712:\E\—CHI
+1D713:\E\—PSI
+1D714:\E\—\ü
+1D715:\E\f PARTIAL DIFFERENTIAL
+1D716:\E\f E\É \
+1D717:\E\f THETA \
+1D718:\E\f KAPPA \
+1D719:\E\f PHI \
+1D71A:\E\f RHO \
+1D71B:\E\f PI \
+1D71C:\î\›\þ
+1D71D:\î\›BETA
+1D71E:\î\›GAMMA
+1D71F:\î\›DELTA
+1D720:\î\›E\É
+1D721:\î\›ZETA
+1D722:\î\›ETA
+1D723:\î\›THETA
+1D724:\î\›IOTA
+1D725:\î\›KAPPA
+1D726:\î\›LAMDA
+1D727:\î\›MU
+1D728:\î\›NU
+1D729:\î\›XI
+1D72A:\î\›OMICRON
+1D72B:\î\›PI
+1D72C:\î\›RHO
+1D72D:\î\›THETA \
+1D72E:\î\›SIGMA
+1D72F:\î\›TAU
+1D730:\î\›U\É
+1D731:\î\›PHI
+1D732:\î\›CHI
+1D733:\î\›PSI
+1D734:\î\›\ü
+1D735:\î\f NABLA
+1D736:\î\—\þ
+1D737:\î\—BETA
+1D738:\î\—GAMMA
+1D739:\î\—DELTA
+1D73A:\î\—E\É
+1D73B:\î\—ZETA
+1D73C:\î\—ETA
+1D73D:\î\—THETA
+1D73E:\î\—IOTA
+1D73F:\î\—KAPPA
+1D740:\î\—LAMDA
+1D741:\î\—MU
+1D742:\î\—NU
+1D743:\î\—XI
+1D744:\î\—OMICRON
+1D745:\î\—PI
+1D746:\î\—RHO
+1D747:\î\—FINAL SIGMA
+1D748:\î\—SIGMA
+1D749:\î\—TAU
+1D74A:\î\—U\É
+1D74B:\î\—PHI
+1D74C:\î\—CHI
+1D74D:\î\—PSI
+1D74E:\î\—\ü
+1D74F:\î\f PARTIAL DIFFERENTIAL
+1D750:\î\f E\É \
+1D751:\î\f THETA \
+1D752:\î\f KAPPA \
+1D753:\î\f PHI \
+1D754:\î\f RHO \
+1D755:\î\f PI \
+1D756:\O\Ò\þ
+1D757:\O\ÒBETA
+1D758:\O\ÒGAMMA
+1D759:\O\ÒDELTA
+1D75A:\O\ÒE\É
+1D75B:\O\ÒZETA
+1D75C:\O\ÒETA
+1D75D:\O\ÒTHETA
+1D75E:\O\ÒIOTA
+1D75F:\O\ÒKAPPA
+1D760:\O\ÒLAMDA
+1D761:\O\ÒMU
+1D762:\O\ÒNU
+1D763:\O\ÒXI
+1D764:\O\ÒOMICRON
+1D765:\O\ÒPI
+1D766:\O\ÒRHO
+1D767:\O\ÒTHETA \
+1D768:\O\ÒSIGMA
+1D769:\O\ÒTAU
+1D76A:\O\ÒU\É
+1D76B:\O\ÒPHI
+1D76C:\O\ÒCHI
+1D76D:\O\ÒPSI
+1D76E:\O\Ò\ü
+1D76F:\O NABLA
+1D770:\O\Ç\þ
+1D771:\O\ÇBETA
+1D772:\O\ÇGAMMA
+1D773:\O\ÇDELTA
+1D774:\O\ÇE\É
+1D775:\O\ÇZETA
+1D776:\O\ÇETA
+1D777:\O\ÇTHETA
+1D778:\O\ÇIOTA
+1D779:\O\ÇKAPPA
+1D77A:\O\ÇLAMDA
+1D77B:\O\ÇMU
+1D77C:\O\ÇNU
+1D77D:\O\ÇXI
+1D77E:\O\ÇOMICRON
+1D77F:\O\ÇPI
+1D780:\O\ÇRHO
+1D781:\O\ÇFINAL SIGMA
+1D782:\O\ÇSIGMA
+1D783:\O\ÇTAU
+1D784:\O\ÇU\É
+1D785:\O\ÇPHI
+1D786:\O\ÇCHI
+1D787:\O\ÇPSI
+1D788:\O\Ç\ü
+1D789:\O PARTIAL DIFFERENTIAL
+1D78A:\O E\É \
+1D78B:\O THETA \
+1D78C:\O KAPPA \
+1D78D:\O PHI \
+1D78E:\O RHO \
+1D78F:\O PI \
+1D790:\O \›\þ
+1D791:\O \›BETA
+1D792:\O \›GAMMA
+1D793:\O \›DELTA
+1D794:\O \›E\É
+1D795:\O \›ZETA
+1D796:\O \›ETA
+1D797:\O \›THETA
+1D798:\O \›IOTA
+1D799:\O \›KAPPA
+1D79A:\O \›LAMDA
+1D79B:\O \›MU
+1D79C:\O \›NU
+1D79D:\O \›XI
+1D79E:\O \›OMICRON
+1D79F:\O \›PI
+1D7A0:\O \›RHO
+1D7A1:\O \›THETA \
+1D7A2:\O \›SIGMA
+1D7A3:\O \›TAU
+1D7A4:\O \›U\É
+1D7A5:\O \›PHI
+1D7A6:\O \›CHI
+1D7A7:\O \›PSI
+1D7A8:\O \›\ü
+1D7A9:\O \f NABLA
+1D7AA:\O \—\þ
+1D7AB:\O \—BETA
+1D7AC:\O \—GAMMA
+1D7AD:\O \—DELTA
+1D7AE:\O \—E\É
+1D7AF:\O \—ZETA
+1D7B0:\O \—ETA
+1D7B1:\O \—THETA
+1D7B2:\O \—IOTA
+1D7B3:\O \—KAPPA
+1D7B4:\O \—LAMDA
+1D7B5:\O \—MU
+1D7B6:\O \—NU
+1D7B7:\O \—XI
+1D7B8:\O \—OMICRON
+1D7B9:\O \—PI
+1D7BA:\O \—RHO
+1D7BB:\O \—FINAL SIGMA
+1D7BC:\O \—SIGMA
+1D7BD:\O \—TAU
+1D7BE:\O \—U\É
+1D7BF:\O \—PHI
+1D7C0:\O \—CHI
+1D7C1:\O \—PSI
+1D7C2:\O \—\ü
+1D7C3:\O \f PARTIAL DIFFERENTIAL
+1D7C4:\O \f E\É \
+1D7C5:\O \f THETA \
+1D7C6:\O \f KAPPA \
+1D7C7:\O \f PHI \
+1D7C8:\O \f RHO \
+1D7C9:\O \f PI \
+1D7CE:\îDIGIT ZERO
+1D7CF:\îDIGIT ONE
+1D7D0:\îDIGIT TWO
+1D7D1:\îDIGIT THREE
+1D7D2:\îDIGIT FOUR
+1D7D3:\îDIGIT FIVE
+1D7D4:\îDIGIT SIX
+1D7D5:\îDIGIT SEVEN
+1D7D6:\îDIGIT E\¼
+1D7D7:\îDIGIT NINE
+1D7D8:\E\¤\hZERO
+1D7D9:\E\¤\hONE
+1D7DA:\E\¤\hTWO
+1D7DB:\E\¤\hTHREE
+1D7DC:\E\¤\hFOUR
+1D7DD:\E\¤\hFIVE
+1D7DE:\E\¤\hSIX
+1D7DF:\E\¤\hSEVEN
+1D7E0:\E\¤\hE\¼
+1D7E1:\E\¤\hNINE
+1D7E2:\z\hZERO
+1D7E3:\z\hONE
+1D7E4:\z\hTWO
+1D7E5:\z\hTHREE
+1D7E6:\z\hFOUR
+1D7E7:\z\hFIVE
+1D7E8:\z\hSIX
+1D7E9:\z\hSEVEN
+1D7EA:\z\hE\¼
+1D7EB:\z\hNINE
+1D7EC:\O\hZERO
+1D7ED:\O\hONE
+1D7EE:\O\hTWO
+1D7EF:\O\hTHREE
+1D7F0:\O\hFOUR
+1D7F1:\O\hFIVE
+1D7F2:\O\hSIX
+1D7F3:\O\hSEVEN
+1D7F4:\O\hE\¼
+1D7F5:\O\hNINE
+1D7F6:\•\hZERO
+1D7F7:\•\hONE
+1D7F8:\•\hTWO
+1D7F9:\•\hTHREE
+1D7FA:\•\hFOUR
+1D7FB:\•\hFIVE
+1D7FC:\•\hSIX
+1D7FD:\•\hSEVEN
+1D7FE:\•\hE\¼
+1D7FF:\•\hNINE
+20000-2A6D6:<CJK Ideograph Extension B>
+2F800:\Þ00
+2F801:\Þ01
+2F802:\Þ02
+2F803:\Þ03
+2F804:\Þ04
+2F805:\Þ05
+2F806:\Þ06
+2F807:\Þ07
+2F808:\Þ08
+2F809:\Þ09
+2F80A:\Þ0A
+2F80B:\Þ0B
+2F80C:\Þ0C
+2F80D:\Þ0D
+2F80E:\Þ0E
+2F80F:\Þ0F
+2F810:\Þ10
+2F811:\Þ11
+2F812:\Þ12
+2F813:\Þ13
+2F814:\Þ14
+2F815:\Þ15
+2F816:\Þ16
+2F817:\Þ17
+2F818:\Þ18
+2F819:\Þ19
+2F81A:\Þ1A
+2F81B:\Þ1B
+2F81C:\Þ1C
+2F81D:\Þ1D
+2F81E:\Þ1E
+2F81F:\Þ1F
+2F820:\Þ20
+2F821:\Þ21
+2F822:\Þ22
+2F823:\Þ23
+2F824:\Þ24
+2F825:\Þ25
+2F826:\Þ26
+2F827:\Þ27
+2F828:\Þ28
+2F829:\Þ29
+2F82A:\Þ2A
+2F82B:\Þ2B
+2F82C:\Þ2C
+2F82D:\Þ2D
+2F82E:\Þ2E
+2F82F:\Þ2F
+2F830:\Þ30
+2F831:\Þ31
+2F832:\Þ32
+2F833:\Þ33
+2F834:\Þ34
+2F835:\Þ35
+2F836:\Þ36
+2F837:\Þ37
+2F838:\Þ38
+2F839:\Þ39
+2F83A:\Þ3A
+2F83B:\Þ3B
+2F83C:\Þ3C
+2F83D:\Þ3D
+2F83E:\Þ3E
+2F83F:\Þ3F
+2F840:\Þ40
+2F841:\Þ41
+2F842:\Þ42
+2F843:\Þ43
+2F844:\Þ44
+2F845:\Þ45
+2F846:\Þ46
+2F847:\Þ47
+2F848:\Þ48
+2F849:\Þ49
+2F84A:\Þ4A
+2F84B:\Þ4B
+2F84C:\Þ4C
+2F84D:\Þ4D
+2F84E:\Þ4E
+2F84F:\Þ4F
+2F850:\Þ50
+2F851:\Þ51
+2F852:\Þ52
+2F853:\Þ53
+2F854:\Þ54
+2F855:\Þ55
+2F856:\Þ56
+2F857:\Þ57
+2F858:\Þ58
+2F859:\Þ59
+2F85A:\Þ5A
+2F85B:\Þ5B
+2F85C:\Þ5C
+2F85D:\Þ5D
+2F85E:\Þ5E
+2F85F:\Þ5F
+2F860:\Þ60
+2F861:\Þ61
+2F862:\Þ62
+2F863:\Þ63
+2F864:\Þ64
+2F865:\Þ65
+2F866:\Þ66
+2F867:\Þ67
+2F868:\Þ68
+2F869:\Þ69
+2F86A:\Þ6A
+2F86B:\Þ6B
+2F86C:\Þ6C
+2F86D:\Þ6D
+2F86E:\Þ6E
+2F86F:\Þ6F
+2F870:\Þ70
+2F871:\Þ71
+2F872:\Þ72
+2F873:\Þ73
+2F874:\Þ74
+2F875:\Þ75
+2F876:\Þ76
+2F877:\Þ77
+2F878:\Þ78
+2F879:\Þ79
+2F87A:\Þ7A
+2F87B:\Þ7B
+2F87C:\Þ7C
+2F87D:\Þ7D
+2F87E:\Þ7E
+2F87F:\Þ7F
+2F880:\Þ80
+2F881:\Þ81
+2F882:\Þ82
+2F883:\Þ83
+2F884:\Þ84
+2F885:\Þ85
+2F886:\Þ86
+2F887:\Þ87
+2F888:\Þ88
+2F889:\Þ89
+2F88A:\Þ8A
+2F88B:\Þ8B
+2F88C:\Þ8C
+2F88D:\Þ8D
+2F88E:\Þ8E
+2F88F:\Þ8F
+2F890:\Þ90
+2F891:\Þ91
+2F892:\Þ92
+2F893:\Þ93
+2F894:\Þ94
+2F895:\Þ95
+2F896:\Þ96
+2F897:\Þ97
+2F898:\Þ98
+2F899:\Þ99
+2F89A:\Þ9A
+2F89B:\Þ9B
+2F89C:\Þ9C
+2F89D:\Þ9D
+2F89E:\Þ9E
+2F89F:\Þ9F
+2F8A0:\ÞA0
+2F8A1:\ÞA1
+2F8A2:\ÞA2
+2F8A3:\ÞA3
+2F8A4:\ÞA4
+2F8A5:\ÞA5
+2F8A6:\ÞA6
+2F8A7:\ÞA7
+2F8A8:\ÞA8
+2F8A9:\ÞA9
+2F8AA:\ÞAA
+2F8AB:\ÞAB
+2F8AC:\ÞAC
+2F8AD:\ÞAD
+2F8AE:\ÞAE
+2F8AF:\ÞAF
+2F8B0:\ÞB0
+2F8B1:\ÞB1
+2F8B2:\ÞB2
+2F8B3:\ÞB3
+2F8B4:\ÞB4
+2F8B5:\ÞB5
+2F8B6:\ÞB6
+2F8B7:\ÞB7
+2F8B8:\ÞB8
+2F8B9:\ÞB9
+2F8BA:\ÞBA
+2F8BB:\ÞBB
+2F8BC:\ÞBC
+2F8BD:\ÞBD
+2F8BE:\ÞBE
+2F8BF:\ÞBF
+2F8C0:\ÞC0
+2F8C1:\ÞC1
+2F8C2:\ÞC2
+2F8C3:\ÞC3
+2F8C4:\ÞC4
+2F8C5:\ÞC5
+2F8C6:\ÞC6
+2F8C7:\ÞC7
+2F8C8:\ÞC8
+2F8C9:\ÞC9
+2F8CA:\ÞCA
+2F8CB:\ÞCB
+2F8CC:\ÞCC
+2F8CD:\ÞCD
+2F8CE:\ÞCE
+2F8CF:\ÞCF
+2F8D0:\ÞD0
+2F8D1:\ÞD1
+2F8D2:\ÞD2
+2F8D3:\ÞD3
+2F8D4:\ÞD4
+2F8D5:\ÞD5
+2F8D6:\ÞD6
+2F8D7:\ÞD7
+2F8D8:\ÞD8
+2F8D9:\ÞD9
+2F8DA:\ÞDA
+2F8DB:\ÞDB
+2F8DC:\ÞDC
+2F8DD:\ÞDD
+2F8DE:\ÞDE
+2F8DF:\ÞDF
+2F8E0:\ÞE0
+2F8E1:\ÞE1
+2F8E2:\ÞE2
+2F8E3:\ÞE3
+2F8E4:\ÞE4
+2F8E5:\ÞE5
+2F8E6:\ÞE6
+2F8E7:\ÞE7
+2F8E8:\ÞE8
+2F8E9:\ÞE9
+2F8EA:\ÞEA
+2F8EB:\ÞEB
+2F8EC:\ÞEC
+2F8ED:\ÞED
+2F8EE:\ÞEE
+2F8EF:\ÞEF
+2F8F0:\ÞF0
+2F8F1:\ÞF1
+2F8F2:\ÞF2
+2F8F3:\ÞF3
+2F8F4:\ÞF4
+2F8F5:\ÞF5
+2F8F6:\ÞF6
+2F8F7:\ÞF7
+2F8F8:\ÞF8
+2F8F9:\ÞF9
+2F8FA:\ÞFA
+2F8FB:\ÞFB
+2F8FC:\ÞFC
+2F8FD:\ÞFD
+2F8FE:\ÞFE
+2F8FF:\ÞFF
+2F900:\ß00
+2F901:\ß01
+2F902:\ß02
+2F903:\ß03
+2F904:\ß04
+2F905:\ß05
+2F906:\ß06
+2F907:\ß07
+2F908:\ß08
+2F909:\ß09
+2F90A:\ß0A
+2F90B:\ß0B
+2F90C:\ß0C
+2F90D:\ß0D
+2F90E:\ß0E
+2F90F:\ß0F
+2F910:\ß10
+2F911:\ß11
+2F912:\ß12
+2F913:\ß13
+2F914:\ß14
+2F915:\ß15
+2F916:\ß16
+2F917:\ß17
+2F918:\ß18
+2F919:\ß19
+2F91A:\ß1A
+2F91B:\ß1B
+2F91C:\ß1C
+2F91D:\ß1D
+2F91E:\ß1E
+2F91F:\ß1F
+2F920:\ß20
+2F921:\ß21
+2F922:\ß22
+2F923:\ß23
+2F924:\ß24
+2F925:\ß25
+2F926:\ß26
+2F927:\ß27
+2F928:\ß28
+2F929:\ß29
+2F92A:\ß2A
+2F92B:\ß2B
+2F92C:\ß2C
+2F92D:\ß2D
+2F92E:\ß2E
+2F92F:\ß2F
+2F930:\ß30
+2F931:\ß31
+2F932:\ß32
+2F933:\ß33
+2F934:\ß34
+2F935:\ß35
+2F936:\ß36
+2F937:\ß37
+2F938:\ß38
+2F939:\ß39
+2F93A:\ß3A
+2F93B:\ß3B
+2F93C:\ß3C
+2F93D:\ß3D
+2F93E:\ß3E
+2F93F:\ß3F
+2F940:\ß40
+2F941:\ß41
+2F942:\ß42
+2F943:\ß43
+2F944:\ß44
+2F945:\ß45
+2F946:\ß46
+2F947:\ß47
+2F948:\ß48
+2F949:\ß49
+2F94A:\ß4A
+2F94B:\ß4B
+2F94C:\ß4C
+2F94D:\ß4D
+2F94E:\ß4E
+2F94F:\ß4F
+2F950:\ß50
+2F951:\ß51
+2F952:\ß52
+2F953:\ß53
+2F954:\ß54
+2F955:\ß55
+2F956:\ß56
+2F957:\ß57
+2F958:\ß58
+2F959:\ß59
+2F95A:\ß5A
+2F95B:\ß5B
+2F95C:\ß5C
+2F95D:\ß5D
+2F95E:\ß5E
+2F95F:\ß5F
+2F960:\ß60
+2F961:\ß61
+2F962:\ß62
+2F963:\ß63
+2F964:\ß64
+2F965:\ß65
+2F966:\ß66
+2F967:\ß67
+2F968:\ß68
+2F969:\ß69
+2F96A:\ß6A
+2F96B:\ß6B
+2F96C:\ß6C
+2F96D:\ß6D
+2F96E:\ß6E
+2F96F:\ß6F
+2F970:\ß70
+2F971:\ß71
+2F972:\ß72
+2F973:\ß73
+2F974:\ß74
+2F975:\ß75
+2F976:\ß76
+2F977:\ß77
+2F978:\ß78
+2F979:\ß79
+2F97A:\ß7A
+2F97B:\ß7B
+2F97C:\ß7C
+2F97D:\ß7D
+2F97E:\ß7E
+2F97F:\ß7F
+2F980:\ß80
+2F981:\ß81
+2F982:\ß82
+2F983:\ß83
+2F984:\ß84
+2F985:\ß85
+2F986:\ß86
+2F987:\ß87
+2F988:\ß88
+2F989:\ß89
+2F98A:\ß8A
+2F98B:\ß8B
+2F98C:\ß8C
+2F98D:\ß8D
+2F98E:\ß8E
+2F98F:\ß8F
+2F990:\ß90
+2F991:\ß91
+2F992:\ß92
+2F993:\ß93
+2F994:\ß94
+2F995:\ß95
+2F996:\ß96
+2F997:\ß97
+2F998:\ß98
+2F999:\ß99
+2F99A:\ß9A
+2F99B:\ß9B
+2F99C:\ß9C
+2F99D:\ß9D
+2F99E:\ß9E
+2F99F:\ß9F
+2F9A0:\ßA0
+2F9A1:\ßA1
+2F9A2:\ßA2
+2F9A3:\ßA3
+2F9A4:\ßA4
+2F9A5:\ßA5
+2F9A6:\ßA6
+2F9A7:\ßA7
+2F9A8:\ßA8
+2F9A9:\ßA9
+2F9AA:\ßAA
+2F9AB:\ßAB
+2F9AC:\ßAC
+2F9AD:\ßAD
+2F9AE:\ßAE
+2F9AF:\ßAF
+2F9B0:\ßB0
+2F9B1:\ßB1
+2F9B2:\ßB2
+2F9B3:\ßB3
+2F9B4:\ßB4
+2F9B5:\ßB5
+2F9B6:\ßB6
+2F9B7:\ßB7
+2F9B8:\ßB8
+2F9B9:\ßB9
+2F9BA:\ßBA
+2F9BB:\ßBB
+2F9BC:\ßBC
+2F9BD:\ßBD
+2F9BE:\ßBE
+2F9BF:\ßBF
+2F9C0:\ßC0
+2F9C1:\ßC1
+2F9C2:\ßC2
+2F9C3:\ßC3
+2F9C4:\ßC4
+2F9C5:\ßC5
+2F9C6:\ßC6
+2F9C7:\ßC7
+2F9C8:\ßC8
+2F9C9:\ßC9
+2F9CA:\ßCA
+2F9CB:\ßCB
+2F9CC:\ßCC
+2F9CD:\ßCD
+2F9CE:\ßCE
+2F9CF:\ßCF
+2F9D0:\ßD0
+2F9D1:\ßD1
+2F9D2:\ßD2
+2F9D3:\ßD3
+2F9D4:\ßD4
+2F9D5:\ßD5
+2F9D6:\ßD6
+2F9D7:\ßD7
+2F9D8:\ßD8
+2F9D9:\ßD9
+2F9DA:\ßDA
+2F9DB:\ßDB
+2F9DC:\ßDC
+2F9DD:\ßDD
+2F9DE:\ßDE
+2F9DF:\ßDF
+2F9E0:\ßE0
+2F9E1:\ßE1
+2F9E2:\ßE2
+2F9E3:\ßE3
+2F9E4:\ßE4
+2F9E5:\ßE5
+2F9E6:\ßE6
+2F9E7:\ßE7
+2F9E8:\ßE8
+2F9E9:\ßE9
+2F9EA:\ßEA
+2F9EB:\ßEB
+2F9EC:\ßEC
+2F9ED:\ßED
+2F9EE:\ßEE
+2F9EF:\ßEF
+2F9F0:\ßF0
+2F9F1:\ßF1
+2F9F2:\ßF2
+2F9F3:\ßF3
+2F9F4:\ßF4
+2F9F5:\ßF5
+2F9F6:\ßF6
+2F9F7:\ßF7
+2F9F8:\ßF8
+2F9F9:\ßF9
+2F9FA:\ßFA
+2F9FB:\ßFB
+2F9FC:\ßFC
+2F9FD:\ßFD
+2F9FE:\ßFE
+2F9FF:\ßFF
+2FA00:\1A00
+2FA01:\1A01
+2FA02:\1A02
+2FA03:\1A03
+2FA04:\1A04
+2FA05:\1A05
+2FA06:\1A06
+2FA07:\1A07
+2FA08:\1A08
+2FA09:\1A09
+2FA0A:\1A0A
+2FA0B:\1A0B
+2FA0C:\1A0C
+2FA0D:\1A0D
+2FA0E:\1A0E
+2FA0F:\1A0F
+2FA10:\1A10
+2FA11:\1A11
+2FA12:\1A12
+2FA13:\1A13
+2FA14:\1A14
+2FA15:\1A15
+2FA16:\1A16
+2FA17:\1A17
+2FA18:\1A18
+2FA19:\1A19
+2FA1A:\1A1A
+2FA1B:\1A1B
+2FA1C:\1A1C
+2FA1D:\1A1D
+E0001:LANGUAGE TAG
+E0020:TAG SPACE
+E0021:TAG EXCLAM\”\¥
+E0022:TAG QUOT\”\¥
+E0023:TAG \­SIGN
+E0024:TAG DOLLAR\‚
+E0025:TAG PERCENT\‚
+E0026:TAG AMPERSAND
+E0027:TAG APOSTROPHE
+E0028:TAG \‰ \ÑS
+E0029:TAG \ù\ÑS
+E002A:TAG ASTERISK
+E002B:TAG PLUS\‚
+E002C:TAG COMMA
+E002D:TAG HYPHEN-MINUS
+E002E:TAG\é
+E002F:TAG SOLIDUS
+E0030:TAG\hZERO
+E0031:TAG\hONE
+E0032:TAG\hTWO
+E0033:TAG\hTHREE
+E0034:TAG\hFOUR
+E0035:TAG\hFIVE
+E0036:TAG\hSIX
+E0037:TAG\hSEVEN
+E0038:TAG\hE\¼
+E0039:TAG\hNINE
+E003A:TAG COLON
+E003B:TAG SEMICOLON
+E003C:TAG \µ\‚
+E003D:TAG EQUALS\‚
+E003E:TAG \’\‚
+E003F:TAG QUESTION\¥
+E0040:TAG COMMERCIAL AT
+E0041:TAG \PA
+E0042:TAG \PB
+E0043:TAG \PC
+E0044:TAG \PD
+E0045:TAG \PE
+E0046:TAG \PF
+E0047:TAG \PG
+E0048:TAG \PH
+E0049:TAG \PI
+E004A:TAG \PJ
+E004B:TAG \PK
+E004C:TAG \PL
+E004D:TAG \PM
+E004E:TAG \PN
+E004F:TAG \PO
+E0050:TAG \PP
+E0051:TAG \PQ
+E0052:TAG \PR
+E0053:TAG \PS
+E0054:TAG \PT
+E0055:TAG \PU
+E0056:TAG \PV
+E0057:TAG \PW
+E0058:TAG \PX
+E0059:TAG \PY
+E005A:TAG \PZ
+E005B:TAG \‰ \r\–
+E005C:TAG REVERSE SOLIDUS
+E005D:TAG \ù\r\–
+E005E:TAG CIRCUMFLEX\×
+E005F:TAG LOW \ä
+E0060:TAG GRAVE\×
+E0061:TAG \LA
+E0062:TAG \LB
+E0063:TAG \LC
+E0064:TAG \LD
+E0065:TAG \LE
+E0066:TAG \LF
+E0067:TAG \LG
+E0068:TAG \LH
+E0069:TAG \LI
+E006A:TAG \LJ
+E006B:TAG \LK
+E006C:TAG \LL
+E006D:TAG \LM
+E006E:TAG \LN
+E006F:TAG \LO
+E0070:TAG \LP
+E0071:TAG \LQ
+E0072:TAG \LR
+E0073:TAG \LS
+E0074:TAG \LT
+E0075:TAG \LU
+E0076:TAG \LV
+E0077:TAG \LW
+E0078:TAG \LX
+E0079:TAG \LY
+E007A:TAG \LZ
+E007B:TAG \‰ CURLY \–
+E007C:TAG \€ \ä
+E007D:TAG \ùCURLY \–
+E007E:TAG \æ
+E007F:CANCEL TAG
+F0000-FFFFD:<Plane 15 Private Use>
+100000-10FFFD:<Plane 16 Private Use>
+T0:DOUBLE
+T1:CJK COMPATIBILITY IDEOGRAPH-2F
+T2: INITIAL FORM
+T3:THAI CHARACTER
+T4:HALFWIDTH
+T5:TIBETAN
+T6: FINAL FORM
+T7:SEONG
+T8:IDEOGRAPH
+T9:GREEK CAPITAL LETTER
+T@: LETTER
+TB:CJK COMPATIBILITY IDEOGRAPH-
+TC: SYLLABLE
+TE:MATHEMATICAL
+TF:CANADIAN SYLLABICS
+TH: WITH
+TI: CAPITAL
+TJ:ARABIC LIGATURE
+TK:MUSICAL SYMBOL
+TL:LATIN SMALL LETTER
+TM:BRAILLE PATTERN DOTS-
+TN: SMALL
+TO:MATHEMATICAL SANS-SERIF BOLD
+TP:LATIN CAPITAL LETTER
+TQ: ISOLATED FORM
+TU:KANGXI RADICAL
+TV:ETHIOPIC SYLLABLE
+TX:AL FORM
+TY:BYZANTINE MUSICAL SYMBOL
+TZ:YI SYLLABLE
+T^:ARABIC LETTER
+T_:IDEOGRAPHIC TELEGRAPH SYMBOL FOR
+Tb: VOWEL SIGN
+Tc:CIRCLED
+Te:HANGUL
+Tf:ITALIC
+Tg:CYRILLIC
+Th: DIGIT
+Ti: AND
+Tj:BOX DRAWINGS
+Tk:CANADIAN SYLLABICS CARRIER
+Tl:APL FUNCTIONAL SYMBOL
+Tm:MATHEMATICAL BOLD
+Tn:KATAKANA
+To:COMBINING
+Tp: ABOVE
+Tq:RIGHT
+Tr:SQUARE
+Tt:PARENTHESIZED
+Tu: ARROW
+Tv: RADICAL
+Tx:MONGOLIAN LETTER
+Ty:GREEK SMALL LETTER
+Tz:MATHEMATICAL SANS-SERIF
+T€:VERTICAL
+T:CANADIAN SYLLABICS WEST-CREE
+T‚: SIGN
+Tƒ:WARDS HARPOON WITH BARB
+T„:DEVANAGARI
+T…: BELOW
+T†:FULLWIDTH
+T‡: WITH ALEF MAKSURA
+Tˆ: WITH CIRCUMFLEX
+T‰:LEFT
+TŠ:WARDS
+T‹:HIRAGANA LETTER
+TŒ:CHEROKEE LETTER
+T:SYMBOL
+TŽ:SCRIPT
+T: WITH MEEM
+T:HORIZONTAL
+T‘: EQUAL TO
+T’:GREATER-THAN
+T“:HANGUL JONGSEONG
+T”:ATION
+T•:MATHEMATICAL MONOSPACE
+T–:BRACKET
+T—:ITALIC SMALL
+T™:HANGUL CHOSEONG
+Tš:MALAYALAM
+T›:ITALIC CAPITAL
+Tœ:GEGRAMMENI
+T:TIBETAN SUBJOINED LETTER
+Tž: WITH DIAERESIS
+TŸ:HEBREW
+T :CJK COMPATIBILITY IDEOGRAPH-F9
+T¡:CYRILLIC CAPITAL LETTER
+T¢:CYRILLIC SMALL LETTER
+T£:FRAKTUR
+T¤:DOUBLE-STRUCK
+T¥: MARK
+T¦:WHITE
+T§:SMALL
+T©:BOPOMOFO LETTER
+Tª:GUJARATI
+T«:HANGUL JUNGSEONG
+T¬:BLACK
+T­:NUMBER
+T®:MODIFIER LETTER
+T¯:GURMUKHI
+T°:BENGALI
+T±: WITH DASIA AND
+T²:ROMAN NUMERAL
+T³: WITH DOT
+T´:PERISPOMENI
+Tµ:LESS-THAN
+T¶:SINHALA LETTER
+T·: WITH PSILI AND
+T¹:PRESENTATION FORM FOR VERTICAL
+Tº:YEH WITH HAMZA ABOVE
+T»:KANNADA
+T¼:IGHT
+T½:MYANMAR
+T¾:TRIANGLE
+T¿:DESERET
+TÀ:RUNIC LETTER
+TÁ:STROKE
+TÂ:ED
+TÃ:KHMER INDEPENDENT VOWEL
+TÄ:POINTING
+TÅ:HEAVY
+TÆ:IEU
+TÇ: SMALL
+TÉ:PSILON
+TÊ:ARABIC
+TË:DOWN
+TÌ:DINGBAT NEGATIVE CIRCLED
+TÍ:KATAKANA LETTER
+TÎ:VOCALIC
+TÏ:TELUGU
+TÐ:CIRCLE
+TÑ:PARENTHESI
+TÒ: CAPITAL
+TÓ:SYRIAC
+TÔ: WITH JEEM
+TÕ:ALI GALI
+TÖ:HANGUL LETTER
+T×: ACCENT
+TÙ:RIGHTWARDS ARROW
+TÚ: OPERATOR
+TÛ: WITH YEH FINAL FORM
+TÜ:ACUTE
+TÝ:KHMER
+TÞ:CJK COMPATIBILITY IDEOGRAPH-2F8
+Tß:CJK COMPATIBILITY IDEOGRAPH-2F9
+Tà:MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING
+Tá:DINGBAT NEGATIVE CIRCLED C-SIMPLIFIED
+Tâ:ORIYA LETTER
+Tã: CAPITAL LETTER
+Tä:LINE
+Tå:MACRON
+Tæ:TILDE
+Tç:VARIATION SELECTOR
+Té: FULL STOP
+Tê:<control>
+Të:THAANA LETTER
+Tì: BAR
+Tí: WITH HOOK
+Tî:MATHEMATICAL BOLD
+Tï:LOWER
+Tð:IDEOGRAPHIC DESCRIPTION CHARACTER
+Tñ:SYMBOL FOR
+Tò:LIGATURE
+Tó:DENTISTRY SYMBOL LIGHT
+Tô:ING
+Tõ:CJK COMPATIBILITY IDEOGRAPH-FA
+Tö:REVERSED
+T÷:UPPER
+Tù:RIGHT
+Tú:VULGAR FRACTION
+Tû: WITH CARON
+Tü:OMEGA
+Tý:SQUARE
+Tþ:ALPHA
+Tÿ:YI SYLLABLE N
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites,ff9 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites,ff9
index 3eb5b44b7..3eb5b44b7 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites,ff9
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites,ff9
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites11,ff9 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites11,ff9
index 48986b41e..48986b41e 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites11,ff9
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites11,ff9
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites22,ff9 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites22,ff9
index 63a6e6122..63a6e6122 100644
--- a/frontends/riscos/distribution/!Boot/Resources/!Unicode/!Sprites22,ff9
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/!Sprites22,ff9
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Morris4/!Sprites,ff9 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Morris4/!Sprites,ff9
new file mode 100644
index 000000000..096f2f22a
--- /dev/null
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Morris4/!Sprites,ff9
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Morris4/!Sprites22,ff9 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Morris4/!Sprites22,ff9
new file mode 100644
index 000000000..3bf5d53b4
--- /dev/null
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Morris4/!Sprites22,ff9
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Ursula/!Sprites,ff9 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Ursula/!Sprites,ff9
new file mode 100644
index 000000000..29a67dd3c
--- /dev/null
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Ursula/!Sprites,ff9
Binary files differ
diff --git a/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Ursula/!Sprites22,ff9 b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Ursula/!Sprites22,ff9
new file mode 100644
index 000000000..0c866df39
--- /dev/null
+++ b/frontends/riscos/distribution/!Boot/Resources/!Unicode/Themes/Ursula/!Sprites22,ff9
Binary files differ
diff --git a/frontends/riscos/distribution/!System/310/Modules/Network/SockWatch,ffa b/frontends/riscos/distribution/!System/310/Modules/Network/SockWatch,ffa
new file mode 100644
index 000000000..e589cfdb4
--- /dev/null
+++ b/frontends/riscos/distribution/!System/310/Modules/Network/SockWatch,ffa
Binary files differ
diff --git a/frontends/riscos/distribution/!System/310/Modules/Network/URI,ffa b/frontends/riscos/distribution/!System/310/Modules/Network/URI,ffa
index 431535e21..d6dafd212 100644
--- a/frontends/riscos/distribution/!System/310/Modules/Network/URI,ffa
+++ b/frontends/riscos/distribution/!System/310/Modules/Network/URI,ffa
Binary files differ
diff --git a/frontends/riscos/distribution/!System/310/Modules/SharedULib,ffa b/frontends/riscos/distribution/!System/310/Modules/SharedULib,ffa
index 8dd0dd2c9..045d6a3af 100755..100644
--- a/frontends/riscos/distribution/!System/310/Modules/SharedULib,ffa
+++ b/frontends/riscos/distribution/!System/310/Modules/SharedULib,ffa
Binary files differ
diff --git a/frontends/riscos/distribution/!System/400/Modules/ARMEABISupport,ffa b/frontends/riscos/distribution/!System/400/Modules/ARMEABISupport,ffa
new file mode 100644
index 000000000..bfcc3ef63
--- /dev/null
+++ b/frontends/riscos/distribution/!System/400/Modules/ARMEABISupport,ffa
Binary files differ
diff --git a/frontends/riscos/distribution/3rdParty/ARMEABISupport/Copyright b/frontends/riscos/distribution/3rdParty/ARMEABISupport/Copyright
new file mode 100644
index 000000000..8bb7d7eb0
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/ARMEABISupport/Copyright
@@ -0,0 +1,20 @@
+Copyright (c) 2019-2022 Lee Noar
+Copyright (c) 2019-2022 GCCSDK Developers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+ * The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/frontends/riscos/distribution/3rdParty/ARMEABISupport/Origin,b28 b/frontends/riscos/distribution/3rdParty/ARMEABISupport/Origin,b28
new file mode 100644
index 000000000..246443e2c
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/ARMEABISupport/Origin,b28
@@ -0,0 +1 @@
+https://www.riscos.info/downloads/gccsdk/sharedunixlib/
diff --git a/frontends/riscos/distribution/3rdParty/AcornURI/!ReadMe b/frontends/riscos/distribution/3rdParty/AcornURI/!ReadMe
deleted file mode 100644
index 4f4ca1e24..000000000
--- a/frontends/riscos/distribution/3rdParty/AcornURI/!ReadMe
+++ /dev/null
@@ -1,34 +0,0 @@
-AcornURI 1.04
--------------
-
-Hi. This is a complete reimplementation of Acorn's URI module such that it
-works on Iyonix. This allows simple URI / URL launching from applications.
-Merge this !System with your own, then (re)launch your favourite browser to
-ensure it's running.
-
-This has a few advantages over the official offering: it's smaller,
-compatible with more browsers and more tolerant of errors.
-
-This is released under the terms of the LGPL, which is included in this
-archive as the file Copying. Previous versions of this module were released
-under the GPL, and are still available from sudden.recoil.org.
-
-Source is available from the same place you downloaded this archive, ie
-<http://sudden.recoil.org/others/acornuri/acornuri104src.zip>
-
-
-Changelog
----------
-
-v1.04 20-May-06 Relicensed under the LGPL (rather than GPL)
-
-v1.03 11-May-04 Changed the order of things to try, so it now
- always prefers browsers which are already loaded
-
-v1.02 19-Feb-04 Fixed claiming of URIs where I'd misread the spec
- Added automatic fall-back to the ANT protocol
- Removed some service calls to improve reliability
-
---
-Christian Ludlam
-chris@recoil.org \ No newline at end of file
diff --git a/frontends/riscos/distribution/3rdParty/AcornURI/Apache-2.0 b/frontends/riscos/distribution/3rdParty/AcornURI/Apache-2.0
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/AcornURI/Apache-2.0
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/frontends/riscos/distribution/3rdParty/AcornURI/Copying b/frontends/riscos/distribution/3rdParty/AcornURI/Copying
index 5ab7695ab..4c1b077bf 100644
--- a/frontends/riscos/distribution/3rdParty/AcornURI/Copying
+++ b/frontends/riscos/distribution/3rdParty/AcornURI/Copying
@@ -1,504 +1,22 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is 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 2.1 of the License, or (at your option) any later version.
-
- This library is 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 library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
+Files: URI
+Copyright:
+ 1995, 1998 Acorn Computers Ltd
+ 2000 Pace Micro Technology plc
+ 2007, 2008, 2013 Castle Technology Ltd
+License: Apache-2.0
+
+License: Apache-2.0
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ .
+ http://www.apache.org/licenses/LICENSE-2.0
+ .
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ .
+ The complete text of the Apache License Version 2.0 can be found in
+ in the file 'Apache-2.0'.
diff --git a/frontends/riscos/distribution/3rdParty/AcornURI/Origin,b28 b/frontends/riscos/distribution/3rdParty/AcornURI/Origin,b28
new file mode 100644
index 000000000..573a74db2
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/AcornURI/Origin,b28
@@ -0,0 +1 @@
+https://www.riscosopen.org/
diff --git a/frontends/riscos/distribution/3rdParty/Cache/Copyright b/frontends/riscos/distribution/3rdParty/Cache/Copyright
new file mode 100644
index 000000000..61d82856d
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Cache/Copyright
@@ -0,0 +1,20 @@
+Copyright 2007 Adam Richardson
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/frontends/riscos/distribution/3rdParty/Cache/Origin,b28 b/frontends/riscos/distribution/3rdParty/Cache/Origin,b28
new file mode 100644
index 000000000..ad677d3c9
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Cache/Origin,b28
@@ -0,0 +1 @@
+https://www.snowstone.org.uk/riscos/
diff --git a/frontends/riscos/distribution/3rdParty/CryptRand/Origin,b28 b/frontends/riscos/distribution/3rdParty/CryptRand/Origin,b28
new file mode 100644
index 000000000..f56f9d600
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/CryptRand/Origin,b28
@@ -0,0 +1 @@
+https://www.riscos.info/packages/arm/System
diff --git a/frontends/riscos/distribution/3rdParty/Iconv/COPYING b/frontends/riscos/distribution/3rdParty/Iconv/COPYING
new file mode 100644
index 000000000..266d65eb1
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Iconv/COPYING
@@ -0,0 +1,140 @@
+Files: *
+Copyright: 2004-13 J-M Bell
+License: MIT-like
+
+Files: src/transtab
+Copyright: 2000 Markus Kuhn
+License: transtab
+
+Files: test/GNU/*
+Copyright: 2000-2002, 2004-2005 Free Software Foundation, Inc.
+License: LGPL-2+
+
+Files: unicode/Unicode/*
+Copyright:
+ 1997 Acorn Computers Ltd
+ 1999, 2001 Pace Micro Technology plc
+License: Apache-2.0
+
+Files: unicode/Unicode/c/makealiases
+Copyright: 2008 John-Mark Bell
+License: MIT-like
+
+Files: unicode/Unicode/data/CharNames
+Copyright: 2002 Unicode, Inc
+License: Unicode
+
+Files: unicode/UnicodeLib/*
+Copyright:
+ 1997, 1998 Acorn Computers Ltd
+ 1997-2000 Pace Micro Technology PLC.
+ 1999 Element 14 Ltd
+ 2005, 2009, 2015 Castle Technology Ltd
+License: Apache-2.0
+
+Files: unicode/UnicodeLib/data/*
+Copyright:
+ 1991-2002 Unicode, Inc.
+License: Unicode
+
+License: Apache-2.0
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ .
+ http://www.apache.org/licenses/LICENSE-2.0
+ .
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ .
+ The complete text of the Apache License Version 2.0 can be found in
+ in the file 'licenses/Apache-2.0'.
+
+License: LGPL-2+
+ The GNU LIBICONV Library is free software; you can redistribute it
+ and/or modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+ .
+ The GNU LIBICONV Library is 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
+ Library General Public License for more details.
+ .
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU LIBICONV Library; see the file COPYING.LIB.
+ If not, write to the Free Software Foundation, Inc., 51 Franklin Street,
+ Fifth Floor, Boston, MA 02110-1301, USA.
+ .
+ The full text of the GNU Library General Public License version 2 can be
+ found in the file 'licenses/LGPL-2'.
+
+License: MIT-like
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ .
+ * The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+License: transtab
+ This package contains a table for transliterating ISO 10646 texts into
+ best-effort representations using smaller coded character sets (ASCII,
+ ISO 8859, etc.). It is primarily intended for inclusion into the GNU C
+ library, but might be of use for other applications as well. The table
+ is freely available to anyone.
+
+License: Unicode
+ UNICODE LICENSE V3
+ .
+ COPYRIGHT AND PERMISSION NOTICE
+ .
+ Copyright © 1991-2023 Unicode, Inc.
+ .
+ NOTICE TO USER: Carefully read the following legal agreement. BY
+ DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
+ SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+ TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
+ DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+ .
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of data files and any associated documentation (the "Data Files") or
+ software and any associated documentation (the "Software") to deal in the
+ Data Files or Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, and/or sell
+ copies of the Data Files or Software, and to permit persons to whom the
+ Data Files or Software are furnished to do so, provided that either (a)
+ this copyright and permission notice appear with all copies of the Data
+ Files or Software, or (b) this copyright and permission notice appear in
+ associated Documentation.
+ .
+ THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+ THIRD PARTY RIGHTS.
+ .
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
+ BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
+ OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
+ FILES OR SOFTWARE.
+ .
+ Except as contained in this notice, the name of a copyright holder shall
+ not be used in advertising or otherwise to promote the sale, use or other
+ dealings in these Data Files or Software without prior written
+ authorization of the copyright holder.
diff --git a/frontends/riscos/distribution/3rdParty/Iconv/Origin,b28 b/frontends/riscos/distribution/3rdParty/Iconv/Origin,b28
new file mode 100644
index 000000000..547a62896
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Iconv/Origin,b28
@@ -0,0 +1 @@
+https://www.netsurf-browser.org/iconv/
diff --git a/frontends/riscos/distribution/3rdParty/Iconv/ReadMe b/frontends/riscos/distribution/3rdParty/Iconv/ReadMe
index 907c2c7c8..f49a1b0b2 100644
--- a/frontends/riscos/distribution/3rdParty/Iconv/ReadMe
+++ b/frontends/riscos/distribution/3rdParty/Iconv/ReadMe
@@ -24,22 +24,5 @@ See the ReadMe file in that directory for further information.
Licence
=======
-Iconv is Copyright © 2004-13 J-M Bell
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
- * The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
+Please see the COPYING file for full licensing information. No part of the
+test suite is included in this binary distribution.
diff --git a/frontends/riscos/distribution/3rdParty/Iconv/licenses/Apache-2.0 b/frontends/riscos/distribution/3rdParty/Iconv/licenses/Apache-2.0
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Iconv/licenses/Apache-2.0
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/frontends/riscos/distribution/3rdParty/Iconv/licenses/LGPL-2 b/frontends/riscos/distribution/3rdParty/Iconv/licenses/LGPL-2
new file mode 100644
index 000000000..5bc8fb2c8
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Iconv/licenses/LGPL-2
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/frontends/riscos/distribution/3rdParty/SharedULib/Copyright b/frontends/riscos/distribution/3rdParty/SharedULib/Copyright
index b6784ed06..4939ec36e 100644
--- a/frontends/riscos/distribution/3rdParty/SharedULib/Copyright
+++ b/frontends/riscos/distribution/3rdParty/SharedULib/Copyright
@@ -7,9 +7,9 @@ Nicholas Clark and Peter Burwood.
These contributors have expressed "no interest" in any further licensing or
copyright in regards to UnixLib.
-Other sections are (c) 1999-2006 Nick Burrett, John Tytgat, Peter Naulls,
-Peter Teichmann, Alex Waugh, Christian Ludlam, Theo Markettos, Graham Shaw,
-James Bursa and John-Mark Bell.
+Other sections are (c) 1999-2011 Nick Burrett, John Tytgat, Peter Naulls,
+Lee Noar, Peter Teichmann, Alex Waugh, Christian Ludlam, Theo Markettos,
+Graham Shaw, James Bursa and John-Mark Bell.
In January 2005, permission was obtained from all relevant contributors
by Peter Naulls to license all past and present contributions to UnixLib
@@ -86,7 +86,7 @@ http://www.fsf.org/licenses/why-not-lgpl.html
===========================================================================
- Copyright (c) 1995-2005 UnixLib Developers
+ Copyright (c) 1995-2009 UnixLib Developers
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -280,7 +280,6 @@ works together with the library.
Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.
-
GNU LIBRARY GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -631,8 +630,8 @@ safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -658,7 +657,7 @@ necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
- <signature of Ty Coon>, 1 April 1990
+ <signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
diff --git a/frontends/riscos/distribution/3rdParty/SharedULib/Origin,b28 b/frontends/riscos/distribution/3rdParty/SharedULib/Origin,b28
new file mode 100644
index 000000000..246443e2c
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/SharedULib/Origin,b28
@@ -0,0 +1 @@
+https://www.riscos.info/downloads/gccsdk/sharedunixlib/
diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/!Info b/frontends/riscos/distribution/3rdParty/SocketWatch/!Info
new file mode 100644
index 000000000..cda797782
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/SocketWatch/!Info
@@ -0,0 +1,137 @@
+Name : SocketWatch
+Purpose: Asynchronous socket operations without null polls
+Version: 0.07 (11-01-2019)
+Status : GNU GPL
+Authors: Dickon Hood, Frank de Bruijn
+
+This isn't an official release.
+
+In November 2003 I noticed SocketWatch 0.04y had a couple of bugs. After I had
+corrected them and was almost ready to release 0.05, I discovered the
+'official' place for SocketWatch was now on the Nettle site
+(http://nettle.sourceforge.net). So I contacted the Nettle maintainers, told
+them about the bugs and sent them all the work I had done on repairing it,
+more or less expecting to hear something about an official release 0.05 within
+a couple of months...
+
+Still nothing three months later, so I sent one more e-mail (which remained
+unanswered) and put 0.05 on my site.
+
+
+Installing
+==========
+The zip archive contains an application called !ModInst. Run it to install the
+module on your computer. If you want to install the module manually, you can
+find it in !ModInst.Resources.!System.310.Modules.Network.
+
+
+Source
+======
+The source code is provided as an ObjAsm file in the Source directory in the
+archive. If you want to assemble the module again, run the Build file. The
+module will be recreated and moved to the !ModInst application for
+installation.
+
+
+Version history
+===============
+11-01-2019 0.07
+----------------
+Catered for errors in SocketWatch_Register better.
+Added notes about use with AcornSSL.
+
+12-06-2012
+----------
+Removed dependency on private library (providing constants) so the source can
+be used stand alone. Added Build script (previous builds were done from
+StrongED, using a multipurpose ObjAsmRun script). Nothing changed otherwise.
+MD5 checksum still f2bb3f8d911d0b20a43d6ee135c3ae97.
+
+23-06-2006 0.06
+----------------
+Fixed small bug in the AtomicReset SWI (flags not restored in 26 bit mode, so
+IRQ bit not cleared). Not sure if this ever bothered anyone (think not as it
+was already present in 0.04y).
+Removed disabling interrupts in EventHandler as event handlers are entered
+with interrupts disabled.
+Also some more source clean ups and more comments added.
+MD5 checksum: f2bb3f8d911d0b20a43d6ee135c3ae97.
+
+14-08-2005
+----------------
+Moved the source to ObjAsm. No functional changes to the code. MD5 checksum
+still 90f3323981a0e287f488e9a59b2e5373. No new release.
+
+12-12-2003 0.05
+----------------
+First one by me. Came about when I was investigating a memory leak on my RPC.
+MD5 checksum of the module: 90f3323981a0e287f488e9a59b2e5373.
+
+The detailed list of changes below was for the benefit of the Nettle
+maintainers and originally sent to Ian in an e-mail on 11-12-2003.
+Use the single file source of 0.04y as a reference.
+
+- Most of the variable definitions from Flags% to r12End% aren't required. You
+ just need SockList% (with a FNdb(-4) instead of a FNdb(4)) and r12End%. The
+ rest was removed.
+- No flag definitions are needed. Removed.
+- Socket structure definitions and ErrorChunk%: no changes.
+- From the module header to EventHandler_GotOne32%: merely some optimisations.
+- Error texts: were placed near the routines that use them. This was mainly
+ cosmetic, but it had the added advantage of allowing me to replace all the
+ FNADRLs with simple ADRs.
+- GetBlock%: removed.
+- ReleaseBlock%: removed.
+- IsHexNum_lp1%: not required. Removed.
+- moveBytes%: not required. Removed.
+- From title string to SWI-handler: no real changes.
+- From Command% to CommandText%: moved the table and the help and syntax texts
+ for the commands to just before the SWDL_Code% routine and 'cleaned up' the
+ texts a bit, but that qualifies as cosmetic.
+- Syslog_Name%: not required. Removed.
+- Syslog_Version%: not required. Removed.
+- From Init% to FinalCode%: several changes, the most important one being the
+ removal of the claiming of a 16K block of temporary workspace which was
+ neither used nor released.
+ There's also the stacking of r7 to r9/r11. It's true that these registers
+ should be saved (according to the PRM) but only if they're modified. So why
+ bother if they're not? Replacing this with just stacking r14 enabled a
+ 'cleaner' jump out of the routines on errors.
+ At the very beginning of Init%, I inserted a check for a value in r12 on
+ entry. This has to do with re-initialisation after a 'Tidy' operation. Not
+ sure if that's still required though (hasn't the 'Tidy' functionality been
+ blocked or removed from RISC OS these days or is that an unfounded rumour?).
+ I removed everything connected with the CRC-check, including the error text.
+ SocketWatch is the only module I've ever come across using something like
+ this and I honestly fail to see what use it is here. But if you do see that,
+ then by all means leave it in.
+ In Final% the (unused) ModuleDying% flag was set, but as that had been
+ removed anyway, so were the three instructions involved in this action.
+ Actually, as the variable Flags% was re-used to point at the module flags
+ word, this flag bit isn't set in the first word of the workspace at all. In
+ fact, on finalisation SocketWatch 0.04y sets bit 1 of the word 592 bytes
+ from the address r12 happens to point at. That *could* be in the unused 16K
+ block that was claimed on initialisation, but there's no guarantee. Nasty
+ (and no, I hadn't realised this yet when I wrote the comment on Flags% in
+ the Source_004y file...).
+ FinalCode% (renamed release%) was more or less integrated with Init% (sort
+ of 'glued to the bottom') but otherwise essentially unchanged, apart from
+ removing the call to ReleaseBlock% (including the stacking/unstacking of
+ r14) in favour of a simple MOV r0,#7 / SWI XOS_Module sequence).
+- SWI_Register% contained some code at the start (up to the Bvs instruction) I
+ couldn't make sense of. If you can, please enlighten me. I asked Dickon
+ about this in my first email to him and he didn't understand it anymore
+ either. So I removed it.
+ The rest is essentially unchanged (cosmetics only), but I did replace the
+ call to GetBlock% and the 'push' and 'pop' instructions around it with the
+ MOV/SWI instructions that were actually required here.
+- SWI_Deregister%: no changes except for replacing the call to ReleaseBlock%
+ and its surrounding 'push'/'pop' with the necessary MOV and SWI.
+- SWI_AtomicReset%: optimisations only.
+- SWI_AllocPW%: no changes.
+- SWI_DeallocPW%: no changes.
+- SWDL_Code%: cosmetic changes only.
+
+02-12-2002 0.04y
+-----------------
+By Dickon Hood. See the !ReadMe file.
diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Origin,b28 b/frontends/riscos/distribution/3rdParty/SocketWatch/Origin,b28
new file mode 100644
index 000000000..34a71d981
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Origin,b28
@@ -0,0 +1 @@
+https://www.aconet.org/tools/
diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Source/!ReadMe b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/!ReadMe
new file mode 100644
index 000000000..ea24c7802
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/!ReadMe
@@ -0,0 +1,133 @@
+Document v0.07. (C) Dickon Hood, see licence for details of copying etc.
+
+
+SocketWatch
+===========
+
+SocketWatch is a simple module designed to reduce the requirement of Wimp
+applications using sockets to constantly poll them using Null Wimp polls for
+data.
+
+If you're not a programmer, stop reading now, this will probably make little
+sense to you. If you are a programmer, but don't write networking
+applications, again, this is unlikely to be of interest.
+
+
+Rationale
+---------
+
+At boot time, my machine loads and runs five seperate applications which
+require open sockets. As none of these have support modules associated with
+them, I'm assuming that they are constantly polling the sockets they open on
+null polls. This is inefficient.
+
+Sockets can be marked as asynchronous. If they are, an Internet event (19)
+is generated whenever something interesting happens to them. Events are only
+accessable to modules, however, and are useless in a Wimp environment. The
+answer is to write a module which does that and notifies the parent
+application that something has happened. If every application did this,
+there'd be another five or six modules running on my machine, all doing much
+the same job, which I don't need.
+
+This attempts to address the issue by implementing a module with an open
+interface, and one which is generic enough to be applicable to almost every
+app. which could want to use it.
+
+
+Usage
+-----
+
+SocketWatch relies upon a feature of Risc OS 3.1 and upwards, so won't work
+on ROS2. Sorry, but there we go.
+
+Sockets are registered with the module. At this point, the socket is marked
+as asynchronous (so the parent app. doesn't need to). A pollword and bit
+number to set are also supplied.
+
+As some internal structure has to be created, a pollword of 0 is acceptable,
+and, if passed, the module will use one of the words in this structure as the
+pollword. This is returned to the app. in r0.
+
+When an Internet event is triggered, the module scans all registered sockets.
+If one is matched, the appropriate bit is set in the pollword. This allows
+other bits to be reserved for other things. Note, it is not an error for a
+socket to have multiple pollwords associated with it; there is no reason I
+can think of for two apps. to share one socket (*why* is another matter, but
+it shouldn't be an error); these may both register PWs for them.
+
+Usage with AcornSSL
+-------------------
+SocketWatch should only be used with the normal socket numbers, not the ssl
+socket handles used by AcornSSL.
+However, it can be used for secure sockets with a sequence like:
+ Socket_Create to get socket normal socket descriptor
+ AcornSSL_CreateSession to get ssl socket
+ SocketWatch_Register of normal socket descriptor
+
+SWIs
+----
+
+SWI SocketWatch_Register (0x52280)
+
+On entry: r0 => pollword, 0 for module to allocate one,
+ r1 = bitmask to set if there's activity
+ r2 = socket number.
+
+On exit: r0 => pollword.
+ If an error is raised by Socket_Ioctl, r0 is => error block
+ and the socket is not registered.
+
+If the pollword passed is 0, one allocated from the internal structure will
+be returned. Note that this is freed when at the time of deregistering and
+may not be used afterwards.
+
+
+
+SWI SocketWatch_Deregister (0x52281)
+
+On entry: r0 = socket,
+ r1 => pollword.
+
+On exit: all preserved.
+
+The socket is no longer watched. If the pollword was allocated by the
+module, it is not valid once this call is called.
+
+
+
+SWI SocketWatch_AtomicReset (0x52282)
+
+On entry: r0 => pollword
+ r1 = new value
+
+On exit: r0 = old value
+ r1 preserved.
+
+This SWI reads from r0, writes r1 to r0, then exits, all with IRQs off,
+making it an atomic operation (ie., one which may not be interrupted). It is
+a problem with Pollwords in that they're used by IRQ or Callback code, yet
+read and reset by usermode code which can't disable IRQs easily. This
+removes the problem where the app. reads the PW, IRQ routine sets a couple of
+bits, then the forground resets it.
+
+
+
+SWI SocketWatch_AllocPW (0x52283)
+
+On entry: -
+
+On exit: r0 => 4 bytes of RAM which may be released by SWI
+SocketWatch_DeallocPW.
+
+ATM, this SWI claims four bytes of RMA; this isn't efficient, and may be
+changed in later releases. The SWI is provided for convenience's sake.
+
+
+
+SWI SocketWatch_DeallocPW (0x52284)
+
+On entry: r0 => pollword, as allocated by SWI SocketWatch_AllocPW.
+
+On exit: all preserved.
+
+ATM this calls OS_Module 7 to free the word.
diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Build,fd7 b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Build,fd7
new file mode 100644
index 000000000..e7418707d
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Build,fd7
@@ -0,0 +1,16 @@
+| SocketWatchBuild 1.00 12-06-2012
+
+Set SocketWatchSource$Dir <Obey$Dir>
+Set SocketWatchTarget$Dir <SocketWatchSource$Dir>.^.!ModInst.Resources.!System.310.Modules.Network
+
+RMEnsure DDEUtils 0.00 IfThere System:Modules.DDEUtils Then RMLoad System:Modules.DDEUtils
+RMEnsure DDEUtils 0.00 Error DDEUtils module not found
+
+ObjAsm -throwback <SocketWatchSource$Dir>.Source <SocketWatchSource$Dir>.[Object]
+Link -verbose -rmf -output <SocketWatchSource$Dir>.SockWatch <SocketWatchSource$Dir>.[Object]
+Remove <SocketWatchSource$Dir>.[Object]
+
+IfThere <SocketWatchTarget$Dir> Then Copy <SocketWatchSource$Dir>.SockWatch <SocketWatchTarget$Dir>.* A~CDF~L~N~P~Q~R~S~T~V
+
+Unset SocketWatchTarget$Dir
+Unset SocketWatchSource$Dir \ No newline at end of file
diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Licence b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Licence
new file mode 100644
index 000000000..dc63aaca0
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Licence
@@ -0,0 +1,340 @@
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Source b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Source
new file mode 100644
index 000000000..03b48b088
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/SocketWatch/Source/Source
@@ -0,0 +1,461 @@
+; SocketWatch.Source 0.07 11-01-2019
+
+; This is the source code for version 0.07 of the SocketWatch module, originally by Dickon Hood.
+; It's GNU GPL (see the file 'Licence').
+; See the !Info file for more information.
+;
+; Frank de Bruijn, June 2006.
+; v0.07 (11/01/2019) Martin Avison catered for errors using AcornSSL, and any other Ioctl errors:
+; AcornSSL_Ioctl will set FIOASYNC for SSL sockets ... but Internet event gives
+; base integer socket, so SocketWatch cannot match it on socket & pollword.
+; Socketwatch must therefore only be used with base integer socket descriptors,
+; (although they may be secured using AcornSSL_CreateSession).
+; If Socket_Ioctl is called with SSL socket, it gives error 'Bad file descriptor' but registers it.
+; This change removes any registration after any Ioctl error, and returns the error.
+;
+
+ GBLS NAME
+ GBLS VERSION
+ GBLS DATE
+NAME SETS "SocketWatch"
+VERSION SETS "0.07"
+DATE SETS "11 Jan 2019"
+
+wp RN r12 ; workspace pointer
+
+X * &20000 ; bit 17
+
+OS_Write0 * &02 ; some SWIs
+OS_NewLine * &03
+OS_Byte * &06
+OS_Module * &1E
+OS_Claim * &1F
+OS_Release * &20
+OS_ConvertHex8 * &D4
+Socket_Ioctl * &41212
+
+iFlag26 * 1<<27 ; IRQ flags
+iFlag32 * 1<<7
+
+ ^ 0
+SockList # 4 ; workspace block : entry to linked list, defined below
+WorkspaceSize * @ ; size of block
+
+ ^ 0
+SockNext # 4 ; socket structure: next in list
+SockDescriptor # 4 ; the socket this describes
+SockPollword # 4 ; pollword for this socket
+SockBits # 4 ; bit to set (0..31) in the pollword if there's activity
+SockSize # 4 ; size of an entry
+
+SWIChunk * &52280
+ErrorChunk * &815B00
+
+
+ AREA codeblock,CODE,READONLY
+
+
+ ENTRY
+
+
+ModuleHeader
+ DCD 0 ; no start code
+ DCD Initialise - ModuleHeader
+ DCD Finalise - ModuleHeader
+ DCD 0 ; no service call handler
+ DCD Title - ModuleHeader
+ DCD Help - ModuleHeader
+ DCD Commands - ModuleHeader
+ DCD SWIChunk
+ DCD SWIHandler - ModuleHeader
+ DCD SWITable - ModuleHeader
+ DCD 0 ; no SWI decoding code
+ DCD 0 ; no Messages filename offset
+ DCD Flags - ModuleHeader
+
+
+Flags DCD 1
+
+
+Title DCB NAME,0
+
+
+Help DCB NAME,9,VERSION," (",DATE,") © 2002 Dickon Hood",0
+ ALIGN
+
+
+; ------------------------------------------------------------------------------------------------------------------------------------
+; Initialisation, finalisation - SVC mode
+; ------------------------------------------------------------------------------------------------------------------------------------
+
+Initialise ROUT
+; Entry : r10 = pointer to environment string
+; r11 = I/O base of instantiation number (PRM 1-208)
+; r12 = pointer to private word (non zero? then after OS_Module 8)
+; r13 = pointer to supervisor stack
+ STR lr, [sp, #-4]!
+ LDR r2, [wp]
+ TEQ r2, #0 ; don't (re)initialise if there's a value (pointer) in wp
+ LDRNE pc, [sp], #4
+ MOV r0, #6
+ MOV r3, #WorkspaceSize
+ SWI X+OS_Module
+ LDRVS pc, [sp], #4 ; exit if no room in RMA
+ STR r2, [wp]
+ MOV wp, r2
+ MOV r0, #0
+0000 STR r0, [r2], #4 ; clear workspace
+ SUBS r3, r3, #4
+ BGT %b0000
+ MOV r0, #16 ; EventV
+ ADR r1, EventHandler
+ MOV r2, wp ; workspace pointer
+ SWI X+OS_Claim
+ MOVVS r3, r0
+ BVS %f0020
+ MOV r0, #14 ; enable
+ MOV r1, #19 ; Internet event
+ SWI X+OS_Byte
+ LDRVC pc, [sp], #4
+ B %f0010
+Finalise ; (PRM 1-209, 3-73)
+; Entry : r10 = fatality indicator: 0=non fatal, 1=fatal
+; r11 = instantiation number
+; r12 = pointer to private word
+; r13 = pointer to supervisor stack
+ STR lr, [sp, #-4]!
+ LDR wp, [wp]
+ LDR r0, [wp, #SockList]
+ TEQ r0, #0
+ ADRNE r0, Finalise_Error
+ BNE %f0030
+0010 MOV r3, r0
+ MOV r0, #13 ; disable
+ MOV r1, #19 ; Internet event
+ SWI X+OS_Byte
+0020 MOV r0, #16 ; EventV
+ ADR r1, EventHandler
+ MOV r2, wp ; workspace pointer
+ SWI X+OS_Release
+ MOV r0, #7
+ MOV r2, wp
+ SWI X+OS_Module ; free workspace
+ SUBS r0, r3, #0
+ LDREQ pc, [sp], #4 ; V will be clear if Z is set
+0030 CMPVC r0, #1<<31
+ CMNVC r0, #1<<31 ; set V
+ LDR pc, [sp], #4
+Finalise_Error
+ DCD ErrorChunk+5
+ DCB "Still watching sockets - can't be killed yet",0
+ ALIGN
+
+
+; ------------------------------------------------------------------------------------------------------------------------------------
+; Event handling - SVC or IRQ mode
+; ------------------------------------------------------------------------------------------------------------------------------------
+
+EventHandler ROUT
+; Function: Handle an event by checking the thread flag and then setting up a callback flag (pollword) to process it.
+; Entry : r0 = event number
+; r1 = event reason
+; r2 = socket descriptor
+; interrupts disabled (PRM 1-146)
+ TEQ r0, #19
+ MOVNE pc, lr ; exit if not Internet event
+ TEQ r1, #1 ; or not 'data waiting'
+ TEQNE r1, #2 ; or not 'urgent data'
+ TEQNE r1, #3 ; or not 'connection broken'
+ MOVNE pc, lr
+ LDR r0, [wp, #SockList]
+ TEQ r0, #0 ; or not watching anything
+ MOVEQ r0, #19
+ MOVEQ pc, lr
+ STMFD sp!, {r1-r3, lr}
+0000 LDR lr, [r0, #SockDescriptor]
+ TEQ lr, r2 ; else find the right descriptor(s)
+ BNE %f0010
+ LDR r2, [r0, #SockBits]
+ LDR lr, [r0, #SockPollword]
+ LDR r1, [lr]
+ ORR r1, r1, r2
+ STR r1, [lr]
+0010 LDR r0, [r0, #SockNext]
+ TEQ r0, #0
+ BNE %b0000
+ MOV r0, #19 ; Internet event
+ LDMFD sp!, {r1-r3, pc}
+
+
+; ------------------------------------------------------------------------------------------------------------------------------------
+; SWI's - SVC mode
+; ----------------
+; Entry : r0-r9 = caller's values
+; r11 = five bottom bits of SWI number
+; r12 = pointer to private word
+; r13 = pointer to supervisor stack
+; r14 = return address as usual
+; ------------------------------------------------------------------------------------------------------------------------------------
+
+SWITable
+ DCB NAME,0
+ DCB "Register",0
+ DCB "Deregister",0
+ DCB "AtomicReset",0
+ DCB "AllocPW",0
+ DCB "DeallocPW",0
+ DCB 0 ; end of table
+ ALIGN
+
+
+SWIHandler ROUT
+ LDR wp, [wp]
+ CMP r11, #(%f0010-%f0000)/4
+ ADDLE pc, pc, r11, lsl #2
+ B %f0010
+0000 B SWI_Register
+ B SWI_Deregister
+ B SWI_AtomicReset
+ B SWI_AllocPW
+ B SWI_DeallocPW
+0010 CMPVC r0, #1<<31
+ CMNVC r0, #1<<31 ; set V
+ ADD r0, pc, #0
+ MOV pc, lr
+ DCD &1E6
+ DCB "No such SWI",0
+ ALIGN
+
+
+SWI_Register ROUT
+; Function: Returns the pollword in r0; if this is zero on entry, it assigns one itself.
+; Entry : r0 = pointer to pollword or zero
+; r1 = flag bits
+; r2 = socket descriptor (not a AcornSSL socket)
+ STMFD sp!, {r0-r4, lr}
+ MOV r4, r2 ; socket descriptor
+ TEQ r0, #0
+ MOVEQ r3, #SockSize+4 ; claim one word extra if the pollword is zero on entry
+ MOVNE r3, #SockSize
+ MOV r0, #6
+ SWI X+OS_Module
+ BVS %f0000
+ LDR r3, [wp, #SockList] ; previous start entry or zero
+ STR r2, [wp, #SockList] ; pointer to new block
+ STR r3, [r2, #SockNext]
+ LDR r0, [sp]
+ TEQ r0, #0
+ ADDEQ r0, r2, #SockSize ; use word in structure if pollword was zero on entry
+ STR r0, [r2, #SockPollword]
+ STR r0, [sp] ; store pointer to pollword in r0 on stack
+ STR r1, [r2, #SockBits]
+ STR r4, [r2, #SockDescriptor]
+ MOV r0, r4
+ LDR r1, Ioctl_FIOASYNC
+ ADR r2, Ioctl_Arg ; 'On'
+ SWI X+Socket_Ioctl ; set FIOASYNC
+ LDMVCFD sp!, {r0-r4, pc}
+; An error leaves the socket still 'registered' with some RMA workspace +v0.07
+; and returned r0 => error not pollword, so cannot be deregistered! +v0.07
+; Fixed to free the block again (and adjust chain) & then return error. +v0.07
+ STR r0, [sp] ; save error ptr for return +v0.07
+ LDR r2, [wp, #SockList] ; pointer to new block +v0.07
+ LDR r3, [r2, #SockNext] ; => next block +v0.07
+ STR r3, [wp, #SockList] ; and re-link +v0.07
+ MOV r0, #7 ; free the new block +v0.07
+ SWI X+OS_Module ; +v0.07
+ CMPVC r0, #1<<31 ; clear V +v0.07
+ CMNVC r0, #1<<31 ; set V +v0.07
+ LDMFD sp!, {r0-r4, pc} ; +v0.07
+
+0000 ADD sp, sp, #4 ; discard stacked r0
+ LDMFD sp!, {r1-r4, pc}
+Ioctl_FIOASYNC DCD &8004667D
+Ioctl_Arg DCD 1
+
+
+SWI_Deregister ROUT
+ STMFD sp!, {r0-r4, lr}
+ LDR r4, [wp, #SockList] ; get pointer to list
+ MOV r2, #0 ; set 'last' to zero
+0000 TEQ r4, #0
+ BEQ %f0010
+ LDR r3, [r4, #SockDescriptor]
+ TEQ r0, r3 ; sockets the same?
+ LDREQ r3, [r4, #SockPollword]
+ TEQEQ r1, r3 ; same pollword?
+ MOVNE r2, r4
+ LDRNE r4, [r4, #SockNext]
+ BNE %b0000
+ LDR r3, [r4, #SockNext]
+ TEQ r2, #0 ; was there a last one?
+ STRNE r3, [r2, #SockNext]
+ STREQ r3, [wp, #SockList]
+ MOV r2, r4
+ MOV r0, #7 ; free the block
+ SWI X+OS_Module
+ LDMFD sp!, {r0-r4, pc}
+0010 CMPVC r0, #1<<31
+ CMNVC r0, #1<<31 ; set V
+ ADD sp, sp, #4 ; discard stacked r0
+ ADD r0, pc, #0
+ LDMFD sp!, {r1-r4, pc}
+ DCD ErrorChunk+4
+ DCB "Attempt to free an unregistered socket/pollword pair",0
+ ALIGN
+
+
+SWI_AtomicReset ROUT
+ TEQ pc, pc
+ BEQ %f0000 ; in 32 bit mode
+ STMFD sp!, {lr}
+ TST lr, #iFlag26
+ TEQEQP lr, #iFlag26 ; IRQ off (no mode change, so no NOP required)
+ LDR lr, [r0]
+ STR r1, [r0]
+ MOV r0, lr
+ LDMFD sp!, {pc}^ ; IRQ restored (also clears V as this was clear on entry)
+0000 STMFD sp!, {r2, lr}
+ MRS r2, cpsr
+ ORR lr, r2, #iFlag32
+ MSR cpsr_c, lr ; IRQ off
+ LDR lr, [r0]
+ STR r1, [r0]
+ MOV r0, lr
+ MSR cpsr_c, r2 ; IRQ restored (also clears V as this was clear on entry)
+ LDMFD sp!, {r2, pc}
+
+
+SWI_AllocPW
+ STMFD sp!, {r2-r3, lr}
+ MOV r0, #6
+ MOV r3, #4
+ SWI X+OS_Module
+ MOVVC r0, r2
+ LDMFD sp!, {r2-r3, pc}
+
+
+SWI_DeallocPW ROUT
+ STMFD sp!, {r0-r3, lr}
+ MOV r3, r0
+ MOV r1, r0
+ LDR r2, [wp, #SockList]
+ TEQ r2, #0
+ BEQ %f0010
+0000 LDR r0, [r2, #SockPollword]
+ TEQ r0, r1
+ LDREQ r0, [r2, #SockDescriptor]
+ LDR r2, [r2, #SockNext]
+ BLEQ SWI_Deregister
+ TEQ r2, #0
+ BNE %b0000
+0010 MOV r2, r3
+ MOV r0, #7
+ SWI X+OS_Module
+ LDMVCFD sp!, {r0-r3, pc}
+ ADD sp, sp, #4
+ LDMFD sp!, {r1-r3, pc}
+
+
+; ------------------------------------------------------------------------------------------------------------------------------------
+; Commands - SVC mode
+; -------------------
+; Entry : r0 = pointer to command tail
+; r1 = number of parameters
+; r12 = pointer to private word
+; r13 = stack pointer
+; r14 = return address
+; Exit : r0 = pointer to error block if V=1
+; r7-r11 = must be unaltered
+; ------------------------------------------------------------------------------------------------------------------------------------
+
+Commands
+ DCB NAME,0 ; command name
+ ALIGN
+ DCD 0 ; no command code
+ DCD 0 ; no information
+ DCD 0 ; no invalid syntax - use default
+ DCD Help_Name - ModuleHeader
+
+ DCB NAME,"_DumpList",0 ; command name
+ ALIGN
+ DCD Command_DumpList - ModuleHeader
+ DCD 0 ; no information
+ DCD Syntax_DumpList - ModuleHeader
+ DCD Help_DumpList - ModuleHeader
+
+ DCD 0 ; end of table
+
+Help_Name
+ DCB "The ",NAME," module enables applications to do asynchronous socket",13,10
+ DCB "operations without null polls. See the !ReadMe file for more information.",13,10
+ DCB "This module is released under the terms of the GNU General Public License.",0
+
+Help_DumpList
+ DCB "*",NAME,"_DumpList dumps the current list of watched sockets.",13,10
+ DCB "Useful for debugging purposes.",13,10
+ DCB "Syntax: "
+Syntax_DumpList
+ DCB "*",NAME,"_DumpList",0
+
+ ALIGN
+
+
+Command_DumpList ROUT
+ LDR wp, [wp]
+ STR lr, [sp, #-4]!
+ LDR r6, [wp, #SockList]
+ TEQ r6, #0
+ BEQ %f0010
+ SUB sp, sp, #12 ; get some scratch space...
+0000 ADR r0, SWDL_x
+ SWI X+OS_Write0
+ LDR r0, [r6, #SockDescriptor]
+ MOV r1, sp
+ MOV r2, #9
+ SWI X+OS_ConvertHex8
+ ADDVS r0, r0, #4
+ SWI X+OS_Write0
+ ADR r0, SWDL_y
+ SWI X+OS_Write0
+ LDR r0, [r6, #SockPollword]
+ MOV r1, sp
+ MOV r2, #9
+ SWI X+OS_ConvertHex8
+ ADDVS r0, r0, #4
+ SWI X+OS_Write0
+ ADR r0, SWDL_z
+ SWI X+OS_Write0
+ LDR r0, [r6, #SockBits]
+ MOV r1, sp
+ MOV r2, #9
+ SWI X+OS_ConvertHex8
+ ADDVS r0, r0, #4
+ SWI X+OS_Write0
+ SWI X+OS_NewLine
+ LDR r6, [r6, #SockNext]
+ TEQ r6, #0
+ BNE %b0000
+ ADD sp, sp, #12
+ LDR pc, [sp], #4
+0010 ADR r0, SWDL_NowtString
+ SWI OS_Write0
+ SWI OS_NewLine
+ LDR pc, [sp], #4
+SWDL_x DCB "Socket 0x",0
+SWDL_y DCB ", pollword 0x",0
+SWDL_z DCB ", bitmask 0x",0
+ ALIGN
+SWDL_NowtString
+ DCB "Nothing registered - nothing to do",0
+ ALIGN
+
+
+ DCB 10,10
+ DCB "Dickon Hood: dickon@fluff.org, dickon@oaktree.co.uk, in order of preference.",10
+ DCB "Frank de Bruijn: frank@aconet.org",10
+ DCB 10
+ ALIGN
+
+
+ END
diff --git a/frontends/riscos/distribution/3rdParty/Tinct/Origin,b28 b/frontends/riscos/distribution/3rdParty/Tinct/Origin,b28
new file mode 100644
index 000000000..3081d9159
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Tinct/Origin,b28
@@ -0,0 +1 @@
+http://www.tinct.net/tinct.asp
diff --git a/frontends/riscos/distribution/3rdParty/Unicode/Apache-2.0 b/frontends/riscos/distribution/3rdParty/Unicode/Apache-2.0
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Unicode/Apache-2.0
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/frontends/riscos/distribution/3rdParty/Unicode/Copyright b/frontends/riscos/distribution/3rdParty/Unicode/Copyright
new file mode 100644
index 000000000..f1a33a5d0
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Unicode/Copyright
@@ -0,0 +1,66 @@
+Files: !Unicode.*
+Copyright:
+ 1997 Acorn Computers Ltd
+ 1999, 2001 Pace Micro Technology plc
+License: Apache-2.0
+
+Files: !Unicode.Files.CharNames
+Copyright: 2002 Unicode, Inc
+License: Unicode
+
+License: Apache-2.0
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ .
+ http://www.apache.org/licenses/LICENSE-2.0
+ .
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ .
+ The complete text of the Apache License Version 2.0 can be found in
+ in the file 'Apache-2.0'.
+
+License: Unicode
+ UNICODE LICENSE V3
+ .
+ COPYRIGHT AND PERMISSION NOTICE
+ .
+ Copyright © 1991-2023 Unicode, Inc.
+ .
+ NOTICE TO USER: Carefully read the following legal agreement. BY
+ DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
+ SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+ TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
+ DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+ .
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of data files and any associated documentation (the "Data Files") or
+ software and any associated documentation (the "Software") to deal in the
+ Data Files or Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, and/or sell
+ copies of the Data Files or Software, and to permit persons to whom the
+ Data Files or Software are furnished to do so, provided that either (a)
+ this copyright and permission notice appear with all copies of the Data
+ Files or Software, or (b) this copyright and permission notice appear in
+ associated Documentation.
+ .
+ THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+ THIRD PARTY RIGHTS.
+ .
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
+ BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
+ OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
+ FILES OR SOFTWARE.
+ .
+ Except as contained in this notice, the name of a copyright holder shall
+ not be used in advertising or otherwise to promote the sale, use or other
+ dealings in these Data Files or Software without prior written
+ authorization of the copyright holder.
diff --git a/frontends/riscos/distribution/3rdParty/Unicode/Origin,b28 b/frontends/riscos/distribution/3rdParty/Unicode/Origin,b28
new file mode 100644
index 000000000..573a74db2
--- /dev/null
+++ b/frontends/riscos/distribution/3rdParty/Unicode/Origin,b28
@@ -0,0 +1 @@
+https://www.riscosopen.org/
diff --git a/frontends/riscos/distribution/LeesMij b/frontends/riscos/distribution/LeesMij
index a0d3ff41f..3a48b77ec 100644
--- a/frontends/riscos/distribution/LeesMij
+++ b/frontends/riscos/distribution/LeesMij
@@ -6,7 +6,7 @@ broncode.
De nieuwste versie van NetSurf is verkrijgbaar via:
- http://www.netsurf-browser.org/
+ https://www.netsurf-browser.org/
Installatie
@@ -59,15 +59,3 @@ voor meer informatie.
De meegeleverde !Boot- en !System-mappen bevatten items die door
derden zijn geproduceerd. De bijbehorende licenties zijn meegeleverd
in de map '3rdParty'.
-
-AcornURI
- http://sudden.recoil.org/others/
-
-Iconv
- http://www.netsurf-browser.org/iconv/
-
-SharedUnixLibrary
- http://www.riscos.info/downloads/gccsdk/sharedunixlib/system.zip
-
-Tinct
- http://www.tinct.net/tinct.asp
diff --git a/frontends/riscos/distribution/ReadMe b/frontends/riscos/distribution/ReadMe
index eec39d6ab..6a4429b12 100644
--- a/frontends/riscos/distribution/ReadMe
+++ b/frontends/riscos/distribution/ReadMe
@@ -5,7 +5,7 @@ This is a development build of NetSurf, an open source web browser.
The latest version of NetSurf is available from:
- http://www.netsurf-browser.org/
+ https://www.netsurf-browser.org/
Installation
@@ -31,7 +31,10 @@ Double click on !NetSurf in your chosen location to launch NetSurf.
Note NetSurf requires WindowManager 3.80 or later. This comes
with RISC OS 4 and above. RISC OS 3 users should install
the Universal Boot Sequence from:
- http://acorn.riscos.com/riscos/releases/UniBoot/
+ http://www.riscos.com/ftp_space/generic/uniboot/ or,
+ alternatively, use the HardDisc4 and associated System
+ resources provided by RISC OS Open:
+ https://www.riscosopen.org/content/downloads/common
Note RISC OS 3.1 and earlier are not supported.
@@ -45,17 +48,5 @@ for details.
The !Boot and !System directories contain items provided produced
-by third parties. Their licences are provided in the 3rd Party
-directory.
-
-AcornURI
- http://sudden.recoil.org/others/
-
-Iconv
- http://www.netsurf-browser.org/iconv/
-
-SharedUnixLibrary
- http://www.riscos.info/downloads/gccsdk/sharedunixlib/system.zip
-
-Tinct
- http://www.tinct.net/tinct.asp
+by third parties. Their licences, associated documentation, and
+origin are provided in the 3rd Party directory.
diff --git a/frontends/riscos/gui.c b/frontends/riscos/gui.c
index 22f6f257c..56296951f 100644
--- a/frontends/riscos/gui.c
+++ b/frontends/riscos/gui.c
@@ -26,8 +26,10 @@
#include <assert.h>
#include <errno.h>
#include <signal.h>
+#include <unistd.h>
#include <unixlib/local.h>
#include <fpu_control.h>
+#include <swis.h>
#include <oslib/help.h>
#include <oslib/uri.h>
#include <oslib/inetsuite.h>
@@ -38,6 +40,7 @@
#include <oslib/osbyte.h>
#include <oslib/osmodule.h>
#include <oslib/osfscontrol.h>
+#include <oslib/socket.h>
#include "utils/utils.h"
#include "utils/nsoption.h"
@@ -57,6 +60,7 @@
#include "desktop/save_complete.h"
#include "desktop/hotlist.h"
#include "content/backing_store.h"
+#include "content/fetch.h"
#include "riscos/gui.h"
#include "riscos/bitmap.h"
@@ -113,11 +117,14 @@ static const char *task_name = "NetSurf";
ro_gui_drag_type gui_current_drag_type;
wimp_t task_handle; /**< RISC OS wimp task handle. */
-static clock_t gui_last_poll; /**< Time of last wimp_poll. */
osspriteop_area *gui_sprites; /**< Sprite area containing pointer and hotlist sprites */
#define DIR_SEP ('.')
+static void *pollword;
+static int *sockets_active;
+static size_t sockets_active_size;
+
/**
* Accepted wimp user messages.
*/
@@ -144,27 +151,6 @@ static ns_wimp_message_list task_messages = {
message_URI_PROCESS,
message_URI_RETURN_RESULT,
message_INET_SUITE_OPEN_URL,
-#ifdef WITH_PLUGIN
- message_PLUG_IN_OPENING,
- message_PLUG_IN_CLOSED,
- message_PLUG_IN_RESHAPE_REQUEST,
- message_PLUG_IN_FOCUS,
- message_PLUG_IN_URL_ACCESS,
- message_PLUG_IN_STATUS,
- message_PLUG_IN_BUSY,
- message_PLUG_IN_STREAM_NEW,
- message_PLUG_IN_STREAM_WRITE,
- message_PLUG_IN_STREAM_WRITTEN,
- message_PLUG_IN_STREAM_DESTROY,
- message_PLUG_IN_OPEN,
- message_PLUG_IN_CLOSE,
- message_PLUG_IN_RESHAPE,
- message_PLUG_IN_STREAM_AS_FILE,
- message_PLUG_IN_NOTIFY,
- message_PLUG_IN_ABORT,
- message_PLUG_IN_ACTION,
- /* message_PLUG_IN_INFORMED, (not provided by oslib) */
-#endif
message_PRINT_SAVE,
message_PRINT_ERROR,
message_PRINT_TYPE_ODD,
@@ -409,6 +395,19 @@ static void ro_gui_cleanup(void)
xhourglass_off();
/* Uninstall NetSurf-specific fonts */
xos_cli("FontRemove NetSurf:Resources.Fonts.");
+ if (pollword != NULL) {
+ size_t i;
+ /* Deregister any remaining sockets from SocketWatch */
+ for (i = 0; i < sockets_active_size; i++) {
+ if (sockets_active[i] != -1) {
+ /* SocketWatch_Deregister */
+ (void) _swix(0x52281, _INR(0,1),
+ sockets_active[i], pollword);
+ sockets_active[i] = -1;
+ }
+ }
+ xosmodule_free(pollword);
+ }
}
@@ -1134,6 +1133,101 @@ static bool ro_gui__os_alpha_sprites_supported(void)
return (var_val == (1 << 15));
}
+static int ro_gui_socket_open(int domain, int type, int protocol)
+{
+ int sock = socket(domain, type, protocol);
+ if (sock != -1) {
+ size_t i;
+ int rosock;
+ _kernel_oserror *error;
+
+ rosock = __get_ro_socket(sock);
+ if (rosock == -1) {
+ close(sock);
+ errno = ENOMEM;
+ return -1;
+ }
+
+ /* SocketWatch_Register */
+ error = _swix(0x52280, _INR(0,2), pollword, 0x1, rosock);
+ if (error != NULL) {
+ close(sock);
+ errno = ENOMEM;
+ return -1;
+ }
+
+ /* Insert RISC OS socket handle into sockets_active */
+ for (i = 0; i < sockets_active_size; i++) {
+ if (sockets_active[i] == -1) {
+ sockets_active[i] = rosock;
+ break;
+ }
+ }
+ if (i == sockets_active_size) {
+ /* No free slots: expand table */
+ int *tmp = realloc(sockets_active,
+ sockets_active_size * 2 * sizeof(int));
+ if (tmp == NULL) {
+ /* SocketWatch_Deregister */
+ (void) _swix(0x52281, _INR(0,1), rosock, pollword);
+ close(sock);
+ errno = ENOMEM;
+ return -1;
+ }
+ memset(sockets_active + sockets_active_size, 0xff,
+ sockets_active_size * sizeof(int));
+ sockets_active_size *= 2;
+ sockets_active[i] = rosock;
+ }
+ }
+ return sock;
+}
+
+static int ro_gui_socket_close(int socket)
+{
+ int rosock;
+
+ rosock = __get_ro_socket(socket);
+ if (rosock != -1) {
+ size_t i;
+ /* Invalidate active sockets entry */
+ for (i = 0; i < sockets_active_size; i++) {
+ if (sockets_active[i] == rosock) {
+ sockets_active[i] = -1;
+ break;
+ }
+ }
+ /* SocketWatch_Deregister */
+ (void) _swix(0x52281, _INR(0,1), rosock, pollword);
+ }
+
+ return close(socket);
+}
+
+/**
+ * Set up internet event handling
+ */
+static os_error *ro_gui_init_internet_event(void)
+{
+ static os_error nomem = { 1, "No memory"};
+ os_error *error;
+
+ sockets_active = malloc(32 * sizeof(int));
+ if (sockets_active == NULL) {
+ return &nomem;
+ }
+ memset(sockets_active, 0xff, 32 * sizeof(int));
+ sockets_active_size = 32;
+
+ error = xosmodule_alloc(4, &pollword);
+ if (error != NULL) {
+ return error;
+ }
+
+ *((uint32_t*) pollword) = 0;
+ return NULL;
+}
+
/**
* Initialise the RISC OS specific GUI.
*
@@ -1235,6 +1329,14 @@ static nserror gui_init(int argc, char** argv)
urldb_load(nsoption_charp(url_path));
urldb_load_cookies(nsoption_charp(cookie_file));
+ /* Setup Internet event handling (must be after atexit) */
+ error = ro_gui_init_internet_event();
+ if (error != NULL) {
+ NSLOG(netsurf, INFO, "init_internet_event: 0x%x: %s",
+ error->errnum, error->errmess);
+ die(error->errmess);
+ }
+
/* Initialise with the wimp */
error = xwimp_initialise(wimp_VERSION_RO38, task_name,
PTR_WIMP_MESSAGE_LIST(&task_messages), 0,
@@ -1779,51 +1881,6 @@ static void ro_gui_user_message(wimp_event_no event, wimp_message *message)
ro_url_message_received(message);
}
break;
-#ifdef WITH_PLUGIN
- case message_PLUG_IN_OPENING:
- plugin_opening(message);
- break;
- case message_PLUG_IN_CLOSED:
- plugin_closed(message);
- break;
- case message_PLUG_IN_RESHAPE_REQUEST:
- plugin_reshape_request(message);
- break;
- case message_PLUG_IN_FOCUS:
- break;
- case message_PLUG_IN_URL_ACCESS:
- plugin_url_access(message);
- break;
- case message_PLUG_IN_STATUS:
- plugin_status(message);
- break;
- case message_PLUG_IN_BUSY:
- break;
- case message_PLUG_IN_STREAM_NEW:
- plugin_stream_new(message);
- break;
- case message_PLUG_IN_STREAM_WRITE:
- break;
- case message_PLUG_IN_STREAM_WRITTEN:
- plugin_stream_written(message);
- break;
- case message_PLUG_IN_STREAM_DESTROY:
- break;
- case message_PLUG_IN_OPEN:
- if (event == wimp_USER_MESSAGE_ACKNOWLEDGE)
- plugin_open_msg(message);
- break;
- case message_PLUG_IN_CLOSE:
- if (event == wimp_USER_MESSAGE_ACKNOWLEDGE)
- plugin_close_msg(message);
- break;
- case message_PLUG_IN_RESHAPE:
- case message_PLUG_IN_STREAM_AS_FILE:
- case message_PLUG_IN_NOTIFY:
- case message_PLUG_IN_ABORT:
- case message_PLUG_IN_ACTION:
- break;
-#endif
case message_PRINT_SAVE:
if (event == wimp_USER_MESSAGE_ACKNOWLEDGE)
ro_print_save_bounce(message);
@@ -1903,6 +1960,14 @@ static void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
ro_gui_scroll(&(block->scroll));
break;
+ case wimp_POLLWORD_NON_ZERO:
+ /* simply reset pollword */
+ if (pollword != NULL) {
+ /* SocketWatch_AtomicReset */
+ _swix(0x52282, _INR(0,1), pollword, 0);
+ }
+ break;
+
case wimp_USER_MESSAGE:
case wimp_USER_MESSAGE_RECORDED:
case wimp_USER_MESSAGE_ACKNOWLEDGE:
@@ -1919,44 +1984,54 @@ static void riscos_poll(void)
{
wimp_event_no event;
wimp_block block;
- const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN | wimp_SAVE_FP;
- os_t track_poll_offset;
+ const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN |
+ wimp_GIVEN_POLLWORD | wimp_SAVE_FP;
+ os_t t, track_poll_offset;
- /* Poll wimp. */
- xhourglass_off();
- track_poll_offset = ro_mouse_poll_interval();
- if (sched_active || (track_poll_offset > 0)) {
- os_t t = os_read_monotonic_time();
+ /* Drain pending non-pollword events until the first NULL event */
+ do {
+ xhourglass_off();
+ event = wimp_poll(wimp_MASK_POLLWORD | mask, &block, pollword);
+ xhourglass_on();
- if (track_poll_offset > 0) {
- t += track_poll_offset;
- } else {
- t += 10;
- }
+ ro_gui_handle_event(event, &block);
+ } while (event != wimp_NULL_REASON_CODE);
- if (sched_active && (sched_time - t) < 0) {
- t = sched_time;
- }
+ /* Redraw window contents */
+ ro_gui_window_update_boxes();
+
+ /* Run scheduled callbacks, if any */
+ schedule_run();
+
+ /* Drive any active fetches. */
+ {
+ fd_set read_fd_set, write_fd_set, exc_fd_set;
+ int max_fd;
+
+ fetch_fdset(&read_fd_set, &write_fd_set, &exc_fd_set, &max_fd);
+ }
- event = wimp_poll_idle(mask, &block, t, 0);
+ /* Poll wimp in the ordinary way. */
+ xhourglass_off();
+ t = os_read_monotonic_time();
+ track_poll_offset = ro_mouse_poll_interval();
+ /* Work out how long we're prepared to wait for an event */
+ if (track_poll_offset > 0) {
+ t += track_poll_offset;
+ } else if (sched_active) {
+ t += 10;
} else {
- event = wimp_poll(wimp_MASK_NULL | mask, &block, 0);
+ t += 100;
}
+ /* And then clamp that to min(sched_time, t) */
+ if (sched_active && (sched_time - t) < 0) {
+ t = sched_time;
+ }
+
+ event = wimp_poll_idle(mask, &block, t, pollword);
xhourglass_on();
- gui_last_poll = clock();
ro_gui_handle_event(event, &block);
-
- /* Only run scheduled callbacks on a null poll
- * We cannot do this in the null event handler, as that may be called
- * from gui_multitask(). Scheduled callbacks must only be run from the
- * top-level.
- */
- if (event == wimp_NULL_REASON_CODE) {
- schedule_run();
- }
-
- ro_gui_window_update_boxes();
}
@@ -2455,6 +2530,8 @@ static struct gui_fetch_table riscos_fetch_table = {
.get_resource_url = gui_get_resource_url,
.mimetype = fetch_mimetype,
+ .socket_open = ro_gui_socket_open,
+ .socket_close = ro_gui_socket_close,
};
static struct gui_misc_table riscos_misc_table = {
diff --git a/frontends/riscos/image.c b/frontends/riscos/image.c
index 4cced0f8a..5c90b05ba 100644
--- a/frontends/riscos/image.c
+++ b/frontends/riscos/image.c
@@ -172,17 +172,19 @@ static bool image_redraw_os(osspriteop_id header, int x, int y, int req_width,
* Only replaces mode if existing mode matches \ref old.
*
* \param[in] area The sprite area containing the sprite.
+ * \param[in] type Requested plot mode.
* \param[in] old Existing sprite mode to check for.
* \param[in] new Sprite mode to set if existing mode is expected.
*/
static inline void image__override_sprite_mode(
osspriteop_area *area,
+ image_type type,
os_mode old,
os_mode new)
{
osspriteop_header *sprite = (osspriteop_header *)(area + 1);
- if (sprite->mode == old) {
+ if (sprite->mode == old && type == IMAGE_PLOT_TINCT_ALPHA) {
sprite->mode = new;
}
}
@@ -209,6 +211,7 @@ bool image_redraw(osspriteop_area *area, int x, int y, int req_width,
colour background_colour,
bool repeatx, bool repeaty, bool background, image_type type)
{
+ image_type used_type = type;
unsigned int tinct_options;
bool tinct_avoid = false;
bool res = false;
@@ -236,7 +239,7 @@ bool image_redraw(osspriteop_area *area, int x, int y, int req_width,
* is that we lose the optimisation for tiling tiny bitmaps.
*/
if (tinct_options & tinct_USE_OS_SPRITE_OP) {
- type = IMAGE_PLOT_OS;
+ used_type = IMAGE_PLOT_OS;
tinct_avoid = true;
}
}
@@ -253,7 +256,7 @@ bool image_redraw(osspriteop_area *area, int x, int y, int req_width,
}
}
- switch (type) {
+ switch (used_type) {
case IMAGE_PLOT_TINCT_ALPHA:
res = image_redraw_tinct(header, x, y,
req_width, req_height,
@@ -274,7 +277,7 @@ bool image_redraw(osspriteop_area *area, int x, int y, int req_width,
case IMAGE_PLOT_OS:
if (tinct_avoid) {
- image__override_sprite_mode(area,
+ image__override_sprite_mode(area, type,
tinct_SPRITE_MODE,
alpha_SPRITE_MODE);
}
@@ -282,7 +285,7 @@ bool image_redraw(osspriteop_area *area, int x, int y, int req_width,
req_height, width, height,
repeatx | repeaty);
if (tinct_avoid) {
- image__override_sprite_mode(area,
+ image__override_sprite_mode(area, type,
alpha_SPRITE_MODE,
tinct_SPRITE_MODE);
}
diff --git a/frontends/riscos/save.c b/frontends/riscos/save.c
index e6b43f1a3..b435787b0 100644
--- a/frontends/riscos/save.c
+++ b/frontends/riscos/save.c
@@ -1020,7 +1020,7 @@ ro_gui_save_content(struct hlcache_handle *h, char *path, bool force_overwrite)
}
else
gui_save_current_type = GUI_SAVE_OBJECT_ORIG; /** \todo do this earlier? */
- /* fall through */
+ fallthrough;
case GUI_SAVE_SOURCE:
case GUI_SAVE_OBJECT_ORIG:
source_data = content_get_source_data(h, &source_size);
diff --git a/frontends/riscos/scripts/Run b/frontends/riscos/scripts/Run
index 94aa933b0..233322e39 100644
--- a/frontends/riscos/scripts/Run
+++ b/frontends/riscos/scripts/Run
@@ -33,14 +33,14 @@ SetMacro NetSurf$ChoicesSave <Choices$Write>.WWW.NetSurf.Choices
RMEnsure UtilityModule 3.00 Error NetSurf needs RISC OS 3 or later
| Ensure Nested WIMP is installed
-| http://acorn.riscos.com/ (in the universal boot archive)
-RMEnsure WindowManager 3.80 Error NetSurf requires the Nested Window Manager. This can be obtained by downloading the Universal Boot sequence from http://acorn.riscos.com/
+| http://www.riscos.com/ftp_space/generic/uniboot/ (i.e. install universal boot)
+RMEnsure WindowManager 3.80 Error NetSurf requires the Nested Window Manager. This can be obtained by downloading the Universal Boot sequence from http://www.riscos.com/ftp_space/generic/uniboot/
| Check for various key resources - can't do much if they don't exist
If "<System$Path>" = "" Then Set System$Path_Message System resources not found.
If "<Wimp$ScrapDir>" = "" Then Error Scrap resource not found.
If "<InetDBase$Path>" = "" Then Error Internet resources can not be found
-If "<Unicode$Path>" = "" Then Error NetSurf requires the !Unicode resource. This can be found, along with the Iconv module, at http://www.netsurf-browser.org/projects/iconv/
+If "<Unicode$Path>" = "" Then Error NetSurf requires the !Unicode resource. This can be found, along with the Iconv module, at https://www.netsurf-browser.org/projects/iconv/
If "<Inet$MimeMappings>" = "" Then Set Inet$MimeMappings InetDBase:MimeMap
| Use OS copy of root CA bundle, if present
@@ -68,6 +68,10 @@ RMEnsure DrawFile 1.30 Error NetSurf requires the DrawFile module. This can be d
RMEnsure SharedUnixLibrary 1.07 NetSurfRMLoad System:Modules.SharedULib
RMEnsure SharedUnixLibrary 1.07 Error NetSurf requires SharedUnixLibrary 1.07 or later. Please use the RISC OS Configure app to update the computer's !System directory from the NetSurf archive.
+| Ensure ARMEABISupport is installed
+|RMEnsure ARMEABISupport 1.04 NetSurfRMLoad System:Modules.ARMEABISupport
+|RMEnsure ARMEABISupport 1.04 Error NetSurf requires ARMEABISupport 1.04 or later. Please use the RISC OS Configure app to update the computer's !System directory from the NetSurf archive.
+
| Load AcornURI if it isn't already
Unset NetSurf$Start_URI_Handler
RMEnsure AcornURI 0.12 Set NetSurf$Start_URI_Handler 1
@@ -91,6 +95,10 @@ RMEnsure Iconv 0.12 Error NetSurf requires Iconv 0.12 or later. Please use the R
RMEnsure CryptRandom 0.13 NetSurfRMLoad System:Modules.CryptRand
RMEnsure CryptRandom 0.13 Error NetSurf requires CryptRandom 0.13 or later. Please use the RISC OS Configure app to update the computer's !System directory from the NetSurf archive.
+| Ensure SocketWatch
+RMEnsure SocketWatch 0.07 NetSurfRMLoad System:Modules.Network.SockWatch
+RMEnsure SocketWatch 0.07 Error NetSurf requires SocketWatch 0.07 or later. Please use the RISC OS Configure app to update the computer's !System directory from the NetSurf archive.
+
| Disable SpecialFX, if present
Set NetSurf$SpecialFX 1
RMEnsure SpecialFX 1.00 Set NetSurf$SpecialFX 0
diff --git a/frontends/riscos/templates/de b/frontends/riscos/templates/de
index 4ad051383..b5710d467 100644
--- a/frontends/riscos/templates/de
+++ b/frontends/riscos/templates/de
@@ -3370,15 +3370,11 @@ wimp_window {
}
wimp_icon {
extent:32,-256,496,-212
-#ifdef WITH_PLUGIN
icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_RADIO
-#else
- icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_DELETED | wimp_BUTTON_RADIO
-#endif
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
- text_and_sprite.text:"Plugins nicht benutzen"
+ text_and_sprite.text:"CSS nicht benutzen"
text_and_sprite.size:42
text_and_sprite.validation:"Soptoff,opton"
}
diff --git a/frontends/riscos/templates/en b/frontends/riscos/templates/en
index c418ed7b9..6ea18a859 100644
--- a/frontends/riscos/templates/en
+++ b/frontends/riscos/templates/en
@@ -3040,15 +3040,11 @@ wimp_window {
}
wimp_icon {
extent:32,-256,344,-212
-#ifdef WITH_PLUGIN
icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_RADIO
-#else
- icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_DELETED | wimp_BUTTON_RADIO
-#endif
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
- text_and_sprite.text:"Disable plug-ins"
+ text_and_sprite.text:"Disable CSS"
text_and_sprite.size:42
text_and_sprite.validation:"Soptoff,opton"
}
diff --git a/frontends/riscos/templates/fr b/frontends/riscos/templates/fr
index cdc109855..e2741df4a 100644
--- a/frontends/riscos/templates/fr
+++ b/frontends/riscos/templates/fr
@@ -2842,15 +2842,11 @@ wimp_window {
}
wimp_icon {
extent:32,-256,404,-212
-#ifdef WITH_PLUGIN
icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_RADIO
-#else
- icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_DELETED | wimp_BUTTON_RADIO
-#endif
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
- text_and_sprite.text:"Désactiver les plug-ins"
+ text_and_sprite.text:"Désactiver les CSS"
text_and_sprite.size:42
text_and_sprite.validation:"Soptoff,opton"
}
diff --git a/frontends/riscos/templates/nl b/frontends/riscos/templates/nl
index 2fba8b5c9..24b176891 100644
--- a/frontends/riscos/templates/nl
+++ b/frontends/riscos/templates/nl
@@ -3090,11 +3090,11 @@ wimp_window {
}
wimp_icon {
extent:32,-256,540,-212
- icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_DELETED | wimp_BUTTON_RADIO
+ icon_flags:wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_BUTTON_RADIO
icon_esg:0
icon_fg:wimp_COLOUR_BLACK
icon_bg:wimp_COLOUR_VERY_LIGHT_GREY
- text_and_sprite.text:"Plug-ins uitschakelen"
+ text_and_sprite.text:"CSS uitschakelen"
text_and_sprite.size:42
text_and_sprite.validation:"Soptoff,opton"
}
diff --git a/frontends/riscos/textarea.c b/frontends/riscos/textarea.c
index 6f41c640b..69b7eede1 100644
--- a/frontends/riscos/textarea.c
+++ b/frontends/riscos/textarea.c
@@ -33,6 +33,7 @@
#include "utils/log.h"
#include "utils/utf8.h"
+#include "utils/utils.h"
#include "riscos/gui.h"
#include "riscos/oslib_pre7.h"
@@ -1023,7 +1024,7 @@ bool ro_textarea_key_press(wimp_key *key)
break;
}
- /* fall through */
+ fallthrough;
case wimp_KEY_ESCAPE:
keypress = *key;
keypress.w = ta->parent;
diff --git a/frontends/riscos/ucstables.c b/frontends/riscos/ucstables.c
index 3e31c992e..a94e4348c 100644
--- a/frontends/riscos/ucstables.c
+++ b/frontends/riscos/ucstables.c
@@ -398,49 +398,47 @@ static const char *localencodings[] = {
"ISO-8859-10//TRANSLIT",
"ISO-8859-13//TRANSLIT",
"ISO-8859-14//TRANSLIT",
- "ISO-8859-16//TRANSLIT",
-#define CONT_ENC_END 116 /* RISC OS alphabet numbers lie in a
- * contiguous range [100,CONT_ENC_END]
- * _except_ for Cyrillic2, which doesn't.
- */
- "CP866//TRANSLIT" /* Cyrillic2 - 120 */
+ "ISO-8859-16//TRANSLIT", /* Latin10 - 116 */
+ NULL, /* UTF-16, if you believe HdrSrc (Unused) */
+ NULL, /* Unused */
+ NULL, /* Unused */
+ "CP866//TRANSLIT" /* Cyrillic2 - 120 */
};
-static const struct special {
- char local; /**< Local 8bit representation */
- char len; /**< Length (in bytes) of UTF-8 character */
- const char *utf; /**< UTF-8 representation */
-} special_chars[] = {
- { 0x80, 3, "\xE2\x82\xAC" }, /* EURO SIGN */
- { 0x81, 2, "\xC5\xB4" }, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
- { 0x82, 2, "\xC5\xB5" }, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */
- { 0x84, 3, "\xE2\x9C\x98" }, /* HEAVY BALLOT X */
- { 0x85, 2, "\xC5\xB6" }, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
- { 0x86, 2, "\xC5\xB7" }, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */
- { 0x88, 3, "\xE2\x87\x90" }, /* LEFTWARDS DOUBLE ARROW */
- { 0x89, 3, "\xE2\x87\x92" }, /* RIGHTWARDS DOUBLE ARROW */
- { 0x8a, 3, "\xE2\x87\x93" }, /* DOWNWARDS DOUBLE ARROW */
- { 0x8b, 3, "\xE2\x87\x91" }, /* UPWARDS DOUBLE ARROW */
- { 0x8c, 3, "\xE2\x80\xA6" }, /* HORIZONTAL ELLIPSIS */
- { 0x8d, 3, "\xE2\x84\xA2" }, /* TRADE MARK SIGN */
- { 0x8e, 3, "\xE2\x80\xB0" }, /* PER MILLE SIGN */
- { 0x8f, 3, "\xE2\x80\xA2" }, /* BULLET */
- { 0x90, 3, "\xE2\x80\x98" }, /* LEFT SINGLE QUOTATION MARK */
- { 0x91, 3, "\xE2\x80\x99" }, /* RIGHT SINGLE QUOTATION MARK */
- { 0x92, 3, "\xE2\x80\xB9" }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
- { 0x93, 3, "\xE2\x80\xBA" }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
- { 0x94, 3, "\xE2\x80\x9C" }, /* LEFT DOUBLE QUOTATION MARK */
- { 0x95, 3, "\xE2\x80\x9D" }, /* RIGHT DOUBLE QUOTATION MARK */
- { 0x96, 3, "\xE2\x80\x9E" }, /* DOUBLE LOW-9 QUOTATION MARK */
- { 0x97, 3, "\xE2\x80\x93" }, /* EN DASH */
- { 0x98, 3, "\xE2\x80\x94" }, /* EM DASH */
- { 0x99, 3, "\xE2\x88\x92" }, /* MINUS SIGN */
- { 0x9a, 2, "\xC5\x92" }, /* LATIN CAPITAL LIGATURE OE */
- { 0x9b, 2, "\xC5\x93" }, /* LATIN SMALL LIGATURE OE */
- { 0x9c, 3, "\xE2\x80\xA0" }, /* DAGGER */
- { 0x9d, 3, "\xE2\x80\xA1" }, /* DOUBLE DAGGER */
- { 0x9e, 3, "\xEF\xAC\x81" }, /* LATIN SMALL LIGATURE FI */
- { 0x9f, 3, "\xEF\xAC\x82" } /* LATIN SMALL LIGATURE FL */
+/* These are the Acorn Latin1 C1 block between [0x80,0x9f] */
+static const char *special_chars[] = {
+ "\xE2\x82\xAC", /* EURO SIGN */
+ "\xC5\xB4", /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
+ "\xC5\xB5", /* LATIN SMALL LETTER W WITH CIRCUMFLEX */
+ NULL, /* unused */
+ "\xE2\x9C\x98", /* HEAVY BALLOT X */
+ "\xC5\xB6", /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
+ "\xC5\xB7", /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */
+ NULL, /* unused */
+ "\xE2\x87\x90", /* LEFTWARDS DOUBLE ARROW */
+ "\xE2\x87\x92", /* RIGHTWARDS DOUBLE ARROW */
+ "\xE2\x87\x93", /* DOWNWARDS DOUBLE ARROW */
+ "\xE2\x87\x91", /* UPWARDS DOUBLE ARROW */
+ "\xE2\x80\xA6", /* HORIZONTAL ELLIPSIS */
+ "\xE2\x84\xA2", /* TRADE MARK SIGN */
+ "\xE2\x80\xB0", /* PER MILLE SIGN */
+ "\xE2\x80\xA2", /* BULLET */
+ "\xE2\x80\x98", /* LEFT SINGLE QUOTATION MARK */
+ "\xE2\x80\x99", /* RIGHT SINGLE QUOTATION MARK */
+ "\xE2\x80\xB9", /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
+ "\xE2\x80\xBA", /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
+ "\xE2\x80\x9C", /* LEFT DOUBLE QUOTATION MARK */
+ "\xE2\x80\x9D", /* RIGHT DOUBLE QUOTATION MARK */
+ "\xE2\x80\x9E", /* DOUBLE LOW-9 QUOTATION MARK */
+ "\xE2\x80\x93", /* EN DASH */
+ "\xE2\x80\x94", /* EM DASH */
+ "\xE2\x88\x92", /* MINUS SIGN */
+ "\xC5\x92", /* LATIN CAPITAL LIGATURE OE */
+ "\xC5\x93", /* LATIN SMALL LIGATURE OE */
+ "\xE2\x80\xA0", /* DAGGER */
+ "\xE2\x80\xA1", /* DOUBLE DAGGER */
+ "\xEF\xAC\x81", /* LATIN SMALL LIGATURE FI */
+ "\xEF\xAC\x82" /* LATIN SMALL LIGATURE FL */
};
@@ -470,20 +468,22 @@ nserror utf8_to_local_encoding(const char *string, size_t len, char **result)
/* read system alphabet */
error = xosbyte1(osbyte_ALPHABET_NUMBER, 127, 0, &alphabet);
- if (error)
+ /* Assume Latin1 for anything we know nothing about */
+ if (error || alphabet < territory_ALPHABET_BFONT ||
+ alphabet > territory_ALPHABET_CYRILLIC2)
alphabet = territory_ALPHABET_LATIN1;
/* UTF-8 -> simply copy string */
- if (alphabet == 111 /* UTF-8 */) {
+ if (alphabet == territory_ALPHABET_UTF8) {
*result = strndup(string, len);
return NSERROR_OK;
}
/* get encoding name */
- enc = (alphabet <= CONT_ENC_END ? localencodings[alphabet - 100]
- : (alphabet == 120 ?
- localencodings[CONT_ENC_END - 100 + 1]
- : localencodings[0]));
+ enc = localencodings[alphabet - territory_ALPHABET_BFONT];
+ /* Assume Latin1 for any that are unused */
+ if (enc == NULL)
+ enc = localencodings[0];
/* create output buffer */
*(result) = malloc(len + 1);
@@ -498,13 +498,32 @@ nserror utf8_to_local_encoding(const char *string, size_t len, char **result)
* characters and inserting appropriate output for characters
* that iconv can't handle. */
for (off = 0; off < len; off = utf8_next(string, len, off)) {
- if (string[off] != 0xE2 &&
- string[off] != 0xC5 && string[off] != 0xEF)
+ /* Specials only start with C5/E2/EF */
+ if (string[off] != 0xC5 &&
+ string[off] != 0xE2 && string[off] != 0xEF)
continue;
+ /* Ignore truncated input */
+ if (off + 2 + (string[off] == 0xC5 ? 0 : 1) >= len)
+ continue;
+
+ /* Search to see if this character is special */
for (i = 0; i != NOF_ELEMENTS(special_chars); i++) {
- if (strncmp(string + off, special_chars[i].utf,
- special_chars[i].len) != 0)
+ /* Skip unused special char */
+ if (special_chars[i] == NULL)
+ continue;
+
+ /* Skip 2-byte non-match */
+ if (string[off] == 0xC5 &&
+ (string[off] != special_chars[i][0] ||
+ string[off+1] != special_chars[i][1]))
+ continue;
+
+ /* Skip 3-byte non-match */
+ if (string[off] != 0xC5 &&
+ (string[off] != special_chars[i][0] ||
+ string[off+1] != special_chars[i][1] ||
+ string[off+2] != special_chars[i][2]))
continue;
/* 0 length has a special meaning to utf8_to_enc */
@@ -524,9 +543,13 @@ nserror utf8_to_local_encoding(const char *string, size_t len, char **result)
free(temp);
}
- *cur_pos = special_chars[i].local;
+ /* Emit conversion for this special character */
+ *cur_pos = 0x80 + i;
*(++cur_pos) = '\0';
- prev_off = off + special_chars[i].len;
+ prev_off = off + 2 + (string[off] == 0xC5 ? 0 : 1);
+
+ /* Return to outer loop to process remaining input */
+ break;
}
}
@@ -561,7 +584,7 @@ nserror utf8_to_local_encoding(const char *string, size_t len, char **result)
nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
{
os_error *error;
- int alphabet, i, num_specials = 0, result_alloc;
+ int alphabet, num_specials = 0, result_alloc;
#define SPECIAL_CHUNK_SIZE 255
size_t off, prev_off, cur_off;
char *temp;
@@ -576,11 +599,13 @@ nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
/* read system alphabet */
error = xosbyte1(osbyte_ALPHABET_NUMBER, 127, 0, &alphabet);
- if (error)
+ /* Assume Latin1 for anything we know nothing about */
+ if (error || alphabet < territory_ALPHABET_BFONT ||
+ alphabet > territory_ALPHABET_CYRILLIC2)
alphabet = territory_ALPHABET_LATIN1;
/* UTF-8 -> simply copy string */
- if (alphabet == 111 /* UTF-8 */) {
+ if (alphabet == territory_ALPHABET_UTF8) {
temp = strndup(string, len);
if (!temp)
return NSERROR_NOMEM;
@@ -590,10 +615,10 @@ nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
}
/* get encoding name */
- enc = (alphabet <= CONT_ENC_END ? localencodings[alphabet - 100]
- : (alphabet == 120 ?
- localencodings[CONT_ENC_END - 100 + 1]
- : localencodings[0]));
+ enc = localencodings[alphabet - territory_ALPHABET_BFONT];
+ /* Assume Latin1 for any that are unused */
+ if (enc == NULL)
+ enc = localencodings[0];
/* create output buffer (oversized) */
result_alloc = (len * 4) + (3 * SPECIAL_CHUNK_SIZE) + 1;
@@ -610,52 +635,54 @@ nserror utf8_from_local_encoding(const char *string, size_t len, char **result)
* characters and inserting appropriate output for characters
* that iconv can't handle. */
for (off = 0; off < len; off++) {
+ /* Skip non-special characters */
if (string[off] < 0x80 || string[off] > 0x9f)
continue;
- for (i = 0; i != NOF_ELEMENTS(special_chars); i++) {
- if (string[off] != special_chars[i].local)
- continue;
-
- /* 0 length has a special meaning to utf8_from_enc */
- if (off - prev_off > 0) {
- err = utf8_from_enc(string + prev_off, enc,
- off - prev_off, &temp, NULL);
- if (err != NSERROR_OK) {
- assert(err != NSERROR_BAD_ENCODING);
- NSLOG(netsurf, INFO,
- "utf8_from_enc failed");
- free(*result);
- return NSERROR_NOMEM;
- }
-
- strcat((*result) + cur_off, temp);
-
- cur_off += strlen(temp);
-
- free(temp);
+ /* 0 length has a special meaning to utf8_from_enc */
+ if (off - prev_off > 0) {
+ err = utf8_from_enc(string + prev_off, enc,
+ off - prev_off, &temp, NULL);
+ if (err != NSERROR_OK) {
+ assert(err != NSERROR_BAD_ENCODING);
+ NSLOG(netsurf, INFO, "utf8_from_enc failed");
+ free(*result);
+ return NSERROR_NOMEM;
}
- strcat((*result) + cur_off, special_chars[i].utf);
+ strcat((*result) + cur_off, temp);
- cur_off += special_chars[i].len;
+ cur_off += strlen(temp);
- prev_off = off + 1;
+ free(temp);
+ }
- num_specials++;
- if (num_specials % SPECIAL_CHUNK_SIZE ==
- SPECIAL_CHUNK_SIZE - 1) {
- char *temp = realloc((*result),
- result_alloc +
- (3 * SPECIAL_CHUNK_SIZE));
- if (!temp) {
- free(*result);
- return NSERROR_NOMEM;
- }
+ /* Append UTF-8 encoded special character or U+FFFD if none */
+ if (special_chars[string[off]-0x80] != NULL) {
+ const char *special = special_chars[string[off]-0x80];
+ strcat((*result) + cur_off, special);
+ cur_off += 2 + (special[0] == 0xC5 ? 0 : 1);
+ } else {
+ strcat((*result) + cur_off, "\xef\xbf\xbd");
+ cur_off += 3;
+ }
- *result = temp;
- result_alloc += (3 * SPECIAL_CHUNK_SIZE);
+ prev_off = off + 1;
+
+ /* Resize output buffer if necessary */
+ num_specials++;
+ if (num_specials % SPECIAL_CHUNK_SIZE ==
+ SPECIAL_CHUNK_SIZE - 1) {
+ char *temp = realloc((*result),
+ result_alloc +
+ (3 * SPECIAL_CHUNK_SIZE));
+ if (!temp) {
+ free(*result);
+ return NSERROR_NOMEM;
}
+
+ *result = temp;
+ result_alloc += (3 * SPECIAL_CHUNK_SIZE);
}
}
diff --git a/frontends/windows/Makefile b/frontends/windows/Makefile
index 4e74edd7a..524f716fe 100644
--- a/frontends/windows/Makefile
+++ b/frontends/windows/Makefile
@@ -90,7 +90,7 @@ $(OBJROOT)/messages-en: $(MESSAGES_TARGET)/en/Messages
$(VQ)echo " MSGCP: $< $@"
$(Q)$(INSTALL) -m 644 -T $< $@
-netsurf-installer.exe: $(EXETARGET) $(WIN_RES_INS_OBJ)
+netsurf-installer.exe: $(EXETARGET) $(POSTEXES) $(WIN_RES_INS_OBJ)
$(VQ)echo "MAKENSIS: $@"
$(Q)makensis -V$(NSIS_VERBOSE) -NOCD -DOBJROOT=$(OBJROOT) -DRESDIR=$(FRONTEND_RESOURCES_DIR) -DVERSIONMAJOR=$(VERSION_MAJ) -DVERSIONMINOR=$(VERSION_MIN) -DOUTFNAME=$@ $(FRONTEND_RESOURCES_DIR)/installer.nsi
diff --git a/frontends/windows/download.c b/frontends/windows/download.c
index f0163cef7..cfd2bbbb7 100644
--- a/frontends/windows/download.c
+++ b/frontends/windows/download.c
@@ -169,6 +169,7 @@ nsws_download_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
case IDOK:
if (download1->downloaded != download1->size)
return TRUE;
+ fallthrough;
case IDCANCEL:
nsws_download_clear_data(download1);
diff --git a/frontends/windows/prefs.c b/frontends/windows/prefs.c
index 37f558477..d6855f5da 100644
--- a/frontends/windows/prefs.c
+++ b/frontends/windows/prefs.c
@@ -277,6 +277,7 @@ static BOOL CALLBACK options_appearance_dialog_handler(HWND hwnd,
}
break;
}
+ break;
case WM_COMMAND:
diff --git a/frontends/windows/res/installer.nsi b/frontends/windows/res/installer.nsi
index e91f29090..2f8b757d8 100644
--- a/frontends/windows/res/installer.nsi
+++ b/frontends/windows/res/installer.nsi
@@ -13,7 +13,7 @@
!define VERSIONMAJOR 3
!endif
!ifndef VERSIONMINOR
- !define VERSIONMINOR 10
+ !define VERSIONMINOR 11
!endif
!ifndef VERSIONBUILD
!define VERSIONBUILD 0
diff --git a/frontends/windows/window.c b/frontends/windows/window.c
index 2f48ae28b..00e5a7e05 100644
--- a/frontends/windows/window.c
+++ b/frontends/windows/window.c
@@ -432,7 +432,7 @@ nsws_window_urlbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
NSLOG(netsurf, INFO, "Destroyed font object");
DeleteObject(hFont);
}
-
+ fallthrough;
case WM_NCDESTROY:
/* remove properties if window is being destroyed */
diff --git a/frontends/windows/window.h b/frontends/windows/window.h
index 5f4349427..97be710f3 100644
--- a/frontends/windows/window.h
+++ b/frontends/windows/window.h
@@ -26,7 +26,6 @@ extern struct gui_window_table *win32_window_table;
struct browser_mouse {
struct gui_window *gui;
- struct box *box;
double pressed_x;
double pressed_y;
diff --git a/include/netsurf/fetch.h b/include/netsurf/fetch.h
index 30b204868..156f4d1ef 100644
--- a/include/netsurf/fetch.h
+++ b/include/netsurf/fetch.h
@@ -99,6 +99,23 @@ struct gui_fetch_table {
*/
char *(*mimetype)(const char *ro_path);
+ /**
+ * Open a socket
+ *
+ * \param domain Communication domain
+ * \param type Socket type
+ * \param protocol Protocol
+ * \return Socket descriptor on success, -1 on error and errno set
+ */
+ int (*socket_open)(int domain, int type, int protocol);
+
+ /**
+ * Close a socket
+ *
+ * \param socket Socket descriptor
+ * \return 0 on success, -1 on error and errno set
+ */
+ int (*socket_close)(int socket);
};
#endif
diff --git a/resources/FatMessages b/resources/FatMessages
index 3492c3f0a..bda91910a 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -39,11 +39,12 @@
en.all.NetSurf:NetSurf
zh_CN.all.NetSurf:NetSurf
-en.all.NetSurfCopyright:© 2003-2020 The NetSurf Developers
-de.all.NetSurfCopyright:© 2003-2020 die NetSurf Entwickler
-nl.all.NetSurfCopyright:© 2003-2020 De NetSurf-ontwikkelaars
-it.all.NetSurfCopyright:© 2003-2020 A cura degli sviluppatori di NetSurf
-zh_CN.all.NetSurfCopyright:©2003-2020 NetSurf å¼€å‘人员
+en.all.NetSurfCopyright:© 2003-2023 The NetSurf Developers
+de.all.NetSurfCopyright:© 2003-2023 die NetSurf Entwickler
+fr.all.NetSurfCopyright:© 2003-2023 Les développeurs de NetSurf
+nl.all.NetSurfCopyright:© 2003-2023 De NetSurf-ontwikkelaars
+it.all.NetSurfCopyright:© 2003-2023 A cura degli sviluppatori di NetSurf
+zh_CN.all.NetSurfCopyright:© 2003-2023 NetSurf å¼€å‘人员
# General
@@ -74,21 +75,21 @@ zh_CN.all.Replace:替æ¢æ–‡ä»¶
en.all.DontReplace:Don't replace
de.all.DontReplace:Abbrechen
-fr.all.DontReplace:Ne pas remplacer le fichier
+fr.all.DontReplace:Ne pas remplacer
it.all.DontReplace:Non sostituire
nl.all.DontReplace:Annuleer bewaaractie
zh_CN.all.DontReplace:ä¸è¦æ›¿æ¢
en.all.Remove:Remove address
de.all.Remove:Adresse entfernen
-fr.all.Remove:Enlever/retirer une adresse
+fr.all.Remove:Retirer l’adresse
it.all.Remove:Rimuovi indirizzo
nl.all.Remove:Verwijder adres
zh_CN.all.Remove:删除地å€
en.all.DontRemove:Don't remove
de.all.DontRemove:Behalten
-fr.all.DontRemove:Ne pas enlever/retirer
+fr.all.DontRemove:Ne pas retirer
it.all.DontRemove:Non rimuovere
nl.all.DontRemove:Niet verwijderen
zh_CN.all.DontRemove:ä¸è¦åˆ é™¤
@@ -130,14 +131,14 @@ zh_CN.all.OK:好的
en.all.Selecting:Selecting
de.all.Selecting:Auswählen
-fr.all.Selecting:Sélection en cours
+fr.all.Selecting:Sélection
it.all.Selecting:Selezione
nl.all.Selecting:selecteren
zh_CN.all.Selecting:正在选择
en.all.FrameDrag:Resizing frames
de.all.FrameDrag:Frames ändern
-fr.all.FrameDrag:Redimensionnement des cadres en cours
+fr.all.FrameDrag:Redimensionnement des cadres
it.all.FrameDrag:Ridimensione dei frame
nl.all.FrameDrag:frames aan het aanpassen
zh_CN.all.FrameDrag:正在调整框架大å°
@@ -149,14 +150,14 @@ zh_CN.all.FrameDrag:正在调整框架大å°
# Decimal prefix
en.all.Bytes: B
de.all.Bytes: B
-fr.all.Bytes: octets
+fr.all.Bytes: o
it.all.Bytes: Byte
nl.all.Bytes: B
zh_CN.all.Bytes: B
en.all.kBytes: kB
de.all.kBytes: kB
-fr.all.kBytes: Ko
+fr.all.kBytes: ko
it.all.kBytes: KB
nl.all.kBytes: KB
zh_CN.all.kBytes: kB
@@ -177,21 +178,27 @@ zh_CN.all.GBytes: GB
# Binary prefix
en.all.KiBytes: KiB
+fr.all.KiBytes: Kio
zh_CN.all.KiBytes: KiB
en.all.MiBytes: MiB
+fr.all.MiBytes: Mio
zh_CN.all.MiBytes: MiB
en.all.GiBytes: GiB
+fr.all.GiBytes: Gio
zh_CN.all.GiBytes: GiB
en.all.TiBytes: TiB
+fr.all.TiBytes: Tio
zh_CN.all.TiBytes: TiB
en.all.PiBytes: PiB
+fr.all.PiBytes: Pio
zh_CN.all.PiBytes: PiB
en.all.EiBytes: EiB
+fr.all.EiBytes: Eio
zh_CN.all.EiBytes: EiB
# Content Forms
@@ -201,7 +208,7 @@ zh_CN.all.EiBytes: EiB
#
en.all.Form_Submit:Submit
de.all.Form_Submit:Ãœbertragen
-fr.all.Form_Submit:Soumettre
+fr.all.Form_Submit:Envoyer
it.all.Form_Submit:Invia
nl.all.Form_Submit:Versturen
zh_CN.all.Form_Submit:æ交
@@ -229,37 +236,37 @@ zh_CN.all.Form_Many:(多个表)
en.all.Form_Drop:Drop file here
it.all.Form_Drop:Sposta il file qui
+de.all.Form_Drop:Datei hier hinziehen
+fr.all.Form_Drop:Déposer ici votre fichier
+it.all.Form_Drop:Inserisci un file qui
+nl.all.Form_Drop:Bestand hier plaatsen
+zh_CN.all.Form_Drop:å•å‡»ä»¥é€‰æ‹©æ–‡ä»¶
en.gtk.Form_Drop:Click to select file
-fr.gtk.Form_Drop:Cliquer pour sélectionner fichier
+fr.gtk.Form_Drop:Cliquer pour sélectionner un fichier
it.gtk.Form_Drop:Clicca per selezionare il file
nl.gtk.Form_Drop:Klik om bestand te selecteren
en.ro.Form_Drop:Drop file here
-fr.ro.Form_Drop:Déposer fichier ici
+fr.ro.Form_Drop:Déposer ici votre fichier
it.ro.Form_Drop:Sposta il file qui
en.ami.Form_Drop:Click or drop file here
-fr.ami.Form_Drop:Cliquer ou déposer fichier ici]
+fr.ami.Form_Drop:Cliquer ou déposer un fichier ici
it.ami.Form_Drop:Clicca o sposta il file qui
nl.ami.Form_Drop:Sleep bestand hierheen
en.beos.Form_Drop:Drop file here
-fr.beos.Form_Drop:Drop file here
+fr.beos.Form_Drop:Déposer ici votre fichier
it.beos.Form_Drop:Sposta il file qui
nl.beos.Form_Drop:Sleep bestand hierheen
en.fb.Form_Drop:Click to select file
-fr.fb.Form_Drop:Cliquer pour sélectionner fichier
+fr.fb.Form_Drop:Cliquer pour sélectionner un fichier
it.fb.Form_Drop:Clicca per selezionare il file
nl.fb.Form_Drop:Klik om bestand te selecteren
en.osx.Form_Drop:Click to select file
-fr.osx.Form_Drop:Cliquer pour sélectionner fichier
+fr.osx.Form_Drop:Cliquer pour sélectionner un fichier
it.osx.Form_Drop:Clicca per selezionare il file
-de.all.Form_Drop:Datei hier hinziehen
-fr.all.Form_Drop:Déposer les fichiers ici
-it.all.Form_Drop:Inserisci un file qui
-nl.all.Form_Drop:Bestand hier plaatsen
-zh_CN.all.Form_Drop:å•å‡»ä»¥é€‰æ‹©æ–‡ä»¶
en.all.FormSelect:Click to choose a form item
de.all.FormSelect:Anklicken öffnet Auswahlmenü
-fr.all.FormSelect:Cliquer pour choisir un item de formulaire
+fr.all.FormSelect:Cliquer pour choisir un élément du formulaire
it.all.FormSelect:Clicca per scegliere un oggetto del form
nl.all.FormSelect:Klikken selecteert een formulieritem
zh_CN.all.FormSelect:å•å‡»ä»¥é€‰æ‹©è¡¨å•é¡¹
@@ -287,14 +294,14 @@ zh_CN.all.FormSubmit:å‘é€è¡¨æ ¼åˆ° %s
en.all.FormBadSubmit:Warning: form can not be submitted
de.all.FormBadSubmit:Achtung: Daten können nicht gesendet werden
-fr.all.FormBadSubmit:Alerte : le formulaire n'a pas pu être envoyé
+fr.all.FormBadSubmit:Attention : le formulaire n’a pas pu être envoyé
it.all.FormBadSubmit:Attenzione: Il form non può essere inviato
nl.all.FormBadSubmit:Waarschuwing: informatie kan niet verzonden worden
zh_CN.all.FormBadSubmit:警告:无法æ交表格
en.all.FormButton:Warning: button can not be activated
de.all.FormButton:Achtung: Schaltknopf kann nicht aktiviert werden
-fr.all.FormButton:Warning: Bouton ne peut être activé
+fr.all.FormButton:Attention : le bouton n’a pas pu être activé
it.all.FormButton:Attenzione: il pulsante non può essere attivato
nl.all.FormButton:Waarschuwing: knop kan niet geactiveerd worden
zh_CN.all.FormButton:警告:无法激活按钮
@@ -322,7 +329,7 @@ zh_CN.all.FormReset:é‡ç½®è¡¨æ ¼ï¼ˆæœªå®žçŽ°ï¼‰
en.all.FormFile:Drop a file here to upload it
de.all.FormFile:Zum Upload Datei hierhin ziehen und fallenlassen
-fr.all.FormFile:Déposer un fichier ici pour le téléverser #Need review
+fr.all.FormFile:Déposer un fichier ici pour le téléverser
it.all.FormFile:Inserisci un file da inviare qui
nl.all.FormFile:Het bestand hier plaatsen voor verzenden
zh_CN.all.FormFile:将文件拖放到在此处上传
@@ -375,7 +382,7 @@ zh_CN.all.PNGTitle:%s(PNG å›¾åƒ ï¼…luxï¼…lu åƒç´ ï¼‰
en.all.SpriteTitle:%s (Sprite image %lux%lu pixels)
de.all.SpriteTitle:%s (Sprite Bild %lux%lu pixels)
-fr.all.SpriteTitle:%s (Image Sprite %lux%lu pixels)
+fr.all.SpriteTitle:%s (Image « sprite » %lux%lu pixels)
it.all.SpriteTitle:%s (Immagine Sprite %lux%lu pixel)
nl.all.SpriteTitle:%s (Sprite-afbeelding %lux%lu punten)
zh_CN.all.SpriteTitle:%s(Sprite å›¾åƒ ï¼…luxï¼…lu åƒç´ ï¼‰
@@ -414,7 +421,7 @@ zh_CN.ami.DataTypesTitle:%s(%s å›¾åƒ ï¼…luxï¼…lu åƒç´ ï¼‰
#
en.all.Encoding0:from HTTP headers
de.all.Encoding0:aus HTTP Kopfzeilen
-fr.all.Encoding0:dans les en-têtes HTTP
+fr.all.Encoding0:dans les entêtes HTTP
it.all.Encoding0:da intestazioni HTTP
nl.all.Encoding0:van HTTP-koppen
zh_CN.all.Encoding0:从 HTTP 报头
@@ -458,7 +465,7 @@ zh_CN.all.Not2xx:æœåŠ¡å™¨è¿”回错误
en.all.InvalidURL:The address <em>%s</em> could not be understood.
de.all.InvalidURL:Die Adresse <em>%s</em> konnte nicht ausgewertet werden.
-fr.all.InvalidURL:L'adresse <em>%s</em> est incomprise.
+fr.all.InvalidURL:L’adresse <em>%s</em> n’a pas pu être reconnue.
it.all.InvalidURL:L'indirizzo <em>%s</em> non è stato riconosciuto.
nl.all.InvalidURL:Het adres <em>%s</em> klopt niet.
zh_CN.all.InvalidURL:无法ç†è§£åœ°å€ <em>%s</em>。
@@ -469,7 +476,7 @@ zh_CN.all.InvalidURL:无法ç†è§£åœ°å€ <em>%s</em>。
#
en.all.ErrorPage:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Page error</title></head><body><h1>Sorry, NetSurf was unable to display this page</h1><p><strong>%s</strong></p></body></html>
de.all.ErrorPage:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Seitenfehler</title></head><body><h1>NetSurf konnte diese Seite leider nicht darstellen.</h1><p><strong>%s</strong></p></body></html>
-fr.all.ErrorPage:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Erreur</title></head><body><h1>Désolé, NetSurf n'a pas pu afficher cette page</h1><p><strong>%s</strong></p></body></html>
+fr.all.ErrorPage:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Erreur</title></head><body><h1>Désolé, NetSurf n’a pas pu afficher cette page</h1><p><strong>%s</strong></p></body></html>
it.all.ErrorPage:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Errore nella pagina</title></head><body><h1>Spiacente, NetSurf non è in grado di visualizzare questa pagina.</h1><p><strong>%s</strong></p></body></html>
nl.all.ErrorPage:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Pagina fout</title></head><body><h1>Sorry, NetSurf kan deze pagina</h1><p><strong>%s</strong></p>niet tonen.</body></html>
zh_CN.all.ErrorPage:<!DOCTYPE HTML PUBLIC“-// W3C // DTD HTML 4.01 // zh_CNâ€â€œ http://www.w3.org/TR/html4/strict.dtd“><html><head><meta http-equiv =“ Content-Type†content =“ text / html; charset = UTF-8â€> <title>页é¢é”™è¯¯</title> </head> <body> <h1>抱歉, NetSurf 无法显示此页é¢</ h1> <p> <strong>%s </strong> </p> </body> </html>
@@ -492,84 +499,84 @@ zh_CN.all.NoMemory:NetSurf 内存ä¸è¶³ã€‚请释放一些内存,然åŽé‡è¯•ã€
en.all.SaveError:The file could not be saved due to an error:
de.all.SaveError:Die Datei konnte wegen eines Fehlers nicht gespeichert werden:
-fr.all.SaveError:Le fichier n'a pas pu être sauvé suite à une erreur:
+fr.all.SaveError:Le fichier n’a pas pu être sauvé à cause d’une erreur :
it.all.SaveError:Il file non può essere salvato a causa di un errore:
nl.all.SaveError:Wegens een fout kan dit bestand niet opgeslagen worden:
zh_CN.all.SaveError:由于出现错误,无法ä¿å­˜æ­¤æ–‡ä»¶ï¼š
en.all.LoadError:The file could not be loaded due to an error:
de.all.LoadError:Die Datei konnte wegen eines Fehlers nicht geladen werden:
-fr.all.LoadError:Le fichier n'a pas pu être chargé à cause d'une erreur:
+fr.all.LoadError:Le fichier n’a pas pu être chargé à cause d’une erreur :
it.all.LoadError:Il file non può essere caricato a causa di un errore:
nl.all.LoadError:Wegens een fout kan dit bestand niet geladen worden:
zh_CN.all.LoadError:由于出现错误,无法加载此文件:
en.all.MiscError:An unexpected error occurred:
de.all.MiscError:Unerwarteter Fehler:
-fr.all.MiscError:Une erreur inattendue s'est produite:
+fr.all.MiscError:Une erreur inattendue s’est produite :
it.all.MiscError:Si è verificato un errore inatteso:
nl.all.MiscError:Er trad een onverwachte fout op:
zh_CN.all.MiscError:出现错误:
en.all.FileError:File does not exist:
de.all.FileError:Datei existiert nicht:
-fr.all.FileError:Le fichier n'existe pas:
+fr.all.FileError:Le fichier n’existe pas :
it.all.FileError:Il file è inesistente:
nl.all.FileError:Bestand lijkt niet te bestaan:
zh_CN.all.FileError:文件ä¸å­˜åœ¨ï¼š
en.all.PrintError:An error occurred when printing:
de.all.PrintError:Ein Fehler trat während des Druckens auf:
-fr.all.PrintError:Une erreur s'est produite lors de l'impression:
+fr.all.PrintError:Une erreur s’est produite lors de l’impression :
it.all.PrintError:Si è verificato un errore durante la stampa:
nl.all.PrintError:Fout tijdens afdrukken:
zh_CN.all.PrintError:打å°æ—¶å‡ºçŽ°é”™è¯¯ï¼š
en.all.NoDiscSpace:Not enough space available on disc.
de.all.NoDiscSpace:Nicht genug Speicherplatz auf dem Medium vorhanden.
-fr.all.NoDiscSpace:Pas assez d'espace disque disponible.
+fr.all.NoDiscSpace:Pas assez d’espace disque disponible.
it.all.NoDiscSpace:Spazio insufficiente nel disco.
nl.all.NoDiscSpace:Onvoldoende ruimte beschikbaar op schijf.
zh_CN.all.NoDiscSpace:ç£ç›˜ä¸Šæ²¡æœ‰è¶³å¤Ÿçš„å¯ç”¨ç©ºé—´ã€‚
en.all.HotlistSaveError:The hotlist was unable to be correctly saved.
de.all.HotlistSaveError:Hotlist konnte nicht korrekt gespeichert werden.
-fr.all.HotlistSaveError:Les favoris n'ont pas pu être sauvés correctement.
+fr.all.HotlistSaveError:Les marque-pages n’ont pas pu être correctement sauvés.
it.all.HotlistSaveError:Non è stato possibile salvare correttamente i segnalibri.
nl.all.HotlistSaveError:De favorietenlijst kon niet correct worden bewaard.
zh_CN.all.HotlistSaveError:无法正确ä¿å­˜æ­¤å¸¸ç”¨åˆ—表。
en.all.TreeLoadError:The tree was unable to be correctly loaded.
de.all.TreeLoadError:The tree was unable to be correctly loaded.
-fr.all.TreeLoadError:The tree was unable to be correctly loaded.
+fr.all.TreeLoadError:L’arbre n’a pas pu être correctement chargé.
it.all.TreeLoadError:L'albero della directory non è stato caricato correttamente.
nl.all.TreeLoadError:De gegevensstructuur kon niet correct worden geladen.
zh_CN.all.TreeLoadError:无法正确加载此树。
en.all.NoDirError:%s is not a directory
de.all.NoDirError:%s ist kein Verzeichnis.
-fr.all.NoDirError:%s n'est pas un répertoire
+fr.all.NoDirError:%s n’est pas un dossier
it.all.NoDirError:%s non è una directory
nl.all.NoDirError:%s is geen map
zh_CN.all.NoDirError:%s ä¸æ˜¯ç›®å½•
en.all.NoNameError:Please enter a name
de.all.NoNameError:Bitte einen Namen eingeben.
-fr.all.NoNameError:Entrez un nom SVP
+fr.all.NoNameError:Merci d’entrer un nom
it.all.NoNameError:Inserisci un nome
nl.all.NoNameError:Geef een naam op
zh_CN.all.NoNameError:请输入å称
en.all.NoURLError:Please enter a URL
de.all.NoURLError:Bitte eine URL Adresse eingeben.
-fr.all.NoURLError:Entrez une URL SVP
+fr.all.NoURLError:Merci d’entrer une URL
it.all.NoURLError:Inserisci un URL
nl.all.NoURLError:Geef een adres op
zh_CN.all.NoURLError:请输入 URL
en.all.URIError:NetSurf was unable to parse this URI file due to a syntax error.
de.all.URIError:NetSurf konnte die URI Datei nicht lesen. Syntax Fehler.
-fr.all.URIError:NetSurf est incapable de traiter ce fichier URI à cause d'une erreur de syntaxe.
+fr.all.URIError:NetSurf est incapable de traiter ce fichier URI à cause d’une erreur de syntaxe.
it.all.URIError:NetSurf non è stato in grado di processare questo file URI a causa di un errore di sintassi.
nl.all.URIError:NetSurf kon dit URI-bestand niet verwerken vanwege een syntaxisfout.
zh_CN.all.URIError:由于语法错误,NetSurf 无法解æžæ­¤ URI 文件。
@@ -583,134 +590,137 @@ zh_CN.all.EmptyError:文件为空。
en.all.SearchError:Invalid Search.
de.all.SearchError:Suche fehlerhaft.
-fr.all.SearchError:Recherche Non-Valide.
+fr.all.SearchError:La recherche n’est pas valide.
it.all.SearchError:Ricerca non valida.
nl.all.SearchError:Ongeldige zoekopdracht.
zh_CN.all.SearchError:无效æœç´¢ã€‚
en.all.EncNotRec:Encoding type not recognised.
de.all.EncNotRec:Encodierung nicht erkannt.
-fr.all.EncNotRec:Type de codage non reconnu.
+fr.all.EncNotRec:Le type d’encodage n’est pas reconnu.
it.all.EncNotRec:Tipo di codifica sconosciuta.
nl.all.EncNotRec:Codeertype is niet herkend.
zh_CN.all.EncNotRec:无法识别编ç ç±»åž‹ã€‚
en.all.FileOpenError:could not open file '%s'
de.all.FileOpenError:Datei ist nicht zu öffnen: '%s'
-fr.all.FileOpenError:ne parvient pas à ouvrir le fichier '%s'
+fr.all.FileOpenError:ne parvient pas à ouvrir le fichier « %s »
it.all.FileOpenError:Impossibile aprire il file '%s'
nl.all.FileOpenError:kan bestand '%s' niet openen
zh_CN.all.FileOpenError:无法打开文件“%sâ€
en.all.DirectoryError:directory '%s' already exists
de.all.DirectoryError:Verzeichnis '%s' existiert bereits.
-fr.all.DirectoryError:répertoire '%s' existe déjà
+fr.all.DirectoryError:le dossier « %s » existe déjà
it.all.DirectoryError:La directory '%s' è già esistente
nl.all.DirectoryError:map '%s' bestaat reeds
zh_CN.all.DirectoryError:目录“%sâ€å·²ç»å­˜åœ¨
en.all.Timeout:This site took too long to respond
+fr.all.Timeout:Ce site met trop de temps à répondre
it.all.Timeout:Questo sito sta impiegando troppo a rispondere
zh_CN.all.Timeout:此网站å“应时间过长
en.all.BadURL:The given URL was not able to be parsed
+fr.all.BadURL:L’URL entrée n’a pas pu être parsée
zh_CN.all.BadURL:给定的 URL 无法解æž
# error messages for RISC OS
#
en.ro.PathToURL:An error occurred converting the file path to an URL:
de.ro.PathToURL:Fehler beim Konvertieren des Dateipfades in eine URL Adresse:
-fr.ro.PathToURL:Une erreur s'est produite en convertissant le chemin du fichier en une URL:
+fr.ro.PathToURL:Une erreur s’est produite en convertissant le chemin du fichier en une URL :
it.ro.PathToURL:Si è verificato un errore durante la conversione del percorso file nell'URL:
nl.ro.PathToURL:Fout tijdens het omzetten van het bestandspad naar een adres:
zh_CN.ro.PathToURL:将文件路径转æ¢ä¸º URL æ—¶å‘生错误:
en.ro.WimpError:An unexpected Window Manager error occurred:
de.ro.WimpError:Unerwarteter Fehler im Window Manager:
-fr.ro.WimpError:Une erreur inattendue du Gestionnaire de Fenêtres s'est produite:
+fr.ro.WimpError:Une erreur inattendue du gestionnaire de fenêtres s’est produite :
it.ro.WimpError:Si è verificato un errore inatteso nella finestra principale:
nl.ro.WimpError:Er trad een onverwachte fout op in de Vensterbeheerder:
zh_CN.ro.WimpError:å‘生窗å£ç®¡ç†å™¨é”™è¯¯ï¼š
en.ro.DragError:An error occurred when dragging the icon:
de.ro.DragError:Fehler beim Ziehen des Symboles:
-fr.ro.DragError:Une erreur s'est produite lors du déplacement d'icône:
+fr.ro.DragError:Une erreur s’est produite lors du déplacement de l’icône :
it.ro.DragError:Si è verificato un errore durante il trascinamento dell'icona:
nl.ro.DragError:Fout bij het slepen van het symbool:
zh_CN.ro.DragError:拖动图标时å‘生错误:
en.ro.MenuError:An error occurred when opening the menu:
de.ro.MenuError:Fehler beim Öffnen des Menüs:
-fr.ro.MenuError:Une erreur s'est produite lors de l'ouverture du menu:
+fr.ro.MenuError:Une erreur s’est produite lors de l’ouverture du menu :
it.ro.MenuError:Si è verificato un errore durante l'apertura del menu:
nl.ro.MenuError:Fout bij het openen van het menu:
zh_CN.ro.MenuError:打开èœå•æ—¶å‘生错误:
en.ro.DownloadWarn:This download may not complete:
de.ro.DownloadWarn:Der Download ist wahrscheinlich unvollständig:
-fr.ro.DownloadWarn:Ce téléchargement ne peut pas se terminer:
+fr.ro.DownloadWarn:Ce téléchargement ne peut pas se terminer :
it.ro.DownloadWarn:Questo trasferimento potrebbe essere incompleto:
nl.ro.DownloadWarn:Dit bestand is misschien niet compleet opgehaald:
zh_CN.ro.DownloadWarn:此下载å¯èƒ½æ— æ³•å®Œæˆï¼š
en.ro.LongURL:The URL for this page is too long for NetSurf to display.
de.ro.LongURL:The URL for this page is too long for NetSurf to display.
-fr.ro.LongURL:The URL for this page is too long for NetSurf to display.
+fr.ro.LongURL:L’URL de cette page est trop longue pour pouvoir être affichée par NetSurf.
it.ro.LongURL:L'URL di questa pagina è troppo lungo per essere visualizzato su NetSurf.
nl.ro.LongURL:Het adres van deze pagina is te lang voor NetSurf om te kunnen tonen.
zh_CN.ro.LongURL:该页é¢çš„ URL 过长, NetSurf 无法显示。
en.ro.FontBadInst:An error occurred when initialising fonts due to the presence of obsolete copies of the ROM fonts on disc. NetSurf will exit and launch a program which will attempt to fix this.
de.ro.FontBadInst:Font-Initialisierung fehlerhaft. Obsolete Kopien von ROM Fonts auf dem lokalem Speichermedium. Fehlerbehebung startet.
-fr.ro.FontBadInst:Une erreur s'est produite lors de l'initialisation des fontes à cause de la présence de copies obsolètes de fontes ROM sur disque. NetSurf va sortir et lancer un programme qui va tenter de réparer cela.
+fr.ro.FontBadInst:Une erreur s’est produite lors de l’initialisation des polices de caractères à cause de la présence de copies obsolètes de polices ROM sur le disque. NetSurf va s’arrêter et lancer un programme pour tenter de réparer ça.
it.ro.FontBadInst:Si è verificato un errore durante l'inizializzazione dei font a causa della presenza di una copia obsoleta dei font "ROM" nel disco. NetSurf verrà chiuso e si cercherà di lanciare un programma in grado di risolvere questo problema.
nl.ro.FontBadInst:Probleem ontstaan bij het initialiseren van de lettertypen. Een schijf bevat een map met geactiveerde ROM-lettertypes die overbodig zijn. NetSurf wordt gestopt en activeert een programma die dit probleem probeert te verhelpen.
zh_CN.ro.FontBadInst:因为ç£ç›˜ä¸Šå­˜åœ¨ ROM 字体的过时副本,åˆå§‹åŒ–字体时出现错误。NetSurf 将退出并å¯åŠ¨ä¸€ä¸ªç”¨äºŽå°è¯•ä¿®å¤æ­¤é—®é¢˜çš„程åºã€‚
en.ro.FontError:Failed to open font "Homerton.Medium" (%s).
de.ro.FontError:Fehler beim öffnen des Fonts "Homerton.Medium" (%s).
-fr.ro.FontError:Échec d'ouverture de la fonte "Homerton.Medium" (%s).
+fr.ro.FontError:Échec d’ouverture de la police « Homerton.Medium » (%s).
it.ro.FontError:Impossibile aprire il font "Homerton.Medium" (%s).
nl.ro.FontError:Het lettertypebestand "Homerton.Medium" kan niet worden geopend (%s).
zh_CN.ro.FontError:无法打开字体“Homerton.Mediumâ€(%s)。
en.ro.Resolvers:No domain name servers are configured, so only browsing local files will be possible. Use Configure to set your name server(s).
de.ro.Resolvers:Keine Domain Name Servers (DNS) konfiguriert. Nur lokale Dateien sind ladbar. Bitte DNS unter !Boot eintragen.
-fr.ro.Resolvers:Aucun nom de domaine n'étant configuré, seul la consultation de fichiers locaux est possible. Utilisez Configure pour définir les serveurs de noms.
+fr.ro.Resolvers:Aucun serveur de résolution de nom de domaine n’étant configuré, seul la consultation de fichiers locaux est possible. Utilisez Configure pour définir les serveurs de noms.
it.ro.Resolvers:Non è stato configurato nessun nome per i domini dei server, perciò sarà possibile effettuare la navigazione dei file solo in modalità locale. Usa "Configura" per impostare il nome (o i nomi) del/dei server.
nl.ro.Resolvers:Er zijn geen DNS-servers ingesteld, dus kunnen alleen lokale bestanden worden bekeken. Ga naar de netwerkinstellingen via !Boot om de DNS-server(s) in te stellen.
zh_CN.ro.Resolvers:没有é…置域åæœåŠ¡å™¨ï¼Œå› æ­¤åªèƒ½æµè§ˆæœ¬åœ°æ–‡ä»¶ã€‚ 使用é…ç½®æ¥è®¾ç½®æ‚¨çš„域åæœåŠ¡å™¨ã€‚
en.ro.Template:A window template is missing from the Templates file. Please reinstall NetSurf.
de.ro.Template:Ein Template für ein Fenster fehlt in der Datei Templates. Bitte NetSurf neu installieren.
-fr.ro.Template:Un modèle de fenêtre est absent du fichier Templates. Réinstallez NetSurf SVP.
+fr.ro.Template:Un modèle de fenêtre est absent du fichier des modèles. Merci de réinstaller NetSurf.
it.ro.Template:Una finestra di template risulta mancante. Per favore reinstalla NetSurf.
nl.ro.Template:Er ontbreekt een vensterdefinitie in het Templates-bestand. Installeer NetSurf opnieuw.
zh_CN.ro.Template:Templates 文件中缺少窗å£æ¨¡æ¿ã€‚请é‡æ–°å®‰è£… NetSurf。
en.ro.NoPathError:To save, drag the icon to a directory display
de.ro.NoPathError:Symbol in ein Verzeichnisfenster ziehen um zu Speichern.
-fr.ro.NoPathError:Pour sauver, lâcher cette icône dans une fenêtre de Filer
+fr.ro.NoPathError:Pour enregistrer, déposez cette icône dans la fenêtre d’un dossier
it.ro.NoPathError:Per salvare, trascina l'icona in una directory di visualizzazione.
nl.ro.NoPathError:Het symbool naar een geopende mapvenster slepen om te bewaren.
zh_CN.ro.NoPathError:è‹¥è¦ä¿å­˜ï¼Œè¯·å°†å›¾æ ‡æ‹–动到显示的目录中
en.ro.AWNotSeen:Please locate the AWViewer application and try again.
de.ro.AWNotSeen:Das Programm AWViewer wurde nicht gefunden.
-fr.ro.AWNotSeen:Localisez l'application AMViewer SVP puis réessayez.
+fr.ro.AWNotSeen:Merci de définir l’emplacement de l’application AWViewer avant de réessayez.
it.ro.AWNotSeen:Per favore fornisci l'applicativo AWViewer e riprova nuovamente.
nl.ro.AWNotSeen:Initialiseer het AWViewer-programma door het op te zoeken en probeer het dan nog eens.
zh_CN.ro.AWNotSeen:è¯·å®šä½ AWViewer 应用程åºï¼Œç„¶åŽé‡è¯•ã€‚
en.ro.PrintErrorRO2:It appears that the printer is busy.
de.ro.PrintErrorRO2:Der Drucker scheint beschäftigt zu sein.
-fr.ro.PrintErrorRO2:Il semble que l'imprimante soit occupée.
+fr.ro.PrintErrorRO2:Il semble que l’imprimante soit occupée.
it.ro.PrintErrorRO2:La stampante sembra essere occupata.
nl.ro.PrintErrorRO2:De printer lijkt al bezig te zijn.
zh_CN.ro.PrintErrorRO2:打å°æœºä¼¼ä¹Žæ­£å¿™ã€‚
en.ro.SprIsNull:Unable to convert image to sprite
de.ro.SprIsNull:Bild nicht in Sprite konvertierbar
+fr.ro.SprIsNull:Impossible de convertir l’image en « sprite »
it.ro.SprIsNull:Impossibile convertire l'immagine in sprite.
nl.ro.SprIsNull:Afbeelding kan niet worden omgezet in een sprite.
zh_CN.ro.SprIsNull:无法将图åƒè½¬æ¢ä¸ºè´´å›¾
@@ -719,35 +729,35 @@ zh_CN.ro.SprIsNull:无法将图åƒè½¬æ¢ä¸ºè´´å›¾
#
en.ami.CompError:Unable to open
de.ami.CompError:Nicht zu öffnen
-fr.ami.CompError:Unable to open
+fr.ami.CompError:Ouverture impossible
it.ami.CompError:Impossibile aprire
nl.ami.CompError:Niet te openen
zh_CN.ami.CompError:无法打开
en.ami.BMConvErr:NetSurf requires guigfx.library to display images in this mode
de.ami.BMConvErr:NetSurf benötigt die guigfx.library für Bilder in diesem Mode
-fr.ami.BMConvErr:NetSurf requires guigfx.library to display images in this mode
+fr.ami.BMConvErr:NetSurf requiert guigfx.library pour afficher les images dans ce mode
it.ami.BMConvErr:NetSurf richiede la guigfx.library per visualizzare le immagini in questa modalità
nl.ami.BMConvErr:NetSurf requires guigfx.library to display images in this mode
zh_CN.ami.BMConvErr:在这ç§æ¨¡å¼ä¸‹ï¼ŒNetSurf éœ€è¦ guigfx.library æ¥æ˜¾ç¤ºå›¾åƒ
en.ami.MultiTabClose:Are you sure you want to close multiple tabs?
de.ami.MultiTabClose:Wirklich mehrere Tabs schließen?
-fr.ami.MultiTabClose:Are you sure you want to close multiple tabs?
+fr.ami.MultiTabClose:Êtes-vous sûr de vouloir fermer plusieurs onglets en même temps ?
it.ami.MultiTabClose:Sono rimaste aperte più schede, sei sicuro di voler chiudere NetSurf?
nl.ami.MultiTabClose:Er zijn meerdere tabbladen geopend. Tabbladen allemaal sluiten?
zh_CN.ami.MultiTabClose:您确定è¦å…³é—­å¤šä¸ªæ ‡ç­¾é¡µå—?
en.ami.TCPIPShutdown:The TCP/IP stack has signalled that it is about to shutdown and NetSurf must exit. NetSurf will quit in 5 seconds unless this shutdown is aborted.
de.ami.TCPIPShutdown:Der TCP/IP Stack geht grad' zur Hölle und reißt Netsurf mit sich. In genau 5 Sekunden - es sei denn, der Shutdown wird abgebrochen.
-fr.ami.TCPIPShutdown:The TCP/IP stack has signalled that it is about to shutdown and NetSurf must exit. NetSurf will quit in 5 seconds unless this shutdown is aborted.
+fr.ami.TCPIPShutdown:La pile TCP/IP a signalé son arrêt et NetSurf doit donc être fermé. NetSurf va s’arrêter dans 5 secondes à moins que cet arrêt soit annulé.
it.ami.TCPIPShutdown:Lo stack TCP/IP ha dato segnale di essere in procinto di arresto, NetSurf verrà chiuso. NetSurf si chiuderà entro 5 secondi a meno che lo shutdown non venga interrotto.
nl.ami.TCPIPShutdown:De TCP/IP-stack meldt dat deze wordt afgesloten waardoor NetSurf gestopt moet worden. NetSurf zal stoppen in 5 seconden, tenzij het afsluiten wordt afgebroken.
zh_CN.ami.TCPIPShutdown:TCP/IP 堆栈已å‘出å³å°†å…³é—­çš„ä¿¡å·ï¼Œå¹¶ä¸” NetSurf 必须退出。除éžä¸­æ­¢å…³æœºï¼Œå¦åˆ™ NetSurf 将在 5 秒钟内退出。
en.ami.AbortShutdown:Abort shutdown
de.ami.AbortShutdown:Shutdown abbrechen
-fr.ami.AbortShutdown:Abort shutdown
+fr.ami.AbortShutdown:Annuler l’arrêt
it.ami.AbortShutdown:Interrompi lo shutdown
nl.ami.AbortShutdown:Afsluiten afbreken
zh_CN.ami.AbortShutdown:中止关机
@@ -760,14 +770,14 @@ zh_CN.ami.AbortShutdown:中止关机
#
en.all.AbortDownload:Are you sure you wish to abort this download?
de.all.AbortDownload:Soll das Herunterladen der Datei wirklich abgebrochen werden ?
-fr.all.AbortDownload:Étes-vous sûr de vouloir interrompre ce téléchargement ?
+fr.all.AbortDownload:Étes-vous sûr de vouloir interrompre ce téléchargement ?
it.all.AbortDownload:Sei sicuro di voler annullare questo trasferimento?
nl.all.AbortDownload:Zeker weten dat deze ophaalopdracht afgebroken moet worden?
zh_CN.all.AbortDownload:您确定è¦ä¸­æ­¢æ­¤ä¸‹è½½ä»»åŠ¡å—?
en.all.QuitDownload:One or more downloads are still in progress. Are you sure you wish to quit?
de.all.QuitDownload:Das Herunterladen ein oder mehrerer Dateien wurde noch nicht abgeschlossen. Soll NetSurf trotzdem beendet werden ?
-fr.all.QuitDownload:Un ou plusieurs téléchargements sont en cours. Êtes-vous sûr de vouloir quitter ?
+fr.all.QuitDownload:Un ou plusieurs téléchargements sont en cours. Êtes-vous sûr de vouloir quitter ?
it.all.QuitDownload:Uno o più file si trovano in fase di scaricamento, sei sicuro di voler chiudere NetSurf?
nl.all.QuitDownload:Eén of meer ophaalopdrachten zijn nog in uitvoering. Toch afbreken?
zh_CN.all.QuitDownload:一或多个下载任务ä»åœ¨è¿›è¡Œä¸­ã€‚您确定è¦é€€å‡ºå—?
@@ -781,7 +791,7 @@ zh_CN.all.OverwriteFile:å·²ç»å­˜åœ¨å…·æœ‰è¯¥å称的文件,原文件将会ä¸
en.all.RemoveHotlist:Are you sure you wish to remove this address from the hotlist?
de.all.RemoveHotlist:Adresse wirklich aus der Hotlist entfernen?
-fr.all.RemoveHotlist:Êtes-vous sûr de vouloir supprimer l'adresse de la liste critique?
+fr.all.RemoveHotlist:Êtes-vous sûr de vouloir supprimer cette adresse des marque-pages ?
it.all.RemoveHotlist:Sei sicuro di voler rimuovere questo indirizzo dai segnalibri?
nl.all.RemoveHotlist:Zeker weten dat dit adres uit de favorietenlijst verwijderd moet worden?
zh_CN.all.RemoveHotlist:您确定è¦ä»Žå¸¸ç”¨é¡¹åˆ—表中删除此地å€å—?
@@ -812,7 +822,7 @@ zh_CN.all.ProgressU:%s
en.all.RecPercent:Received %s (%u%%)
de.all.RecPercent:Empfangen %s (%u%%)
-fr.all.RecPercent:%s (%u%%)
+fr.all.RecPercent:%s reçus (%u%%)
it.all.RecPercent:ricevuti %s (%u%%)
nl.all.RecPercent:ontvangen %s (%u%%)
zh_CN.all.RecPercent:已收到 %s (%u%%)
@@ -826,7 +836,7 @@ zh_CN.all.Received:已收到 %s
en.all.Redirecting:Redirecting...
de.all.Redirecting:Umleiten...
-fr.all.Redirecting:Redirection en cours...
+fr.all.Redirecting:Redirection en cours…
it.all.Redirecting:redirezione in corso...
nl.all.Redirecting:doorverwijzen...
zh_CN.all.Redirecting:正在é‡å®šå‘…
@@ -877,7 +887,7 @@ zh_CN.all.Stopped:å·²åœæ­¢
#
en.all.BadRedirect:Bad redirect URL
de.all.BadRedirect:Falsche URL für Redirect
-fr.all.BadRedirect:Mauvais URL de redirection
+fr.all.BadRedirect:Mauvaise URL de redirection
it.all.BadRedirect:Errata redirezione dell'URL
nl.all.BadRedirect:foutief doorverwijzen naar adres
zh_CN.all.BadRedirect:错误的é‡å®šå‘地å€
@@ -891,35 +901,35 @@ zh_CN.all.FetchFailed:无法获å–文件
en.all.NotCSS:Warning: stylesheet is not CSS
de.all.NotCSS:Warnung:Stylesheet ist kein CSS
-fr.all.NotCSS:Attention: feuille de style non CSS
+fr.all.NotCSS:Attention : la feuille de style n’est pas du CSS
it.all.NotCSS:Attenzione: La dicitura "Foglio di stile" non ha nulla a che vedere con i CSS
nl.all.NotCSS:melding: stijlblad is geen CSS
zh_CN.all.NotCSS:警告:样å¼è¡¨ä¸æ˜¯ CSS æ ·å¼
en.all.NotFavIco:Favicon not supported
de.all.NotFavIco:Favicon wird nicht unterstützt
-fr.all.NotFavIco:Favicon non-soutenu
+fr.all.NotFavIco:Favicon non reconnu
it.all.NotFavIco:Favicon non supportata
nl.all.NotFavIco:websitesymbool wordt niet ondersteund
zh_CN.all.NotFavIco:ä¸æ”¯æŒçš„网站图标
en.all.BadObject:Warning: bad object type
de.all.BadObject:Warnung: falscher Objekttyp
-fr.all.BadObject:Attention: mauvais type d'objet
+fr.all.BadObject:Attention : mauvais type d’objet
it.all.BadObject:Errore nell'analisi del tipo di oggetto
nl.all.BadObject:melding: fout objecttype
zh_CN.all.BadObject:警告:对象类型错误
en.all.ObjError:Error loading object: %s
de.all.ObjError:Fehler beim Laden des Objektes: %s
-fr.all.ObjError:Erreur lors du chargement de: %s
+fr.all.ObjError:Erreur lors du chargement de : %s
it.all.ObjError:Errore nel caricamento dell'oggetto: %s
nl.all.ObjError:fout bij het laden object: %s
zh_CN.all.ObjError:加载对象时出错:%s
en.all.ParsingFail:Parsing the document failed.
de.all.ParsingFail:Dokumentparsing ist fehlgeschlagen.
-fr.all.ParsingFail:L'analyse syntaxique du document a échoué.
+fr.all.ParsingFail:L’analyse syntaxique du document a échoué.
it.all.ParsingFail:Analisi del documento fallita.
nl.all.ParsingFail:fout bij ontleden van dit document.
zh_CN.all.ParsingFail:无法解æžæ–‡æ¡£ã€‚
@@ -939,42 +949,42 @@ zh_CN.all.CSSBase:无法加载基本样å¼è¡¨
en.all.BadGIF:Reading GIF failed.
de.all.BadGIF:Lesen einer GIF Datei fehlgeschlagen.
-fr.all.BadGIF:Erreur de lecture de GIF.
+fr.all.BadGIF:Erreur de lecture GIF.
it.all.BadGIF:Lettura del file GIF fallita.
nl.all.BadGIF:fout bij lezen GIF.
zh_CN.all.BadGIF:æ— æ³•èŽ·å– GIF 图åƒã€‚
en.all.BadBMP:Reading BMP failed.
de.all.BadBMP:Lesen einer BMP Datei fehlgeschlagen.
-fr.all.BadBMP:Erreur de lecture de BMP.
+fr.all.BadBMP:Erreur de lecture BMP.
it.all.BadBMP:Lettura del file BMP fallita.
nl.all.BadBMP:fout bij lezen BMP.
zh_CN.all.BadBMP:æ— æ³•èŽ·å– BMP 图åƒã€‚
en.all.BadICO:Reading ICO failed.
de.all.BadICO:Lesen einer ICO Datei fehlgeschlagen.
-fr.all.BadICO:Erreur de lecture de ICO.
+fr.all.BadICO:Erreur de lecture ICO.
it.all.BadICO:Lettura del file ICO fallita.
nl.all.BadICO:fout bij lezen ICO.
zh_CN.all.BadICO:æ— æ³•èŽ·å– ICO 图åƒã€‚
en.all.PNGError:Error converting PNG.
de.all.PNGError:Fehler beim PNG konvertieren.
-fr.all.PNGError:Error converting PNG.
+fr.all.PNGError:Erreur de conversion PNG.
it.all.PNGError:Errore durante la conversione PNG.
nl.all.PNGError:fout bij omzetting PNG.
zh_CN.all.PNGError:æ— æ³•è½¬æ¢ PNG 图åƒã€‚
en.all.MNGError:Error converting MNG/PNG/JNG: %i
de.all.MNGError:MNG Library Fehler: %i
-fr.all.MNGError:Erreur dans la bibliothèque MNG: %i
+fr.all.MNGError:Erreur dans la bibliothèque MNG/PNG/JNG : %i
it.all.MNGError:Errore durante la conversione MNG/PNG/JNG: %i
nl.all.MNGError:MNG-bibliotheekfout: %i
zh_CN.all.MNGError:æ— æ³•è½¬æ¢ MNG/PNG/JNG 图åƒï¼š%i
en.all.BadSprite:Invalid or corrupt Sprite data.
de.all.BadSprite:Ungültiges oder beschädigtes Sprite.
-fr.all.BadSprite:Les données du sprite sont invalides ou corrompues.
+fr.all.BadSprite:Les données du « sprite » sont invalides ou corrompues.
it.all.BadSprite:Dati del file Sprite invalidi o corrotti.
nl.all.BadSprite:foutief sprite-bestand.
zh_CN.all.BadSprite:无效或已æŸå的贴图数æ®ã€‚
@@ -1020,14 +1030,14 @@ zh_CN.all.HTTP203:éžæƒå¨ä¿¡æ¯
en.all.HTTP204:No content
de.all.HTTP204:No content
-fr.all.HTTP204:Pas de contenu
+fr.all.HTTP204:Aucun contenu
it.all.HTTP204:Nessun contenuto
nl.all.HTTP204:Geen inhoud
zh_CN.all.HTTP204:无内容
en.all.HTTP205:Reset content
de.all.HTTP205:Reset content
-fr.all.HTTP205:Remise-à-Zéro du contenu
+fr.all.HTTP205:Réinitialisation du contenu
it.all.HTTP205:Resetta contenuto
nl.all.HTTP205:Inhoud opnieuw instellen
zh_CN.all.HTTP205:é‡è®¾å†…容
@@ -1048,7 +1058,7 @@ zh_CN.all.HTTP300:多é‡é€‰æ‹©
en.all.HTTP301:Moved permanently
de.all.HTTP301:Moved permanently
-fr.all.HTTP301:A déménagé définitivement
+fr.all.HTTP301:A changé d’adresse définitivement
it.all.HTTP301:Rimosso permanentemente
nl.all.HTTP301:Definitief verplaatst
zh_CN.all.HTTP301:永久移动
@@ -1069,7 +1079,7 @@ zh_CN.all.HTTP303:查看其他
en.all.HTTP304:Not modified
de.all.HTTP304:Not modified
-fr.all.HTTP304:Pas modifié
+fr.all.HTTP304:Non modifié
it.all.HTTP304:Non modificato
nl.all.HTTP304:Niet gewijzigd
zh_CN.all.HTTP304:未修改
@@ -1097,7 +1107,7 @@ zh_CN.all.HTTP400:错误请求
en.all.HTTP401:Unauthorized
de.all.HTTP401:Unauthorized
-fr.all.HTTP401:Sans autorisation
+fr.all.HTTP401:Non autorisé
it.all.HTTP401:Autorizzazione negata
nl.all.HTTP401:Niet geautoriseerd
zh_CN.all.HTTP401:未ç»æŽˆæƒ
@@ -1118,7 +1128,7 @@ zh_CN.all.HTTP403:å·²ç¦æ­¢
en.all.HTTP404:Not found
de.all.HTTP404:Not found
-fr.all.HTTP404:Pas trouvé
+fr.all.HTTP404:Non trouvé
it.all.HTTP404:Non trovato
nl.all.HTTP404:Niet gevonden
zh_CN.all.HTTP404:未找到
@@ -1132,14 +1142,14 @@ zh_CN.all.HTTP405:方法ä¸å…许
en.all.HTTP406:Not acceptable
de.all.HTTP406:Not acceptable
-fr.all.HTTP406:Pas acceptable
+fr.all.HTTP406:Non acceptable
it.all.HTTP406:Non accettabile
nl.all.HTTP406:Niet aanvaardbaar
zh_CN.all.HTTP406:ä¸æŽ¥å—
en.all.HTTP407:Proxy authentication required
de.all.HTTP407:Proxy authentication required
-fr.all.HTTP407:Authentification du proxy nécessaire
+fr.all.HTTP407:Authentification via proxy nécessaire
it.all.HTTP407:Autentificazione Proxy necessaria
nl.all.HTTP407:Authenticatie op de proxy-server verplicht
zh_CN.all.HTTP407:需è¦ä»£ç†èº«ä»½éªŒè¯
@@ -1167,7 +1177,7 @@ zh_CN.all.HTTP410:已丢失
en.all.HTTP411:Length required
de.all.HTTP411:Length required
-fr.all.HTTP411:Longueur nécessaire
+fr.all.HTTP411:Taille nécessaire
it.all.HTTP411:Lunghezza richiesta
nl.all.HTTP411:Lengte benodigd
zh_CN.all.HTTP411:长度å—é™
@@ -1181,14 +1191,14 @@ zh_CN.all.HTTP412:å‰ææ¡ä»¶å¤±è´¥
en.all.HTTP413:Request entity too large
de.all.HTTP413:Request entity too large
-fr.all.HTTP413:Demande d'entité trop grande
+fr.all.HTTP413:Requète trop grande pour cette entité
it.all.HTTP413:Entità richiesta troppo larga
nl.all.HTTP413:Aanvraag te groot
zh_CN.all.HTTP413:请求的实体过大
en.all.HTTP414:Request-URI too long
de.all.HTTP414:Request-URI too long
-fr.all.HTTP414:Request-URI trop long
+fr.all.HTTP414:L’URI de la requète est trop longue
it.all.HTTP414:Richiesta URI troppo lunga
nl.all.HTTP414:Aanvraagadres te lang
zh_CN.all.HTTP414:请求的 URI 过长
@@ -1202,7 +1212,7 @@ zh_CN.all.HTTP415:ä¸æ”¯æŒçš„媒体类型
en.all.HTTP416:Requested range not satisfiable
de.all.HTTP416:Requested range not satisfiable
-fr.all.HTTP416:Étendue demandée non satisfaisable
+fr.all.HTTP416:Plage demandée non satisfaite
it.all.HTTP416:Estensione richiesta non soddisfabile
nl.all.HTTP416:Aangevraagd gedeelte niet opvraagbaar
zh_CN.all.HTTP416:无法满足è¦æ±‚的范围
@@ -1244,14 +1254,14 @@ zh_CN.all.HTTP503:ä¸å¯ç”¨æœåŠ¡
en.all.HTTP504:Gateway timeout
de.all.HTTP504:Gateway timeout
-fr.all.HTTP504:Délai passerelle expiré
+fr.all.HTTP504:Délai expiré de la passerelle
it.all.HTTP504:Timeout Gateway
nl.all.HTTP504:Aanvraagtijd bij Gateway verstreken
zh_CN.all.HTTP504:网关超时
en.all.HTTP505:HTTP version not supported
de.all.HTTP505:HTTP version not supported
-fr.all.HTTP505:version HTTP non supportée
+fr.all.HTTP505:Version HTTP non supportée
it.all.HTTP505:Versione HTTP non supportata
nl.all.HTTP505:HTTP-versie wordt niet ondersteund
zh_CN.all.HTTP505:ä¸æ”¯æŒçš„ HTTP 版本
@@ -1304,7 +1314,7 @@ zh_CN.all.FileDate:文件日期
en.all.FileTime:Time
de.all.FileTime:Zeit
-fr.all.FileTime:Time
+fr.all.FileTime:Heure
it.all.FileTime:Ora
nl.all.FileTime:Tijd
zh_CN.all.FileTime:文件时间
@@ -1346,7 +1356,7 @@ zh_CN.all.Prev:上一页
en.all.ShowAll:Show All
de.all.ShowAll:Alle zeigen
-fr.all.ShowAll:Tout afficher
+fr.all.ShowAll:Afficher tout
it.all.ShowAll:Mostra Tutto
nl.all.ShowAll:Toon alles
zh_CN.all.ShowAll:显示全部
@@ -1367,17 +1377,17 @@ zh_CN.all.CaseSens:区分大å°å†™
#
en.all.LoginTitle:Authentication Requested
it.all.LoginTitle:Richiesta di Autentificazione
-fr.all.LoginTitle:Authentification demandée
+fr.all.LoginTitle:Authentification requise
zh_CN.all.LoginTitle:è¦æ±‚认è¯
en.all.LoginDescription:The site %s with realm "%s" is requesting credentials for access.
it.all.LoginDescription:Il sito %s con elementi di tipo realm "%s" richiede delle credenziali per l'accesso.
-fr.all.LoginDescription:Le site %s avec le royaume "%s" demande des informations d'identification pour l'accès.
+fr.all.LoginDescription:Le site %s demande des informations d’identification pour accéder au domaine « %s ».
zh_CN.all.LoginDescription:域“%2$sâ€çš„站点 %1$s 正在请求访问凭è¯ã€‚
en.all.LoginAgain:The credentials for the site %s and realm "%s" were rejected.
it.all.LoginAgain:Le credenziali per il sito %s ed il realm "%s" sono state rifiutate.
-fr.all.LoginAgain:Les identifiants pour le site %s et le royaume "%s" ont été rejetés.
+fr.all.LoginAgain:Les identifiants pour le site %s et son domaine « %s » ont été rejetés.
zh_CN.all.LoginAgain:网站 %s 和领域“%sâ€çš„凭è¯è¢«æ‹’ç»ã€‚
en.all.Host:Host
@@ -1396,7 +1406,7 @@ zh_CN.all.Realm:域
en.all.Username:Username
de.all.Username:Benutzername
-fr.all.Username:Nom d'utilisateur
+fr.all.Username:Nom d’utilisateur
it.all.Username:Nome Utente
nl.all.Username:Gebruikersnaam
zh_CN.all.Username:用户å
@@ -1428,12 +1438,13 @@ zh_CN.all.Cancel:å–消
#
en.all.PrivacyTitle:Privacy error
de.all.PrivacyTitle:Datenschutzfehler
-fr.all.PrivacyTitle:Erreur de confidentialité
+fr.all.PrivacyTitle:Problème de confidentialité
it.all.PrivacyTitle:Errore della privacy
nl.all.PrivacyTitle:Privacyfout
zh_CN.all.PrivacyTitle:用户éšç§é”™è¯¯
en.all.PrivacyDescription:A privacy error occurred while communicating with %s this may be a site configuration error or an attempt to steal private information (passwords, messages or credit cards)
+fr.all.PrivacyDescription:Un problème de confidentialité est apparu lors de la communication avec %s. Cela peut être dû à une erreur de configuration du site ou une tentative de vol d’informations privées (mots de passe, messages, numéros de carte de crédit, …)
it.all.PrivacyDescription:Si è verificato un errore della privacy durante la comunicazione con %s fai attenzione, questo potrebbe essere un errore di configurazione del sito oppure un tentativo di rubare informazioni private (password, messaggi o numeri di carte di credito)
zh_CN.all.PrivacyDescription:与 %s 通讯时å‘生éšç§é”™è¯¯ï¼Œè¿™å¯èƒ½æ˜¯ç½‘ç«™é…置错误或试图窃å–ç§äººä¿¡æ¯ï¼ˆå¯†ç ï¼Œæ¶ˆæ¯æˆ–信用å¡ï¼‰å¯¼è‡´çš„
@@ -1453,59 +1464,70 @@ zh_CN.all.ViewCertificatesNotPossible:è¯ä¹¦ä¿¡æ¯ä¸å¯æŸ¥çœ‹
en.all.Proceed:Proceed
de.all.Proceed:Vorgehen
-fr.all.Proceed:Procéder
+fr.all.Proceed:Continuer
it.all.Proceed:Procedi
nl.all.Proceed:Doorgaan
zh_CN.all.Proceed:继续进行
en.all.Backtosafety:Back to safety
de.all.Backtosafety:Zurück zur Sicherheit
-fr.all.Backtosafety:Retour a la sécurité
+fr.all.Backtosafety:Retourner en sécurité
it.all.Backtosafety:Torna al modo sicuro
nl.all.Backtosafety:Terug naar veiligheid
zh_CN.all.Backtosafety:返回到安全区域
en.all.SSLCertErrOk:The certificate has no errors.
+fr.all.SSLCertErrOk:Le certificat n’a pas d’erreur.
it.all.SSLCertErrOk:Il certificato non contiene errori.
zh_CN.all.SSLCertErrOk:è¯ä¹¦æ²¡æœ‰é”™è¯¯ã€‚
en.all.SSLCertErrUnknown:An unknown error occurred while processing the certificate.
+fr.all.SSLCertErrUnknown:Une erreur inconnue est survenue durant le traitement du certificat.
it.all.SSLCertErrUnknown:Si è verificato un problema sconosciuto durante l'elaborazione del certificato.
zh_CN.all.SSLCertErrUnknown:处ç†è¯ä¹¦æ—¶å‘生未知错误。
en.all.SSLCertErrBadIssuer:The issuer of this certificate is not known. This may occur if the browser cannot access the certificate authority (CA) bundle.
+fr.all.SSLCertErrBadIssuer:L’émetteur de ce certificat est inconnu. Cela peut arriver si le navigateur ne peut pas accéder au paquet des certificats d’autorité.
it.all.SSLCertErrBadIssuer:L'emittente di questo certificato è sconosciuto. Questo può verificarsi se il browser non è in grado di accedere al pacchetto dell'autorità di certificazione (CA).
zh_CN.all.SSLCertErrBadIssuer:该è¯ä¹¦çš„å‘行者未知。如果æµè§ˆå™¨æ— æ³•è®¿é—®è¯ä¹¦é¢å‘机构(CA)的æ†ç»‘包,则å¯èƒ½ä¼šå‘生这ç§æƒ…况。
en.all.SSLCertErrBadSig:The certificate is improperly signed.
+fr.all.SSLCertErrBadSig:Le certificat est mal signé.
it.all.SSLCertErrBadSig:Il certificato non è stato firmato correttamente.
zh_CN.all.SSLCertErrBadSig:è¯ä¹¦ç­¾åä¸æ­£ç¡®ã€‚
en.all.SSLCertErrTooYoung:The certificate is not yet valid.
+fr.all.SSLCertErrTooYoung:Le certificat n’est pas encore valide.
it.all.SSLCertErrTooYoung:Il certificato non è ancora valido.
zh_CN.all.SSLCertErrTooYoung:è¯ä¹¦å°šæœªç”Ÿæ•ˆã€‚
en.all.SSLCertErrTooOld:The certificate has expired.
+fr.all.SSLCertErrTooOld:Le certificat a expiré.
it.all.SSLCertErrTooOld:Il certificato è scaduto.
zh_CN.all.SSLCertErrTooOld:è¯ä¹¦å·²è¿‡æœŸã€‚
en.all.SSLCertErrSelfSigned:The certificate is self signed.
+fr.all.SSLCertErrSelfSigned:Le certificat est auto-signé.
it.all.SSLCertErrSelfSigned:Il certificato è autofirmato.
zh_CN.all.SSLCertErrSelfSigned:è¯ä¹¦æ˜¯è‡ªç­¾å的。
en.all.SSLCertErrChainSelfSigned:The certificate chain is self signed.
+fr.all.SSLCertErrChainSelfSigned:La chaîne de certification est auto-signée.
it.all.SSLCertErrChainSelfSigned:La catena dei certificati è autofirmata.
zh_CN.all.SSLCertErrChainSelfSigned:è¯ä¹¦é“¾æ˜¯è‡ªç­¾å的。
en.all.SSLCertErrRevoked:The certificate has been revoked by the issuer.
+fr.all.SSLCertErrRevoked:Le certificat a été révoqué par son émetteur.
it.all.SSLCertErrRevoked:Il certificato è stato revocato dall'emittente.
zh_CN.all.SSLCertErrRevoked:该è¯ä¹¦å·²è¢«å‘行者åŠé”€ã€‚
en.all.SSLCertErrHostnameMismatch:The certificate is for a different host than the server.
+fr.all.SSLCertErrHostnameMismatch:Le certificat est pour un nom d’hôte différent de celui du serveur.
it.all.SSLCertErrHostnameMismatch:Il certificato è per un host diverso rispetto al server.
zh_CN.all.SSLCertErrHostnameMismatch:è¯ä¹¦ç”¨äºŽä¸ŽæœåŠ¡å™¨ä¸åŒçš„主机。
en.all.SSLCertErrCertMissing:The certificate was missing from the chain.
+fr.all.SSLCertErrCertMissing:Le certificat n’est pas dans la chaîne.
it.all.SSLCertErrCertMissing:Il certificato mancava dalla catena.
zh_CN.all.SSLCertErrCertMissing:è¯ä¹¦ä»Žé“¾ä¸­ä¸¢å¤±ã€‚
@@ -1514,18 +1536,22 @@ zh_CN.all.SSLCertErrCertMissing:è¯ä¹¦ä»Žé“¾ä¸­ä¸¢å¤±ã€‚
# =======================
#
en.all.TimeoutTitle:Connection timed out
+fr.all.TimeoutTitle:La connexion a expiré
it.all.TimeoutTitle:Connessione scaduta
zh_CN.all.TimeoutTitle:连接超时
en.all.TimeoutDescription: A connection to %s could not be established. The site may be temporarily unavailable or too busy to respond.
+fr.all.TimeoutDescription: La connexion à %s n’a pas pu être établie. Le site peut être temporairement injoignable ou trop occupé pour répondre.
it.all.TimeoutDescription: La connessione a %s non può essere stabilita. Il sito potrebbe essere temporaneamente indisponibile o troppo occupato per rispondere.
zh_CN.all.TimeoutDescription: 无法连接到 %s。该站点å¯èƒ½æš‚æ—¶ä¸å¯ç”¨æˆ–太ç¹å¿™è€Œæ— æ³•å“应。
en.all.Backtoprevious:Back
+fr.all.Backtoprevious:Retour
it.all.Backtoprevious:Indietro
zh_CN.all.Backtoprevious:返回
en.all.TryAgain:Try Again
+fr.all.TryAgain:Essayer à nouveau
it.all.TryAgain:Ricarica
zh_CN.all.TryAgain:é‡è¯•
@@ -1561,56 +1587,56 @@ zh_CN.all.SSLCerts:SSL è¯ä¹¦
en.all.SSLError:NetSurf failed to verify the authenticity of an SSL certificate. Please verify the details presented below.
de.all.SSLError:NetSurf konnte ein SSL Zertifikat nicht prüfen. Bitte die Details unten beachten.
-fr.all.SSLError:NetSurf a échoué dans la vérification de l'authenticité d'un certificat SSL. Vérifier les détails présentés ci-dessous.
+fr.all.SSLError:NetSurf n’a pas réussi à vérifier l’authenticité d’un certificat SSL. Vérifier les détails présentés ci-dessous.
it.all.SSLError:NetSurf non è stato in grado di verificare l'autenticità di questo certificato SSL, per favore verifica i dettagli presenti di seguito
nl.all.SSLError:NetSurf kan de authenticiteit van een SSL-certificaat niet controleren. Controleer onderstaande details.
zh_CN.all.SSLError:NetSurf æ— æ³•éªŒè¯ SSL è¯ä¹¦çš„真实性。请验è¯ä¸‹é¢æ˜¾ç¤ºçš„详细信æ¯ã€‚
en.all.SSL_Certificate_Subject:Subject: %s
de.all.SSL_Certificate_Subject:Subject: %s
-fr.all.SSL_Certificate_Subject:Objet : %s
+fr.all.SSL_Certificate_Subject:Objet : %s
it.all.SSL_Certificate_Subject:Soggetto: %s
nl.all.SSL_Certificate_Subject:Subjekt: %s
zh_CN.all.SSL_Certificate_Subject:主题:%s
en.all.SSL_Certificate_Issuer:Issuer: %s
de.all.SSL_Certificate_Issuer:Issuer: %s
-fr.all.SSL_Certificate_Issuer:Émetteur : %s
+fr.all.SSL_Certificate_Issuer:Émetteur : %s
it.all.SSL_Certificate_Issuer:Emittente: %s
nl.all.SSL_Certificate_Issuer:Uitgever: %s
zh_CN.all.SSL_Certificate_Issuer:å‘行者:%s
en.all.SSL_Certificate_Version:Version: %ld
de.all.SSL_Certificate_Version:Version: %ld
-fr.all.SSL_Certificate_Version:Version : %ld
+fr.all.SSL_Certificate_Version:Version : %ld
it.all.SSL_Certificate_Version:Versione: %ld
nl.all.SSL_Certificate_Version:Versie: %ld
zh_CN.all.SSL_Certificate_Version:版本:%ld
en.all.SSL_Certificate_ValidFrom:Valid from: %s
de.all.SSL_Certificate_ValidFrom:Valid from: %s
-fr.all.SSL_Certificate_ValidFrom:Valide à compter du : %s
+fr.all.SSL_Certificate_ValidFrom:Valide à compter du : %s
it.all.SSL_Certificate_ValidFrom:Valido da: %s
nl.all.SSL_Certificate_ValidFrom:Geldig vanaf: %s
zh_CN.all.SSL_Certificate_ValidFrom:有效期从:%s
en.all.SSL_Certificate_ValidTo:Valid until: %s
de.all.SSL_Certificate_ValidTo:Valid until: %s
-fr.all.SSL_Certificate_ValidTo:Valable jusqu'au : %s
+fr.all.SSL_Certificate_ValidTo:Valable jusqu’au : %s
it.all.SSL_Certificate_ValidTo:Valido fino a: %s
nl.all.SSL_Certificate_ValidTo:Geldig tot: %s
zh_CN.all.SSL_Certificate_ValidTo:有效期至:%s
en.all.SSL_Certificate_Type:Type: %i
de.all.SSL_Certificate_Type:Type: %i
-fr.all.SSL_Certificate_Type:Type : %i
+fr.all.SSL_Certificate_Type:Type : %i
it.all.SSL_Certificate_Type:Tipo: %i
nl.all.SSL_Certificate_Type:Type: %i
zh_CN.all.SSL_Certificate_Type:类型:%i
en.all.SSL_Certificate_Serial:Serial: %ld
de.all.SSL_Certificate_Serial:Serial: %ld
-fr.all.SSL_Certificate_Serial:Série : %ld
+fr.all.SSL_Certificate_Serial:Série : %ld
it.all.SSL_Certificate_Serial:Seriale: %ld
nl.all.SSL_Certificate_Serial:Serienr.: %ld
zh_CN.all.SSL_Certificate_Serial:åºåˆ—å·ï¼š%ld
@@ -1666,7 +1692,7 @@ zh_CN.all.Copies:副本
en.all.Printing:Printing page
de.all.Printing:Drucke Seite
-fr.all.Printing:Page impression
+fr.all.Printing:Impression de la page
it.all.Printing:Stampa della pagina
nl.all.Printing:Pagina aan het afdrukken
zh_CN.all.Printing:正在打å°é¡µé¢
@@ -1683,28 +1709,28 @@ zh_CN.all.Printing:正在打å°é¡µé¢
#
en.all.TreeAdded:Added: %s
de.all.TreeAdded:eingetragen am: %s
-fr.all.TreeAdded:Ajoutée : %s
+fr.all.TreeAdded:Ajoutée : %s
it.all.TreeAdded:Aggiunto: %s
nl.all.TreeAdded:Toegevoegd: %s
zh_CN.all.TreeAdded:新增:%s
en.all.TreeLast:Last visited: %s
de.all.TreeLast:letzter Besuch: %s
-fr.all.TreeLast:Dernière visitée : %s
+fr.all.TreeLast:Dernière visite : %s
it.all.TreeLast:Ultima visita: %s
nl.all.TreeLast:Laatst bezocht: %s
zh_CN.all.TreeLast:上次访问:%s
en.all.TreeVisited:Visited: %s
de.all.TreeVisited:gesehen am: %s
-fr.all.TreeVisited:Visitées : %s
+fr.all.TreeVisited:Visites : %s
it.all.TreeVisited:Visitato: %s
nl.all.TreeVisited:Bezocht: %s keer
zh_CN.all.TreeVisited:访问日期:%s
en.all.TreeVisits:Visits: %i
de.all.TreeVisits:Besuche gesamt: %i
-fr.all.TreeVisits:Visites : %i
+fr.all.TreeVisits:Visites : %i
it.all.TreeVisits:Visite totali: %i
nl.all.TreeVisits:Bezocht: %i keer
zh_CN.all.TreeVisits:访问次数:%i
@@ -1718,63 +1744,63 @@ zh_CN.all.TreeUnknown:未知
en.all.TreeValue:Value: %s
de.all.TreeValue:Eintrag: %s
-fr.all.TreeValue:Valeur : %s
+fr.all.TreeValue:Valeur : %s
it.all.TreeValue:Valore: %s
nl.all.TreeValue:Waarde: %s
zh_CN.all.TreeValue:值:%s
en.all.TreeComment:Comment: %s
de.all.TreeComment:Kommentar: %s
-fr.all.TreeComment:Commentaire : %s
+fr.all.TreeComment:Commentaire : %s
it.all.TreeComment:Commento: %s
nl.all.TreeComment:Commentaar: %s
zh_CN.all.TreeComment:注释:%s
en.all.TreeDomain:Domain: %s%s
de.all.TreeDomain:Domain: %s%s
-fr.all.TreeDomain:Domaine : %s%s
+fr.all.TreeDomain:Domaine : %s%s
it.all.TreeDomain:Dominio: %s%s
nl.all.TreeDomain:Domein: %s%s
zh_CN.all.TreeDomain:域:%s%s
en.all.TreePath:Path: %s%s
de.all.TreePath:Pfad: %s%s
-fr.all.TreePath:Chemin : %s%s
+fr.all.TreePath:Chemin : %s%s
it.all.TreePath:Percorso: %s%s
nl.all.TreePath:Pad: %s%s
zh_CN.all.TreePath:路径:%s%s
en.all.TreeExpires:Expires: %s
de.all.TreeExpires:Verfällt: %s
-fr.all.TreeExpires:Expire : %s
+fr.all.TreeExpires:Expire : %s
it.all.TreeExpires:Scadenza: %s
nl.all.TreeExpires:Verloopt op: %s
zh_CN.all.TreeExpires:过期:%s
en.all.TreeLastUsed:Last used: %s
de.all.TreeLastUsed:Zuletzt genutzt: %s
-fr.all.TreeLastUsed:Dernière utilisation : %s
+fr.all.TreeLastUsed:Dernière utilisation : %s
it.all.TreeLastUsed:Ultimo utilizzo: %s
nl.all.TreeLastUsed:Laatst gebruikt: %s
zh_CN.all.TreeLastUsed:上次使用:%s
en.all.TreeSecure:Secure hosts only: %s
de.all.TreeSecure:Nur sichere Hosts: %s
-fr.all.TreeSecure:Uniquement des sites sécurisés : %s
+fr.all.TreeSecure:Uniquement des sites sécurisés : %s
it.all.TreeSecure:Solo host sicuri: %s
nl.all.TreeSecure:Alleen veilige sites: %s
zh_CN.all.TreeSecure:ä»…é™å®‰å…¨ä¸»æœºï¼š%s
en.all.TreeVersion:Version: %s
de.all.TreeVersion:Version: %s
-fr.all.TreeVersion:Version : %s
+fr.all.TreeVersion:Version : %s
it.all.TreeVersion:Versione: %s
nl.all.TreeVersion:Versie: %s
zh_CN.all.TreeVersion:版本:%s
en.all.TreePersistent:Persistent: %s
de.all.TreePersistent:Persistent: %s
-fr.all.TreePersistent:Persistant : %s
+fr.all.TreePersistent:Persistant : %s
it.all.TreePersistent:Persistenza: %s
nl.all.TreePersistent:Permanent: %s
zh_CN.all.TreePersistent:æŒç»­æ€§ï¼š%s
@@ -1844,7 +1870,7 @@ zh_CN.all.TreeNewFolder:新建目录
en.all.TreeLaunch:Visit URL
de.all.TreeLaunch:URL ansehen
-fr.all.TreeLaunch:Visiter l'URL
+fr.all.TreeLaunch:Visiter l’URL
it.all.TreeLaunch:Visita URL
nl.all.TreeLaunch:Bezoek webadres
zh_CN.all.TreeLaunch:访问 URL
@@ -2000,7 +2026,7 @@ zh_CN.all.TreeviewLabelType:类型
en.all.TreeviewLabelValidUntil:Valid until
de.all.TreeviewLabelValidUntil:Valid until
-fr.all.TreeviewLabelValidUntil:Valable jusqu'au
+fr.all.TreeviewLabelValidUntil:Valable jusqu’au
it.all.TreeviewLabelValidUntil:Valido fino a
nl.all.TreeviewLabelValidUntil:Geldig tot:
zh_CN.all.TreeviewLabelValidUntil:有效期从
@@ -2074,7 +2100,7 @@ zh_CN.all.NewFolderName:新建文件夹
#
en.all.NoTitle:<No title>
de.all.NoTitle:<No title>
-fr.all.NoTitle:<Sans titre>
+fr.all.NoTitle:<sans titre>
it.all.NoTitle:<Senza titolo>
nl.all.NoTitle:<Naamloos>
zh_CN.all.NoTitle:<无标题>
@@ -2083,7 +2109,7 @@ zh_CN.all.NoTitle:<无标题>
#
en.all.TreeHotlist:NetSurf hotlist
de.all.TreeHotlist:NetSurf Hotlist
-fr.all.TreeHotlist:Favoris de NetSurf
+fr.all.TreeHotlist:Marque-pages de NetSurf
it.all.TreeHotlist:Segnalibri di NetSurf
nl.all.TreeHotlist:NetSurf-favorieten
zh_CN.all.TreeHotlist:NetSurf 常用列表
@@ -2095,13 +2121,13 @@ zh_CN.all.TreeHotlist:NetSurf 常用列表
# This secion is for tokens that have user information about the browser
en.ami.NetSurfDesc:Small as a mouse, fast as a cheetah and available for free. NetSurf is a multi-platform web browser.
-fr.ami.NetSurfDesc:Petit comme une souris, rapide comme un guépard. NetSurf est un navigateur Web multi-plate-forme libre.
+fr.ami.NetSurfDesc:Petit comme une souris, rapide comme un guépard. NetSurf est un navigateur Web multi-plateforme libre.
it.ami.NetSurfDesc:Piccolo come un mouse e veloce come un ghepardo! NetSurf, il browser web opensource e multi-piattaforma
nl.ami.NetSurfDesc:Klein als een muis, snel als een cheetah en gratis beschikbaar. NetSurf is een multi-platform webbrowser.
zh_CN.ami.NetSurfDesc:NetSurf 体积å°ï¼Œé€Ÿåº¦å¿«ï¼Œå¹¶æä¾›å…è´¹æœåŠ¡ã€‚NetSurf 是一个多平å°çš„网络æµè§ˆå™¨ã€‚
en.gtk.AboutDesc:NetSurf is a small and fast web browser.
-fr.gtk.AboutDesc:NetSurf est un navigateur Web multi-plate-forme libre.
+fr.gtk.AboutDesc:NetSurf est un petit, mais rapide, navigateur Web libre.
it.gtk.AboutDesc:NetSurf, il browser web opensource e multi-piattaforma
nl.gtk.AboutDesc:NetSurf is een kleine, snelle webbrowser met open broncode.
zh_CN.gtk.AboutDesc:NetSurf 是一款体积å°ï¼Œé€Ÿåº¦å¿«çš„网络æµè§ˆå™¨ã€‚
@@ -2118,7 +2144,7 @@ zh_CN.gtk.AboutDesc:NetSurf 是一款体积å°ï¼Œé€Ÿåº¦å¿«çš„网络æµè§ˆå™¨ã€‚
#
en.all.NewLink:Create new address
de.all.NewLink:Neuen Eintrag erstellen
-fr.all.NewLink:Créer une nouvelle adresse
+fr.all.NewLink:Ajouter une nouvelle adresse
it.all.NewLink:Crea nuovo indirizzo
nl.all.NewLink:Nieuw adres aanmaken
zh_CN.all.NewLink:新建地å€
@@ -2132,14 +2158,14 @@ zh_CN.all.NewFolder:新建目录
en.all.EditTitle:Edit title
de.all.EditTitle:Edit title
-fr.all.EditTitle:Éditer le titre
+fr.all.EditTitle:Modifier le titre
it.all.EditTitle:Modifica titolo
nl.all.EditTitle:Wijzig titel
zh_CN.all.EditTitle:修改标题
en.all.EditLink:Edit address
de.all.EditLink:Eintrag bearbeiten
-fr.all.EditLink:Éditer l'adresse
+fr.all.EditLink:Modifier l’adresse
it.all.EditLink:Modifica indirizzo
nl.all.EditLink:Bewerk adres
zh_CN.all.EditLink:修改地å€
@@ -2155,7 +2181,7 @@ zh_CN.all.EditFolder:é‡å‘½å目录
#
en.all.HotlistHomepage:NetSurf homepage
de.all.HotlistHomepage:NetSurf Homepage
-fr.all.HotlistHomepage:Page d'accueil de NetSurf
+fr.all.HotlistHomepage:Page d’accueil de NetSurf
it.all.HotlistHomepage:Pagina iniziale di NetSurf
nl.all.HotlistHomepage:NetSurf-startpagina
zh_CN.all.HotlistHomepage:NetSurf 主页
@@ -2185,14 +2211,14 @@ zh_CN.all.HotlistDownloads:下载最新版本
#
en.ami.HotlistMenu:Hotlist menu
de.ami.HotlistMenu:Hotlist menu
-fr.ami.HotlistMenu:Hotlist menu
+fr.ami.HotlistMenu:Menu des marque-pages
it.ami.HotlistMenu:Menu segnalibri
nl.ami.HotlistMenu:Favorietenmenu
zh_CN.ami.HotlistMenu:常用列表èœå•
en.ami.HotlistToolbar:Hotlist toolbar
de.ami.HotlistToolbar:Hotlist toolbar
-fr.ami.HotlistToolbar:Hotlist toolbar
+fr.ami.HotlistToolbar:Barre d’outils des marque-pages
it.ami.HotlistToolbar:Barra segnalibri
nl.ami.HotlistToolbar:Favorietenwerkbalk
zh_CN.ami.HotlistToolbar:常用列表工具æ 
@@ -2220,7 +2246,7 @@ zh_CN.all.DomainAll:(所有域)
en.all.DateToday:Today
de.all.DateToday:Heute
-fr.all.DateToday:Aujourd'hui
+fr.all.DateToday:Aujourd’hui
it.all.DateToday:Oggi
nl.all.DateToday:Vandaag
zh_CN.all.DateToday:今天
@@ -2355,28 +2381,28 @@ zh_CN.all.Info:ä¿¡æ¯
en.ro.AppHelpNoShortcut:Help...
de.ro.AppHelpNoShortcut:Hilfe...
-fr.ro.AppHelpNoShortcut:Aide...
+fr.ro.AppHelpNoShortcut:Aide…
it.ro.AppHelpNoShortcut:Aiuto...
nl.ro.AppHelpNoShortcut:Hulp...
zh_CN.ro.AppHelpNoShortcut:帮助…
en.beos.AppHelp:Help...
de.beos.AppHelp:Hilfe...
-fr.beos.AppHelp:Aide...
+fr.beos.AppHelp:Aide…
it.beos.AppHelp:Aiuto...
nl.beos.AppHelp:Hulp...
zh_CN.beos.AppHelp:帮助…
en.ro.HotlistShowNoShortcut:Show hotlist...
de.ro.HotlistShowNoShortcut:Hotlist zeigen...
-fr.ro.HotlistShowNoShortcut:Montrer les favoris...
+fr.ro.HotlistShowNoShortcut:Afficher les marque-pages…
it.ro.HotlistShowNoShortcut:Mostra...
nl.ro.HotlistShowNoShortcut:Favorieten...
zh_CN.ro.HotlistShowNoShortcut:显示常用列表…
en.ro.HistGlobalNoShortcut:Show global history...
de.ro.HistGlobalNoShortcut:History (global) zeigen...
-fr.ro.HistGlobalNoShortcut:Montrer l'historique global...
+fr.ro.HistGlobalNoShortcut:Afficher l’historique global…
it.ro.HistGlobalNoShortcut:Mostra cronologia globale...
nl.ro.HistGlobalNoShortcut:Browsergeschiedenis...
zh_CN.ro.HistGlobalNoShortcut:显示全局历å²è®°å½•â€¦
@@ -2389,7 +2415,7 @@ zh_CN.all.Open:打开
en.all.Choices:Choices...
de.all.Choices:Einstellungen...
-fr.all.Choices:Préférences...
+fr.all.Choices:Préférences…
it.all.Choices:Scegli...
nl.all.Choices:Keuzes...
zh_CN.all.Choices:选择…
@@ -2408,7 +2434,7 @@ zh_CN.beos.QuitAccel:Q
#
en.all.OpenURL:Open URL
de.all.OpenURL:Öffne URL
-fr.all.OpenURL:Ouvrir l'URL
+fr.all.OpenURL:Ouvrir l’URL
it.all.OpenURL:Apri URL
nl.all.OpenURL:Weblocatie
zh_CN.all.OpenURL:打开 URL
@@ -2467,14 +2493,14 @@ zh_CN.ro.PageInfo:ä¿¡æ¯ ^F1
en.ro.Save:Save F3
de.ro.Save:Speichern F3
-fr.ro.Save:Sauver F3
+fr.ro.Save:Enregistrer F3
it.ro.Save:Salva F3
nl.ro.Save:Bewaar F3
zh_CN.ro.Save:ä¿å­˜ F3
en.ro.SaveComp:Full save ⇑F3
de.ro.SaveComp:Alles speichern ⇑F3
-fr.ro.SaveComp:Sauvegarde Complète ⇑F3
+fr.ro.SaveComp:Sauvegarde complète ⇑F3
it.ro.SaveComp:Salva Tutto ⇑F3
nl.ro.SaveComp:Bewaar alles ⇑F3
zh_CN.ro.SaveComp:全部ä¿å­˜ ↑F3
@@ -2488,7 +2514,7 @@ zh_CN.all.Export:导出
en.all.SaveURL:Save location
de.all.SaveURL:URL speichern
-fr.all.SaveURL:Sauver le lieu
+fr.all.SaveURL:Enregistrer l’adresse
it.all.SaveURL:Salva indirizzo
nl.all.SaveURL:Bewaar adres
zh_CN.all.SaveURL:ä¿å­˜ä½ç½®
@@ -2513,12 +2539,12 @@ zh_CN.beos.NewWindowNSAccel:N
en.ro.ViewSrc:View source... F8
de.ro.ViewSrc:Quellcode... F8
-fr.ro.ViewSrc:Voir le source... F8
+fr.ro.ViewSrc:Voir la source… F8
it.ro.ViewSrc:Mostra sorgente... F8
nl.ro.ViewSrc:Toon HTML... F8
en.beos.ViewSrc:View source...
de.beos.ViewSrc:Quellcode...
-fr.beos.ViewSrc:Voir le source...
+fr.beos.ViewSrc:Voir le source…
it.beos.ViewSrc:Mostra sorgente...
nl.beos.ViewSrc:Toon HTML...
zh_CN.beos.ViewSrc:查看æºä»£ç â€¦
@@ -2577,7 +2603,7 @@ zh_CN.all.ObjInfo:ä¿¡æ¯
en.all.ObjSave:Save
de.all.ObjSave:Speichern
-fr.all.ObjSave:Sauver
+fr.all.ObjSave:Enregistrer
it.all.ObjSave:Salva
nl.all.ObjSave:Bewaar
zh_CN.all.ObjSave:ä¿å­˜
@@ -2618,7 +2644,7 @@ zh_CN.all.LinkSave:ä¿å­˜
en.all.LinkDload:Download target
de.all.LinkDload:Ziel speichern
-fr.all.LinkDload:Téléchargement cible
+fr.all.LinkDload:Télécharger la cible
it.all.LinkDload:Scarica file
nl.all.LinkDload:Haal op
zh_CN.all.LinkDload:下载目标
@@ -2642,7 +2668,7 @@ zh_CN.all.SelSave:ä¿å­˜
#
en.all.Home:Home page
de.all.Home:Homepage
-fr.all.Home:Page d'accueil
+fr.all.Home:Page d’accueil
it.all.Home:Pagina iniziale
nl.all.Home:Startpagina
zh_CN.all.Home:主页
@@ -2675,7 +2701,7 @@ zh_CN.beos.ForwardAccel:→
en.all.UpLevel:Up one level
de.all.UpLevel:Eine Ebene hoch
-fr.all.UpLevel:Remonter d'un niveau
+fr.all.UpLevel:Remonter d’un niveau
it.all.UpLevel:Livello superiore
nl.all.UpLevel:Niveau omhoog
zh_CN.all.UpLevel:回到上级
@@ -2729,7 +2755,7 @@ zh_CN.all.Images:图åƒ
en.all.Toolbars:Toolbars
de.all.Toolbars:Anzeigen und Leisten
-fr.all.Toolbars:Barre d'outils
+fr.all.Toolbars:Barres d’outils
it.all.Toolbars:Barre strumenti
nl.all.Toolbars:Toon gereedschapbalken
zh_CN.all.Toolbars:工具æ 
@@ -2775,21 +2801,21 @@ zh_CN.all.ToolButtons:按钮
en.all.ToolAddress:Address bar
de.all.ToolAddress:Adressleiste
-fr.all.ToolAddress:Barre d'adresse
+fr.all.ToolAddress:Barre d’adresse
it.all.ToolAddress:Barra indirizzi
nl.all.ToolAddress:Adresveld
zh_CN.all.ToolAddress:地å€æ 
en.all.ToolThrob:Throbber
de.all.ToolThrob:Ladeaktivität
-fr.all.ToolThrob:Pulseur
+fr.all.ToolThrob:Indicateur d’activité
it.all.ToolThrob:Indicatore di attività
nl.all.ToolThrob:Laadactiviteit
zh_CN.all.ToolThrob:动æ€æµè§ˆå›¾ç¤º
en.all.ToolStatus:Status bar
de.all.ToolStatus:Statusanzeige
-fr.all.ToolStatus:Barre d'état
+fr.all.ToolStatus:Barre d’état
it.all.ToolStatus:Barra di stato
nl.all.ToolStatus:Statusbalk
zh_CN.all.ToolStatus:状æ€æ 
@@ -2798,14 +2824,14 @@ zh_CN.all.ToolStatus:状æ€æ 
#
en.all.RenderAnims:Buffer animations
de.all.RenderAnims:Animationen zwischenspeichern
-fr.all.RenderAnims:Tamponner les animations
+fr.all.RenderAnims:Utiliser un tampon pour les animations
it.all.RenderAnims:Buffer animazioni
nl.all.RenderAnims:Buffer animaties
zh_CN.all.RenderAnims:缓冲动画
en.all.RenderAll:Buffer all rendering
de.all.RenderAll:Alles zwischenspeichern
-fr.all.RenderAll:Tamponner tous les rendus
+fr.all.RenderAll:Utiliser un tampon pour tous les rendus
it.all.RenderAll:Blocca tutto l'interprete
nl.all.RenderAll:Buffer gehele weergave
zh_CN.all.RenderAll:缓冲所有渲染
@@ -2813,7 +2839,7 @@ zh_CN.all.RenderAll:缓冲所有渲染
# Main -> Utilities menu
#
en.all.Hotlist:Hotlist
-fr.all.Hotlist:Favoris
+fr.all.Hotlist:Marque-pages
it.all.Hotlist:Segnalibri
nl.all.Hotlist:Favorieten
zh_CN.all.Hotlist:常用列表
@@ -2831,7 +2857,7 @@ zh_CN.all.Cookies:Cookies
en.ro.FindText:Find text F4
de.ro.FindText:Text suchen F4
-fr.ro.FindText:Recherche de texte F4
+fr.ro.FindText:Recherche texte F4
it.ro.FindText:Trova testo F4
nl.ro.FindText:Zoek tekst F4
zh_CN.ro.FindText:查找文本 F4
@@ -2847,14 +2873,14 @@ zh_CN.all.Window:窗å£
#
en.all.HotlistAdd:Add to hotlist
de.all.HotlistAdd:Eintrag hinzufügen
-fr.all.HotlistAdd:Ajouter aux favoris
+fr.all.HotlistAdd:Ajouter aux marque-pages
it.all.HotlistAdd:Aggiungi
nl.all.HotlistAdd:Voeg pagina toe
zh_CN.all.HotlistAdd:添加至常用列表
en.ro.HotlistShow:Show hotlist... F6
de.ro.HotlistShow:Hotlist zeigen... F6
-fr.ro.HotlistShow:Montrer les favoris... F6
+fr.ro.HotlistShow:Afficher les marque-pages… F6
it.ro.HotlistShow:Mostra... F6
nl.ro.HotlistShow:Favorieten... F6
zh_CN.ro.HotlistShow:显示常用列表… F6
@@ -2863,14 +2889,14 @@ zh_CN.ro.HotlistShow:显示常用列表… F6
#
en.ro.HistLocal:Show local history... F7
de.ro.HistLocal:History (lokal) zeigen... F7
-fr.ro.HistLocal:Montrer l'historique local... F7
+fr.ro.HistLocal:Afficher l’historique local… F7
it.ro.HistLocal:Mostra cronologia locale... F7
nl.ro.HistLocal:Venstergeschiedenis... F7
zh_CN.ro.HistLocal:显示本地历å²è®°å½•â€¦ F7
en.ro.HistGlobal:Show global history... ^F7
de.ro.HistGlobal:History (global) zeigen... ^F7
-fr.ro.HistGlobal:Montrer l'historique global... ^F7
+fr.ro.HistGlobal:Afficher l’historique global… ^F7
it.ro.HistGlobal:Mostra cronologia globale... ^F7
nl.ro.HistGlobal:Browsergeschiedenis... ^F7
zh_CN.ro.HistGlobal:显示全局历å²è®°å½•â€¦ ^F7
@@ -2878,7 +2904,7 @@ zh_CN.ro.HistGlobal:显示全局历å²è®°å½•â€¦ ^F7
# Main -> Utilities -> Cookies menu
en.all.ShowCookies:Show cookies...
de.all.ShowCookies:Cookies verwalten...
-fr.all.ShowCookies:Montrer les cookies...
+fr.all.ShowCookies:Afficher les cookies…
it.all.ShowCookies:Mostra cookie...
nl.all.ShowCookies:Cookiesbeheer...
zh_CN.all.ShowCookies:显示 Cookies …
@@ -2901,7 +2927,7 @@ zh_CN.all.WindowSave:设置为默认ä½ç½®
en.all.WindowStagr:Stagger window position
de.all.WindowStagr:neue Fenster versetzen
-fr.all.WindowStagr:Décaler la position des nouv. fenêtres
+fr.all.WindowStagr:Étaler la position des fenêtres
it.all.WindowStagr:Sfalsa posizione della finestra
nl.all.WindowStagr:Open vensters stapelgewijs
zh_CN.all.WindowStagr:错开窗å£ä½ç½®
@@ -2915,7 +2941,7 @@ zh_CN.all.WindowSize:æ‹·è´çª—å£ä½ç½®
en.all.WindowReset:Reset default position
de.all.WindowReset:Fensterposition zurücksetzen
-fr.all.WindowReset:RAZ de la position par défaut
+fr.all.WindowReset:Revenir à la position par défaut
it.all.WindowReset:Resetta posizione della finestra
nl.all.WindowReset:Herstel standaardwaarden
zh_CN.all.WindowReset:é‡ç½®é»˜è®¤ä½ç½®
@@ -2923,7 +2949,7 @@ zh_CN.all.WindowReset:é‡ç½®é»˜è®¤ä½ç½®
# Main -> Help menu
#
en.ro.HelpContent:Contents F1
-de.ro.HelpContent:Inhalt F1
+de.ro.HelpContent:Inhalt F1
fr.ro.HelpContent:Contenus F1
it.ro.HelpContent:Contenuti F1
nl.ro.HelpContent:Inhoudsopgave F1
@@ -2931,7 +2957,7 @@ zh_CN.ro.HelpContent:内容 F1
en.ro.HelpGuide:User guide
de.ro.HelpGuide:Handbuch
-fr.ro.HelpGuide:Guide de l'utilisateur
+fr.ro.HelpGuide:Guide de l’utilisateur
it.ro.HelpGuide:Guida in linea
nl.ro.HelpGuide:Gebruikershandleiding
zh_CN.ro.HelpGuide:用户指å—
@@ -2951,6 +2977,7 @@ zh_CN.all.HelpCredits:制作人员åå•
en.all.HelpLicence:Licence
de.all.HelpLicence:Lizenz
+fr.all.HelpLicence:Licence
it.all.HelpLicence:Licenza
nl.all.HelpLicence:Licentie
zh_CN.all.HelpLicence:许å¯è¯
@@ -2966,14 +2993,14 @@ zh_CN.ro.HelpInter:交互å¼å¸®åŠ©ç”¨æˆ·
#
en.all.Toolbar:Toolbar
de.all.Toolbar:Symbolleiste
-fr.all.Toolbar:Barre d'outils
+fr.all.Toolbar:Barre d’outils
it.all.Toolbar:Barra strumenti
nl.all.Toolbar:Gereedschapbalk
zh_CN.all.Toolbar:工具æ 
en.all.EditToolbar:Edit toolbar
de.all.EditToolbar:Symbolleiste bearbeiten
-fr.all.EditToolbar:Éditer la barre d'outils
+fr.all.EditToolbar:Éditer la barre d’outils
it.all.EditToolbar:Modifica barra strumenti
nl.all.EditToolbar:Aanpasmodus
zh_CN.all.EditToolbar:编辑工具æ 
@@ -3026,7 +3053,7 @@ zh_CN.ro.Paste:从剪贴æ¿ç²˜è´´ ^V
#
en.all.Edit:Edit
de.all.Edit:Bearbeiten
-fr.all.Edit:Éditer
+fr.all.Edit:Édition
it.all.Edit:Modifica
nl.all.Edit:Wijzig naam
zh_CN.all.Edit:编辑
@@ -3063,14 +3090,14 @@ zh_CN.all.New:新建
en.all.Expand:Expand
de.all.Expand:Expandieren
-fr.all.Expand:Déployer
+fr.all.Expand:Développer
it.all.Expand:Espandi
nl.all.Expand:Klap uit
zh_CN.all.Expand:扩展
en.all.Collapse:Collapse
de.all.Collapse:Zusammenfalten
-fr.all.Collapse:Regrouper
+fr.all.Collapse:Réduire
it.all.Collapse:Raggruppa
nl.all.Collapse:Klap in
zh_CN.all.Collapse:崩溃
@@ -3082,7 +3109,7 @@ nl.all.Tree:Tree
zh_CN.all.Tree:æ ‘
en.all.TreeExport:Export...
-fr.all.TreeExport:Exporter...
+fr.all.TreeExport:Exporter…
it.all.TreeExport:Esporta...
nl.all.TreeExport:Exporteer...
zh_CN.all.TreeExport:导出…
@@ -3217,14 +3244,14 @@ zh_CN.all.Display:显示
en.all.ImgStyle0:Use OS
de.all.ImgStyle0:RISC OS nutzen
-fr.all.ImgStyle0:Utiliser l'OS
+fr.all.ImgStyle0:Utiliser l’OS
it.all.ImgStyle0:Usa OS
nl.all.ImgStyle0:RISC OS-routines
zh_CN.all.ImgStyle0:使用æ“作系统
en.all.ImgStyle1:Direct to screen
de.all.ImgStyle1:Direktausgabe
-fr.all.ImgStyle1:Directement sur l'écran
+fr.all.ImgStyle1:Directement sur l’écran
it.all.ImgStyle1:Diretto su schermo
nl.all.ImgStyle1:Directe weergave
zh_CN.all.ImgStyle1:直接在å±å¹•ä¸Šæ˜¾ç¤º
@@ -3238,7 +3265,7 @@ zh_CN.all.ImgStyle2:数字抖动
en.all.ImgStyle3:Error diffused
de.all.ImgStyle3:Error-Diffusion
-fr.all.ImgStyle3:Avec diffusion d'erreur
+fr.all.ImgStyle3:Avec diffusion d’erreur
it.all.ImgStyle3:Errore diffuso
nl.all.ImgStyle3:Foutdiffusie
zh_CN.all.ImgStyle3:误差扩散方法
@@ -3272,7 +3299,7 @@ zh_CN.all.NewTab:新建标签页
en.all.CloseTab:Close tab
de.all.CloseTab:Schließe Tab
-fr.all.CloseTab:Fermer l'onglet
+fr.all.CloseTab:Fermer l’onglet
it.all.CloseTab:Chiudi scheda
nl.all.CloseTab:Sluit tabblad
zh_CN.all.CloseTab:关闭标签页
@@ -3293,42 +3320,42 @@ zh_CN.all.SaveAsNS:å¦å­˜ä¸º
en.all.Source:Source...
de.all.Source:Quelle...
-fr.all.Source:Source...
+fr.all.Source:Source…
it.all.Source:Sorgente...
nl.all.Source:Bron...
zh_CN.all.Source:æºä»£ç â€¦
en.all.TextNS:Text...
de.all.TextNS:Text...
-fr.all.TextNS:Texte...
+fr.all.TextNS:Texte…
it.all.TextNS:Testo...
nl.all.TextNS:Tekst...
zh_CN.all.TextNS:文本…
en.all.SaveCompNS:Complete...
de.all.SaveCompNS:Komplett...
-fr.all.SaveCompNS:Complète ...
+fr.all.SaveCompNS:Complète…
it.all.SaveCompNS:Cartella...
nl.all.SaveCompNS:Compleet...
zh_CN.all.SaveCompNS:补全…
en.all.PDFNS:PDF...
de.all.PDFNS:PDF...
-fr.all.PDFNS:PDF...
+fr.all.PDFNS:PDF…
it.all.PDFNS:PDF...
nl.all.PDFNS:PDF...
zh_CN.all.PDFNS:PDF…
en.ami.IFF:IFF...
de.ami.IFF:IFF...
-fr.ami.IFF:IFF...
+fr.ami.IFF:IFF…
it.ami.IFF:IFF...
nl.ami.IFF:IFF...
zh_CN.ami.IFF:IFF…
en.all.OpenFile:Open local file...
de.all.OpenFile:Öffne lokale Datei...
-fr.all.OpenFile:Ouvrir un fichier local ...
+fr.all.OpenFile:Ouvrir un fichier local…
it.all.OpenFile:Apri file locale...
nl.all.OpenFile:Open lokaal bestand...
zh_CN.all.OpenFile:打开本地文件…
@@ -3342,7 +3369,7 @@ zh_CN.all.About:关于
en.all.PrintNS:Print...
de.all.PrintNS:Drucken...
-fr.all.PrintNS:Imprimer...
+fr.all.PrintNS:Imprimer…
it.all.PrintNS:Stampa...
nl.all.PrintNS:Druk af...
zh_CN.all.PrintNS:打å°â€¦
@@ -3409,28 +3436,28 @@ zh_CN.all.Browser:æµè§ˆå™¨
en.all.HistGlobalNS:Show global history
de.all.HistGlobalNS:Zeige globale History
-fr.all.HistGlobalNS:Afficher l'historique global
+fr.all.HistGlobalNS:Afficher l’historique global
it.all.HistGlobalNS:Mostra cronologia globale
nl.all.HistGlobalNS:Toon browsergeschiedenis
zh_CN.all.HistGlobalNS:显示全局历å²è®°å½•
en.all.HistLocalNS:Show local history
de.all.HistLocalNS:Zeige lokale History
-fr.all.HistLocalNS:Afficher l'historique local
+fr.all.HistLocalNS:Afficher l’historique local
it.all.HistLocalNS:Mostra cronologia locale
nl.all.HistLocalNS:Toon venstergeschiedenis
zh_CN.all.HistLocalNS:显示本地历å²è®°å½•
en.ami.ShowCookiesNS:Show cookies
de.ami.ShowCookiesNS:Cookies verwalten
-fr.ami.ShowCookiesNS:Montrer les cookies
+fr.ami.ShowCookiesNS:Afficher les cookies
it.ami.ShowCookiesNS:Mostra cookie
nl.ami.ShowCookiesNS:Toon cookies
zh_CN.ami.ShowCookiesNS:显示 Cookies
en.all.FindTextNS:Find text...
de.all.FindTextNS:Suchen...
-fr.all.FindTextNS:Recherche de texte...
+fr.all.FindTextNS:Recherche de texte…
it.all.FindTextNS:Trova testo...
nl.all.FindTextNS:Zoek tekst...
zh_CN.all.FindTextNS:查找文本…
@@ -3474,7 +3501,7 @@ zh_CN.all.ScaleNorm:正常
#
en.all.HotlistShowNS:Show hotlist
de.all.HotlistShowNS:Zeige Hotlist
-fr.all.HotlistShowNS:Afficher les favoris
+fr.all.HotlistShowNS:Afficher les marque-pages
it.all.HotlistShowNS:Mostra
nl.all.HotlistShowNS:Toon favorieten
zh_CN.all.HotlistShowNS:显示常用列表
@@ -3520,7 +3547,7 @@ zh_CN.ami.ARexx:ARexx
en.ami.ARexxExecute:Execute script...
de.ami.ARexxExecute:Script ausführen...
-fr.ami.ARexxExecute:Executer script...
+fr.ami.ARexxExecute:Executer script…
it.ami.ARexxExecute:Esegui script...
nl.ami.ARexxExecute:Voer script uit...
zh_CN.ami.ARexxExecute:执行脚本…
@@ -3562,21 +3589,21 @@ zh_CN.all.CopyClip:å¤åˆ¶åˆ°å‰ªè´´æ¿
en.all.SaveAs:Save as...
de.all.SaveAs:Speichern als...
-fr.all.SaveAs:Enregistrer sous...
+fr.all.SaveAs:Enregistrer sous…
it.all.SaveAs:Salva come...
nl.all.SaveAs:Bewaar als...
zh_CN.all.SaveAs:å¦å­˜ä¸ºâ€¦
en.ami.SaveIFF:Save as IFF...
de.ami.SaveIFF:Speichern als IFF...
-fr.ami.SaveIFF:Enregistrer sous IFF...
+fr.ami.SaveIFF:Enregistrer sous IFF…
it.ami.SaveIFF:Salva come IFF...
nl.ami.SaveIFF:Bewaar als IFF...
zh_CN.ami.SaveIFF:å¦å­˜ä¸º IFF …
en.all.SaveComplete:Save complete...
de.all.SaveComplete:Speichern abgeschlossen...
-fr.all.SaveComplete:Enregistrement terminé...
+fr.all.SaveComplete:Enregistrement terminé…
it.all.SaveComplete:Salva tutto...
nl.all.SaveComplete:Bewaar alles...
zh_CN.all.SaveComplete:完æˆä¿å­˜â€¦
@@ -3590,21 +3617,21 @@ zh_CN.all.Close:关闭
en.ami.CloseInactive:Close inactive tabs
de.ami.CloseInactive:Close inactive tabs
-fr.ami.CloseInactive:Close inactive tabs
+fr.ami.CloseInactive:Fermer les onglets inactifs
it.ami.CloseInactive:Chiudi schede inattive
nl.ami.CloseInactive:Close inactive tabs
zh_CN.ami.CloseInactive:关闭闲置的标签页
en.all.ObjShow:Show object
de.all.ObjShow:Zeige Objekt
-fr.all.ObjShow:Afficher l'objet
+fr.all.ObjShow:Afficher l’objet
it.all.ObjShow:Mostra file
nl.all.ObjShow:Toon object
zh_CN.all.ObjShow:显示对象
en.all.Frame:Frame
de.all.Frame:Frame
-fr.all.Frame:Frame
+fr.all.Frame:Cadre
it.all.Frame:Frame
nl.all.Frame:Vensterkader
zh_CN.all.Frame:帧
@@ -3625,14 +3652,14 @@ zh_CN.all.FrameNewTab:在新标签页中显示
en.all.FrameOnly:Show only this frame
de.all.FrameOnly:Nur diesen Frame anzeigen
-fr.all.FrameOnly:N'afficher que ce cadre
+fr.all.FrameOnly:N’afficher que ce cadre
it.all.FrameOnly:Apri frame in questa finestra
nl.all.FrameOnly:Toon alleen dit vensterkader
zh_CN.all.FrameOnly:仅显示此帧
en.all.SelectFile:Select file...
de.all.SelectFile:Datei auswählen...
-fr.all.SelectFile:Sélectionnez le fichier...
+fr.all.SelectFile:Sélectionnez le fichier…
it.all.SelectFile:Seleziona file...
nl.all.SelectFile:Selecteer bestand...
zh_CN.all.SelectFile:选择文件…
@@ -3674,7 +3701,7 @@ zh_CN.all.Downloaded:å®Œæˆ %s • å¹³å‡ %s/s • 总共 %s
en.all.Unwritten:Writing data to file failed.
de.all.Unwritten:Schreiben der Datei ist fehlgeschlagen.
-fr.all.Unwritten:L'écriture de données dans le fichier a échoué.
+fr.all.Unwritten:L’écriture de données dans le fichier a échoué.
it.all.Unwritten:Scrittura dei dati sul file fallita.
nl.all.Unwritten:Informatie naar bestand wegschrijven is mislukt.
zh_CN.all.Unwritten:将数æ®å†™å…¥æ–‡ä»¶å¤±è´¥ã€‚
@@ -3693,21 +3720,21 @@ zh_CN.all.Abort:中止
#
en.ami.amiDownloading:NetSurf: Downloading...
de.ami.amiDownloading:NetSurf: Downloading...
-fr.ami.amiDownloading:NetSurf: Downloading...
+fr.ami.amiDownloading:NetSurf: Téléchargement…
it.ami.amiDownloading:NetSurf: Scaricamento...
nl.ami.amiDownloading:NetSurf: Downloading...
zh_CN.ami.amiDownloading:NetSurf:正在下载…
en.ami.amiDownload:%ld of %ld bytes downloaded
de.ami.amiDownload:%ld von %ld Bytes heruntergeladen
-fr.ami.amiDownload:%ld of %ld bytes downloaded
+fr.ami.amiDownload:%ld de %ld bytes téléchargés
it.ami.amiDownload:%ld di %ld byte scaricati
nl.ami.amiDownload:%ld van %ld bytes opgehaald
zh_CN.ami.amiDownload:已下载 %2$ld 个字节中的 %1$ld 个
en.ami.amiDownloadU:%ld bytes downloaded
de.ami.amiDownloadU:%ld Bytes heruntergeladen
-fr.ami.amiDownloadU:%ld bytes downloaded
+fr.ami.amiDownloadU:%ld bytes téléchargés
it.ami.amiDownloadU:%ld byte scaricati
nl.ami.amiDownloadU:%ld bytes opgehaald
zh_CN.ami.amiDownloadU:已下载 %ld 个字节
@@ -3757,7 +3784,7 @@ zh_CN.gtk.gtkProgressBar:%.0f%%,共 %u 个文件
en.gtk.gtkProgressBarPulse:Downloading %u files
de.gtk.gtkProgressBarPulse:Lade %u Dateien herunter
-fr.gtk.gtkProgressBarPulse:Tèlèchargement des fichiers %u
+fr.gtk.gtkProgressBarPulse:Téléchargement des fichiers %u
it.gtk.gtkProgressBarPulse:Scaricamento dei file %u
nl.gtk.gtkProgressBarPulse:%u bestanden aan het downloaden
zh_CN.gtk.gtkProgressBarPulse:正在下载 %u 个文件
@@ -3826,7 +3853,7 @@ zh_CN.gtk.gtkCanceled: å·²å–消
en.gtk.gtkWorking: Working
de.gtk.gtkWorking: Arbeite
-fr.gtk.gtkWorking: en cours
+fr.gtk.gtkWorking: En cours
it.gtk.gtkWorking: In corso
nl.gtk.gtkWorking: In bedrijf
zh_CN.gtk.gtkWorking: 正在处ç†
@@ -3835,7 +3862,7 @@ zh_CN.gtk.gtkWorking: 正在处ç†
#
en.gtk.gtkQuit:Quit NetSurf?
de.gtk.gtkQuit:NetSurf beenden?
-fr.gtk.gtkQuit:Quitter NetSurf ?
+fr.gtk.gtkQuit:Quitter NetSurf ?
it.gtk.gtkQuit:Sei sicuro di voler uscire da NetSurf?
nl.gtk.gtkQuit:NetSurf afsluiten?
zh_CN.gtk.gtkQuit:是å¦é€€å‡º NetSurf?
@@ -3849,28 +3876,28 @@ zh_CN.gtk.gtkDownloadsRunning:ç›®å‰ä»ç„¶æœ‰ä¸‹è½½ä»»åŠ¡æ­£åœ¨è¿è¡Œï¼Œå¦‚æžœæ‚
en.gtk.gtkStartDownload:Download file?
de.gtk.gtkStartDownload:Datei herunterladen?
-fr.gtk.gtkStartDownload:Téléchargement du fichier?
+fr.gtk.gtkStartDownload:Téléchargement du fichier ?
it.gtk.gtkStartDownload:Scaricare il file?
nl.gtk.gtkStartDownload:Bestand downloaden?
zh_CN.gtk.gtkStartDownload:下载文件?
en.gtk.gtkOverwrite:A file named "%s" already exists. Do you want to replace it?
de.gtk.gtkOverwrite:Eine Datei mit dem Namen "%s" existiert bereits. Soll sie ersetzt werden?
-fr.gtk.gtkOverwrite:Un fichier nommé "%s" existe déja. Voulez-vous le remplacer ?
+fr.gtk.gtkOverwrite:Un fichier nommé « %s » existe déja. Voulez-vous le remplacer ?
it.gtk.gtkOverwrite:Il file "%s" è già esistente. Si desidera sovrascriverlo?
nl.gtk.gtkOverwrite:Een bestand met de naam "%s" bestaat reeds. Bestand overschrijven en vervangen?
zh_CN.gtk.gtkOverwrite:已存在å为 “%s†的文件。您è¦æ›¿æ¢å®ƒå—?
en.gtk.gtkOverwriteTitle:File exists
de.gtk.gtkOverwriteTitle:File exists
-fr.gtk.gtkOverwriteTitle:Le fichier existe
+fr.gtk.gtkOverwriteTitle:Fichier existant
it.gtk.gtkOverwriteTitle:File già esistente
nl.gtk.gtkOverwriteTitle:Bestand bestaat reeds.
zh_CN.gtk.gtkOverwriteTitle:文件已存在
en.gtk.gtkOverwriteInfo:The file already exists in "%s". Replacing it will overwrite its contents.
de.gtk.gtkOverwriteInfo:Die Datei existiert bereits im Verzeichnis "%s". Beim ersetzen wird ihr momentaner Inhalt überschrieben.
-fr.gtk.gtkOverwriteInfo:Le fichier existe déja dans "%s". Son remplacement réécrira son contenu.
+fr.gtk.gtkOverwriteInfo:Le fichier existe déja dans « %s ». Son remplacement réécrira son contenu.
it.gtk.gtkOverwriteInfo:Il file è già esistente in "%s". Sostituirlo comporterà la sovrascrittura del file.
nl.gtk.gtkOverwriteInfo:Het bestand bestaat reeds in map "%s". Bij het vervangen zal de huidige inhoud worden overschreven.
zh_CN.gtk.gtkOverwriteInfo:“%s†中已有该文件。替æ¢æ­¤æ–‡ä»¶ä¼šè¦†ç›–其内容。
@@ -3884,7 +3911,7 @@ zh_CN.gtk.gtkFailed:下载失败
en.gtk.gtkFileError:File error: %s
de.gtk.gtkFileError:Dateifehler: %s
-fr.gtk.gtkFileError:Erreur de fichier : %s
+fr.gtk.gtkFileError:Erreur de fichier : %s
it.gtk.gtkFileError:Errore file: %s
nl.gtk.gtkFileError:Bestandsfout: %s
zh_CN.gtk.gtkFileError:文件错误: %s
@@ -3898,14 +3925,14 @@ zh_CN.gtk.gtkInfo:%2$s 中的 %1$s 大å°æ˜¯ %3$s
en.gtk.gtkSave:Save file as…
de.gtk.gtkSave:Datei speichern unter...
-fr.gtk.gtkSave:Enregistrer le fichier sous...
+fr.gtk.gtkSave:Enregistrer le fichier sous…
it.gtk.gtkSave:Salva file come...
nl.gtk.gtkSave:Bestand bewaren als...
zh_CN.gtk.gtkSave:文件å¦å­˜ä¸ºâ€¦
en.gtk.gtkSourceSave:Save source
de.gtk.gtkSourceSave:Quelltext speichern
-fr.gtk.gtkSourceSave:Enregistrer la Source
+fr.gtk.gtkSourceSave:Enregistrer la source
it.gtk.gtkSourceSave:Salva sorgente
nl.gtk.gtkSourceSave:Brontekst bewaren
zh_CN.gtk.gtkSourceSave:ä¿å­˜æº
@@ -3915,7 +3942,7 @@ de.gtk.gtkSourceTabError:Fehler beim behandeln der Quelldaten
fr.gtk.gtkSourceTabError:Erreur de manipulation des données source
it.gtk.gtkSourceTabError:Errore di modifica sul sorgente
nl.gtk.gtkSourceTabError:Fout plaatsgevonden bij afhandelen brondata
-zh_CN.gtk.gtkSourceTabError:处ç†æºæ•°æ®æ—¶å‡ºé”™
+zh_CN.gtk.gtkSourceTabError:处ç†æºæ•°æ®æ—¶å‡ºé”™
en.gtk.gtkplainSave:Save plain text
de.gtk.gtkplainSave:Als Text speichern
@@ -3926,7 +3953,7 @@ zh_CN.gtk.gtkplainSave:ä¿å­˜çº¯æ–‡æœ¬
en.gtk.gtkcompleteSave:Export complete page as a folder
de.gtk.gtkcompleteSave:Seite komplett speichern
-fr.gtk.gtkcompleteSave:Enregistrer page web complète
+fr.gtk.gtkcompleteSave:Enregistrer la page Web complète
it.gtk.gtkcompleteSave:Salva pagina web completa
nl.gtk.gtkcompleteSave:Complete webpagina bewaren
zh_CN.gtk.gtkcompleteSave:将完整页é¢å¯¼å‡ºä¸ºæ–‡ä»¶å¤¹
@@ -3940,7 +3967,7 @@ zh_CN.gtk.gtkSaveConfirm:文件已ä¿å­˜
en.gtk.gtkSaveCancelled:File not saved
de.gtk.gtkSaveCancelled:Datei nicht gespeichert
-fr.gtk.gtkSaveCancelled:Fichier pas enregistré
+fr.gtk.gtkSaveCancelled:Fichier non enregistré
it.gtk.gtkSaveCancelled:File non salvato
nl.gtk.gtkSaveCancelled:Bestand is niet bewaard
zh_CN.gtk.gtkSaveCancelled:文件未ä¿å­˜
@@ -3970,6 +3997,7 @@ zh_CN.gtk.gtkUnknownSize:未知大å°
#
en.gtk.gtkOpenMenu:Open Menu
+fr.gtk.gtkOpenMenu:Ouvrir le menu
it.gtk.gtkOpenMenu:Apri menu
zh_CN.gtk.gtkOpenMenu:打开èœå•
@@ -3982,7 +4010,7 @@ zh_CN.gtk.gtkFile:文件(_F)
en.gtk.gtkEdit:_Edit
de.gtk.gtkEdit:_Bearbeiten
-fr.gtk.gtkEdit:Édit_er
+fr.gtk.gtkEdit:Édi_tion
it.gtk.gtkEdit:Mo_difica
nl.gtk.gtkEdit:Be_werken
zh_CN.gtk.gtkEdit:退出(_E)
@@ -4003,7 +4031,7 @@ zh_CN.gtk.gtkNavigate:导航(_N)
en.gtk.gtkTools:_Tools
de.gtk.gtkTools:_Tools
-fr.gtk.gtkTools:Ou_tils
+fr.gtk.gtkTools:_Outils
it.gtk.gtkTools:_Strumenti
nl.gtk.gtkTools:E_xtra
zh_CN.gtk.gtkTools:工具(_T)
@@ -4017,14 +4045,14 @@ zh_CN.gtk.gtkHelp:帮助(_H)
en.gtk.gtkNewTab:New _Tab
de.gtk.gtkNewTab:Neuer _Tab
-fr.gtk.gtkNewTab:Nouvel _Onglet
+fr.gtk.gtkNewTab:Nouvel _onglet
it.gtk.gtkNewTab:Nuova _scheda
nl.gtk.gtkNewTab:Nieuw _Tabblad
zh_CN.gtk.gtkNewTab:新建标签页(_T)
en.gtk.gtkNewWindow:_New Window
de.gtk.gtkNewWindow:_Neues Fenster
-fr.gtk.gtkNewWindow:_Nouvelle Fenêtre
+fr.gtk.gtkNewWindow:_Nouvelle fenêtre
it.gtk.gtkNewWindow:Nuova _finestra
nl.gtk.gtkNewWindow:_Nieuw venster
zh_CN.gtk.gtkNewWindow:新建窗å£(_N)
@@ -4052,49 +4080,49 @@ zh_CN.gtk.gtkExport:导出
en.gtk.gtkSavePage:Complete Page…
de.gtk.gtkSavePage:Seite speichern..
-fr.gtk.gtkSavePage:Enregistrer la Page...
+fr.gtk.gtkSavePage:Enregistrer la Page…
it.gtk.gtkSavePage:Salva pagina...
nl.gtk.gtkSavePage:Pagina bewaren...
zh_CN.gtk.gtkSavePage:完整页é¢â€¦
en.gtk.gtkPlainText:Plain Text…
de.gtk.gtkPlainText:Reiner Text..
-fr.gtk.gtkPlainText:Texte...
+fr.gtk.gtkPlainText:Texte…
it.gtk.gtkPlainText:Testo normale...
nl.gtk.gtkPlainText:Platte tekst...
zh_CN.gtk.gtkPlainText:纯文本…
en.gtk.gtkDrawFile:Drawfile…
de.gtk.gtkDrawFile:Drawfile..
-fr.gtk.gtkDrawFile:Fichier dessin...
+fr.gtk.gtkDrawFile:Fichier dessin…
it.gtk.gtkDrawFile:File Draw...
nl.gtk.gtkDrawFile:Draw-bestand...
zh_CN.gtk.gtkDrawFile:绘图文件…
en.gtk.gtkPostScript:PostScript…
de.gtk.gtkPostScript:PostScript..
-fr.gtk.gtkPostScript:PostScript...
+fr.gtk.gtkPostScript:PostScript…
it.gtk.gtkPostScript:File PostScript...
nl.gtk.gtkPostScript:PostScript...
zh_CN.gtk.gtkPostScript:PostScript…
en.gtk.gtkPDF:PDF…
de.gtk.gtkPDF:PDF..
-fr.gtk.gtkPDF:PDF...
+fr.gtk.gtkPDF:PDF…
it.gtk.gtkPDF:File PDF...
nl.gtk.gtkPDF:PDF...
zh_CN.gtk.gtkPDF:PDF…
en.gtk.gtkPrintPreview:Print Preview…
de.gtk.gtkPrintPreview:Druckvorschau...
-fr.gtk.gtkPrintPreview:Aperçu avant impression...
+fr.gtk.gtkPrintPreview:Aperçu avant impression…
it.gtk.gtkPrintPreview:Anteprima di stampa...
nl.gtk.gtkPrintPreview:Afdruk_voorbeeld...
zh_CN.gtk.gtkPrintPreview:打å°é¢„览…
en.gtk.gtkPrint:Print…
de.gtk.gtkPrint:Drucken...
-fr.gtk.gtkPrint:Imprimer...
+fr.gtk.gtkPrint:Imprimer…
it.gtk.gtkPrint:Stampa...
nl.gtk.gtkPrint:Af_drukken...
zh_CN.gtk.gtkPrint:打å°â€¦
@@ -4143,7 +4171,7 @@ zh_CN.gtk.gtkSelectAll:全选(_A)
en.gtk.gtkFind:_Find…
de.gtk.gtkFind:_Finden..
-fr.gtk.gtkFind:_Rechercher...
+fr.gtk.gtkFind:_Rechercher…
it.gtk.gtkFind:T_rova...
nl.gtk.gtkFind:_Zoeken...
zh_CN.gtk.gtkFind:查找(_F) …
@@ -4227,14 +4255,14 @@ zh_CN.gtk.gtkForegroundImages:å‰æ™¯å›¾åƒ(_F)
en.gtk.gtkBackgroundImages:_Background Images
de.gtk.gtkBackgroundImages:_Hintergrundbilder
-fr.gtk.gtkBackgroundImages:_Images d'arrière plan
+fr.gtk.gtkBackgroundImages:_Images d’arrière plan
it.gtk.gtkBackgroundImages:In _sottofondo
nl.gtk.gtkBackgroundImages:_Achtergrondafbeeldingen
zh_CN.gtk.gtkBackgroundImages:背景图åƒ(_B)
en.gtk.gtkToolbars:_Toolbars
de.gtk.gtkToolbars:_Werkzeugleisten
-fr.gtk.gtkToolbars:Barre d'ou_tils
+fr.gtk.gtkToolbars:Barres d’ou_tils
it.gtk.gtkToolbars:_Barre strumenti
nl.gtk.gtkToolbars:_Werkbalken
zh_CN.gtk.gtkToolbars:工具æ (_T)
@@ -4255,21 +4283,21 @@ zh_CN.gtk.gtkMenuBar:èœå•æ (_M)
en.gtk.gtkToolBar:_Button Bar
de.gtk.gtkToolBar:_Buttonleiste
-fr.gtk.gtkToolBar:_Barre de boutons
+fr.gtk.gtkToolBar:_Barre de navigation
it.gtk.gtkToolBar:Barra p_ulsanti
nl.gtk.gtkToolBar:_Knoppenbalk
zh_CN.gtk.gtkToolBar:按钮æ (_B)
en.gtk.gtkStatusBar:_Status Bar
de.gtk.gtkStatusBar:_Statusleiste
-fr.gtk.gtkStatusBar:Ba_rre d'état
+fr.gtk.gtkStatusBar:Ba_rre d’état
it.gtk.gtkStatusBar:Barra di s_tato
nl.gtk.gtkStatusBar:_Statusbalk
zh_CN.gtk.gtkStatusBar:状æ€æ (_S)
en.gtk.gtkDownloads:_Downloads...
de.gtk.gtkDownloads:_Downloads...
-fr.gtk.gtkDownloads:_Téléchargements...
+fr.gtk.gtkDownloads:_Téléchargements…
it.gtk.gtkDownloads:_Trasferimenti...
nl.gtk.gtkDownloads:_Downloads...
zh_CN.gtk.gtkDownloads:下载(_D) …
@@ -4297,14 +4325,14 @@ zh_CN.gtk.gtkToggleDebugging:切æ¢è°ƒè¯•æ¸²æŸ“(_O)
en.gtk.gtkDebugBoxTree:Debug _box tree
de.gtk.gtkDebugBoxTree:Debug _box tree
-fr.gtk.gtkDebugBoxTree:Déboguer arbre _box
+fr.gtk.gtkDebugBoxTree:Déboguer l’arbre d’em_boîtement
it.gtk.gtkDebugBoxTree:Debug _box tree
nl.gtk.gtkDebugBoxTree:_Box-boom debuggen
zh_CN.gtk.gtkDebugBoxTree:调试边框树(_B)
en.gtk.gtkDebugDomTree:Debug _DOM tree
de.gtk.gtkDebugDomTree:Debug _DOM tree
-fr.gtk.gtkDebugDomTree:Déboguer arbre _DOM
+fr.gtk.gtkDebugDomTree:Déboguer l’arbre _DOM
it.gtk.gtkDebugDomTree:Debug albero _DOM
nl.gtk.gtkDebugDomTree:_DOM-boom debuggen
zh_CN.gtk.gtkDebugDomTree:调试 _DOM 树
@@ -4347,28 +4375,28 @@ zh_CN.gtk.gtkGlobalHistory:全局历å²è®°å½•(_G) …
en.gtk.gtkAddBookMarks:_Add to Bookmarks…
de.gtk.gtkAddBookMarks:_Lesezeichen hinzufügen..
-fr.gtk.gtkAddBookMarks:_Ajouter un marque-page..
+fr.gtk.gtkAddBookMarks:_Ajouter un marque-page…
it.gtk.gtkAddBookMarks:Aggiungi ai _segnalibri...
nl.gtk.gtkAddBookMarks:_Aan bladwijzers toevoegen...
zh_CN.gtk.gtkAddBookMarks:添加到书签(_A) …
en.gtk.gtkShowBookMarks:_Show Bookmarks…
de.gtk.gtkShowBookMarks:Le_sezeichen anzeigen..
-fr.gtk.gtkShowBookMarks:_Montrer les marques-pages...
+fr.gtk.gtkShowBookMarks:_Afficher les marque-pages…
it.gtk.gtkShowBookMarks:_Mostra segnalibri...
nl.gtk.gtkShowBookMarks:Bladwijzers _beheren...
zh_CN.gtk.gtkShowBookMarks:显示书签(_S) …
en.gtk.gtkShowCookies:Show _Cookies…
de.gtk.gtkShowCookies:Zeige _Cookies…
-fr.gtk.gtkShowCookies:Afficher _cookies...
+fr.gtk.gtkShowCookies:Afficher les _cookies…
it.gtk.gtkShowCookies:Mostra _cookie...
nl.gtk.gtkShowCookies:_Cookies beheren...
zh_CN.gtk.gtkShowCookies:显示 Cookies(_C) …
en.gtk.gtkOpenLocation:_Open Location…
de.gtk.gtkOpenLocation:_Ort öffnen..
-fr.gtk.gtkOpenLocation:_Ouvrir un site..
+fr.gtk.gtkOpenLocation:_Ouvrir un site…
it.gtk.gtkOpenLocation:Apri in_dirizzo...
nl.gtk.gtkOpenLocation:Locatie _openen..
zh_CN.gtk.gtkOpenLocation:打开ä½ç½®ä¿¡æ¯(_O) …
@@ -4389,7 +4417,7 @@ zh_CN.gtk.gtkPrevTab:上一个标签页(_P)
en.gtk.gtkCloseTab:_Close tab
de.gtk.gtkCloseTab:Tab s_chliessen
-fr.gtk.gtkCloseTab:_Fermer l'onglet
+fr.gtk.gtkCloseTab:_Fermer l’onglet
it.gtk.gtkCloseTab:_Chiudi scheda
nl.gtk.gtkCloseTab:Tabblad _sluiten
zh_CN.gtk.gtkCloseTab:关闭标签页(_C)
@@ -4417,42 +4445,42 @@ zh_CN.gtk.gtkUserInformation:用户信æ¯(_I) …
en.gtk.gtkAbout:_About…
de.gtk.gtkAbout:Ü_ber
-fr.gtk.gtkAbout:_A propos...
+fr.gtk.gtkAbout:_À propos…
it.gtk.gtkAbout:_Informazioni...
nl.gtk.gtkAbout:_Programma-informatie...
zh_CN.gtk.gtkAbout:关于(_A) …
en.gtk.gtkCustomize:Customise…
de.gtk.gtkCustomize:Anpassen…
-fr.gtk.gtkCustomize:Personnaliser...
+fr.gtk.gtkCustomize:Personnaliser…
it.gtk.gtkCustomize:Personalizza...
nl.gtk.gtkCustomize:Aanpassen...
zh_CN.gtk.gtkCustomize:自定义(_C) …
en.gtk.gtkOpentab:Open Link in New _Tab
de.gtk.gtkOpentab:Link in neuem _Tab öffnen
-fr.gtk.gtkOpentab:Ouvrir dans un nouvel _Onglet
+fr.gtk.gtkOpentab:Ouvrir dans un nouvel _onglet
it.gtk.gtkOpentab:Apri in nuova _scheda
nl.gtk.gtkOpentab:Koppeling openen in nieuw _tabblad
zh_CN.gtk.gtkOpentab:在新标签页中打开链接(_T)
en.gtk.gtkOpenwin:Open Link in New _Window
de.gtk.gtkOpenwin:Link in neuem _Fenster öffnen
-fr.gtk.gtkOpenwin:Ouvrir dans une nouvelle _Fenêtre
+fr.gtk.gtkOpenwin:Ouvrir dans une nouvelle _fenêtre
it.gtk.gtkOpenwin:Apri in nuova _finestra
nl.gtk.gtkOpenwin:Koppeling openen in nieuw _venster
zh_CN.gtk.gtkOpenwin:在新窗å£ä¸­æ‰“开链接(_W)
en.gtk.gtkSavelink:Save Lin_k
de.gtk.gtkSavelink:Lin_k speichern..
-fr.gtk.gtkSavelink:Enregistrer li_en
+fr.gtk.gtkSavelink:Enregistrer le li_en
it.gtk.gtkSavelink:Salva lin_k
nl.gtk.gtkSavelink:_Koppeling opslaan als...
zh_CN.gtk.gtkSavelink:ä¿å­˜é“¾æŽ¥(_K)
en.gtk.gtkBookmarklink:Bookmark _Link
de.gtk.gtkBookmarklink:_Link als Bookmark
-fr.gtk.gtkBookmarklink:Marquer _Lien
+fr.gtk.gtkBookmarklink:Marquer le _lien
it.gtk.gtkBookmarklink:A_ggiungi ai segnalibri
nl.gtk.gtkBookmarklink:B_ladwijzer voor de koppeling maken
zh_CN.gtk.gtkBookmarklink:书签链接(_L)
@@ -4468,14 +4496,14 @@ zh_CN.gtk.gtkCopylink:å¤åˆ¶é“¾æŽ¥ä½ç½®(_A)
en.gtk.gtkAddThemeTitle:Select folder containing theme images
de.gtk.gtkAddThemeTitle:Ordner mit Themenbildern auswählen
-fr.gtk.gtkAddThemeTitle:Sélectionner le dossier contenant des images de thèmes
+fr.gtk.gtkAddThemeTitle:Sélectionner le dossier contenant des images de thème
it.gtk.gtkAddThemeTitle:Seleziona una cartella contenente le immagini del tema in questione
nl.gtk.gtkAddThemeTitle:Map met thema-afbeeldingen selecteren
zh_CN.gtk.gtkAddThemeTitle:选择包å«ä¸»é¢˜å›¾åƒçš„文件夹
en.gtk.gtkThemeFolderInstructions:To Install a theme, create a directory full of appropriately-named images as a subdirectory of gtk/res/themes/
de.gtk.gtkThemeFolderInstructions:Erstellen sie ein Verzeichnis mit korrekt benannten Bildern als Unterverzeichnis von gtk/res/themes um ein Thema zu installieren
-fr.gtk.gtkThemeFolderInstructions:Pour installer un thème, créer un dossier d'images avec un nom approprié comme sous-dossier de gtk/res/themes/
+fr.gtk.gtkThemeFolderInstructions:Pour installer un thème, créer un dossier d’images avec un nom approprié comme sous-dossier de gtk/res/themes/
it.gtk.gtkThemeFolderInstructions:Per installare un nuovo tema crea una directory con delle immagini appropriate ed inseriscile come sotto-directory di gtk/res/themes/
nl.gtk.gtkThemeFolderInstructions:Maak in de map gtk/res/themes/ een submap aan die afbeeldingen met de juiste namen bevatten om deze als thema te installeren.
zh_CN.gtk.gtkThemeFolderInstructions:如果è¦å®‰è£…主题,请创建一个目录,作为 gtk/res/themes/ çš„å­ç›®å½•ï¼Œå…¶ä¸­åŒ…å«æ­£ç¡®å‘½å的图åƒã€‚
@@ -4496,7 +4524,7 @@ zh_CN.gtk.gtkThemeDup:已应用主题
en.gtk.gtkThemeAdd:Theme added successfully
de.gtk.gtkThemeAdd:Thema erfolgreich hinzugefügt
-fr.gtk.gtkThemeAdd:Le thème a été ajouté avec succes
+fr.gtk.gtkThemeAdd:Le thème a été ajouté avec succès
it.gtk.gtkThemeAdd:Il tema è stato aggiunto con successo
nl.gtk.gtkThemeAdd:Thema is succesvol toegevoegd
zh_CN.gtk.gtkThemeAdd:å·²æˆåŠŸæ·»åŠ ä¸»é¢˜
@@ -4504,36 +4532,44 @@ zh_CN.gtk.gtkThemeAdd:å·²æˆåŠŸæ·»åŠ ä¸»é¢˜
# GTK toolbar customisation
en.gtk.gtkCustomizeToolbarTitle:Customise Toolbar
+fr.gtk.gtkCustomizeToolbarTitle:Personnaliser la barre d’outils
it.gtk.gtkCustomizeToolbarTitle:Personalizza barra strumenti
zh_CN.gtk.gtkCustomizeToolbarTitle:自定义工具æ 
en.gtk.gtkCustomizeToolbarInstructions:Drag toolbar items into and out of the toolbar.
+fr.gtk.gtkCustomizeToolbarInstructions:Glisser-déposer de nouveaux éléments sur la barre.
it.gtk.gtkCustomizeToolbarInstructions:Trascina elementi della barra strumenti dentro e fuori la barra.
zh_CN.gtk.gtkCustomizeToolbarInstructions:拖动工具æ é¡¹ã€‚
# GTK find in page
en.gtk.gtkFindPlaceholder:Find in page
+fr.gtk.gtkFindPlaceholder:Rechercher dans la page
it.gtk.gtkFindPlaceholder:Trova nella pagina
zh_CN.gtk.gtkFindPlaceholder:在页é¢ä¸­æŸ¥æ‰¾
en.gtk.gtkFindBack:Find Previous Occurrence
+fr.gtk.gtkFindBack:Trouver l’occurence précédente
it.gtk.gtkFindBack:Trova occorrenza _precedente
zh_CN.gtk.gtkFindBack:查找上一个匹é…项
en.gtk.gtkFindForward:Find _Next Occurrence
+fr.gtk.gtkFindForward:Trouver l’occurence _suivante
it.gtk.gtkFindForward:Trova occorrenza _successiva
zh_CN.gtk.gtkFindForward:查找下一个匹é…项(_N)
en.gtk.gtkFindHighlightAll:Highlight All
+fr.gtk.gtkFindHighlightAll:Tout surligner
it.gtk.gtkFindHighlightAll:Evidenzia tutto
zh_CN.gtk.gtkFindHighlightAll:çªå‡ºæ˜¾ç¤ºæ‰€æœ‰æŸ¥æ‰¾å†…容
en.gtk.gtkFindMatchCase:Match Case
+fr.gtk.gtkFindMatchCase:Respecter la casse
it.gtk.gtkFindMatchCase:Marca corrispondenze
zh_CN.gtk.gtkFindMatchCase:匹é…查找内容
en.gtk.gtkFindClose:Close Find Bar
+fr.gtk.gtkFindClose:Fermer la barre de recherche
it.gtk.gtkFindClose:Chiudi finestra di ricerca
zh_CN.gtk.gtkFindClose:关闭æœç´¢æ 
@@ -4549,7 +4585,7 @@ zh_CN.gtk.preferencesTitle:NetSurf 首选项
# Main tab
en.gtk.preferencesMainTabtitle:Main
de.gtk.preferencesMainTabtitle:Allgemein
-fr.gtk.preferencesMainTabtitle:Accueil/Principal
+fr.gtk.preferencesMainTabtitle:Général
it.gtk.preferencesMainTabtitle:Principale
nl.gtk.preferencesMainTabtitle:Algemeen
zh_CN.gtk.preferencesMainTabtitle:主èœå•
@@ -4563,7 +4599,7 @@ zh_CN.gtk.preferencesStartup:<b>å¯åŠ¨</b>
en.gtk.preferencesStartupPage:Page:
de.gtk.preferencesStartupPage:Seite:
-fr.gtk.preferencesStartupPage:Page:
+fr.gtk.preferencesStartupPage:Page :
it.gtk.preferencesStartupPage:Pagina:
nl.gtk.preferencesStartupPage:Pagina:
zh_CN.gtk.preferencesStartupPage:页é¢ï¼š
@@ -4598,21 +4634,21 @@ zh_CN.gtk.preferencesSearch:<b>查找</b>
en.gtk.preferencesSearchURLBar:Search from URL bar
de.gtk.preferencesSearchURLBar:Adressleiste zum Suchen
-fr.gtk.preferencesSearchURLBar:Recherche depuis la barre d'URL
+fr.gtk.preferencesSearchURLBar:Recherche depuis la barre d’URL
it.gtk.preferencesSearchURLBar:Cerca da barra URL
nl.gtk.preferencesSearchURLBar:Standaardzoekmachine
zh_CN.gtk.preferencesSearchURLBar:从地å€æ æœç´¢
en.gtk.preferencesSearchProvider:Provider:
de.gtk.preferencesSearchProvider:Anbieter:
-fr.gtk.preferencesSearchProvider:Fournisseur :
+fr.gtk.preferencesSearchProvider:Fournisseur :
it.gtk.preferencesSearchProvider:Provider:
nl.gtk.preferencesSearchProvider:Zoeken met:
zh_CN.gtk.preferencesSearchProvider:æ供者:
en.gtk.preferencesSearchProviderTooltip:The default web search provider
de.gtk.preferencesSearchProviderTooltip:Voreingestellter Suchanbieter
-fr.gtk.preferencesSearchProviderTooltip:Le fournisseur de recherche sur le web par défaut
+fr.gtk.preferencesSearchProviderTooltip:Le fournisseur de recherche Web par défaut
it.gtk.preferencesSearchProviderTooltip:Provider di ricerca web predefinito
nl.gtk.preferencesSearchProviderTooltip:Kies de standaardzoekmachine. NetSurf gebruikt deze in de zoekbalk.
zh_CN.gtk.preferencesSearchProviderTooltip:默认网络æœç´¢æ供者
@@ -4633,21 +4669,21 @@ zh_CN.gtk.preferencesDownloadsRemove:完æˆåŽä»Žåˆ—表中删除下载任务
en.gtk.preferencesDownloadsConfirm:Confirm before overwriting files
de.gtk.preferencesDownloadsConfirm:Überschreiben bestätigen
-fr.gtk.preferencesDownloadsConfirm:Confirmer avant d'écraser des fichiers
+fr.gtk.preferencesDownloadsConfirm:Confirmer avant d’écraser des fichiers
it.gtk.preferencesDownloadsConfirm:Conferma prima di sovrascrivere
nl.gtk.preferencesDownloadsConfirm:Overschrijven van bestand bevestigen
zh_CN.gtk.preferencesDownloadsConfirm:覆盖文件之å‰è¿›è¡Œç¡®è®¤
en.gtk.preferencesDownloadsLocation:Location:
de.gtk.preferencesDownloadsLocation:Zielort:
-fr.gtk.preferencesDownloadsLocation:Emplacement :
+fr.gtk.preferencesDownloadsLocation:Emplacement :
it.gtk.preferencesDownloadsLocation:Percorso:
nl.gtk.preferencesDownloadsLocation:Bestanden opslaan in:
zh_CN.gtk.preferencesDownloadsLocation:ä½ç½®ï¼š
en.gtk.preferencesDownloadsLocationTooltip:The default location downloaded files are put
de.gtk.preferencesDownloadsLocationTooltip:Speicherort für Downloads
-fr.gtk.preferencesDownloadsLocationTooltip:L'emplacement par défaut des fichiers téléchargés sont mis
+fr.gtk.preferencesDownloadsLocationTooltip:L’emplacement par défaut où déplacer les fichiers téléchargés
it.gtk.preferencesDownloadsLocationTooltip:Percorso predefinito dove scaricare i file
nl.gtk.preferencesDownloadsLocationTooltip:De standaardplaats waar gedownloade bestanden worden opgeslagen
zh_CN.gtk.preferencesDownloadsLocationTooltip:默认ä½ç½®æ”¾ç½®ä¸‹è½½çš„文件
@@ -4669,7 +4705,7 @@ zh_CN.gtk.preferencesThemes:<b>主题</b>
en.gtk.preferencesThemesAdd:Add Theme...
de.gtk.preferencesThemesAdd:Thema hinzu...
-fr.gtk.preferencesThemesAdd:Ajouter thème...
+fr.gtk.preferencesThemesAdd:Ajouter un thème…
it.gtk.preferencesThemesAdd:Aggiungi tema...
nl.gtk.preferencesThemesAdd:Thema toevoegen...
zh_CN.gtk.preferencesThemesAdd:添加主题…
@@ -4683,28 +4719,28 @@ zh_CN.gtk.preferencesTabs:<b>标签页</b>
en.gtk.preferencesTabsAlways:Always show tab bar
de.gtk.preferencesTabsAlways:Tableiste immer anzeigen
-fr.gtk.preferencesTabsAlways:Toujours afficher la barre d'onglet
+fr.gtk.preferencesTabsAlways:Toujours afficher la barre d’onglet
it.gtk.preferencesTabsAlways:Mostra sempre la barra delle schede
nl.gtk.preferencesTabsAlways:De tabbladenwerkbalk verbergen wanneer slechts één tabblad is geopend
zh_CN.gtk.preferencesTabsAlways:总是显示标签页æ 
en.gtk.preferencesTabsSwitch:Switch to newly opened tabs immediately
de.gtk.preferencesTabsSwitch:neue Tabs sofort in Vordergrund
-fr.gtk.preferencesTabsSwitch:Passer à l'onglet nouvellement ouvert immédiatement
+fr.gtk.preferencesTabsSwitch:À l’ouverture d’un nouvel onglet, basculer immédiatement vers celui-ci
it.gtk.preferencesTabsSwitch:Passa immediatamente alle nuove schede aperte
nl.gtk.preferencesTabsSwitch:Naar vanuit koppeling geopende nieuwe tabbladen schakelen
zh_CN.gtk.preferencesTabsSwitch:ç«‹å³åˆ‡æ¢åˆ°æ–°æ‰“开的标签页
en.gtk.preferencesTabsNewly:Newly opened tabs are blank
de.gtk.preferencesTabsNewly:neue Tabs als leere Seite
-fr.gtk.preferencesTabsNewly:Onglet récemment ouvert est vièrge
+fr.gtk.preferencesTabsNewly:Utiliser une page vide pour les nouveaux onglets
it.gtk.preferencesTabsNewly:Le nuove schede aperte sono vuote
nl.gtk.preferencesTabsNewly:Geopende nieuwe tabbladen zijn leeg inplaats van de startpagina
zh_CN.gtk.preferencesTabsNewly:新打开的标签页为空白
en.gtk.preferencesTabsPosition:Position:
de.gtk.preferencesTabsPosition:Position:
-fr.gtk.preferencesTabsPosition:Position :
+fr.gtk.preferencesTabsPosition:Position :
it.gtk.preferencesTabsPosition:Posizione:
nl.gtk.preferencesTabsPosition:Positie in venster:
zh_CN.gtk.preferencesTabsPosition:ä½ç½®ï¼š
@@ -4718,56 +4754,56 @@ zh_CN.gtk.preferencesTools:<b>工具</b>
en.gtk.preferencesDeveloperView:Open developer views in a
de.gtk.preferencesDeveloperView:Entwickleransicht öffnen in
-fr.gtk.preferencesDeveloperView:Vues de développement s'ouvrent dans
+fr.gtk.preferencesDeveloperView:La vue de développement s’ouvre dans
it.gtk.preferencesDeveloperView:Apri visualizzazione sviluppatori in
nl.gtk.preferencesDeveloperView:Informatie voor ontwikkelaars openen in
zh_CN.gtk.preferencesDeveloperView:打开开å‘人员视图
en.gtk.preferencesDeveloperViewWindow:Window
de.gtk.preferencesDeveloperViewWindow:Fenster
-fr.gtk.preferencesDeveloperViewWindow:un fenêtre
+fr.gtk.preferencesDeveloperViewWindow:une nouvelle fenêtre
it.gtk.preferencesDeveloperViewWindow:Finestra
nl.gtk.preferencesDeveloperViewWindow:Venster
zh_CN.gtk.preferencesDeveloperViewWindow:窗å£
en.gtk.preferencesDeveloperViewTab:Tab
de.gtk.preferencesDeveloperViewTab:Tab
-fr.gtk.preferencesDeveloperViewTab:un onglet
+fr.gtk.preferencesDeveloperViewTab:un nouvel onglet
it.gtk.preferencesDeveloperViewTab:Scheda
nl.gtk.preferencesDeveloperViewTab:Tabblad
zh_CN.gtk.preferencesDeveloperViewTab:标签页
en.gtk.preferencesDeveloperViewEditor:Editor
de.gtk.preferencesDeveloperViewEditor:Editor
-fr.gtk.preferencesDeveloperViewEditor:Éditeur
+fr.gtk.preferencesDeveloperViewEditor:votre éditeur préféré
it.gtk.preferencesDeveloperViewEditor:Editor di testo
nl.gtk.preferencesDeveloperViewEditor:Tekst-editor
zh_CN.gtk.preferencesDeveloperViewEditor:编辑器
en.gtk.preferencesURLbar:<b>URLbar</b>
de.gtk.preferencesURLbar:<b>Adressleiste</b>
-fr.gtk.preferencesURLbar:<b>Barre URL</b>
+fr.gtk.preferencesURLbar:<b>Barre d’URL</b>
it.gtk.preferencesURLbar:<b>Barra indirizzi</b>
nl.gtk.preferencesURLbar:<b>Locatiebalk</b>
zh_CN.gtk.preferencesURLbar:<b>地å€æ </b>
en.gtk.preferencesURLbarDisplay:Display recently visited URLs as you type
de.gtk.preferencesURLbarDisplay:benutzte URLs während Eingabe zeigen
-fr.gtk.preferencesURLbarDisplay:Afficher les URL visités récemment lorsque vous tapez
+fr.gtk.preferencesURLbarDisplay:Afficher les URL récemment visitées lors de la frappe
it.gtk.preferencesURLbarDisplay:Mostra gli URL visitati di recente durante la digitazione
nl.gtk.preferencesURLbarDisplay:Automatisch aanvullen vanuit de browsergeschiedenis tijdens het typen
zh_CN.gtk.preferencesURLbarDisplay:键入时显示最近访问的地å€
en.gtk.preferencesToolbar:<b>Toolbar</b>
de.gtk.preferencesToolbar:<b>Knopfleiste</b>
-fr.gtk.preferencesToolbar:<b>Barre d'outils</b>
+fr.gtk.preferencesToolbar:<b>Barre d’outils</b>
it.gtk.preferencesToolbar:<b>Barra strumenti</b>
nl.gtk.preferencesToolbar:<b>Werkbalk</b>
zh_CN.gtk.preferencesToolbar:<b>工具æ </b>
en.gtk.preferencesToolbarButtons:Buttons:
de.gtk.preferencesToolbarButtons:Gestalt:
-fr.gtk.preferencesToolbarButtons:Boutons :
+fr.gtk.preferencesToolbarButtons:Boutons :
it.gtk.preferencesToolbarButtons:Pulsanti:
nl.gtk.preferencesToolbarButtons:Knoppen:
zh_CN.gtk.preferencesToolbarButtons:按钮:
@@ -4783,28 +4819,28 @@ zh_CN.gtk.preferencesThemeTypeDefault:默认
# Tab position list
en.gtk.preferencesTabLocTop:Top
de.gtk.preferencesTabLocTop:Oben
-fr.gtk.preferencesTabLocTop:Haut
+fr.gtk.preferencesTabLocTop:en haut
it.gtk.preferencesTabLocTop:In alto
nl.gtk.preferencesTabLocTop:Bovenaan
zh_CN.gtk.preferencesTabLocTop:顶部
en.gtk.preferencesTabLocLeft:Left
de.gtk.preferencesTabLocLeft:Links
-fr.gtk.preferencesTabLocLeft:Gauche
+fr.gtk.preferencesTabLocLeft:à gauche
it.gtk.preferencesTabLocLeft:A sinistra
nl.gtk.preferencesTabLocLeft:Links
zh_CN.gtk.preferencesTabLocLeft:左侧
en.gtk.preferencesTabLocBottom:Bottom
de.gtk.preferencesTabLocBottom:Unten
-fr.gtk.preferencesTabLocBottom:Bas
+fr.gtk.preferencesTabLocBottom:en bas
it.gtk.preferencesTabLocBottom:In basso
nl.gtk.preferencesTabLocBottom:Onderaan
zh_CN.gtk.preferencesTabLocBottom:底部
en.gtk.preferencesTabLocRight:Right
de.gtk.preferencesTabLocRight:Rechts
-fr.gtk.preferencesTabLocRight:Droite
+fr.gtk.preferencesTabLocRight:à droite
it.gtk.preferencesTabLocRight:A destra
nl.gtk.preferencesTabLocRight:Rechts
zh_CN.gtk.preferencesTabLocRight:å³ä¾§
@@ -4812,28 +4848,28 @@ zh_CN.gtk.preferencesTabLocRight:å³ä¾§
# button list
en.gtk.preferencesButtonTypeSmall:Small Icons
de.gtk.preferencesButtonTypeSmall:Kleine Icons
-fr.gtk.preferencesButtonTypeSmall:Petites icônes
+fr.gtk.preferencesButtonTypeSmall:petites icônes
it.gtk.preferencesButtonTypeSmall:Pulsanti piccoli
nl.gtk.preferencesButtonTypeSmall:Kleine pictogrammen
zh_CN.gtk.preferencesButtonTypeSmall:å°å›¾æ ‡
en.gtk.preferencesButtonTypeLarge:Large Icons
de.gtk.preferencesButtonTypeLarge:Große Icons
-fr.gtk.preferencesButtonTypeLarge:Grandes icônes
+fr.gtk.preferencesButtonTypeLarge:grandes icônes
it.gtk.preferencesButtonTypeLarge:Pulsanti grandi
nl.gtk.preferencesButtonTypeLarge:Grote pictogrammen
zh_CN.gtk.preferencesButtonTypeLarge:大图标
en.gtk.preferencesButtonTypeLargeText:Large Icons and Text
de.gtk.preferencesButtonTypeLargeText:Große Icons mit Text
-fr.gtk.preferencesButtonTypeLargeText:Grandes icônes et texte
+fr.gtk.preferencesButtonTypeLargeText:grandes icônes et texte
it.gtk.preferencesButtonTypeLargeText:Pulsanti grandi e testo
nl.gtk.preferencesButtonTypeLargeText:Grote pictogrammen en tekst
zh_CN.gtk.preferencesButtonTypeLargeText:大图标和文本
en.gtk.preferencesButtonTypeText:Text only
de.gtk.preferencesButtonTypeText:Text ohne Icons
-fr.gtk.preferencesButtonTypeText:Texte uniquement
+fr.gtk.preferencesButtonTypeText:texte uniquement
it.gtk.preferencesButtonTypeText:Solo testo
nl.gtk.preferencesButtonTypeText:Alleen tekst
zh_CN.gtk.preferencesButtonTypeText:仅文本
@@ -4855,7 +4891,7 @@ zh_CN.gtk.preferencesControl:<b>控件</b>
en.gtk.preferencesControlPrevent:Prevent pop-up windows
de.gtk.preferencesControlPrevent:Pop-Up Fenster blocken
-fr.gtk.preferencesControlPrevent:Empêcher fenêtres pop-up
+fr.gtk.preferencesControlPrevent:Bloquer les fenêtres popup
it.gtk.preferencesControlPrevent:Blocca finestre pop-up (AdBlock)
nl.gtk.preferencesControlPrevent:Pop-upvensters blokkeren
zh_CN.gtk.preferencesControlPrevent:阻止弹窗
@@ -4869,21 +4905,21 @@ zh_CN.gtk.preferencesControlHide:éšè—广告
en.gtk.preferencesControlEnable:Enable JavaScript
de.gtk.preferencesControlEnable:JavaScript einschalten
-fr.gtk.preferencesControlEnable:Activer JavaScript
+fr.gtk.preferencesControlEnable:Activer le JavaScript
it.gtk.preferencesControlEnable:Attiva JavaScript
nl.gtk.preferencesControlEnable:JavaScript inschakelen
zh_CN.gtk.preferencesControlEnable:å¯ç”¨ JavaScript
en.gtk.preferencesControlDisable:Disable plug-ins
de.gtk.preferencesControlDisable:Plug-Ins abschalten
-fr.gtk.preferencesControlDisable:Désactiver modules externes
+fr.gtk.preferencesControlDisable:Désactiver les modules externes
it.gtk.preferencesControlDisable:Disattiva Plugins
nl.gtk.preferencesControlDisable:Plug-ins uitschakelen
zh_CN.gtk.preferencesControlDisable:ç¦ç”¨æ’件
en.gtk.preferencesControlHigh:High quality image scaling
de.gtk.preferencesControlHigh:Bildskalierung hoher Qualität
-fr.gtk.preferencesControlHigh:Haute qualité d'image redimensionnée
+fr.gtk.preferencesControlHigh:Haute qualité d’image
it.gtk.preferencesControlHigh:Scala immagini in alta qualità
nl.gtk.preferencesControlHigh:Schalen op hoge beeldkwaliteit
zh_CN.gtk.preferencesControlHigh:高质é‡å›¾åƒç¼©æ”¾
@@ -4911,7 +4947,7 @@ zh_CN.gtk.preferencesAnimationEnable:å¯ç”¨
en.gtk.preferencesAnimationMinimum:Minimum time between frames:
de.gtk.preferencesAnimationMinimum:minimale Zeit zwischen Frames:
-fr.gtk.preferencesAnimationMinimum:Temps minimal entre cadres/frames/images/photo :
+fr.gtk.preferencesAnimationMinimum:Temps minimal entre chaque image :
it.gtk.preferencesAnimationMinimum:Limita velocità fotogrammi al secondo:
nl.gtk.preferencesAnimationMinimum:Minimum tijd tussen opeenvolgende animatiebeelden:
zh_CN.gtk.preferencesAnimationMinimum:最å°å¸§é—´éš”时间:
@@ -4925,7 +4961,7 @@ zh_CN.gtk.preferencesAnimationMinimumTooltip:更新动画的频率ä¸è¦è¶…过æ­
en.gtk.preferencesFonts:<b>Fonts</b>
de.gtk.preferencesFonts:<b>Fonts</b>
-fr.gtk.preferencesFonts:<b>Fontes/Polices</b>
+fr.gtk.preferencesFonts:<b>Polices de caractères</b>
it.gtk.preferencesFonts:<b>Font</b>
nl.gtk.preferencesFonts:<b>Lettertypen</b>
zh_CN.gtk.preferencesFonts:<b>字体</b>
@@ -4946,7 +4982,7 @@ zh_CN.gtk.preferencesFontsSize:字体大å°
en.gtk.preferencesFontsSizeTooltip:The base-line font size to use.
de.gtk.preferencesFontsSizeTooltip:Die Standardgröße für Basisschriften.
-fr.gtk.preferencesFontsSizeTooltip:La taille de la fonte/police de base à utiliser.
+fr.gtk.preferencesFontsSizeTooltip:La taille de référence à utiliser pour les polices.
it.gtk.preferencesFontsSizeTooltip:Dimensione base del carattere di linea da utilizzare.
nl.gtk.preferencesFontsSizeTooltip:Het standaardlettertype te gebruiken voor webpagina's.
zh_CN.gtk.preferencesFontsSizeTooltip:è¦ä½¿ç”¨çš„基准字体大å°ã€‚
@@ -4967,7 +5003,7 @@ zh_CN.gtk.preferencesLanguage:<b>语言</b>
en.gtk.preferencesLanguagePreferred:Preferred language:
de.gtk.preferencesLanguagePreferred:bevorzugte Sprache:
-fr.gtk.preferencesLanguagePreferred:Langue préférée :
+fr.gtk.preferencesLanguagePreferred:Langue préférée :
it.gtk.preferencesLanguagePreferred:Lingua preferita:
nl.gtk.preferencesLanguagePreferred:Voorkeurtaal:
zh_CN.gtk.preferencesLanguagePreferred:首选语言:
@@ -4982,28 +5018,28 @@ zh_CN.gtk.preferencesLanguagePreferredTooltip:网页的首选语言
# Image loading list
en.gtk.preferencesImageLoadBoth:foreground and background images
de.gtk.preferencesImageLoadBoth:Vorder- und Hintergrundbilder
-fr.gtk.preferencesImageLoadBoth:Images d'avant-plan et d'arrière-plan
+fr.gtk.preferencesImageLoadBoth:images de premier plan et d’arrière plan
it.gtk.preferencesImageLoadBoth:Immagini in primo piano e di sfondo
nl.gtk.preferencesImageLoadBoth:voorgrond- en achtergrondafbeeldingen
zh_CN.gtk.preferencesImageLoadBoth:å‰æ™¯å’ŒèƒŒæ™¯å›¾åƒ
en.gtk.preferencesImageLoadFore:foreground images
de.gtk.preferencesImageLoadFore:Vordergrundbilder
-fr.gtk.preferencesImageLoadFore:Images d'avant-plan
+fr.gtk.preferencesImageLoadFore:images de premier plan
it.gtk.preferencesImageLoadFore:Immagini in primo piano
nl.gtk.preferencesImageLoadFore:voorgrondafbeeldingen
zh_CN.gtk.preferencesImageLoadFore:å‰æ™¯å›¾åƒ
en.gtk.preferencesImageLoadBack:background images
de.gtk.preferencesImageLoadBack:Hintergrundbilder
-fr.gtk.preferencesImageLoadBack:Images d'arrière-plan
+fr.gtk.preferencesImageLoadBack:images d’arrière plan
it.gtk.preferencesImageLoadBack:Immagini di sfondo
nl.gtk.preferencesImageLoadBack:achtergrondafbeeldingen
zh_CN.gtk.preferencesImageLoadBack:背景图åƒ
en.gtk.preferencesImageLoadNone:no images
de.gtk.preferencesImageLoadNone:Keine Bidlder
-fr.gtk.preferencesImageLoadNone:pas d'images
+fr.gtk.preferencesImageLoadNone:aucune image
it.gtk.preferencesImageLoadNone:Nessuna immagine
nl.gtk.preferencesImageLoadNone:geen afbeeldingen
zh_CN.gtk.preferencesImageLoadNone:无图åƒ
@@ -5025,7 +5061,7 @@ zh_CN.gtk.preferencesFonttypeSerif:衬线字体
en.gtk.preferencesFonttypeMonospace:Monospace
de.gtk.preferencesFonttypeMonospace:Monospace
-fr.gtk.preferencesFonttypeMonospace:Monospace
+fr.gtk.preferencesFonttypeMonospace:Chasse fixe
it.gtk.preferencesFonttypeMonospace:Monospaziato
nl.gtk.preferencesFonttypeMonospace:Monospace
zh_CN.gtk.preferencesFonttypeMonospace:等宽字体
@@ -5039,7 +5075,7 @@ zh_CN.gtk.preferencesFonttypeCursive:手写字体
en.gtk.preferencesFonttypeFantasy:Fantasy
de.gtk.preferencesFonttypeFantasy:Fantasy
-fr.gtk.preferencesFonttypeFantasy:Fantasy
+fr.gtk.preferencesFonttypeFantasy:Fantaisie
it.gtk.preferencesFonttypeFantasy:Fantasia
nl.gtk.preferencesFonttypeFantasy:Fantasie
zh_CN.gtk.preferencesFonttypeFantasy:Fantasy 字体
@@ -5060,14 +5096,14 @@ zh_CN.gtk.preferencesGeneral:<b>常规</b>
en.gtk.preferencesGeneralReferral:Enable referral submission
de.gtk.preferencesGeneralReferral:Referenzen erlauben
-fr.gtk.preferencesGeneralReferral:Permettre l'envoi du referer en entête
+fr.gtk.preferencesGeneralReferral:Autoriser le partage du referer
it.gtk.preferencesGeneralReferral:Permetti invio informazioni sul referral
nl.gtk.preferencesGeneralReferral:Referentie versturen inschakelen
zh_CN.gtk.preferencesGeneralReferral:å¯ç”¨æŽ¨èæ交
en.gtk.preferencesGeneralDNT:Enable sending "Do Not Track" request
de.gtk.preferencesGeneralDNT:Webseiten sollen nicht nachverfolgen dürfen
-fr.gtk.preferencesGeneralDNT:Activer l'envoi d'une requête "Ne pas suivre à la trace"
+fr.gtk.preferencesGeneralDNT:Demander aux sites Web de « ne pas me pister »
it.gtk.preferencesGeneralDNT:Attiva invio per la richiesta di non tracciamento
nl.gtk.preferencesGeneralDNT:Websites laten weten dat gebruiker niet gevolgd wil worden
zh_CN.gtk.preferencesGeneralDNT:å‘é€â€œä¸è·Ÿè¸ªâ€è¯·æ±‚
@@ -5081,14 +5117,14 @@ zh_CN.gtk.preferencesHistory:<b>历å²è®°å½•</b>
en.gtk.preferencesHistoryShow:Local history shows URL in tooltip
de.gtk.preferencesHistoryShow:History (lokal) zeigt die URL in der Hilfe an
-fr.gtk.preferencesHistoryShow:Historique local dans une infobulle
+fr.gtk.preferencesHistoryShow:L’historique local montre les URLs dans une infobulle
it.gtk.preferencesHistoryShow:Mostra cronologia locale dell'URL nella descrizione comandi
nl.gtk.preferencesHistoryShow:Venstergeschiedenis toont webadres in een tipkader
zh_CN.gtk.preferencesHistoryShow:本地历å²è®°å½•åœ¨å·¥å…·æ示中显示 URL
en.gtk.preferencesHistoryRemember:Remember browsing history for up to
de.gtk.preferencesHistoryRemember:History merken für bis zu
-fr.gtk.preferencesHistoryRemember:Conserver l'historique de navigation pendant
+fr.gtk.preferencesHistoryRemember:Conserver l’historique de navigation pendant
it.gtk.preferencesHistoryRemember:Ricorda cronologia di navigazione in
nl.gtk.preferencesHistoryRemember:Browsergeschiedenis onthouden voor
zh_CN.gtk.preferencesHistoryRemember:è®°ä½æµè§ˆåŽ†å²è®°å½•
@@ -5109,14 +5145,14 @@ zh_CN.gtk.preferencesCache:<b>缓存</b>
en.gtk.preferencesCacheMemory:Memory cache size
de.gtk.preferencesCacheMemory:RAM Cache
-fr.gtk.preferencesCacheMemory:Taille du cache mémoire
+fr.gtk.preferencesCacheMemory:Taille du cache en mémoire vive
it.gtk.preferencesCacheMemory:Dimensione memoria cache
nl.gtk.preferencesCacheMemory:Grootte geheugenbuffer
zh_CN.gtk.preferencesCacheMemory:内存缓存大å°
en.gtk.preferencesCacheDisc:Disc cache size
de.gtk.preferencesCacheDisc:Festplatten Cache
-fr.gtk.preferencesCacheDisc:Taille du cache disque
+fr.gtk.preferencesCacheDisc:Taille du cache sur le disque
it.gtk.preferencesCacheDisc:Dimensione memoria disco
nl.gtk.preferencesCacheDisc:Grootte schijfbuffer
zh_CN.gtk.preferencesCacheDisc:ç£ç›˜ç¼“存大å°
@@ -5158,7 +5194,7 @@ zh_CN.gtk.preferencesProxy:<b>HTTP 代ç†æœåŠ¡å™¨</b>
en.gtk.preferencesProxyType:Proxy type
de.gtk.preferencesProxyType:Proxytyp
-fr.gtk.preferencesProxyType:Type de Proxy
+fr.gtk.preferencesProxyType:Type de proxy
it.gtk.preferencesProxyType:Tipo di Proxy
nl.gtk.preferencesProxyType:Proxy-type
zh_CN.gtk.preferencesProxyType:代ç†æœåŠ¡å™¨ç±»åž‹
@@ -5172,7 +5208,7 @@ zh_CN.gtk.preferencesProxyHost:主机
en.gtk.preferencesProxyUsername:Username
de.gtk.preferencesProxyUsername:Benutzer
-fr.gtk.preferencesProxyUsername:Nom d'utilisateur
+fr.gtk.preferencesProxyUsername:Nom d’utilisateur
it.gtk.preferencesProxyUsername:Nome utente
nl.gtk.preferencesProxyUsername:Gebruikersnaam
zh_CN.gtk.preferencesProxyUsername:用户å
@@ -5193,14 +5229,14 @@ zh_CN.gtk.preferencesProxyNoproxy:没有代ç†æœåŠ¡å™¨ç”¨äºŽæ“作
en.gtk.preferencesProxyTypeTooltip:The type of HTTP proxy server.
de.gtk.preferencesProxyTypeTooltip:Der Type des HTTP Proxy-Servers.
-fr.gtk.preferencesProxyTypeTooltip:Le type de serveur proxy HTTP.
+fr.gtk.preferencesProxyTypeTooltip:Type de serveur proxy HTTP.
it.gtk.preferencesProxyTypeTooltip:Il tipo di server Proxy HTTP.
nl.gtk.preferencesProxyTypeTooltip:Het type van de HTTP-proxy-server.
zh_CN.gtk.preferencesProxyTypeTooltip:HTTP 代ç†æœåŠ¡å™¨çš„类型。
en.gtk.preferencesProxyHostTooltip:Host name of your proxy server.
de.gtk.preferencesProxyHostTooltip:Hostname des Proxy-Servers.
-fr.gtk.preferencesProxyHostTooltip:Nom d'hôte du serveur proxy.
+fr.gtk.preferencesProxyHostTooltip:Nom d’hôte du serveur proxy.
it.gtk.preferencesProxyHostTooltip:Nome host del tuo server Proxy.
nl.gtk.preferencesProxyHostTooltip:Adres van de proxy-server.
zh_CN.gtk.preferencesProxyHostTooltip:代ç†æœåŠ¡å™¨çš„主机å。
@@ -5214,14 +5250,14 @@ zh_CN.gtk.preferencesProxyPortTooltip:连接代ç†æœåŠ¡å™¨çš„端å£å·ã€‚
en.gtk.preferencesProxyUsernameTooltip:Username to access the proxy.
de.gtk.preferencesProxyUsernameTooltip:Username für die Verbindung zum Proxy.
-fr.gtk.preferencesProxyUsernameTooltip:Nom d'utilisateur pour accéder au proxy.
+fr.gtk.preferencesProxyUsernameTooltip:Nom d’utilisateur pour accéder au proxy.
it.gtk.preferencesProxyUsernameTooltip:Nome utente per l'accesso al Proxy.
nl.gtk.preferencesProxyUsernameTooltip:Gebruikersnaam voor toegang tot de proxy.
zh_CN.gtk.preferencesProxyUsernameTooltip:访问代ç†æœåŠ¡å™¨çš„用户å。
en.gtk.preferencesProxyNoproxyTooltip:Comma separated list of host names that should not be proxied.
de.gtk.preferencesProxyNoproxyTooltip:Liste von Hosts, die kein Proxy sein sollen. Komma trennt Einträge.
-fr.gtk.preferencesProxyNoproxyTooltip:Liste des noms d'hôtes séparés par des virgules qui ne devraient pas être traitées par le proxy.
+fr.gtk.preferencesProxyNoproxyTooltip:Liste des noms d’hôtes séparés par des virgules qui ne devraient pas être traitées par le proxy.
it.gtk.preferencesProxyNoproxyTooltip:Elenco separato da virgole dei nomi host che non devono essere sottoposti a Proxy.
nl.gtk.preferencesProxyNoproxyTooltip:Lijst van ip-adressen of servernamen die niet via de proxy mogen lopen, gescheiden door komma's.
zh_CN.gtk.preferencesProxyNoproxyTooltip:用逗å·åˆ†éš”ä¸åº”代ç†çš„主机å列表。
@@ -5256,21 +5292,21 @@ zh_CN.gtk.preferencesFetchingCached:已缓存的连接
en.gtk.preferencesFetchingMaxTooltip:Maximum number of concurrent items to fetch at once.
de.gtk.preferencesFetchingMaxTooltip:Maximale Anzahl paralleler Verbindungen.
-fr.gtk.preferencesFetchingMaxTooltip:Nombre maximum d'éléments simultanés à récupérer
+fr.gtk.preferencesFetchingMaxTooltip:Nombre maximum d’éléments simultanés à récupérer
it.gtk.preferencesFetchingMaxTooltip:Numero massimo di elementi simultanei da recuperare in contemporanea.
nl.gtk.preferencesFetchingMaxTooltip:Maximum aantal verbindingen die simultaan items ophalen.
zh_CN.gtk.preferencesFetchingMaxTooltip:一次获å–的最大并å‘项数。
en.gtk.preferencesFetchingPerhostTooltip:Maximum number of item fetches per web server.
de.gtk.preferencesFetchingPerhostTooltip:Maximale Zahl je Webserver.
-fr.gtk.preferencesFetchingPerhostTooltip:Nombre maximum d'élément à extrair pour chaque serveur Web.
+fr.gtk.preferencesFetchingPerhostTooltip:Nombre maximum d’élément à extraire pour chaque serveur Web.
it.gtk.preferencesFetchingPerhostTooltip:Numero massimo di elementi da recuperare per server Web.
nl.gtk.preferencesFetchingPerhostTooltip:Maximum aantal verbinden per webserver.
zh_CN.gtk.preferencesFetchingPerhostTooltip:æ¯ä¸ªç½‘络æœåŠ¡å™¨çš„最大项目获å–数。
en.gtk.preferencesFetchingCachedTooltip:Number of connections to keep in case they are needed again.
de.gtk.preferencesFetchingCachedTooltip:Zahl offengehaltener Verbindungen für den Fall, daß sie nochmal benötigt werden.
-fr.gtk.preferencesFetchingCachedTooltip:Nombre de connexions à maintenir dans le cas où elles seront nécessaires à nouveau.
+fr.gtk.preferencesFetchingCachedTooltip:Nombre de connexions à maintenir dans le cas où elles seraient nécessaires à nouveau.
it.gtk.preferencesFetchingCachedTooltip:Numero di connessioni da conservare nel caso in cui siano di nuovo necessarie.
nl.gtk.preferencesFetchingCachedTooltip:Aantal verbindingen te bufferen voor het geval ze zijn weer nodig.
zh_CN.gtk.preferencesFetchingCachedTooltip:è¦ä¿ç•™çš„连接数,以备å†æ¬¡éœ€è¦æ—¶ä½¿ç”¨ã€‚
@@ -5299,7 +5335,7 @@ zh_CN.gtk.preferencesProxyTypeBasic:使用基本身份验è¯çš„手动æ“作
en.gtk.preferencesProxyTypeNLTM:Manual with - authentication
de.gtk.preferencesProxyTypeNLTM:Manuell mit - Authentifizierung
-fr.gtk.preferencesProxyTypeNLTM:Manuel avec l'authentification NTLM
+fr.gtk.preferencesProxyTypeNLTM:Manuel avec authentification NTLM
it.gtk.preferencesProxyTypeNLTM:Manuale con autentificazione NTLM
nl.gtk.preferencesProxyTypeNLTM:Handmatig via NTLM-authenticatie
zh_CN.gtk.preferencesProxyTypeNLTM:使用身份验è¯çš„手动æ“作
@@ -5327,14 +5363,14 @@ zh_CN.gtk.preferencesAppearance:<b>外观</b>
en.gtk.preferencesAppearanceImages:No images in output
de.gtk.preferencesAppearanceImages:Bilder unterdrücken
-fr.gtk.preferencesAppearanceImages:Aucune image de rendu/restituée
+fr.gtk.preferencesAppearanceImages:Supprimer toutes les images
it.gtk.preferencesAppearanceImages:Nessuna immagine in output
nl.gtk.preferencesAppearanceImages:Geen afbeeldingen in uitvoer
zh_CN.gtk.preferencesAppearanceImages:输出结果中无图åƒ
en.gtk.preferencesAppearanceBackground:No background images in output
de.gtk.preferencesAppearanceBackground:keine Hintergrundbilder
-fr.gtk.preferencesAppearanceBackground:Aucune image d'arrière-plan de rendu/restituée
+fr.gtk.preferencesAppearanceBackground:Supprimer les images d’arrière plan
it.gtk.preferencesAppearanceBackground:Nessuna immagine di sfondo in output
nl.gtk.preferencesAppearanceBackground:Geen achtergrondafbeeldingen in uitvoer
zh_CN.gtk.preferencesAppearanceBackground:输出结果中无背景图åƒ
@@ -5369,21 +5405,21 @@ zh_CN.gtk.preferencesMarginsMeasurements:å•ä½ä¸ºæ¯«ç±³
en.gtk.preferencesGeneration:<b>Generation</b>
de.gtk.preferencesGeneration:<b>Erstellung</b>
-fr.gtk.preferencesGeneration:<b>Generation</b>
+fr.gtk.preferencesGeneration:<b>Génération</b>
it.gtk.preferencesGeneration:<b>Generazione</b>
nl.gtk.preferencesGeneration:<b>Genereren</b>
zh_CN.gtk.preferencesGeneration:<b>生æˆ</b>
en.gtk.preferencesGenerationCompressed:Output is compressed
de.gtk.preferencesGenerationCompressed:Ausgabe komprimieren
-fr.gtk.preferencesGenerationCompressed:La restitution est compressée
+fr.gtk.preferencesGenerationCompressed:Compresser le document
it.gtk.preferencesGenerationCompressed:L'output è compresso
nl.gtk.preferencesGenerationCompressed:Uitvoer wordt gecomprimeerd
zh_CN.gtk.preferencesGenerationCompressed:输出结果已压缩
en.gtk.preferencesGenerationPassword:Output has a password
de.gtk.preferencesGenerationPassword:Dokument hat Passwort
-fr.gtk.preferencesGenerationPassword:La restitution possède un mot de passe
+fr.gtk.preferencesGenerationPassword:Protéger le document par un mot de passe
it.gtk.preferencesGenerationPassword:L'output ha una password
nl.gtk.preferencesGenerationPassword:Uitvoer wordt met wachtwoord beveiligd
zh_CN.gtk.preferencesGenerationPassword:输出结果有密ç 
@@ -5407,21 +5443,21 @@ zh_CN.all.ScrollUp:点击箭头å‘上滚动页é¢
en.all.ScrollPUp:Click to scroll up one page
de.all.ScrollPUp:Anklicken scrollt eine Seite hoch
-fr.all.ScrollPUp:Cliquer pour faire défiler d'une page vers le haut
+fr.all.ScrollPUp:Cliquer pour faire défiler d’une page vers le haut
it.all.ScrollPUp:Clicca per scrollare in alto di una pagina
nl.all.ScrollPUp:Klik om 1 pagina omhoog te gaan
zh_CN.all.ScrollPUp:点击å‘上滚动一页
en.all.ScrollV:Drag the bar to scroll vertically
de.all.ScrollV:Ziehen der Leiste scrollt vertikal
-fr.all.ScrollV:Tirez la barre pour la faire défiler verticalement
+fr.all.ScrollV:Tirez sur la barre pour faire défiler verticalement
it.all.ScrollV:Trascina la barra per scrollare verticalmente
nl.all.ScrollV:Verschuif de balk om verticaal over de pagina te gaan
zh_CN.all.ScrollV:拖动æ åž‚直滚动
en.all.ScrollPDown:Click to scroll down one page
de.all.ScrollPDown:Anklicken scrollt eine Seite nach unten
-fr.all.ScrollPDown:Cliquer pour faire défiler d'une page vers le bas
+fr.all.ScrollPDown:Cliquer pour faire défiler d’une page vers le bas
it.all.ScrollPDown:Clicca per scrollare in basso di una pagina
nl.all.ScrollPDown:Klik om 1 pagina omlaag te gaan
zh_CN.all.ScrollPDown:点击å‘下滚动一页
@@ -5442,21 +5478,21 @@ zh_CN.all.ScrollLeft:点击箭头å‘左滚动页é¢
en.all.ScrollPLeft:Click to scroll left one page
de.all.ScrollPLeft:Anklicken scrollt eine Seite nach links
-fr.all.ScrollPLeft:Cliquer pour faire défiler d'une page vers la gauche
+fr.all.ScrollPLeft:Cliquer pour faire défiler d’une page vers la gauche
it.all.ScrollPLeft:Clicca per scrollare a sinistra di una pagina
nl.all.ScrollPLeft:Klik om 1 pagina naar links te gaan
zh_CN.all.ScrollPLeft:点击å‘左滚动一页
en.all.ScrollH:Drag the bar to scroll horizontally
de.all.ScrollH:Ziehen der Leiste scrollt horizontal
-fr.all.ScrollH:Tirez la barre pour la faire défiler horizontalement
+fr.all.ScrollH:Tirez sur la barre pour faire défiler horizontalement
it.all.ScrollH:Trascina la barra per scrollare orizzontalmente
nl.all.ScrollH:Verschuif de balk om horizontaal over de pagina te gaan
zh_CN.all.ScrollH:拖动æ æ°´å¹³æ»šåŠ¨
en.all.ScrollPRight:Click to scroll right one page
de.all.ScrollPRight:Anklicken scrollt eine Seite nach rechts
-fr.all.ScrollPRight:Cliquer pour faire défiler d'une page vers la droite
+fr.all.ScrollPRight:Cliquer pour faire défiler d’une page vers la droite
it.all.ScrollPRight:Clicca per scrollare a destra di una pagina
nl.all.ScrollPRight:Klik om 1 pagina naar rechts te gaan
zh_CN.all.ScrollPRight:点击å‘å³æ»šåŠ¨ä¸€é¡µ
@@ -5479,14 +5515,14 @@ zh_CN.all.ScrollBoth:在按ä½æŒ‰é’®çš„åŒæ—¶ç§»åŠ¨é¼ æ ‡æ¥æ»šåŠ¨æµè§ˆå†…容
#
en.all.SelectClick:Click on entry to select it
de.all.SelectClick:Anklicken um auszuwählen
-fr.all.SelectClick:Cliquer sur l'entrée pour la sélectionner
+fr.all.SelectClick:Cliquer sur une entrée pour la sélectionner
it.all.SelectClick:Clicca sull'elemento per selezionarlo
nl.all.SelectClick:Klik op een item om het te selecteren.
zh_CN.all.SelectClick:点击æ¡ç›®å°†å…¶é€‰ä¸­
en.all.SelectMClick:Click on entry to select it, multiple options can be selected
de.all.SelectMClick:Anklicken um auszuwählen, auch mehrere Optionen sind auswählbar
-fr.all.SelectMClick:Cliquer sur l'entrée pour la sélectionner, plusieurs options peuvent être sélectionnées
+fr.all.SelectMClick:Cliquer sur une entrée pour la sélectionner, plusieurs options peuvent être sélectionnées
it.all.SelectMClick:Clicca sull'elemento per selezionarlo, sono supportate le scelte multiple
nl.all.SelectMClick:Klik op een item om het te selecteren, er kunnen meerdere opties tegelijkertijd geselecteerd worden
zh_CN.all.SelectMClick:点击æ¡ç›®å°†å…¶é€‰ä¸­ï¼Œå¯ä»¥é€‰æ‹©å¤šä¸ªé€‰é¡¹
@@ -5506,21 +5542,21 @@ zh_CN.all.SelectClose:点击关闭选择èœå•
en.all.SaveSource:Source
de.all.SaveSource:Quellcode
-fr.all.SaveSource:Source
+fr.all.SaveSource:Code source
it.all.SaveSource:Sorgente
nl.all.SaveSource:Bron
zh_CN.all.SaveSource:ä¿å­˜æºä»£ç 
en.all.SaveDraw:Webpage
de.all.SaveDraw:Webseite
-fr.all.SaveDraw:PageWeb
+fr.all.SaveDraw:Page Web
it.all.SaveDraw:Pagina Web
nl.all.SaveDraw:Webpagina
zh_CN.all.SaveDraw:ä¿å­˜ç½‘页绘图
en.all.SaveText:Webpage
de.all.SaveText:Webseite
-fr.all.SaveText:PageWeb
+fr.all.SaveText:Page Web
it.all.SaveText:Pagina Web
nl.all.SaveText:Webpagina
zh_CN.all.SaveText:ä¿å­˜ç½‘页文本
@@ -5541,7 +5577,7 @@ zh_CN.all.SaveLink:ä¿å­˜é“¾æŽ¥
en.all.SaveSelection:Selection
de.all.SaveSelection:Auswahl
-fr.all.SaveSelection:Texte
+fr.all.SaveSelection:Sélection
it.all.SaveSelection:Selezione
nl.all.SaveSelection:Selectie
zh_CN.all.SaveSelection:ä¿å­˜é€‰é¡¹
@@ -5554,14 +5590,14 @@ zh_CN.all.SaveSelection:ä¿å­˜é€‰é¡¹
en.all.ThemeInstActive:A theme is currently being downloaded or installed. Please wait for it to finish or cancel it before installing more themes.
de.all.ThemeInstActive:Ein Thema wird gerade geladen oder installiert. Bitte vor Installation weiterer Themen diesen Vorgang abwarten oder beenden.
-fr.all.ThemeInstActive:Un thème est en cours de téléchargement ou d'installation. Veuillez attendre que ce soit fini ou annulez l'opération avant d'installer de nouveaux thèmes.
+fr.all.ThemeInstActive:Un thème est en cours de téléchargement ou d’installation. Veuillez attendre que ce soit fini ou annulez l’opération avant d’installer de nouveaux thèmes.
it.all.ThemeInstActive:Il tema è attualmente in fase di scaricamento o di installazione. Attendere il completamente del processo oppure annullare l'intera operazione prima di installare altri temi.
nl.all.ThemeInstActive:Een thema wordt momenteel opgehaald of geïnstalleerd. Wacht tot het is geïnstalleerd of annuleer de opdracht voordat meer thema's geïnstalleerd worden.
zh_CN.all.ThemeInstActive:主题正在下载或安装中。在安装更多主题之å‰ï¼Œè¯·ç­‰å¾…其完æˆæˆ–å–消任务。
en.all.ThemeInstDown:Please wait for the theme to download.
de.all.ThemeInstDown:Bitte warten bis das Thema vollständig heruntergeladen wurde.
-fr.all.ThemeInstDown:Veuillez attendre le téléchargement du thème.
+fr.all.ThemeInstDown:Veuillez attendre la fin du téléchargement du thème.
it.all.ThemeInstDown:Per favore attendere lo scaricamento del tema grafico.
nl.all.ThemeInstDown:Wacht tot het thema is opgehaald.
zh_CN.all.ThemeInstDown:请等待下载主题。
@@ -5575,28 +5611,28 @@ zh_CN.all.ThemeInvalid:下载的主题无效或需è¦ä½¿ç”¨æ›´é«˜ç‰ˆæœ¬çš„ NetSu
en.all.ThemeInstall:Would you like to install the theme '%s' by %s?
de.all.ThemeInstall:Soll das Thema '%s' von %s installiert werden ?
-fr.all.ThemeInstall:Voulez-vous installer le thème '%s' par %s?
+fr.all.ThemeInstall:Voulez-vous installer le thème « %s » créé par %s ?
it.all.ThemeInstall:Si desidera installare il tema '%s' di %s?
nl.all.ThemeInstall:Moet het thema '%s' geïnstalleerd worden door %s?
zh_CN.all.ThemeInstall:是å¦è¦ç”± %2$s 安装主题“%1$sâ€ï¼Ÿ
en.all.ThemeInstallErr:An error occurred whilst trying to install the downloaded theme.
de.all.ThemeInstallErr:Beim Installieren des geladenen Themas trat ein Fehler auf.
-fr.all.ThemeInstallErr:Une erreur s'est produite pendant l'installation du thème téléchargé.
+fr.all.ThemeInstallErr:Une erreur s’est produite pendant l’installation du thème téléchargé.
it.all.ThemeInstallErr:Si è verificato un errore durante il tentativo di installazione del tema scaricato
nl.all.ThemeInstallErr:Een fout ontstond tijdens het installeren van het opgehaalde thema.
zh_CN.all.ThemeInstallErr:å°è¯•å®‰è£…下载的主题时å‘生错误。
en.all.ThemeApplyErr:An error occurred whilst trying to apply the downloaded theme.
de.all.ThemeApplyErr:Beim Versuch der Anwendung eines geladenen Themas trat ein Fehler auf.
-fr.all.ThemeApplyErr:Une erreur s'est produite en essayant d'appliquer le thème téléchargé.
+fr.all.ThemeApplyErr:Une erreur s’est produite en essayant d’appliquer le thème téléchargé.
it.all.ThemeApplyErr:Si è verificato un errore durante il tentativo di applicazione del tema
nl.all.ThemeApplyErr:Een fout ontstond tijdens het toevoegen van het opgehaalde thema.
zh_CN.all.ThemeApplyErr:å°è¯•åº”用下载的主题时å‘生错误。
en.ami.More:More
de.ami.More:Mehr
-fr.ami.More:More
+fr.ami.More:Plus
it.ami.More:Altro
nl.ami.More:Meer
zh_CN.ami.More:更多
@@ -5609,14 +5645,14 @@ zh_CN.ami.More:更多
#
en.ro.HelpToolbar0:\Tback button.|M\Straverse back one page in the history tree.|MDoes not resubmit form information.
de.ro.HelpToolbar0:Schaltet zurück auf die zuvor dargestellte Seite.|MDer Inhalt wird dabei nicht aktualisiert.
-fr.ro.HelpToolbar0:\Tle bouton de retour.|M\Srevenir d'une page en arrière dans l'historique.|MNe renvoie pas l'information de formulaire.
+fr.ro.HelpToolbar0:\Tle bouton de retour.|M\Srevenir d’une page en arrière dans l’historique.|MNe renvoie pas l’information de formulaire.
it.ro.HelpToolbar0:\Ttorna indietro di una pagina
nl.ro.HelpToolbar0:Dit is de Terug-knop.|MKlik met KIES om 1 pagina terug te gaan.|MKlik met PASAAN om 1 pagina terug te gaan en deze in een nieuw browservenster te openen.|MLet op! Formulieren worden niet nogmaals ingediend.
zh_CN.ro.HelpToolbar0:\TåŽé€€é”®ã€‚|M\S在历å²è®°å½•æ ‘中å‘åŽé历一页。|Mä¸é‡æ–°æ交表å•ä¿¡æ¯ã€‚
en.ro.HelpToolbar1:\Tforward button.|M\Straverse forward one page in the history tree.|MDoes not resubmit form information.
de.ro.HelpToolbar1:Schaltet vorwärts auf die nächste Seite.|MDer Inhalt wird dabei nicht aktualisiert.
-fr.ro.HelpToolbar1:\Tle bouton d'avance.|M\Savancer d'une page dans l'historique.|MNe renvoie pas l'information de formulaire.
+fr.ro.HelpToolbar1:\Tle bouton d’avance.|M\Savancer d’une page dans l’historique.|MNe renvoie pas l’information de formulaire.
it.ro.HelpToolbar1:\Tvai avanti di una pagina
nl.ro.HelpToolbar1:Dit is de Vooruit-knop.|MKlik met KIES om 1 pagina vooruit te gaan.|MKlik met PASAAN om 1 pagina terug te gaan en deze in een nieuw browservenster te openen.|MLet op! Formulieren worden niet nogmaals ingediend.
zh_CN.ro.HelpToolbar1:\Tå‰è¿›é”®ã€‚|M\S在历å²è®°å½•æ ‘中å‘å‰é历一页。|Mä¸é‡æ–°æ交表å•ä¿¡æ¯ã€‚
@@ -5630,21 +5666,21 @@ zh_CN.ro.HelpToolbar2:\Tåœæ­¢é”®ã€‚|M\Såœæ­¢åŠ è½½é¡µé¢ã€‚
en.ro.HelpToolbar3:\Treload button.|M\Sreload this page.|M\Areload this page and any objects it contains.
de.ro.HelpToolbar3:Aktualisiert den Seiteninhalt.|MKlicken mit AUSWAHL lädt die Seite neu.|MKlicken mit SPEZIAL lädt die Seite und alle zugehörigen Objekte neu.
-fr.ro.HelpToolbar3:\Tle bouton de recharge.|M\Srecharger cette page.|M\Arecharger cette page et tous les objets qu'elle contient.
+fr.ro.HelpToolbar3:\Tle bouton de recharge.|M\Srecharger cette page.|M\Arecharger cette page et tous les objets qu’elle contient.
it.ro.HelpToolbar3:\Tricarica la pagina corrente
nl.ro.HelpToolbar3:Dit is de Herlaad-knop.|MKlik met KIES om deze pagina opnieuw op te halen.|MKlik met PASAAN om deze pagina opnieuw op te halen, inclusief alle objecten die deze pagina bevat.
zh_CN.ro.HelpToolbar3:\Té‡è½½é”®ã€‚|M\Sé‡è½½æ­¤é¡µé¢ã€‚|M\Aé‡è½½æ­¤é¡µé¢å’Œå…¶ä¸­æ‰€æœ‰åŒ…å«çš„对象。
en.ro.HelpToolbar4:\Thome button.|M\Sgo to your home page.
de.ro.HelpToolbar4:Lädt die Homepage.
-fr.ro.HelpToolbar4:\Tle bouton Accueil.|M\Saller à votre page d'accueil.
+fr.ro.HelpToolbar4:\Tle bouton Accueil.|M\Saller à votre page d’accueil.
it.ro.HelpToolbar4:\Tvai alla pagina iniziale
nl.ro.HelpToolbar4:Dit is de Startpagina-knop.|MKlik met KIES om naar de begin-/startpagina te gaan.
zh_CN.ro.HelpToolbar4:\T主页键。|M\Så‰å¾€ä¸»é¡µé¢ã€‚
en.ro.HelpToolbar5:\Thistory button.|M\Sopen the local history \w.|M\Aopen the global history \w.
de.ro.HelpToolbar5:Das ist der Schaltknopf zur History-Funktion.|MKlicken mit AUSWAHL öffnet die lokale History.|MKlicken mit SPEZIAL öffnet das Fenster mit der globalen History.
-fr.ro.HelpToolbar5:\Tle bouton d'historique.|M\Souvrir la \w d'historique locale.|M\Aopen the global history \w.
+fr.ro.HelpToolbar5:\Tle bouton d’historique.|M\Souvrir la \w d’historique locale.|M\Aopen the global history \w.
it.ro.HelpToolbar5:\Tmostra la cronologia locale o globale
nl.ro.HelpToolbar5:Dit is de Geschiedenis-knop.|MKlik met KIES om de venstergeschiedenis te openen.|MKlik met PASAAN om de browsergeschiedenis te openen.
zh_CN.ro.HelpToolbar5:\T历å²é”®ã€‚|M\S打开本地历å²è®°å½•\w。|M\A打开全局历å²è®°å½• \w。
@@ -5658,21 +5694,21 @@ zh_CN.ro.HelpToolbar6:\Tä¿å­˜é”®ã€‚|M\Sä¿æŒå½“å‰æ–‡ä»¶è®°å½•ã€‚
en.ro.HelpToolbar7:\Tprint button.|M\Sopen the print dialogue box.
de.ro.HelpToolbar7:Drucken der aktuellen Seite.|MAnklicken öffnet den 'Drucken' Dialog.
-fr.ro.HelpToolbar7:\Tle bouton d'impression.|M\Simprimer cette page.|MOuvre une bo�te de dialogue pour l'impression.
+fr.ro.HelpToolbar7:\Tle bouton d’impression.|M\Simprimer cette page.|MOuvre une boîte de dialogue pour l’impression.
it.ro.HelpToolbar7:\Tapri la finestra di stampa
nl.ro.HelpToolbar7:Dit is de Afdruk-knop.|MKlik met KIES om het afdrukvenster te openen.
zh_CN.ro.HelpToolbar7:\T打å°é”®ã€‚|M\S打开打å°å¯¹è¯æ¡†ã€‚
en.ro.HelpToolbar8:\Thotlist button.|M\Sopen the hotlist management \w.|M\Aadd this address to the hotlist.
de.ro.HelpToolbar8:Das ist der Hotlist Schaltknopf.|MKlicken mit AUSWAHL öffnet die Hotlist.|MKlicken mit SPEZIAL trägt die aktuelle Seite in die Hotlist ein.
-fr.ro.HelpToolbar8:\Tle bouton de favoris.|M\Souvrir la \w de gestion des favoris.|M\Aajouter cette adresse aux favoris.
+fr.ro.HelpToolbar8:\Tle bouton des marque-pages.|M\Souvrir la \w de gestion des marque-pages.|M\Aajouter cette adresse aux marque-pages.
it.ro.HelpToolbar8:\Tapri o aggiungi un link ai segnalibri
nl.ro.HelpToolbar8:Dit is de Favorieten-knop.|MKlik met KIES om de favorietenlijst te openen.|MKlik met PASAAN om dit webadres aan de favorietenlijst toe te voegen.
zh_CN.ro.HelpToolbar8:\T常用列表键。|M\S打开常用列表管ç†\w。|M\A添加此地å€åˆ°å¸¸ç”¨åˆ—表。
en.ro.HelpToolbar9:\Tscale view button.|M\Sscale the page, affecting both text and images.
de.ro.HelpToolbar9:Anklicken öffnet den Vergrößerungs-Dialog.|MDie Vergrößerung betrifft Text und Bilder.
-fr.ro.HelpToolbar9:\Tle bouton de changement d'échelle.|M\Sredimensionner la page, texte et images comprises.
+fr.ro.HelpToolbar9:\Tle bouton de changement d’échelle.|M\Sredimensionner la page, texte et images comprises.
it.ro.HelpToolbar9:\Tscala la dimensione del testo e delle immagini
nl.ro.HelpToolbar9:Dit is de Schaal-knop.|MKlik met KIES om deze pagina te schalen, zowel tekst als afbeeldingen.
zh_CN.ro.HelpToolbar9:\T缩放键。|M\S 缩放页é¢ï¼Œæ”¹å˜æ–‡å­—和图åƒã€‚
@@ -5686,28 +5722,28 @@ zh_CN.ro.HelpToolbar10:\T查找键。|M\S在页é¢ä¸ŠæŸ¥æ‰¾æ–‡æœ¬å­—符串的实
en.ro.HelpToolbar11:\Tup button.|M\Straverse up one level on the current website
de.ro.HelpToolbar11:Das ist der Aufwärtsknopf.|MKlicken mit AUSWAHL führt auf die nächsthöhere Ebene der innerhalb Webseite.
-fr.ro.HelpToolbar11:\Tle bouton haut.|M\Sremonte d'un niveau sur le site web en cours.
+fr.ro.HelpToolbar11:\Tle bouton haut.|M\Sremonte d’un niveau sur le site web en cours.
it.ro.HelpToolbar11:\Tsali di un livello rispetto all'indirizzo corrente
nl.ro.HelpToolbar11:Dit is de Omhoog-knop.|MKlik met KIES om 1 niveau omhoog te gaan in de websitehiërarchie.|MKlik met PASAAN om 1 niveau omhoog te gaan in de websitehiërarchie en deze in een nieuw browservenster te openen.
zh_CN.ro.HelpToolbar11:\Tå‘上方å‘键。|M\S在当å‰ç½‘站上å‘上移动一级
en.ro.HelpToolbar14:\TURL bar.|MType in the address of a site to visit and press Return to go there.
de.ro.HelpToolbar14:Das ist die Adressleiste.|MHier die Adresse (URL) eingeben und Entertaste drücken, um eine neue Seite zu laden.
-fr.ro.HelpToolbar14:\Tla barre d'URL.|MTapez l'adresse d'un site à visiter et appuyez sur Return pour y aller.
+fr.ro.HelpToolbar14:\Tla barre d’URL.|MTapez l’adresse d’un site à visiter et appuyez sur Return pour y aller.
it.ro.HelpToolbar14:\Tdigita un indirizzo e premi invio
nl.ro.HelpToolbar14:Dit is het Adresveld.|MVoer een adres in van een website en druk op RETURN om er naartoe te gaan.
zh_CN.ro.HelpToolbar14:\T地å€æ ã€‚|M输入您è¦è®¿é—®çš„站点地å€ï¼Œç„¶åŽæŒ‰å›žè½¦é”®ã€‚
en.ro.HelpToolbar15:\TURL suggestion icon.|M\Sopen a list of recently typed URLs.
de.ro.HelpToolbar15:Das ist das URL-Schnellwahl Symbol.|MKlicken mit AUSWAHL öffnet eine Liste der zuletzt eingegebenen Web-Adressen.
-fr.ro.HelpToolbar15:\Tl'icône de suggestion d'URL.|M\Souvrir une liste d'URLs tapées récemment.
+fr.ro.HelpToolbar15:\Tl’icône de suggestion d’URL.|M\Souvrir une liste d’URLs tapées récemment.
it.ro.HelpToolbar15:\Tapri la lista dei siti visitati più recenti
nl.ro.HelpToolbar15:Dit is het Adressuggestie-symbool.|MKlik met KIES om een lijst met adressen van recent bezochte websites te openen.
zh_CN.ro.HelpToolbar15:\T地å€å»ºè®®å›¾æ ‡ã€‚|M\S打开最近键入的 URL 列表。
en.ro.HelpToolbar16:\Tthrobber.|MIt animates while this \w is active.
de.ro.HelpToolbar16:Das ist die Ladeaktivitätsanzeige.|MSie wird animiert, wenn NetSurf aktiv ist.
-fr.ro.HelpToolbar16:\Tle pulseur.|MIl s'anime lorsque cette \w est active.
+fr.ro.HelpToolbar16:\Tle pulseur.|MIl s’anime lorsque cette \w est active.
it.ro.HelpToolbar16:\Tthrobber animato durante le attività di rete
nl.ro.HelpToolbar16:Dit is de Activiteitsindicator.|MDeze indicator beweegt zolang er actieve processen in het venster plaatsvinden.
zh_CN.ro.HelpToolbar16:\T页é¢åŠ è½½æŒ‡ç¤ºå™¨ã€‚|M它会在此 \w 处于活跃状æ€æ—¶åˆ¶ä½œåŠ¨ç”»ã€‚
@@ -5721,21 +5757,21 @@ zh_CN.ro.HelpToolbarFav:\T收è—夹图标:当å‰ç«™ç‚¹æ供的å°å¾½æ ‡(如æž
en.ro.HelpToolbarHot:\Thotlist indicator: if lit, the current address is in the hotlist.|M\Sto add the current address to the hotlist.|M\Ato remove the current address from the hotlist.
de.ro.HelpToolbarHot:\Thotlist indicator: if lit, the current address is in the hotlist.|M\Sto add the current address to the hotlist.|M\Ato remove the current address from the hotlist.
-fr.ro.HelpToolbarHot:\Thotlist indicator: if lit, the current address is in the hotlist.|M\Sto add the current address to the hotlist.|M\Ato remove the current address from the hotlist.
+fr.ro.HelpToolbarHot:\Tindicateur des marque-pages : si allumé, l’adresse courante est déjà dans les marque-pages.|M\Spour ajouter l’adresse courante aux marque-pages.|M\Apour supprimer l’adresse courante des marque-pages.
it.ro.HelpToolbarHot:\Tindicatore segnalibri: se acceso significa che il corrente indirizzo è presente nei segnalibri.|M\Sper aggiungere il corrente indirizzo ai segnalibri.|M\Aper rimuovere il corrente indirizzo dai segnalibri.
nl.ro.HelpToolbarHot:Dit is de favorietenindicator: wanneer deze oplicht, staat het webadres al in de favorietenlijst.|MKlik met KIES om het adres aan de favorietenlijst toe te voegen.|MKlik met PASAAN om het adres uit de favorietenlijst te verwijderen.
zh_CN.ro.HelpToolbarHot:\T常用列表指示器:若指示图标亮起,则当å‰åœ°å€åœ¨è¯¥å¸¸ç”¨é¡¹åˆ—表中。|M\S将当å‰åœ°å€æ·»åŠ åˆ°è¯¥å¸¸ç”¨é¡¹åˆ—表中。|M\A从该常用项列表中删除当å‰åœ°å€ã€‚
en.ro.HelpStatus0:\Tstatus bar resizer.|MDrag to alter the size of the status bar.
de.ro.HelpStatus0:Das ist die Begrenzung der Statusanzeige.|MKlicken und Ziehen verändert die Länge der Statusanzeige.
-fr.ro.HelpStatus0:\Tla glissière de la barre d'état.|MDéplacez-la pour changer la taille de la barre d'état.
+fr.ro.HelpStatus0:\Tla glissière de la barre d’état.|MDéplacez-la pour changer la taille de la barre d’état.
it.ro.HelpStatus0:\Ttrascina per modificare le dimensioni della barra di stato
nl.ro.HelpStatus0:Dit is statusbalkaanpasser.|MVersleep het om de grootte van de statusbalk te wijzigen.
zh_CN.ro.HelpStatus0:\T状æ€æ å¤§å°è°ƒæ•´å™¨ã€‚|M拖动以更改状æ€æ çš„大å°ã€‚
en.ro.HelpStatus1:\Tstatus bar.|MIt displays information on what the browser \w is doing.
de.ro.HelpStatus1:Das ist die Statusanzeige|MSie zeigt an, was gerade im Browserfenster geschieht.
-fr.ro.HelpStatus1:\Tla barre d'état.|MElle affiche des informations sur ce que fait la \w de navigateur.
+fr.ro.HelpStatus1:\Tla barre d’état.|MElle affiche des informations sur ce que fait la \w de navigateur.
it.ro.HelpStatus1:\Tmostra informazioni relative alle attività del browser
nl.ro.HelpStatus1:Dit is statusbalk.|MHet toont informatie over wat het browservenster aan het doen is.
zh_CN.ro.HelpStatus1:\T状æ€æ ã€‚|M它会显示相关æµè§ˆå™¨ \w 正在执行的æ“作信æ¯ã€‚
@@ -5770,14 +5806,14 @@ zh_CN.ro.HelpIconMenu2-0:\R输入访问地å€ã€‚
en.ro.HelpIconMenu2-1:\Sopen the hotlist management \w.
de.ro.HelpIconMenu2-1:Klicken mit AUSWAHL öffnet die Hotlist.
-fr.ro.HelpIconMenu2-1:\Souvrir la fenêtre de gestion des favoris.
+fr.ro.HelpIconMenu2-1:\Souvrir la fenêtre de gestion des marque-pages.
it.ro.HelpIconMenu2-1:\Sapri la finestra dei segnalibri
nl.ro.HelpIconMenu2-1:Klik met KIES om de favorietenlijst te openen.
zh_CN.ro.HelpIconMenu2-1:\S打开常用列表管ç†å™¨ \w。
en.ro.HelpIconMenu2-2:\Sopen the global history \w.
de.ro.HelpIconMenu2-2:Klicken mit AUSWAHL öffnet das Fenster mit der globalen History.
-fr.ro.HelpIconMenu2-2:\Souvrir la fenêtre d'historique global.
+fr.ro.HelpIconMenu2-2:\Souvrir la fenêtre d’historique global.
it.ro.HelpIconMenu2-2:\Smostra cronologia globale
nl.ro.HelpIconMenu2-2:Klik met KIES om de browsergeschiedenis te openen.
zh_CN.ro.HelpIconMenu2-2:\S打开全局历å²è®°å½• \w。
@@ -5833,7 +5869,7 @@ zh_CN.ro.HelpBrowserMenu0-2:\Rä¿å­˜å½“å‰é¡µé¢ï¼ŒåŒ…括所有图åƒå’Œæ ·å¼è¡
en.ro.HelpBrowserMenu0-3:\Rsee the export options.
de.ro.HelpBrowserMenu0-3:Abspeichern der Seite in verschiedenen Formaten.
-fr.ro.HelpBrowserMenu0-3:\Rvoir les options d'exportation.
+fr.ro.HelpBrowserMenu0-3:\Rvoir les options d’exportation.
it.ro.HelpBrowserMenu0-3:\Rmostra opzioni di esportazione
nl.ro.HelpBrowserMenu0-3:Verplaats de muispijl naar rechts om de exporteermogelijkheden te tonen.
zh_CN.ro.HelpBrowserMenu0-3:\R查看导出选项。
@@ -5854,35 +5890,35 @@ zh_CN.ro.HelpBrowserMenu0-3-1:\R将当å‰é¡µé¢å¯¼å‡ºä¸ºçº¯æ–‡æœ¬æ–‡ä»¶ã€‚
en.ro.HelpBrowserMenu0-4:\Rsave the address of the current page.
de.ro.HelpBrowserMenu0-4:Adresse der Seite speichern.
-fr.ro.HelpBrowserMenu0-4:\Rsauver l'adresse de la page courante.
+fr.ro.HelpBrowserMenu0-4:\Rsauver l’adresse de la page courante.
it.ro.HelpBrowserMenu0-4:\Rsalva l'indirizzo della pagina corrente
nl.ro.HelpBrowserMenu0-4:Verplaats de muispijl naar rechts om het webadres van deze pagina te bewaren.
zh_CN.ro.HelpBrowserMenu0-4:\Rä¿å­˜å½“å‰é¡µé¢çš„网å€ã€‚
en.ro.HelpBrowserMenu0-4-0:\Rsave the current address in Acorn URI format.
de.ro.HelpBrowserMenu0-4-0:Speichert die Adresse der Seite im Acorn URI Format.
-fr.ro.HelpBrowserMenu0-4-0:\Rsauver l'adresse en cours au format Acorn URI.
+fr.ro.HelpBrowserMenu0-4-0:\Rsauver l’adresse en cours au format Acorn URI.
it.ro.HelpBrowserMenu0-4-0:\Rsalva l'indirizzo corrente nel formato Acorn URI
nl.ro.HelpBrowserMenu0-4-0:Verplaats de muispijl naar rechts om dit adres in AcornURI-vorm te bewaren.
zh_CN.ro.HelpBrowserMenu0-4-0:\R以 Acorn URI æ ¼å¼ä¿å­˜å½“å‰ç½‘å€ã€‚
en.ro.HelpBrowserMenu0-4-1:\Rsave the current address in Ant URL format.
de.ro.HelpBrowserMenu0-4-1:Speichert die Adresse der Seite im Ant URL Format.
-fr.ro.HelpBrowserMenu0-4-1:\Rsauver l'adresse en cours au format Ant URL.
+fr.ro.HelpBrowserMenu0-4-1:\Rsauver l’adresse en cours au format Ant URL.
it.ro.HelpBrowserMenu0-4-1:\Rsalva l'indirizzo corrente nel formato Ant URL
nl.ro.HelpBrowserMenu0-4-1:Verplaats de muispijl naar rechts om dit adres in AntURL-vorm te bewaren,
zh_CN.ro.HelpBrowserMenu0-4-1:\R以 Ant URL æ ¼å¼ä¿å­˜å½“å‰ç½‘å€ã€‚
en.ro.HelpBrowserMenu0-4-2:\Rsave the current address as plain text.
de.ro.HelpBrowserMenu0-4-2:Speichert die Adresse der Seite als Text.
-fr.ro.HelpBrowserMenu0-4-2:\Rsauver l'adresse courante en simple texte.
+fr.ro.HelpBrowserMenu0-4-2:\Rsauver l’adresse courante en simple texte.
it.ro.HelpBrowserMenu0-4-2:\Rsalva l'indirizzo corrente come file di testo
nl.ro.HelpBrowserMenu0-4-2:Verplaats de muispijl naar rechts om dit adres als platte tekst te bewaren.
zh_CN.ro.HelpBrowserMenu0-4-2:\R将当å‰ç½‘å€å¦å­˜ä¸ºçº¯æ–‡æœ¬ã€‚
en.ro.HelpBrowserMenu0-5:\Sopen the print dialogue box.
de.ro.HelpBrowserMenu0-5:Dialogfenster zum Drucken der Seite.
-fr.ro.HelpBrowserMenu0-5:\Souvrir la boîte de dialogue d'impression.
+fr.ro.HelpBrowserMenu0-5:\Souvrir la boîte de dialogue d’impression.
it.ro.HelpBrowserMenu0-5:\Sapri la finestra di stampa
nl.ro.HelpBrowserMenu0-5:Verplaats de muispijl naar rechts om het afdrukvenster te openen.
zh_CN.ro.HelpBrowserMenu0-5:\S打开打å°å¯¹è¯æ¡†ã€‚
@@ -5910,35 +5946,35 @@ zh_CN.ro.HelpBrowserMenu0-8:\S在文本编辑器中查看当å‰é¡µé¢çš„æºä»£ç 
en.ro.HelpBrowserMenu1:\Rsee the options relating to the current item.
de.ro.HelpBrowserMenu1:Untermenü Objekt.|MMenöpunkte beziehen sich auf das aktuelle Objekt.
-fr.ro.HelpBrowserMenu1:\Rvoir les options correspondant à l'objet courant.
+fr.ro.HelpBrowserMenu1:\Rvoir les options correspondant à l’objet courant.
it.ro.HelpBrowserMenu1:\Rmostra opzioni relative all'oggetto corrente.
nl.ro.HelpBrowserMenu1:Verplaats de muispijl naar rechts om de mogelijkheden bij dit item te tonen.
zh_CN.ro.HelpBrowserMenu1:\R查看与当å‰é¡¹çš„相关选项。
en.ro.HelpBrowserMenu1-0-0:\Rsee information about the current item.
de.ro.HelpBrowserMenu1-0-0:Informationen zum aktuellen Objekt zeigen.
-fr.ro.HelpBrowserMenu1-0-0:\Rvoir les informations sur l'objet en cours.
+fr.ro.HelpBrowserMenu1-0-0:\Rvoir les informations sur l’objet en cours.
it.ro.HelpBrowserMenu1-0-0:\Rmostra informazioni relative all'oggetto corrente.
nl.ro.HelpBrowserMenu1-0-0:Verplaats de muispijl naar rechts om informatie over dit item te tonen.
zh_CN.ro.HelpBrowserMenu1-0-0:\R查看当å‰é¡¹çš„ä¿¡æ¯ã€‚
en.ro.HelpBrowserMenu1-0-1:\Rsave the current item.
de.ro.HelpBrowserMenu1-0-1:Abspeichern des Objektes (Original).
-fr.ro.HelpBrowserMenu1-0-1:\Rsauver l'objet courant.
+fr.ro.HelpBrowserMenu1-0-1:\Rsauver l’objet courant.
it.ro.HelpBrowserMenu1-0-1:\Rsalva l'oggetto corrente
nl.ro.HelpBrowserMenu1-0-1:Verplaats de muispijl naar rechts om dit item te bewaren.
zh_CN.ro.HelpBrowserMenu1-0-1:\Rä¿å­˜å½“å‰é¡¹ã€‚
en.ro.HelpBrowserMenu1-0-2:\Rsee the export options.
de.ro.HelpBrowserMenu1-0-2:Optionen zum Export des aktuellen Objektes zeigen.
-fr.ro.HelpBrowserMenu1-0-2:\Rvoir les options d'exportation.
+fr.ro.HelpBrowserMenu1-0-2:\Rvoir les options d’exportation.
it.ro.HelpBrowserMenu1-0-2:\Rmostra opzioni di esportazione
nl.ro.HelpBrowserMenu1-0-2:Verplaats de muispijl naar rechts om de exporteermogelijkheden te tonen.
zh_CN.ro.HelpBrowserMenu1-0-2:\R查看导出选项。
en.ro.HelpBrowserMenu1-0-2-0:\Rsave the image as a Sprite.
de.ro.HelpBrowserMenu1-0-2-0:Abspeichern des Bildes als Sprite Datei.
-fr.ro.HelpBrowserMenu1-0-2-0:\Rsauver l'image au format Sprite.
+fr.ro.HelpBrowserMenu1-0-2-0:\Rsauver l’image au format « sprite ».
it.ro.HelpBrowserMenu1-0-2-0:\Rsalva l'immagine come file Sprite
nl.ro.HelpBrowserMenu1-0-2-0:Verplaats de muispijl naar rechts om de afbeelding als een Sprite-bestand te bewaren.
zh_CN.ro.HelpBrowserMenu1-0-2-0:\R将图åƒå¦å­˜ä¸ºè´´å›¾æ–‡ä»¶ã€‚
@@ -5952,28 +5988,28 @@ zh_CN.ro.HelpBrowserMenu1-0-2-1:\R将图åƒå¦å­˜ä¸ºç»˜å›¾æ–‡ä»¶
en.ro.HelpBrowserMenu1-0-3:\Rsave the address of the current item.
de.ro.HelpBrowserMenu1-0-3:Die Adresse des Objektes speichern.
-fr.ro.HelpBrowserMenu1-0-3:\Rsauver l'adresse de l'objet courant.
+fr.ro.HelpBrowserMenu1-0-3:\Rsauver l’adresse de l’objet courant.
it.ro.HelpBrowserMenu1-0-3:\Rsalva l'indirizzo dell'oggetto corrente.
nl.ro.HelpBrowserMenu1-0-3:Verplaats de muispijl naar rechts om het adres van dit item te bewaren.
zh_CN.ro.HelpBrowserMenu1-0-3:\Rä¿å­˜å½“å‰é¡¹çš„网å€ã€‚
en.ro.HelpBrowserMenu1-0-3-0:\Rsave the current item's address in Acorn URI format.
de.ro.HelpBrowserMenu1-0-3-0:Speichert die Adresse des Objektes im Acorn URI Format.
-fr.ro.HelpBrowserMenu1-0-3-0:\Rsauver l'adresse de l'objet courant au format Acorn URI.
+fr.ro.HelpBrowserMenu1-0-3-0:\Rsauver l’adresse de l’objet courant au format Acorn URI.
it.ro.HelpBrowserMenu1-0-3-0:\Rsalva l'indirizzo dell'oggetto corrente nel formato Acorn URI
nl.ro.HelpBrowserMenu1-0-3-0:Verplaats de muispijl naar rechts om het adres van dit item in AcornURI-vorm te bewaren.
zh_CN.ro.HelpBrowserMenu1-0-3-0:\R以 Acorn URI æ ¼å¼ä¿å­˜å½“å‰é¡¹çš„网å€ã€‚
en.ro.HelpBrowserMenu1-0-3-1:\Rsave the current item's address in Ant URL format.
de.ro.HelpBrowserMenu1-0-3-1:Speichert die Adresse des Objektes im Ant URL Format.
-fr.ro.HelpBrowserMenu1-0-3-1:\Rsauver l'adresse de l'objet courant au format Ant URL.
+fr.ro.HelpBrowserMenu1-0-3-1:\Rsauver l’adresse de l’objet courant au format Ant URL.
it.ro.HelpBrowserMenu1-0-3-1:\Rsalva l'indirizzo dell'oggetto corrente nel formato Ant URL
nl.ro.HelpBrowserMenu1-0-3-1:Verplaats de muispijl naar rechts om het adres van dit item in AntURL-vorm te bewaren.
zh_CN.ro.HelpBrowserMenu1-0-3-1:\R以 Ant URL æ ¼å¼ä¿å­˜å½“å‰é¡¹çš„网å€ã€‚
en.ro.HelpBrowserMenu1-0-3-2:\Rsave the current item's address as plain text.
de.ro.HelpBrowserMenu1-0-3-2:Speichert die Adresse des Objektes als Text.
-fr.ro.HelpBrowserMenu1-0-3-2:\Rsauver l'adresse de l'objet courant en texte simple.
+fr.ro.HelpBrowserMenu1-0-3-2:\Rsauver l’adresse de l’objet courant en texte simple.
it.ro.HelpBrowserMenu1-0-3-2:\Rsalva l'indirizzo dell'oggetto corrente come file di testo
nl.ro.HelpBrowserMenu1-0-3-2:Verplaats de muispijl naar rechts om het adres van dit item als platte tekst te bewaren.
zh_CN.ro.HelpBrowserMenu1-0-3-2:\R将当å‰é¡¹çš„网å€å¦å­˜ä¸ºçº¯æ–‡æœ¬ã€‚
@@ -6092,21 +6128,21 @@ zh_CN.ro.HelpBrowserMenu3:\R查看导航选项。
en.ro.HelpBrowserMenu3-0:\Sreturn to the configured home page.
de.ro.HelpBrowserMenu3-0:Öffnet die Homepage im aktuellen Fenster.
-fr.ro.HelpBrowserMenu3-0:\Srevenir à la page d'accueil configurée.
+fr.ro.HelpBrowserMenu3-0:\Srevenir à la page d’accueil configurée.
it.ro.HelpBrowserMenu3-0:\Storna alla pagina iniziale preconfigurata
nl.ro.HelpBrowserMenu3-0:Klik met KIES om terug naar de begin-/startpagina te gaan.
zh_CN.ro.HelpBrowserMenu3-0:\S返回é…置好的主页。
en.ro.HelpBrowserMenu3-1:\Sgo back a page in the local history.|MForm information is not resubmitted.
de.ro.HelpBrowserMenu3-1:Schaltet zurück zur vorher dargestellten Seite.|MDie Seite wird dabei nicht aktualisiert.
-fr.ro.HelpBrowserMenu3-1:\Sreculer d'une page dans l'historique local.|ML'information du formlaire n'est pas réenvoyée.
+fr.ro.HelpBrowserMenu3-1:\Sreculer d’une page dans l’historique local.|ML’information du formlaire n’est pas réenvoyée.
it.ro.HelpBrowserMenu3-1:\Storna indietro di una pagina nella cronologia locale.|MIl form non verrà reinviato.
nl.ro.HelpBrowserMenu3-1:Klik met KIES om 1 pagina terug in de venstergeschiedenis te gaan.|MLet op! Formulierinformatie wordt niet opnieuw ingediend.
zh_CN.ro.HelpBrowserMenu3-1:\S在本地历å²è®°å½•ä¸­åŽé€€ä¸€é¡µã€‚|Mä¸é‡æ–°æ交表格信æ¯ã€‚
en.ro.HelpBrowserMenu3-2:\Sstep forward a page in the local history.|MForm information is not resubmitted.
de.ro.HelpBrowserMenu3-2:Schaltet zur nächsten Seite in der lokalen History Liste.|MDie Seite wird dabei nicht aktualisiert.
-fr.ro.HelpBrowserMenu3-2:\Savancer d'une page dans l'historique local.|ML'information du formlaire n'est pas réenvoyée.
+fr.ro.HelpBrowserMenu3-2:\Savancer d’une page dans l’historique local.|ML’information du formlaire n’est pas réenvoyée.
it.ro.HelpBrowserMenu3-2:\Svai avanti di una pagina nella cronologia locale.|MLe informazioni contenute nel form non verranno inviate.
nl.ro.HelpBrowserMenu3-2:Klik met KIES om 1 pagina vooruit in de venstergeschiedenis te gaan.|MLet op! Formulierinformatie wordt niet opnieuw ingediend.
zh_CN.ro.HelpBrowserMenu3-2:\S在本地历å²è®°å½•ä¸­å‰è¿›ä¸€é¡µã€‚|Mä¸é‡æ–°æ交表格信æ¯ã€‚
@@ -6134,7 +6170,7 @@ zh_CN.ro.HelpBrowserMenu3-5:\S阻止 NetSurf 继续加载此页é¢ã€‚
en.ro.HelpBrowserMenu4:\Rset the local display options.
de.ro.HelpBrowserMenu4:Untermenü Anzeige.|MFestlegen der Darstellungsparameter für das Browserfenster.
-fr.ro.HelpBrowserMenu4:\Rdéfinir les options d'affichage locales.
+fr.ro.HelpBrowserMenu4:\Rdéfinir les options d’affichage locales.
it.ro.HelpBrowserMenu4:\Rimposta le opzioni di visualizzazione locale.
nl.ro.HelpBrowserMenu4:Verplaats de muispijl naar rechts om de weergavemogelijkheden van dit browservenster aan te passen.
zh_CN.ro.HelpBrowserMenu4:\R设置本地显示的选项。
@@ -6148,7 +6184,7 @@ zh_CN.ro.HelpBrowserMenu4-0:\R缩放页é¢ï¼ŒåŒæ—¶æ”¹å˜æ–‡æœ¬å’Œå›¾åƒã€‚
en.ro.HelpBrowserMenu4-1:\Rset the local image options.
de.ro.HelpBrowserMenu4-1:Optionen zur Anzeige von Bildern.
-fr.ro.HelpBrowserMenu4-1:\Rdéfinir les options d'images locales.
+fr.ro.HelpBrowserMenu4-1:\Rdéfinir les options d’images locales.
it.ro.HelpBrowserMenu4-1:\Rimposta le opzioni relative alle immagini locali.
nl.ro.HelpBrowserMenu4-1:Verplaats de muispijl naar rechts om de afbeeldingsmogelijkheden van dit browservenster aan te passen.
zh_CN.ro.HelpBrowserMenu4-1:\R设置本地图åƒçš„选项。
@@ -6176,42 +6212,42 @@ zh_CN.ro.HelpBrowserMenu4-1-2:\S切æ¢æ˜¾ç¤ºåŠ¨ç”»ã€‚|M如果关闭,则会显ç
en.ro.HelpBrowserMenu4-2:\Rcontrol the display of NetSurf's toolbars.
de.ro.HelpBrowserMenu4-2:Optionen zur Anzeige von Kontroll- und Steuerelementen.
-fr.ro.HelpBrowserMenu4-2:\Rcontroler l'affichage des barres d'outils de NetSurf.
+fr.ro.HelpBrowserMenu4-2:\Rcontroler l’affichage des barres d’outils de NetSurf.
it.ro.HelpBrowserMenu4-2:\Rcontrolla la visualizzazione delle barre strumenti di NetSurf.
nl.ro.HelpBrowserMenu4-2:Verplaats de muispijl naar rechts om de gereedschapbalken aan te passen.
zh_CN.ro.HelpBrowserMenu4-2:\R控制显示 NetSurf 工具æ ã€‚
en.ro.HelpBrowserMenu4-2-0:\Stoggle the display of the toolbar buttons.|MURL bar uses the remaining space.
de.ro.HelpBrowserMenu4-2-0:Schaltet die Schaltknöpfe am oberen Fensterrand ein/aus.|MDie Länge der Adressleiste wird angepaßt.
-fr.ro.HelpBrowserMenu4-2-0:\Safficher ou pas les boutons de la barre d'outil.|MLa barre d'URL utilise l'espace restant.
+fr.ro.HelpBrowserMenu4-2-0:\Safficher ou pas les boutons de la barre d’outil.|MLa barre d’URL utilise l’espace restant.
it.ro.HelpBrowserMenu4-2-0:\Salterna la visualizzazione dei pulsanti della barra strumenti.|MLa barra URL coprirà lo spazio eccedente.
nl.ro.HelpBrowserMenu4-2-0:Klik met KIES om het tonen van de knoppen op de gereedschapbalk aan of uit te zetten.|MHet adresveld gebruikt de overblijvende vrijkomende ruimte.
zh_CN.ro.HelpBrowserMenu4-2-0:\S切æ¢æ˜¾ç¤ºå·¥å…·æ æŒ‰é’®ã€‚|M 地å€æ ä½¿ç”¨å‰©ä½™çš„空间。
en.ro.HelpBrowserMenu4-2-1:\Stoggle the display of the address (URL) bar.
de.ro.HelpBrowserMenu4-2-1:Schaltet die Adressleiste am oberen Fensterrand ein/aus.
-fr.ro.HelpBrowserMenu4-2-1:\Safficher ou pas la barre d'adresse (URL).
+fr.ro.HelpBrowserMenu4-2-1:\Safficher ou pas la barre d’adresse (URL).
it.ro.HelpBrowserMenu4-2-1:\Salterna la visualizzazione della barra indirizzi (URL).
nl.ro.HelpBrowserMenu4-2-1:Klik met KIES om het tonen van het (web)adresveld aan of uit te zetten.
zh_CN.ro.HelpBrowserMenu4-2-1:\S切æ¢æ˜¾ç¤ºåœ°å€(URL)æ ã€‚
en.ro.HelpBrowserMenu4-2-2:\Stoggle the display of the throbber.|MURL bar uses the remaining space.
de.ro.HelpBrowserMenu4-2-2:Schaltet die Ladeaktivitätsanzeige am oberen Fensterrand ein/aus.|MDie Länge der Adressleiste wird angepaßt.
-fr.ro.HelpBrowserMenu4-2-2:\Safficher le pulseur ou pas.|MLa barre d'URL utilise l'espace restant.
+fr.ro.HelpBrowserMenu4-2-2:\Safficher le pulseur ou pas.|MLa barre d’URL utilise l’espace restant.
it.ro.HelpBrowserMenu4-2-2:\Salterna la visualizzazione del throbber.|MLa barra URL coprirà lo spazio eccedente.
nl.ro.HelpBrowserMenu4-2-2:Klik met KIES om het tonen van de (laad)Activiteitsindicator aan of uit te zetten.|MHet adresveld gebruikt de overblijvende vrijkomende ruimte.
zh_CN.ro.HelpBrowserMenu4-2-2:\S切æ¢æ˜¾ç¤ºåŠ¨æ€æµè§ˆå›¾ç¤ºã€‚|M 地å€æ ä½¿ç”¨å‰©ä½™çš„空间。
en.ro.HelpBrowserMenu4-2-3:\Stoggle toolbar edit mode.
de.ro.HelpBrowserMenu4-2-3:Schaltet in den Modus zur Bearbeitung der Iconleiste am oberen Fensterrand.
-fr.ro.HelpBrowserMenu4-2-3:\Schanger le mode d'édition de barre d'outils.
+fr.ro.HelpBrowserMenu4-2-3:\Schanger le mode d’édition de barre d’outils.
it.ro.HelpBrowserMenu4-2-3:\Salterna la modalità di modifica della barra strumenti.
nl.ro.HelpBrowserMenu4-2-3:Klik met KIES om de aanpasmodus van de gereedschapbalk in of uit te schakelen. Wanneer ingeschakelt, verschijnt er een balk onder de gereedschapbalk met extra knoppen die van en naar deze balk gesleept kunnen worden om deze aan te passen.
zh_CN.ro.HelpBrowserMenu4-2-3:\S切æ¢å·¥å…·æ ç¼–辑模å¼ã€‚
en.ro.HelpBrowserMenu4-3:\Scontrol the manner in which the display is rendered.
de.ro.HelpBrowserMenu4-3:Einstellungen zur Berechnung der Seitendarstellung.
-fr.ro.HelpBrowserMenu4-3:\Scontroler la façon d'afficher.
+fr.ro.HelpBrowserMenu4-3:\Scontroler la façon d’afficher.
it.ro.HelpBrowserMenu4-3:\Scontrolla il modo in cui è resa l'esposizione.
nl.ro.HelpBrowserMenu4-3:Verplaats de muispijl naar rechts om de pagina-opbouwmethodes aan te passen.
zh_CN.ro.HelpBrowserMenu4-3:\S控制显示的渲染方å¼ã€‚
@@ -6232,7 +6268,7 @@ zh_CN.ro.HelpBrowserMenu4-3-1:\S切æ¢æ˜¯å¦åœ¨æ‰€æœ‰è®¡ç®—完æˆä¹‹å‰ä¸æ˜¾ç¤º
en.ro.HelpBrowserMenu4-4:\Smake your local display options the default options for NetSurf.
de.ro.HelpBrowserMenu4-4:Übernimmt die vorgenommenen Anzeigeeinstellungen als globale Standardwerte für die Darstellung aller weiteren Seiten.
-fr.ro.HelpBrowserMenu4-4:\Spromouvoir vos options d'affichage locales en options par défaut pour NetSurf.
+fr.ro.HelpBrowserMenu4-4:\Spromouvoir vos options d’affichage locales en options par défaut pour NetSurf.
it.ro.HelpBrowserMenu4-4:\Simposta come predefinite tutte le impostazioni di visualizzazione.
nl.ro.HelpBrowserMenu4-4:Klik met KIES om de gekozen weergave van dit browservenster als de standaardinstelling voor NetSurf te maken.
zh_CN.ro.HelpBrowserMenu4-4:\S将本地显示选项设置为 NetSurf 的默认选项。
@@ -6253,7 +6289,7 @@ zh_CN.ro.HelpBrowserMenu4-5-0:\S å°†å½“å‰ \w ä½ç½®è®¾ç½®ä¸ºé»˜è®¤ä½ç½®ã€‚
en.ro.HelpBrowserMenu4-5-1:\S toggle whether subsequent windows are staggered down the screen.
de.ro.HelpBrowserMenu4-5-1:Neu geöffnete Fenster werden nicht alle an der Standardposition sondern zueinander leicht versetzt plaziert.
-fr.ro.HelpBrowserMenu4-5-1:\Sdécider si les fenêtres suivantes doivent être ouvertes en décalage à l'écran.
+fr.ro.HelpBrowserMenu4-5-1:\Sdécider si les fenêtres suivantes doivent être ouvertes en décalage à l’écran.
it.ro.HelpBrowserMenu4-5-1:\Simposta nel caso le finestre successive siano sfalsate rispetto alla parte bassa dello schermo.
nl.ro.HelpBrowserMenu4-5-1:Klik met KIES om het verticaal stapelen van nieuwe browservensters aan of uit te zetten.
zh_CN.ro.HelpBrowserMenu4-5-1:\S 切æ¢åŽç»­çª—å£æ˜¯å¦åœ¨å±å¹•ä¸Šäº¤é”™æ˜¾ç¤ºã€‚
@@ -6274,28 +6310,28 @@ zh_CN.ro.HelpBrowserMenu4-5-3:\S 返回默认的\w ä½ç½®ã€‚
en.ro.HelpBrowserMenu5:\Raccess NetSurf's built in utilities.|MUtilities are tools such as the hotlist, history tree and various setup options.
de.ro.HelpBrowserMenu5:Untermenü Werkzeuge.|MEnthält verschiedene nützliche Zusatz- und Sonderfunktionen.
-fr.ro.HelpBrowserMenu5:\Raccéder aux utilitaires intégrés à NetSurf.|MLes utilitaires sont des outils comme les favoris, l'historique arborescent et diverses options de configuration.
+fr.ro.HelpBrowserMenu5:\Raccéder aux utilitaires intégrés à NetSurf.|MLes utilitaires sont des outils comme les marque-pages, l’historique arborescent et diverses options de configuration.
it.ro.HelpBrowserMenu5:\Raccedi a NetSurf attraverso le utilità.|MLe utilità sono strumenti simili ai segnalibri, gli alberi della cronologia e le altre opzioni di configurazione.
nl.ro.HelpBrowserMenu5:Verplaats de muispijl naar rechts om toegang te krijgen tot NetSurf's ingebouwde mogelijkheden.|MMogelijkheden zijn bijvoorbeeld gereedschappen zoals de favorietenlijst, de browsergeschiedenis en verschillende instelmogelijkheden.
zh_CN.ro.HelpBrowserMenu5:\R访问 NetSurf 的内置实用程åºã€‚|M实用程åºæ˜¯è¯¸å¦‚常用列表,历å²è®°å½•æ ‘å’Œå„ç§è®¾ç½®é€‰é¡¹ä¹‹ç±»çš„工具。
en.ro.HelpBrowserMenu5-0:\Rmanage the hotlist.
de.ro.HelpBrowserMenu5-0:Verwaltung der Hotlist.
-fr.ro.HelpBrowserMenu5-0:\Rgérer les favoris.
+fr.ro.HelpBrowserMenu5-0:\Rgérer les marque-pages.
it.ro.HelpBrowserMenu5-0:\Rgestisci i segnalibri.
nl.ro.HelpBrowserMenu5-0:Verplaats de muispijl naar rechts om de favorietenlijst te beheren.
zh_CN.ro.HelpBrowserMenu5-0:\R管ç†å¸¸ç”¨åˆ—表。
en.ro.HelpBrowserMenu5-0-0:\Sadd the current page to the hotlist.
de.ro.HelpBrowserMenu5-0-0:Anklicken trägt die Adresse der aktuellen Seite in die Hotlist ein.
-fr.ro.HelpBrowserMenu5-0-0:\Sajouter la page en cours aux favoris.
+fr.ro.HelpBrowserMenu5-0-0:\Sajouter la page courante aux marque-pages.
it.ro.HelpBrowserMenu5-0-0:\Saggiungi la pagina corrente ai segnalibri
nl.ro.HelpBrowserMenu5-0-0:Klik met KIES om deze pagina aan de favorietenlijst toe te voegen.
zh_CN.ro.HelpBrowserMenu5-0-0:\S将当å‰é¡µé¢æ·»åŠ åˆ°å¸¸ç”¨åˆ—表。
en.ro.HelpBrowserMenu5-0-1:\Sopen the hotlist management \w.
de.ro.HelpBrowserMenu5-0-1:Öffnet die Hotlist.
-fr.ro.HelpBrowserMenu5-0-1:\Souvrir la \w de gestion des favoris.
+fr.ro.HelpBrowserMenu5-0-1:\Souvrir la \w de gestion des marque-pages.
it.ro.HelpBrowserMenu5-0-1:\Sapri la finestra del gestore dei segnalibri
nl.ro.HelpBrowserMenu5-0-1:Klik met KIES om de favorietenlijst te openen.
zh_CN.ro.HelpBrowserMenu5-0-1:\S打开常用列表管ç†å™¨ \w。
@@ -6309,21 +6345,21 @@ zh_CN.ro.HelpBrowserMenu5-1:\R查看历å²è®°å½•é€‰é¡¹ã€‚
en.ro.HelpBrowserMenu5-1-0:\Sopen the local history \w.
de.ro.HelpBrowserMenu5-1-0:Anklicken mit AUSWAHL öffnet das Fenster mit der lokalen History.|MIn der lokalen History werden alle Webseiten notiert, die mit dem aktuellen Browserfenster bereits besucht worden waren.
-fr.ro.HelpBrowserMenu5-1-0:\Souvrir la \w d'historique local.
+fr.ro.HelpBrowserMenu5-1-0:\Souvrir la \w d’historique local.
it.ro.HelpBrowserMenu5-1-0:\Sapri la cronologia locale
nl.ro.HelpBrowserMenu5-1-0:Klik met KIES om de venstergeschiedenis te openen.
zh_CN.ro.HelpBrowserMenu5-1-0:\S打开本地历å²è®°å½• \w。
en.ro.HelpBrowserMenu5-1-1:\Sopen the global history \w.
de.ro.HelpBrowserMenu5-1-1:Anklicken mit AUSWAHL öffnet das Fenster mit der globalen History.|MIn der globalen History werden alle mit NetSurf besuchten Webseiten notiert.
-fr.ro.HelpBrowserMenu5-1-1:\Souvrir la fenêtre d'historique global.
+fr.ro.HelpBrowserMenu5-1-1:\Souvrir la fenêtre d’historique global.
it.ro.HelpBrowserMenu5-1-1:\Sapri la cronologia globale
nl.ro.HelpBrowserMenu5-1-1:Klik met KIES om de browsergeschiedenis te openen.
zh_CN.ro.HelpBrowserMenu5-1-1:\S打开全局历å²è®°å½• \w。
en.ro.HelpBrowserMenu5-2:\Rmanage your cookies.
de.ro.HelpBrowserMenu5-2:Cookies bearbeiten.
-fr.ro.HelpBrowserMenu5-2:\Rgérer vos favoris.
+fr.ro.HelpBrowserMenu5-2:\Rgérer vos cookies.
it.ro.HelpBrowserMenu5-2:\Rgestisci i tuoi cookie.
nl.ro.HelpBrowserMenu5-2:Verplaats de muispijl naar rechts om de cookies te beheren.
zh_CN.ro.HelpBrowserMenu5-2:\R管ç†æ‚¨çš„ Cookies。
@@ -6344,7 +6380,7 @@ zh_CN.ro.HelpBrowserMenu5-2-1:\S删除所有ä¿å­˜çš„ Cookies。
en.ro.HelpBrowserMenu6:\Rsee the help resources available.
de.ro.HelpBrowserMenu6:Untermenü Hilfe.|MZeigt Informationen zu und über NetSurf.
-fr.ro.HelpBrowserMenu6:\Rvoir l'aide disponible.
+fr.ro.HelpBrowserMenu6:\Rvoir l’aide disponible.
it.ro.HelpBrowserMenu6:\Rmostra la documentazione disponibile
nl.ro.HelpBrowserMenu6:Verplaats de muispijl naar rechts om extra hulp en informatie te raadplegen, indien deze beschikbaar is.
zh_CN.ro.HelpBrowserMenu6:\R查看å¯ç”¨çš„帮助资æºã€‚
@@ -6358,14 +6394,14 @@ zh_CN.ro.HelpBrowserMenu6-0:\S在新的 \w 中打开文档内容页é¢ã€‚
en.ro.HelpBrowserMenu6-1:\Sopen the user guide in a new \w.
de.ro.HelpBrowserMenu6-1:Öffnet das NetSurf Handbuch in einem neuen Browserfenster.
-fr.ro.HelpBrowserMenu6-1:\Souvrir le guide de l'utilisateur dans une nouvelle fenêtre.
+fr.ro.HelpBrowserMenu6-1:\Souvrir le guide de l’utilisateur dans une nouvelle fenêtre.
it.ro.HelpBrowserMenu6-1:\Sapri la guida in linea in una nuova finestra
nl.ro.HelpBrowserMenu6-1:Klik met KIES om de gebruikershandleiding in een nieuw browservenster te openen.
zh_CN.ro.HelpBrowserMenu6-1:\S在新的 \w 中打开用户指å—。
en.ro.HelpBrowserMenu6-2:\Sopen the user information page in a new \w.
de.ro.HelpBrowserMenu6-2:Öffnet eine Seite mit allgemeinen Informationen zu NetSurf in einem neuen Browserfenster.
-fr.ro.HelpBrowserMenu6-2:\Souvrir la page d'information de l'utilisateur dans une nouvelle fenêtre.
+fr.ro.HelpBrowserMenu6-2:\Souvrir la page d’information de l’utilisateur dans une nouvelle fenêtre.
it.ro.HelpBrowserMenu6-2:\Sapri la pagina delle informazioni utente in una nuova finestra
nl.ro.HelpBrowserMenu6-2:Klik met KIES om de gebruikersinformatie in een nieuw browservenster te openen.
zh_CN.ro.HelpBrowserMenu6-2:\S在新的 \w 中打开用户信æ¯é¡µé¢ã€‚
@@ -6393,21 +6429,21 @@ zh_CN.ro.HelpBrowserMenu6-5:\Sè¿è¡Œå¸®åŠ©ã€‚
en.ro.HelpBrowser-1:Click \s on a link to follow it.|MClick \a on a link to open it in a new \w.|MShift+\s click on a link to download the link target contents.|MShift+\a click to save the link target address.
de.ro.HelpBrowser-1:Das ist ein Browserfenster.|MEinen Link mit AUSWAHL anklicken, um ihm zu folgen.|MEinen Link mit SPEZIAL anklicken, um ihn in einem neuen Fenster zu öffnen.|MShift+AUSWAHL über einem Verweis lädt den verlinkten Inhalt herunter.|MShift+SPEZIAL über einem Link klicken zum Speichern der Adresse des Verweises.
-fr.ro.HelpBrowser-1:Cliquer \s sur un lien pour le suivre.|MCliquer \a sur un lien pour l'ouvrir dans une nouvelle \w.|MShift+\s click on a link to download the link target contents.|MShift+\a click to save the link target address.
+fr.ro.HelpBrowser-1:Cliquer \s sur un lien pour le suivre.|MCliquer \a sur un lien pour l’ouvrir dans une nouvelle \w.|MShift+\s click on a link to download the link target contents.|MShift+\a click to save the link target address.
it.ro.HelpBrowser-1:Clicca \s sul link per procedere.|MClicca \a in un link per aprirlo in una nuova finestra|MShift+\s clicca sul link per scaricarne i contenuti.|MShift+\a clicca per salvare l'indirizzo del link.
nl.ro.HelpBrowser-1:Klik met KIES op een koppeling om deze te volgen.|MKlik met PASAAN om de koppeling in een nieuw venster te openen.|MKlik met SHIFT+KIES om de inhoud op te halen voor opslag.|MKlik met SHIFT+PASAAN om het koppelingsadres te bewaren.
zh_CN.ro.HelpBrowser-1:å•å‡»é“¾æŽ¥ä¸Šçš„ \s 以跟éšå®ƒã€‚|Må•å‡»é“¾æŽ¥ä¸Šçš„ \a 以在新的 \w 中打开。|MShift+\s å•å‡»é“¾æŽ¥ä»¥ä¸‹è½½é“¾æŽ¥ç›®æ ‡å†…容。|MShift+\a å•å‡»ä»¥ä¿å­˜é“¾æŽ¥ç›®æ ‡ç½‘å€ã€‚
en.ro.HelpIconbar:\TNetSurf icon.|M\Sopen a new browser \w.|M\Aopen the hotlist management \w.
de.ro.HelpIconbar:Das ist das NetSurf Icon.|MKlicken mit AUSWAHL öffnet ein neues Browserfenster.|MKlicken mit SPEZIAL öffnet die Hotlist.
-fr.ro.HelpIconbar:\Tl'icône de NetSurf.|M\Souvrir une nouvelle \w de navigateur.|M\Aouvrir la fenêtre de gestion des favoris.
+fr.ro.HelpIconbar:\Tl’icône de NetSurf.|M\Souvrir une nouvelle \w de navigateur.|M\Aouvrir la fenêtre de gestion des marque-pages.
it.ro.HelpIconbar:\TIcona di NetSurf.|M\Sapri una nuova finestra|M\Aapri la finestra del gestore dei segnalibri
nl.ro.HelpIconbar:Dit is het symbool van het programma NetSurf.|MKlik met KIES om een nieuw browservenster te openen.|MKlik met PASAAN om de favorietenlijst te openen.
zh_CN.ro.HelpIconbar:\T NetSurf 图标。|M\S打开新的æµè§ˆå™¨ \w。|M\A打开常用项列表管ç†\w。
en.ro.HelpHistory:Use this \w to navigate around the local history tree.|M\Son a thumbnail to return to that page.
de.ro.HelpHistory:Die History zeigt alle in dieser Sitzung besuchten Seiten.|MKlicken mit AUSWAHL auf eine Symbolgrafik kehrt zurück zur jeweiligen Seite.
-fr.ro.HelpHistory:Utiliser cette \w pour naviguer dans l'historique arborescent local.|M\Ssur une vignette pour revenir à cette page.
+fr.ro.HelpHistory:Utiliser cette \w pour naviguer dans l’historique arborescent local.|M\Ssur une vignette pour revenir à cette page.
it.ro.HelpHistory:Usa questa finestra per navigare all'interno dell'albero della cronologia locale.|M\Ssulla miniatura per tornare a quella pagina.
nl.ro.HelpHistory:Gebruik dit venster om door de structuur van de venstergeschiedenis te kunnen gaan.|MKlik met KIES op een miniatuur om terug te keren naar de pagina.
zh_CN.ro.HelpHistory:使用此 \w 在本地历å²è®°å½•æ ‘中导航。|M\S在缩略图上返回到该页é¢ã€‚
@@ -6435,7 +6471,7 @@ zh_CN.ro.HelpSaveAs1:用æ¥ä¿å­˜æ­¤æ–‡æ¡£çš„文件å。
en.ro.HelpSaveAs2:\Ssave the file with the current filename.|MIf a full path is not set, you must drag the icon to a directory.
de.ro.HelpSaveAs2:Klicken mit AUSWAHL speichert die Datei unter angezeigtem Pfad und Namen.|MWird kein voller Dateipfad angezeigt, muß die Datei per Drag & Drop gespeichert werden.
-fr.ro.HelpSaveAs2:\Ssauver le fichier avec le nom de fichier en cours.|MSi le nom de chemin n'est pas complet, il vous faudra déposer l'icône dans un répertoire.
+fr.ro.HelpSaveAs2:\Ssauver le fichier avec le nom de fichier en cours.|MSi le nom de chemin n’est pas complet, il vous faudra déposer l’icône dans un répertoire.
it.ro.HelpSaveAs2:\Ssalva il file usando il suo nome corrente.|MNel caso il percorso completo non sia impostato sposta l'icona nella directory.
nl.ro.HelpSaveAs2:Klik met KIES om het bestand met deze bestandsnaam te bewaren.|MWanneer het veld geen volledig pad toont, dan moet het symbool naar de gewenste map worden gesleept.
zh_CN.ro.HelpSaveAs2:\S用当å‰æ–‡ä»¶åä¿å­˜æ–‡ä»¶ã€‚|M如果您未设置完整路径,则必须将图标拖到目录中。
@@ -6449,28 +6485,28 @@ zh_CN.ro.HelpSaveAs3:\S关闭此 \w 而ä¸ä¿å­˜ã€‚
en.ro.HelpScaleView:Use this \w to change the scale the page is displayed at.
de.ro.HelpScaleView:Mit diesem Dialog kann die Darstellung der Seite vergrößert oder verkleinert werden.
-fr.ro.HelpScaleView:Utiliser cette \w pour changer l'échelle d'affichage.
+fr.ro.HelpScaleView:Utiliser cette \w pour changer l’échelle d’affichage.
it.ro.HelpScaleView:Usa questa finestra per modificare la scala di visualizzazione della pagina.
nl.ro.HelpScaleView:Gebruik dit venster om de schaal van deze pagina te wijzigen.
zh_CN.ro.HelpScaleView:使用此 \w 以更改页é¢æ˜¾ç¤ºçš„比例。
en.ro.HelpScaleView1:Enter the scale you wish the page to be displayed at.
de.ro.HelpScaleView1:Gewünschte Skalierung hier eingeben.
-fr.ro.HelpScaleView1:Saisissez l'échelle à laquelle vous voulez afficher cette page.
+fr.ro.HelpScaleView1:Saisissez l’échelle à laquelle vous voulez afficher cette page.
it.ro.HelpScaleView1:Inserisci la scala di visualizzazione preferita.
nl.ro.HelpScaleView1:Voer hier de gewenste schaal in waarop deze pagina getoond moet worden.
zh_CN.ro.HelpScaleView1:输入您希望显示的页é¢æ¯”例。
en.ro.HelpScaleView2:\Sreduce the scale, 10% at a time.
de.ro.HelpScaleView2:Klicken mit AUSWAHL um die Skalierung um 10% zu verringern.
-fr.ro.HelpScaleView2:\Sréduire l'échelle, par pas de 10%.
+fr.ro.HelpScaleView2:\Sréduire l’échelle, par pas de 10%.
it.ro.HelpScaleView2:\Sdecrementa la scala di un 10% alla volta.
nl.ro.HelpScaleView2:Klik met KIES om de schaal met 10% per keer te verkleinen.
zh_CN.ro.HelpScaleView2:\S缩å°æ¯”例, æ¯æ¬¡å‡å°‘ 10%。
en.ro.HelpScaleView3:\Sincrease the scale, 10% at a time.
de.ro.HelpScaleView3:Klicken mit AUSWAHL um die Skalierung um 10% zu erhöhen.
-fr.ro.HelpScaleView3:\Saugmenter l'échelle, par pas de 10%.
+fr.ro.HelpScaleView3:\Saugmenter l’échelle, par pas de 10%.
it.ro.HelpScaleView3:\Sincrementa la scala di un 10% alla volta.
nl.ro.HelpScaleView3:Klik met KIES om de schaal met 10% per keer te vergroten.
zh_CN.ro.HelpScaleView3:\S放大比例, æ¯æ¬¡å¢žåŠ  10%。
@@ -6484,14 +6520,14 @@ zh_CN.ro.HelpScaleView5:选择是å¦ä¹Ÿç¼©æ”¾æ‰€æœ‰å¸§ã€‚
en.ro.HelpScaleView7:\Scancel changes.|MThe current scale will not be changed.
de.ro.HelpScaleView7:Klicken mit AUSWAHL um die Skalierung nicht durchzuführen.|MDas Dialogfenster wird geschlossen.|MDie Darstellung der Seite wird unverändert beibehalten.
-fr.ro.HelpScaleView7:\Sannuler les changements.|ML'échelle en cours ne sera pas modifiée.
+fr.ro.HelpScaleView7:\Sannuler les changements.|ML’échelle en cours ne sera pas modifiée.
it.ro.HelpScaleView7:\Sannulla tutte le modifiche.|MLa scala corrente non verrà modificata.
nl.ro.HelpScaleView7:Klik met KIES om dit venster te sluiten zonder dat de gemaakte wijzigingen worden ingesteld.|MDeze schaal wordt niet gewijzigd.
zh_CN.ro.HelpScaleView7:\S撤销更改。|Mä¸ä¼šæ›´æ”¹å½“å‰æ¯”例。
en.ro.HelpScaleView8:\Schange the view to the scale you have chosen.
de.ro.HelpScaleView8:Klicken mit AUSWAHL um die Seite skaliert darzustellen.|MDie Seite wird in der gewählten Vergrößerung angezeigt.
-fr.ro.HelpScaleView8:\Svalider le changement d'échelle.
+fr.ro.HelpScaleView8:\Svalider le changement d’échelle.
it.ro.HelpScaleView8:\Smodifica la visualizzazione della scala prescelta.
nl.ro.HelpScaleView8:Klik met KIES om de gekozen schaal in te stellen op deze weergave en het venster sluiten.
zh_CN.ro.HelpScaleView8:\S将视图更改到您选定的比例。
@@ -6505,28 +6541,28 @@ zh_CN.ro.HelpSearch:使用 \w æœç´¢é¡µé¢å†…的文本。
en.ro.HelpSearch0:Enter the search text. # matches any single character, * matches 0 or more characters.
de.ro.HelpSearch0:Suchtext hier eingeben. # steht für exakt ein beliebiges Zeichen. * steht für 0 oder mehrere Zeichen.
-fr.ro.HelpSearch0:Entrer la chaîne de recherche. # remplace n'importe quel caractère, * correspond à 0 ou plus caractères.
+fr.ro.HelpSearch0:Entrer la chaîne de recherche. # remplace n’importe quel caractère, * correspond à 0 ou plus caractères.
it.ro.HelpSearch0:Inserisci un testo da cercare. # corrispondenza di ogni singolo carattere, * corrispondenza di 0 o più caratteri.
nl.ro.HelpSearch0:Voer in dit veld de zoekreeks in. # staat voor 1 willekeurig letterteken, * staat voor 0 of meerdere lettertekens.
zh_CN.ro.HelpSearch0:输入æœç´¢æ–‡å­—。# 匹é…任何å•ä¸ªå­—符,* åŒ¹é… 0 个或多个字符。
en.ro.HelpSearch1:Choose whether the search should regard upper and lower case characters as different.
de.ro.HelpSearch1:Wählt ob nach Groß- und Kleinschreibung unterschieden werden soll.
-fr.ro.HelpSearch1:Choisir si la recherche accorde de l'importance à la casse (minuscules/MAJUSCULES).
+fr.ro.HelpSearch1:Choisir si la recherche accorde de l’importance à la casse (minuscules/MAJUSCULES).
it.ro.HelpSearch1:Scegli se la ricerca deve considerare i caratteri maiuscoli e minuscoli come diversi.
nl.ro.HelpSearch1:Kies of een zoekopdracht rekening moet houden met hoofd- en kleine letters.
zh_CN.ro.HelpSearch1:选择æœç´¢æ˜¯å¦åº”区分大写和å°å†™å­—æ¯ã€‚
en.ro.HelpSearch2:\Smove to the next match.
de.ro.HelpSearch2:Klicken mit AUSWAHL findet den nächsten Treffer.
-fr.ro.HelpSearch2:\Schercher l'occurence suivante.
+fr.ro.HelpSearch2:\Schercher l’occurence suivante.
it.ro.HelpSearch2:\Spassa alla prossima occorrenza
nl.ro.HelpSearch2:Klik met KIES om naar de volgende gevonden zoekreeks te gaan.
zh_CN.ro.HelpSearch2:\S移动到下一个匹é…ä½ç½®ã€‚
en.ro.HelpSearch3:\Smove to the previous match.
de.ro.HelpSearch3:Klicken mit AUSWAHL sucht rückwärts im Text.
-fr.ro.HelpSearch3:\Schercher l'occurence précédente.
+fr.ro.HelpSearch3:\Schercher l’occurence précédente.
it.ro.HelpSearch3:\Spassa alla precedente occorrenza
nl.ro.HelpSearch3:Klik met KIES om naar de vorige gevonden zoekreeks te gaan.
zh_CN.ro.HelpSearch3:\S移动到上一个匹é…ä½ç½®ã€‚
@@ -6554,7 +6590,7 @@ zh_CN.ro.HelpHotEntry:使用此 \w æ¥è®¾ç½®æ¡ç›®è¯¦ç»†ä¿¡æ¯ã€‚
en.ro.HelpHotlist:\Thotlist management window.
de.ro.HelpHotlist:Das ist das Hotlist Fenster.
-fr.ro.HelpHotlist:\Tla fenêtre de gestion des favoris.
+fr.ro.HelpHotlist:\Tla fenêtre de gestion des marque-pages.
it.ro.HelpHotlist:\Tfinestra di gestione dei segnalibri.
nl.ro.HelpHotlist:Dit venster toont de favorietenlijst.
zh_CN.ro.HelpHotlist:\T常用列表管ç†çª—å£ã€‚
@@ -6624,14 +6660,14 @@ zh_CN.ro.HelpHotToolbar0:\T删除键。|M\S删除当å‰é€‰é¡¹ã€‚
en.ro.HelpHotToolbar1:\Texpand entries button.|M\Sexpand all addresses in the hotlist.|M\Acollapse all addresses in the hotlist.|MExpanded addresses show additional details, such as a visit counter.
de.ro.HelpHotToolbar1:Expandiert Einträge.|MKlicken mit AUSWAHL expandiert alle / alle markierten Einträge.|MKlicken mit SPEZIAL faltet alle / alle markierten Einträge zusammen.|MBei expandierten Einträgen werden zusätzliche Informationen angezeigt.
-fr.ro.HelpHotToolbar1:\Tle bouton de déploiement des entrées.|M\Sdéployer toutes les entrées ou seulement celle de la sélection courante.|M\ARegrouper toutes les entrées ou seulement celles de la sélection courante.|MLes entrées déployées affichent des infos supplémentaires, comme un compteur de visite.
+fr.ro.HelpHotToolbar1:\Tle bouton de développement des marque-pages.|M\Sdévelopper toutes les entrées.|M\Aréduire toutes les entrées.|MLes entrées développées affichent des détails supplémentaires, comme un compteur de visite.
it.ro.HelpHotToolbar1:\Tpulsante espandi voci.|M\Sespande tutti gli indirizzi dei segnalibri.|M\Araggruppa tutti gli indirizzi nei segnalibri.|MEspandi gli indirizzi mostrando dettagli addizionali quali ad esempio il numero delle visite.
nl.ro.HelpHotToolbar1:Dit is de Detail-knop.|MKlik met KIES om alle favorieten uit te klappen.|MKlik met PASAAN om alle favorieten in te klappen.|MUitgeklapte favorieten tonen aanvullende details, zoals een bezoekteller.
zh_CN.ro.HelpHotToolbar1:\T展开æ¡ç›®é”®ã€‚|M\S展开常用列表中的所有网å€ã€‚|M\A折å å¸¸ç”¨åˆ—表中的所有网å€ã€‚|M展开的网å€æ˜¾ç¤ºå…¶ä»–详细信æ¯ï¼Œå¦‚访问计数器。
en.ro.HelpHotToolbar2:\Topen directories button.|M\Sopen all directories in the hotlist.|M\Aclose all directories in the hotlist.
de.ro.HelpHotToolbar2:Öffnet Verzeichnisse.|MKlicken mit AUSWAHL öffnet alle / alle markierten Verzeichnisse.|MKlicken mit SPEZIAL schließt alle / alle markierten Verzeichnisse.
-fr.ro.HelpHotToolbar2:\Tle bouton d'ouverture de répertoires.|M\Souvrir tous les répertoires ou seulement ceux de la sélection courante.|M\Afermer tous les répertoires ou seulement ceux de la sélection courante.
+fr.ro.HelpHotToolbar2:\Tle bouton d’ouverture de répertoires.|M\Souvrir tous les répertoires ou seulement ceux de la sélection courante.|M\Afermer tous les répertoires ou seulement ceux de la sélection courante.
it.ro.HelpHotToolbar2:\Tpulsante apri directory.|M\Sapri tutte le directory dei segnalibri.|M\Achiudi tutte le directory dei segnalibri.
nl.ro.HelpHotToolbar2:Dit is de Open map-knop.|MKlik met KIES om alle mappen in de favorietenlijst te openen.|MKlik met PASAAN om alle mappen in de favorietenlijst te sluiten.
zh_CN.ro.HelpHotToolbar2:\T打开目录键。|M\S打开常用列表中的所有目录。|M\A关闭常用列表中的所有目录。
@@ -6652,7 +6688,7 @@ zh_CN.ro.HelpHotToolbar4:\T创建键。|M\S创建新目录。
en.ro.HelpHotlistMenu0:\Rperform an operation on the hotlist.
de.ro.HelpHotlistMenu0:Untermenü Hotlist. Bearbeiten der Hotlist.
-fr.ro.HelpHotlistMenu0:\Raccomplir une opération sur les favoris.
+fr.ro.HelpHotlistMenu0:\Raccomplir une opération sur les marque-pages.
it.ro.HelpHotlistMenu0:\Resegui un'operazione nei segnalibri.
nl.ro.HelpHotlistMenu0:Verplaats de muispijl naar rechts om een operatie uit te voeren op de favorietenlijst.
zh_CN.ro.HelpHotlistMenu0:\R在常用列表上执行æ“作。
@@ -6680,14 +6716,14 @@ zh_CN.ro.HelpHotlistMenu0-0-1:\R创建新网å€ã€‚
en.ro.HelpHotlistMenu0-1:\Rexport the hotlist as an HTML file.
de.ro.HelpHotlistMenu0-1:Die gesamte Hotlist als HTML Datei speichern.
-fr.ro.HelpHotlistMenu0-1:\Rexporter les favoris en fichier HTML.
+fr.ro.HelpHotlistMenu0-1:\Rexporter les marque-pages en fichier HTML.
it.ro.HelpHotlistMenu0-1:\Resporta i segnalibri come file HTML.
nl.ro.HelpHotlistMenu0-1:Verplaats de muispijl naar rechts om de favorietenlijst te exporteren als een HTML-bestand.
zh_CN.ro.HelpHotlistMenu0-1:\R将常用列表导出为 HTML 文件。
en.ro.HelpHotlistMenu0-2:\Rexpand items within the hotlist.
de.ro.HelpHotlistMenu0-2:Öffnen von Verzeichnissen und Anzeigen von Zusatzinformationen.
-fr.ro.HelpHotlistMenu0-2:\Rdéployer les items dans la liste des favoris.
+fr.ro.HelpHotlistMenu0-2:\Rdévelopper la liste des marque-pages.
it.ro.HelpHotlistMenu0-2:\Respandi gli elementi all'interno dei segnalibri.
nl.ro.HelpHotlistMenu0-2:Verplaats de muispijl naar rechts om bepaalde items in de favorietenlijst uit te klappen.
zh_CN.ro.HelpHotlistMenu0-2:\R展开常用列表中的项。
@@ -6715,7 +6751,7 @@ zh_CN.ro.HelpHotlistMenu0-2-2:\S显示全部æ¡ç›®è¯¦ç»†ä¿¡æ¯ã€‚
en.ro.HelpHotlistMenu0-3:\Rcollapse items within the hotlist.
de.ro.HelpHotlistMenu0-3:Schließen von Verzeichnissen und Ausblenden der Zusatzinformationen.
-fr.ro.HelpHotlistMenu0-3:\Rregrouper les items dans la liste des favoris.
+fr.ro.HelpHotlistMenu0-3:\Rréduire la liste des marque-pages.
it.ro.HelpHotlistMenu0-3:\Rraggruppa gli elementi all'interno dei segnalibri.
nl.ro.HelpHotlistMenu0-3:Verplaats de muispijl naar rechts om bepaalde items in de favorietenlijst in te klappen.
zh_CN.ro.HelpHotlistMenu0-3:\R折å å¸¸ç”¨åˆ—表中的项目。
@@ -6743,21 +6779,21 @@ zh_CN.ro.HelpHotlistMenu0-3-2:\Séšè—所有æ¡ç›®è¯¦ç»†ä¿¡æ¯ã€‚
en.ro.HelpHotlistMenu0-4:\Rcontrol the display of NetSurf's toolbars.
de.ro.HelpHotlistMenu0-4:Knopfleisteneinstellungen vornehmen.
-fr.ro.HelpHotlistMenu0-4:\Rcontroler l'affichage des barres d'outils de Netsurf.
+fr.ro.HelpHotlistMenu0-4:\Rcontroler l’affichage des barres d’outils de Netsurf.
it.ro.HelpHotlistMenu0-4:\Rcontrolla la visualizzazione delle barre strumenti di NetSurf.
nl.ro.HelpHotlistMenu0-4:Verplaats de muispijl naar rechts om de gereedschapbalken aan te passen.
zh_CN.ro.HelpHotlistMenu0-4:\R控制显示 NetSurf 工具æ ã€‚
en.ro.HelpHotlistMenu0-4-0:\Stoggle the display of the toolbar buttons.
de.ro.HelpHotlistMenu0-4-0:Anklicken um die Knopfleiste ein- bzw. auszuschalten.
-fr.ro.HelpHotlistMenu0-4-0:\Sbasculer l'affichage des boutons de la barre d'outils.
+fr.ro.HelpHotlistMenu0-4-0:\Sbasculer l’affichage des boutons de la barre d’outils.
it.ro.HelpHotlistMenu0-4-0:\Salterna la visualizzazione dei pulsanti della barra strumenti.
nl.ro.HelpHotlistMenu0-4-0:Klik met KIES om het tonen van de knoppen van de gereedschapbalk aan of uit te zetten.
zh_CN.ro.HelpHotlistMenu0-4-0:\S切æ¢æ˜¾ç¤ºå·¥å…·æ æŒ‰é’®ã€‚
en.ro.HelpHotlistMenu0-4-1:\Stoggle toolbar edit mode.
de.ro.HelpHotlistMenu0-4-1:Anklicken zum Bearbeiten der Knopfleiste.
-fr.ro.HelpHotlistMenu0-4-1:\Sbasculer le mode d'édition de barre d'outils.
+fr.ro.HelpHotlistMenu0-4-1:\Sbasculer le mode d’édition de barre d’outils.
it.ro.HelpHotlistMenu0-4-1:\Salterna la modalità di modifica della barra strumenti.
nl.ro.HelpHotlistMenu0-4-1:Klik met KIES om de aanpasmodus van de gereedschapbalk in of uit te schakelen. Wanneer ingeschakelt, verschijnt er een balk onder de gereedschapbalk met extra knoppen die van en naar deze balk gesleept kunnen worden om deze aan te passen.
zh_CN.ro.HelpHotlistMenu0-4-1:\S切æ¢å·¥å…·æ ç¼–辑模å¼ã€‚
@@ -6771,7 +6807,7 @@ zh_CN.ro.HelpHotlistMenu1:\R对当å‰é€‰æ‹©æ‰§è¡Œæ“作。
en.ro.HelpHotlistMenu1-0:\Redit the current item.
de.ro.HelpHotlistMenu1-0:Ändern des markierten Elementes in der Hotlist.
-fr.ro.HelpHotlistMenu1-0:\Rééditer l'item en cours.
+fr.ro.HelpHotlistMenu1-0:\Rééditer l’item en cours.
it.ro.HelpHotlistMenu1-0:\Rmodifica l'oggetto corrente.
nl.ro.HelpHotlistMenu1-0:Klik met KIES om de naam van dit item te wijzigen
zh_CN.ro.HelpHotlistMenu1-0:\R编辑当å‰é¡¹ã€‚
@@ -6785,7 +6821,7 @@ zh_CN.ro.HelpHotlistMenu1-1:\Så¯åŠ¨å½“å‰é€‰é¡¹ã€‚
en.ro.HelpHotlistMenu1-2:\Sdelete the current selection from the hotlist.
de.ro.HelpHotlistMenu1-2:Löscht markierte Elemente aus der Hotlist.|MAchtung: Verzeichnisse werden mit allen in ihnen enthaltenen Einträgen gelöscht.
-fr.ro.HelpHotlistMenu1-2:\Ssupprimer la sélection courante de la liste des favoris.
+fr.ro.HelpHotlistMenu1-2:\Ssupprimer la sélection courante des marque-pages.
it.ro.HelpHotlistMenu1-2:\Scancella dai segnalibri la selezione corrente.
nl.ro.HelpHotlistMenu1-2:Klik met KIES om deze selectie uit de favorietenlijst te verwijderen.
zh_CN.ro.HelpHotlistMenu1-2:\S从常用列表中删除当å‰é€‰é¡¹ã€‚
@@ -6799,7 +6835,7 @@ zh_CN.ro.HelpHotlistMenu1-3:\Sé‡ç½®æ‰€é€‰é¡¹çš„统计信æ¯ï¼Œå¦‚访问计数ç­
en.ro.HelpHotlistMenu2:\Sselect all the items in the hotlist.
de.ro.HelpHotlistMenu2:Markiert alle Elemente der Hotlist.
-fr.ro.HelpHotlistMenu2:\Ssélectionner tous les items de la liste des favoris.
+fr.ro.HelpHotlistMenu2:\Ssélectionner tous les marque-pages.
it.ro.HelpHotlistMenu2:\Sseleziona tutti gli elementi dei segnalibri.
nl.ro.HelpHotlistMenu2:Klik met KIES om alle items in de favorietenlijst te selecteren.
zh_CN.ro.HelpHotlistMenu2:\S选择常用列表中的所有项。
@@ -6813,7 +6849,7 @@ zh_CN.ro.HelpHotlistMenu3:\Så–消选择所有选定项。
en.ro.HelpGHistory:\Tglobal history window.
de.ro.HelpGHistory:Das ist das Fenster der globalen History.
-fr.ro.HelpGHistory:\Tla fenêtre d'historique global.
+fr.ro.HelpGHistory:\Tla fenêtre d’historique global.
it.ro.HelpGHistory:\Tfinestra della cronologia globale.
nl.ro.HelpGHistory:Dit venster toont de browsergeschiedenis.
zh_CN.ro.HelpGHistory:\T全局历å²è®°å½•çª—å£ã€‚
@@ -6827,14 +6863,14 @@ zh_CN.ro.HelpGHistoryToolbar0:\T删除键。|M\S删除当å‰é€‰é¡¹ã€‚
en.ro.HelpGHistoryToolbar1:\Texpand entries button.|M\Sexpand all entries in the history.|M\Acollapse all entries in the history.|MExpanded entries show additional details, such as a visit counter.
de.ro.HelpGHistoryToolbar1:Expandiert Einträge.|MAnklicken mit AUSWAHL expandiert alle Adressen.|MAnklicken mit SPEZIAL macht die Expansion aller Adressen rückgängig.|MIn expandierten Adressen werden Zusatzinformationen angezeigt.
-fr.ro.HelpGHistoryToolbar1:\Tle bouton de déploiement des entrées.|M\Sdéployer toutes les adresses des favoris.|M\Aregrouper toutes les adresses des favoris.|MLes adresses déployées apportent des détails supplémentaires, comme un compteur de visites.
+fr.ro.HelpGHistoryToolbar1:\Tle bouton de développement des entrées.|M\Sdévelopper toutes les entrées de l’historique.|M\Aréduire toutes les entrées de l’historique.|MLes adresses développées affichent des détails supplémentaires, comme un compteur de visites.
it.ro.HelpGHistoryToolbar1:\Tpulsante espandi voci.|M\Sespandi tutte le voci nella cronologia.|M\Araggruppa tutte le voci nella cronologia.|ML'espansione delle voci mostra dettagli addizionali quali ad esempio il numero delle visite.
nl.ro.HelpGHistoryToolbar1:Dit is de Detail-knop.|MKlik met KIES om alle items in de broswergeschiedenis uit te klappen.|MKlik met PASAAN om alle items in te klappen.|MUitgeklapte items tonen aanvullende details, zoals een bezoekteller.
zh_CN.ro.HelpGHistoryToolbar1:\T展开æ¡ç›®é”®ã€‚|M\S展开历å²è®°å½•ä¸­çš„所有æ¡ç›®ã€‚|M\A折å åŽ†å²è®°å½•ä¸­çš„所有æ¡ç›®ã€‚|M展开的æ¡ç›®æ˜¾ç¤ºå…¶ä»–详细信æ¯ï¼Œå¦‚访问计数器。
en.ro.HelpGHistoryToolbar2:\Topen sections button.|M\Sopen all sections in the global history.|M\Aclose all sections in the global history.
de.ro.HelpGHistoryToolbar2:Öffnet Verzeichnisse.|MAnklicken mit AUSWAHL öffnet alle Verzeichnisse.|MAnklicken mit SPEZIAL schließt alle geöffneten Verzeichnisse.
-fr.ro.HelpGHistoryToolbar2:\Tle bouton d'ouverture de répertoires.|M\Souvrir tous les répertoires des favoris.|M\Afermer tous les répertoires des favoris.
+fr.ro.HelpGHistoryToolbar2:\Tle bouton d’ouverture des sections.|M\Souvrir toutes les sections de l’historique.|M\Afermer toutes les sections de l’historique.
it.ro.HelpGHistoryToolbar2:\Tpulsante apri sezioni.|M\Sapri tutte le sezioni nella cronologia globale.|M\Achiudi tutte le sezioni nella cronologia globale.
nl.ro.HelpGHistoryToolbar2:Dit is de Open tijdsmappen-knop.|MKlik met KIES om alle tijdsmappen in de browsergeschiedenis te openen.|MKlik met PASAAN om alle tijdsmappen te sluiten.
zh_CN.ro.HelpGHistoryToolbar2:\T打开分区键。|M\S打开全局历å²è®°å½•ä¸­çš„所有分区。|M\A关闭全局历å²è®°å½•ä¸­çš„所有分区。
@@ -6848,21 +6884,21 @@ zh_CN.ro.HelpGHistoryToolbar3:\Tå¯åŠ¨é”®ã€‚|M\Så¯åŠ¨å½“å‰é€‰é¡¹ã€‚
en.ro.HelpGHistoryMenu0:\Rperform an operation on global history.
de.ro.HelpGHistoryMenu0:Die globale History bearbeiten.
-fr.ro.HelpGHistoryMenu0:\Reffectuer une opération sur l'historique global.
+fr.ro.HelpGHistoryMenu0:\Reffectuer une opération sur l’historique global.
it.ro.HelpGHistoryMenu0:\Resegui un'operazione nella cronologia globale.
nl.ro.HelpGHistoryMenu0:Verplaats de muispijl naar rechts om een operatie uit te voeren op de browsergeschiedenis.
zh_CN.ro.HelpGHistoryMenu0:\R对全局历å²è®°å½•æ‰§è¡Œæ“作。
en.ro.HelpGHistoryMenu0-0:\Rexport global history as an HTML file.
de.ro.HelpGHistoryMenu0-0:Speichert die History (global) als HTML Datei.
-fr.ro.HelpGHistoryMenu0-0:\Rexporter l'historique global en fichier HTML.
+fr.ro.HelpGHistoryMenu0-0:\Rexporter l’historique global en fichier HTML.
it.ro.HelpGHistoryMenu0-0:\Resporta la cronologia globale come file HTML.
nl.ro.HelpGHistoryMenu0-0:Verplaats de muispijl naar rechts om de browsergeschiedenis te exporteren als een HTML-bestand.
zh_CN.ro.HelpGHistoryMenu0-0:\R将全局历å²è®°å½•å¯¼å‡ºä¸º HTML 文件。
en.ro.HelpGHistoryMenu0-1:\Rexpand items within global history.
de.ro.HelpGHistoryMenu0-1:Mehr Information anzeigen
-fr.ro.HelpGHistoryMenu0-1:\Rdéployer les items de l'historique global.
+fr.ro.HelpGHistoryMenu0-1:\Rdévelopper les items de l’historique global.
it.ro.HelpGHistoryMenu0-1:\Respandi gli elementi all'interno della cronologia globale.
nl.ro.HelpGHistoryMenu0-1:Verplaats de muispijl naar rechts om bepaalde items in de browsergeschiedenis uit te klappen.
zh_CN.ro.HelpGHistoryMenu0-1:\R展开全局历å²è®°å½•ä¸­çš„项。
@@ -6890,7 +6926,7 @@ zh_CN.ro.HelpGHistoryMenu0-1-2:\S显示全部æ¡ç›®è¯¦ç»†ä¿¡æ¯ã€‚
en.ro.HelpGHistoryMenu0-2:\Rcollapse items within global history.
de.ro.HelpGHistoryMenu0-2:Weniger Information anzeigen
-fr.ro.HelpGHistoryMenu0-2:\Rregrouper les items de l'historique global.
+fr.ro.HelpGHistoryMenu0-2:\Rréduire les entrées de l’historique global.
it.ro.HelpGHistoryMenu0-2:\Rraggruppa gli elementi all'interno della cronologia globale.
nl.ro.HelpGHistoryMenu0-2:Verplaats de muispijl naar rechts om bepaalde items in de browsergeschiedenis in te klappen.
zh_CN.ro.HelpGHistoryMenu0-2:\R折å å…¨å±€åŽ†å²è®°å½•ä¸­çš„项。
@@ -6918,21 +6954,21 @@ zh_CN.ro.HelpGHistoryMenu0-2-2:\Séšè—所有æ¡ç›®è¯¦ç»†ä¿¡æ¯ã€‚
en.ro.HelpGHistoryMenu0-3:\Rcontrol the display of NetSurf's toolbars.
de.ro.HelpGHistoryMenu0-3:Die Iconleiste der globalen History verändern.
-fr.ro.HelpGHistoryMenu0-3:\Rcontroler l'affichage des barre d'outils de NetSurf.
+fr.ro.HelpGHistoryMenu0-3:\Rcontroler l’affichage des barre d’outils de NetSurf.
it.ro.HelpGHistoryMenu0-3:\Rcontrolla la visualizzazione delle barre strumenti di NetSurf.
nl.ro.HelpGHistoryMenu0-3:Verplaats de muispijl naar rechts om de gereedschapbalken aan te passen.
zh_CN.ro.HelpGHistoryMenu0-3:\R控制显示 NetSurf 工具æ ã€‚
en.ro.HelpGHistoryMenu0-3-0:\Stoggle the display of the toolbar buttons.
de.ro.HelpGHistoryMenu0-3-0:Iconleiste an- oder abschalten.
-fr.ro.HelpGHistoryMenu0-3-0:\Sbasculer l'affichage des boutons de la barre d'outils.
+fr.ro.HelpGHistoryMenu0-3-0:\Sbasculer l’affichage des boutons de la barre d’outils.
it.ro.HelpGHistoryMenu0-3-0:\Salterna la visualizzazione dei pulsanti della barra strumenti.
nl.ro.HelpGHistoryMenu0-3-0:Klik met KIES om het tonen van de knoppen op de gereedschapbalk aan of uit te zetten.
zh_CN.ro.HelpGHistoryMenu0-3-0:\S切æ¢æ˜¾ç¤ºå·¥å…·æ æŒ‰é’®ã€‚
en.ro.HelpGHistoryMenu0-3-1:\Stoggle toolbar edit mode.
de.ro.HelpGHistoryMenu0-3-1:Iconleiste bearbeiten.
-fr.ro.HelpGHistoryMenu0-3-1:\Sbasculer le mode d'édition de la barre d'outils.
+fr.ro.HelpGHistoryMenu0-3-1:\Sbasculer le mode d’édition de la barre d’outils.
it.ro.HelpGHistoryMenu0-3-1:\Salterna la modalità di modifica della barra strumenti.
nl.ro.HelpGHistoryMenu0-3-1:Klik met KIES om de aanpasmodus van de gereedschapbalk in of uit te schakelen. Wanneer ingeschakelt, verschijnt er een balk onder de gereedschapbalk met extra knoppen die van en naar deze balk gesleept kunnen worden om deze aan te passen.
zh_CN.ro.HelpGHistoryMenu0-3-1:\S切æ¢å·¥å…·æ ç¼–辑模å¼ã€‚
@@ -6953,7 +6989,7 @@ zh_CN.ro.HelpGHistoryMenu1-0:\Så¯åŠ¨å½“å‰é€‰é¡¹ã€‚
en.ro.HelpGHistoryMenu1-1:\Sdelete the current selection from global history.
de.ro.HelpGHistoryMenu1-1:Entfernt markierte Bereiche.|MAnklicken mit AUSWAHL löscht die vorher markierten Bereiche aus der History.
-fr.ro.HelpGHistoryMenu1-1:\Ssupprimer la sélection courante de l'historique global.
+fr.ro.HelpGHistoryMenu1-1:\Ssupprimer la sélection courante de l’historique global.
it.ro.HelpGHistoryMenu1-1:\Scancella la selezione corrente dalla cronologia globale.
nl.ro.HelpGHistoryMenu1-1:Klik met KIES om deze selectie uit de browsergeschiedenis te verwijderen.
zh_CN.ro.HelpGHistoryMenu1-1:\S从全局历å²è®°å½•ä¸­åˆ é™¤å½“å‰é€‰é¡¹ã€‚
@@ -6967,7 +7003,7 @@ zh_CN.ro.HelpGHistoryMenu1-2:\Sé‡ç½®æ‰€é€‰é¡¹çš„统计信æ¯ï¼Œå¦‚访问计数ç
en.ro.HelpGHistoryMenu2:\Sselect all the items in the history.
de.ro.HelpGHistoryMenu2:Markiert alle Elemente der globalen History.
-fr.ro.HelpGHistoryMenu2:\Ssélectionner tous les items des favoris.
+fr.ro.HelpGHistoryMenu2:\Ssélectionner toutes les entrées de l’historique.
it.ro.HelpGHistoryMenu2:\Sseleziona tutti gli oggetti della cronologia.
nl.ro.HelpGHistoryMenu2:Klik met KIES om alle items in de browsergeschiedenis te selecteren.
zh_CN.ro.HelpGHistoryMenu2:\S选择历å²è®°å½•ä¸­çš„所有项。
@@ -6995,7 +7031,7 @@ zh_CN.ro.HelpCookiesToolbar0:\T删除键。|M\S删除当å‰é€‰é¡¹ã€‚
en.ro.HelpCookiesToolbar1:\Texpand cookies button.|M\Sexpand all cookies in the list.|M\Acollapse all cookies in the list.|MExpanded cookies show additional details.
de.ro.HelpCookiesToolbar1:Dies ist der Schalter zum Expandieren der Einträge.|MKlicken mit AUSWAHL expandiert alle Cookies.|MKlicken mit SPEZIAL versteckt die Zusatzinformationen wieder.|MIn expandierten Cookies werden zusätzliche Informationen angezeigt.
-fr.ro.HelpCookiesToolbar1:\Tdéployer le bouton de cookies.|M\Sdéployer tous les cookies de la liste.|M\Aregrouper tous les cookies de la liste.|MDéployer les cookies permet l'affichage d'informations supplémentaires.
+fr.ro.HelpCookiesToolbar1:\Tbouton de développement des cookies.|M\Sdévelopper tous les cookies de la liste.|M\Aréduire tous les cookies de la liste.|MDévelopper les cookies permet l’affichage de détails supplémentaires.
it.ro.HelpCookiesToolbar1:\Tpulsante espandi cookie.|M\Sespandi tutti i cookie nella lista.|M\Araggruppa tutti i cookie nella lista.|ML'espansione dei cookie serve a mostrare dettagli addizionali.
nl.ro.HelpCookiesToolbar1:Dit is de Detail-knop.|MKlik met KIES om alle cookies uit te klappen.|MKlik met PASAAN om alle cookies in te klappen.|MUitgeklapte cookies tonen aanvullende details,
zh_CN.ro.HelpCookiesToolbar1:\T展开 Cookies 键。|M\S展开列表中的所有 Cookies。|M\A折å åˆ—表中的所有 Cookies。|M展开的 Cookies 显示其他详细信æ¯ã€‚
@@ -7009,14 +7045,14 @@ zh_CN.ro.HelpCookiesToolbar2:\T打开目录键。|M\S打开列表中的所有目
en.ro.HelpCookiesMenu0:\Rperform an operation on the cookie list.
de.ro.HelpCookiesMenu0:Die gesamte Liste bearbeiten.
-fr.ro.HelpCookiesMenu0:\Raccomplir une opération sur la liste de cookies.
+fr.ro.HelpCookiesMenu0:\Raccomplir une opération sur la liste des cookies.
it.ro.HelpCookiesMenu0:\Resegui un'operazione nella lista dei cookie.
nl.ro.HelpCookiesMenu0:Verplaats de muispijl naar rechts om een operatie uit te voeren op de opgeslagen cookies.
zh_CN.ro.HelpCookiesMenu0:\R对 Cookie 列表执行æ“作。
en.ro.HelpCookiesMenu0-0:\Rexpand items within the cookie list.
de.ro.HelpCookiesMenu0-0:Menü zum Expandieren der Einträge der Liste.
-fr.ro.HelpCookiesMenu0-0:\Rdéployer les items dans la liste de cookies.
+fr.ro.HelpCookiesMenu0-0:\Rdévelopper les items dans la liste des cookies.
it.ro.HelpCookiesMenu0-0:\Respandi gli elementi all'interno della lista dei cookie.
nl.ro.HelpCookiesMenu0-0:Verplaats de muispijl naar rechts om bepaalde items in het cookiesbeheervenster uit te klappen.
zh_CN.ro.HelpCookiesMenu0-0:\R展开 Cookie 列表中的项。
@@ -7044,7 +7080,7 @@ zh_CN.ro.HelpCookiesMenu0-0-2:\S显示全部 Cookie 详细信æ¯ã€‚
en.ro.HelpCookiesMenu0-1:\Rcollapse items within the cookie list.
de.ro.HelpCookiesMenu0-1:Menü zum Schließen der Einträge der Liste.
-fr.ro.HelpCookiesMenu0-1:\Rregrouper les items dans la liste de cookies.
+fr.ro.HelpCookiesMenu0-1:\Rregrouper les items dans la liste des cookies.
it.ro.HelpCookiesMenu0-1:\Rragguppa gli elementi all'interno della lista dei cookie.
nl.ro.HelpCookiesMenu0-1:Verplaats de muispijl naar rechts om bepaalde items in het cookiesbeheervenster in te klappen.
zh_CN.ro.HelpCookiesMenu0-1:\RæŠ˜å  Cookie 列表中的项。
@@ -7072,21 +7108,21 @@ zh_CN.ro.HelpCookiesMenu0-1-2:\Séšè—所有 Cookie 详细信æ¯ã€‚
en.ro.HelpCookiesMenu0-2:\Rcontrol the display of NetSurf's toolbars.
de.ro.HelpCookiesMenu0-2:Die Iconleiste verändern.
-fr.ro.HelpCookiesMenu0-2:\Rcontroler l'affichage des barres d'outils de Netsurf.
+fr.ro.HelpCookiesMenu0-2:\Rcontroler l’affichage des barres d’outils de Netsurf.
it.ro.HelpCookiesMenu0-2:\Rcontrolla la visualizzazione delle barre strumenti di NetSurf.
nl.ro.HelpCookiesMenu0-2:Verplaats de muispijl naar rechts om de gereedschapbalken aan te passen.
zh_CN.ro.HelpCookiesMenu0-2:\R控制显示 NetSurf 工具æ ã€‚
en.ro.HelpCookiesMenu0-2-0:\Stoggle the display of the toolbar buttons.
de.ro.HelpCookiesMenu0-2-0:Klicken mit AUSWAHL um die Iconleiste an- oder abzuschalten.
-fr.ro.HelpCookiesMenu0-2-0:\Sbasculer l'affichage des boutons de la barre d'outils.
+fr.ro.HelpCookiesMenu0-2-0:\Sbasculer l’affichage des boutons de la barre d’outils.
it.ro.HelpCookiesMenu0-2-0:\Salterna la visualizzazione dei pulsanti della barra strumenti.
nl.ro.HelpCookiesMenu0-2-0:Klik met KIES om het tonen van de knoppen op de gereedschapbalk aan of uit te zetten.
zh_CN.ro.HelpCookiesMenu0-2-0:\S切æ¢æ˜¾ç¤ºå·¥å…·æ æŒ‰é’®ã€‚
en.ro.HelpCookiesMenu0-2-1:\Stoggle toolbar edit mode.
de.ro.HelpCookiesMenu0-2-1:Klicken mit AUSWAHL um die Iconleiste zu bearbeiten.
-fr.ro.HelpCookiesMenu0-2-1:\Sbasculer le mode d'édition de la barre d'outils.
+fr.ro.HelpCookiesMenu0-2-1:\Sbasculer le mode d’édition de la barre d’outils.
it.ro.HelpCookiesMenu0-2-1:\Salterna la modalità di modifica della barra strumenti.
nl.ro.HelpCookiesMenu0-2-1:Klik met KIES om de aanpasmodus van de gereedschapbalk in of uit te schakelen. Wanneer ingeschakelt, verschijnt er een balk onder de gereedschapbalk met extra knoppen die van en naar deze balk gesleept kunnen worden om deze aan te passen.
zh_CN.ro.HelpCookiesMenu0-2-1:\S切æ¢å·¥å…·æ ç¼–辑模å¼ã€‚
@@ -7107,7 +7143,7 @@ zh_CN.ro.HelpCookiesMenu1-0:\S删除所有选定的 Cookies。
en.ro.HelpCookiesMenu2:\Sselect all the items in the cookie list.
de.ro.HelpCookiesMenu2:Klicken mit AUSWAHL markiert alle Cookies als gewählt.
-fr.ro.HelpCookiesMenu2:\Ssélectionner tous les items dans la liste de cookies.
+fr.ro.HelpCookiesMenu2:\Ssélectionner tous les items dans la liste des cookies.
it.ro.HelpCookiesMenu2:\Sseleziona tutti gli oggetti dalla lista dei cookie.
nl.ro.HelpCookiesMenu2:Klik met KIES om alle cookies in het cookiesbeheervenster te selecteren.
zh_CN.ro.HelpCookiesMenu2:\S选择 Cookie 列表中的所有项。
@@ -7121,7 +7157,7 @@ zh_CN.ro.HelpCookiesMenu3:\Så–消选择所有选定项。
en.ro.HelpAppInfo:\TNetSurf information \w.|MSee the about page for the contributor list and credits.
de.ro.HelpAppInfo:Das ist das Info-Fenster zu NetSurf.|MGenauere Angaben zu den Autoren, Grafikern, Übersetzern, genutzten Libraries etc. gibt es bei "Über NetSurf" im Untermenü Hilfe eines Browserfensters.
-fr.ro.HelpAppInfo:\Tla \w d'information de NetSurf.|MVoir la page "À propos de" pour une liste des contributeurs et les remerciements.
+fr.ro.HelpAppInfo:\Tla \w d’information de NetSurf.|MVoir la page "À propos de" pour une liste des contributeurs et les remerciements.
it.ro.HelpAppInfo:\TInformazioni su NetSurf \w.|MMostra la pagina delle informazioni e la lista dei ringraziamenti.
nl.ro.HelpAppInfo:Dit is het NetSurf-informatievenster.|MOpen de Bijdragen-pagina voor de lijst met degenen die bijdroegen aan het NetSurf-project.
zh_CN.ro.HelpAppInfo:\TNetSurf ä¿¡æ¯ \w。|M相关贡献者列表和制作人员åå•ï¼Œè¯·å‚阅关于页é¢ã€‚
@@ -7164,21 +7200,21 @@ zh_CN.ro.HelpConfigure3:字体é…置工具
en.ro.HelpConfigure4:Home page configuration tool
de.ro.HelpConfigure4:Homepage einstellen
-fr.ro.HelpConfigure4:Outil de configuration de la page d'accueil
+fr.ro.HelpConfigure4:Outil de configuration de la page d’accueil
it.ro.HelpConfigure4:Strumento di configurazione della pagina iniziale
nl.ro.HelpConfigure4:Begin-/Startpagina-instellingen.|MKlik op dit symbool om de begin-/startpagin in te stellen.
zh_CN.ro.HelpConfigure4:主页é…置工具
en.ro.HelpConfigure5:Image configuration tool
de.ro.HelpConfigure5:Bilderdarstellung konfigurieren
-fr.ro.HelpConfigure5:Outil de configuration d'image
+fr.ro.HelpConfigure5:Outil de configuration d’image
it.ro.HelpConfigure5:Strumento di configurazione delle immagini
nl.ro.HelpConfigure5:Afbeeldingen-instellingen.|MKlik op dit symbool om de afhandelinginstellingen van de afbeeldingen aan te passen.
zh_CN.ro.HelpConfigure5:图åƒé…置工具
en.ro.HelpConfigure6:Interface configuration tool
de.ro.HelpConfigure6:Programmverhalten für besondere Situationen einstellen
-fr.ro.HelpConfigure6:Outil de configuration d'interface
+fr.ro.HelpConfigure6:Outil de configuration d’interface
it.ro.HelpConfigure6:Strumento di configurazione dell'interfaccia
nl.ro.HelpConfigure6:Interface-instellingen.|MKlik op dit symbool om de instellingen van de gebruikersinterface aan te passen.
zh_CN.ro.HelpConfigure6:ç•Œé¢é…置工具
@@ -7318,7 +7354,7 @@ zh_CN.ro.HelpConnectConfig4:\S选择代ç†æœåŠ¡å™¨ç±»åž‹ã€‚
en.ro.HelpConnectConfig6:You can enter the proxy's host name here.
de.ro.HelpConnectConfig6:Hier kann der Hostname des Proxys eingegeben werden.
-fr.ro.HelpConnectConfig6:Vous pouvez entrer ici le nom d'hôte du proxy.
+fr.ro.HelpConnectConfig6:Vous pouvez entrer ici le nom d’hôte du proxy.
it.ro.HelpConnectConfig6:Inserisci qui il nome host del proxy.
nl.ro.HelpConnectConfig6:Voer hier de hostnaam in voor de proxy-server.
zh_CN.ro.HelpConnectConfig6:您å¯ä»¥åœ¨æ­¤å¤„输入代ç†æœåŠ¡å™¨çš„主机å。
@@ -7332,7 +7368,7 @@ zh_CN.ro.HelpConnectConfig8:您å¯ä»¥åœ¨æ­¤å¤„输入代ç†æœåŠ¡å™¨çš„端å£å·ã
en.ro.HelpConnectConfig10:You can enter a username for proxies that require authentication here.
de.ro.HelpConnectConfig10:Hier kann ein Username eingegeben werden, wenn der Proxy das erfordert.
-fr.ro.HelpConnectConfig10:Vous pouvez entrer ici un nom d'utilisateur pour les proxies nécessitant une authentification.
+fr.ro.HelpConnectConfig10:Vous pouvez entrer ici un nom d’utilisateur pour les proxies nécessitant une authentification.
it.ro.HelpConnectConfig10:Inserisci un nome utente per i proxy che richiedono autentificazione.
nl.ro.HelpConnectConfig10:Voer hier een gebruikersnaam in voor proxies die authenticifering vereisen.
zh_CN.ro.HelpConnectConfig10:您å¯ä»¥åœ¨æ­¤å¤„输入需è¦èº«ä»½éªŒè¯çš„代ç†æœåŠ¡å™¨ç”¨æˆ·å。
@@ -7444,17 +7480,17 @@ zh_CN.ro.HelpContentConfig2:这表示 NetSurf 是å¦ä¼šå°è¯•å±è”½ç½‘页上的å
en.ro.HelpContentConfig3:This indicates whether NetSurf will stop web sites from automatically opening new windows on your desktop.
de.ro.HelpContentConfig3:Stellt ein, ob NetSurf das automatische Öffnen neuer Fenster auf dem Desktop unterbinden soll.
-fr.ro.HelpContentConfig3:Ceci indique si Netsurf doit empêcher les sites web d'ouvrir automatiquement de nouvelles fenêtres sur votre Bureau.
+fr.ro.HelpContentConfig3:Ceci indique si Netsurf doit empêcher les sites web d’ouvrir automatiquement de nouvelles fenêtres sur votre Bureau.
it.ro.HelpContentConfig3:Indica se NetSurf impedirà ai siti Web di aprire automaticamente nuove finestre sul desktop.
nl.ro.HelpContentConfig3:Deze optie geeft aan of NetSurf websites, die automatisch nieuwe pagina's proberen te openen blokkeerd.
zh_CN.ro.HelpContentConfig3:这表示NetSurf是å¦ä¼šé˜»æ­¢ç½‘站在您的桌é¢ä¸Šè‡ªåŠ¨æ‰“开新窗å£ã€‚
-en.ro.HelpContentConfig4:This indicates whether NetSurf will allow external plug-ins to handle additional types of content, such as Flash.
-de.ro.HelpContentConfig4:Stellt ein, ob externe Pluginroutinen genutzt werden dürfen, um Zusatzinhalte darzustellen (z.B. Flash).
-fr.ro.HelpContentConfig4:Ceci indique si Netsurf doit autoriser les plug-ins externes à manipuler des types de contenu supplémentaires, comme le Flash.
-it.ro.HelpContentConfig4:Indica se NetSurf consentirà ai plug-in esterni di gestire tipi di contenuto aggiuntivi come il Flash.
-nl.ro.HelpContentConfig4:Deze optie geeft aan of NetSurf externe plug-ins, voor aanvullende soorten inhoud zoals Flash toestaat.
-zh_CN.ro.HelpContentConfig4:这表示 NetSurf 是å¦å…许外部æ’件æ¥å¤„ç†å…¶ä»–类型的内容,如 Flash æ’件。
+en.ro.HelpContentConfig4:This indicates whether NetSurf will allow web pages to style their content with CSS.
+de.ro.HelpContentConfig4:This indicates whether NetSurf will allow web pages to style their content with CSS.
+fr.ro.HelpContentConfig4:This indicates whether NetSurf will allow web pages to style their content with CSS.
+it.ro.HelpContentConfig4:This indicates whether NetSurf will allow web pages to style their content with CSS.
+nl.ro.HelpContentConfig4:This indicates whether NetSurf will allow web pages to style their content with CSS.
+zh_CN.ro.HelpContentConfig4:This indicates whether NetSurf will allow web pages to style their content with CSS.
en.ro.HelpContentConfig7:This indicates whether NetSurf will allow links to open in new windows.
de.ro.HelpContentConfig7:Stellt ein, ob NetSurf erlaubt, daß Links beim Aufruf neue Browserfenster öffnen dürfen.
@@ -7500,7 +7536,7 @@ zh_CN.ro.HelpFontConfig:\T字体é…ç½® \w
en.ro.HelpFontConfig3:\Tcurrently selected sans-serif font.|MNetSurf will use this font wherever a web page specifies a sans-serif typeface.
de.ro.HelpFontConfig3:Das ist die aktuell gewählte Schriftart für Sans-serif.|MNetSurf wird diese Schriftart überall dort verwenden, wo von der Webseite ein Schriftbild in Sans-serif vorgegeben wird.
-fr.ro.HelpFontConfig3:\Tla fonte sans-sérif actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu'une page web spécifiera une police sans-sérif.
+fr.ro.HelpFontConfig3:\Tla fonte sans-sérif actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu’une page web spécifiera une police sans-sérif.
it.ro.HelpFontConfig3:\Tfont sans-serif correntemente selezionato.|MNetSurf utilizzerà questo font ovunque una pagina Web specifichi un carattere tipografico di tipo sans-serif.
nl.ro.HelpFontConfig3:Dit is momenteel het geselecteerde schreefloos lettertype.|MNetSurf gebruikt dit lettertype wanneer een webpagina om deze tekststijl vraagt.
zh_CN.ro.HelpFontConfig3:\T当å‰é€‰å®šçš„无衬线字体。|M NetSurf 将在网页指定 无衬线字体的任何地方使用此字体。
@@ -7514,7 +7550,7 @@ zh_CN.ro.HelpFontConfig4:\S选择一个无衬线字体。
en.ro.HelpFontConfig6:\Tcurrently selected serif font.|MNetSurf will use this font wherever a web page specifies a serif typeface.
de.ro.HelpFontConfig6:Das ist die aktuell gewählte Schriftart für Serif.|MNetSurf wird diese Schriftart überall dort verwenden, wo von der Webseite ein Schriftbild in Serif vorgegeben wird.
-fr.ro.HelpFontConfig6:\Tla fonte sérif actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu'une page web spécifiera une police sérif.
+fr.ro.HelpFontConfig6:\Tla fonte sérif actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu’une page web spécifiera une police sérif.
it.ro.HelpFontConfig6:\Tfont serif correntemente selezionato.|MNetSurf utilizzerà questo font ovunque una pagina Web specifichi un carattere tipografico di tipo serif.
nl.ro.HelpFontConfig6:Dit is momenteel het geselecteerde lettertype met schreef.|MNetSurf gebruikt dit lettertype wanneer een webpagina om deze tekststijl vraagt.
zh_CN.ro.HelpFontConfig6:\T当å‰é€‰å®šçš„衬线字体。|M NetSurf 将在网页指定衬线字体的任何地方使用此字体。
@@ -7528,7 +7564,7 @@ zh_CN.ro.HelpFontConfig7:\S选择一个无衬线字体。
en.ro.HelpFontConfig9:\Tcurrently selected monospace font.|MNetSurf will use this font wherever a web page specifies a monospace typeface.
de.ro.HelpFontConfig9:Das ist die aktuell gewählte Schriftart für Monospace.|MNetSurf wird diese Schriftart überall dort verwenden, wo von der Webseite ein Schriftbild in Monospace vorgegeben wird.
-fr.ro.HelpFontConfig9:\Tla fonte sérif actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu'une page web spécifiera une police monospace.
+fr.ro.HelpFontConfig9:\Tla fonte sérif actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu’une page web spécifiera une police monospace.
it.ro.HelpFontConfig9:\Tfont monospaziato correntemente selezionato.|MNetSurf utilizzerà questo font ovunque una pagina Web specifichi un carattere tipografico di tipo monospaziato.
nl.ro.HelpFontConfig9:Dit is momenteel het geselecteerde monospace-lettertype.|MNetSurf gebruikt dit lettertype wanneer een webpagina om deze tekststijl vraagt.
zh_CN.ro.HelpFontConfig9:\T当å‰é€‰å®šçš„等宽字体。|M NetSurf 将在网页指定等宽字体的任何地方使用此字体。
@@ -7542,7 +7578,7 @@ zh_CN.ro.HelpFontConfig10:\S选择一个等宽字体。
en.ro.HelpFontConfig12:\Tcurrently selected cursive font.|MNetSurf will use this font wherever a web page specifies a cursive typeface.
de.ro.HelpFontConfig12:Das ist die aktuell gewählte Schriftart für Kursiv.|MNetSurf wird diese Schriftart überall dort verwenden, wo von der Webseite ein Schriftbild in Kursiv vorgegeben wird.
-fr.ro.HelpFontConfig12:\Tla fonte cursive actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu'une page web spécifiera une police cursive.
+fr.ro.HelpFontConfig12:\Tla fonte cursive actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu’une page web spécifiera une police cursive.
it.ro.HelpFontConfig12:\Tfont corsivo correntemente selezionato.|MNetSurf utilizzerà questo font ovunque una pagina Web specifichi un carattere tipografico di tipo corsivo.
nl.ro.HelpFontConfig12:Dit is momenteel het geselecteerde cursieve lettertype.|MNetSurf gebruikt dit lettertype wanneer een webpagina om deze tekststijl vraagt.
zh_CN.ro.HelpFontConfig12:\T当å‰é€‰å®šçš„手写字体。|M NetSurf 将在网页指定手写字体的任何地方使用此字体。
@@ -7556,7 +7592,7 @@ zh_CN.ro.HelpFontConfig13:\S选择一个手写字体。
en.ro.HelpFontConfig15:\Tcurrently selected fantasy font.|MNetSurf will use this font wherever a web page specifies a fantasy typeface.
de.ro.HelpFontConfig15:Das ist die aktuell gewählte Schriftart für Fantasy.|MNetSurf wird diese Schriftart überall dort verwenden, wo von der Webseite ein Schriftbild in Fantasy vorgegeben wird.
-fr.ro.HelpFontConfig15:\Tla fonte fantaisie actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu'une page web spécifiera une police fantaisie.
+fr.ro.HelpFontConfig15:\Tla fonte fantaisie actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu’une page web spécifiera une police fantaisie.
it.ro.HelpFontConfig15:\Tfont fantasia correntemente selezionato.|MNetSurf utilizzerà questo font ovunque una pagina Web specifichi un carattere tipografico di tipo fantasia.
nl.ro.HelpFontConfig15:Dit is momenteel het geselecteerde fantasie-lettertype.|MNetSurf gebruikt dit lettertype wanneer een webpagina om deze tekststijl vraagt.
zh_CN.ro.HelpFontConfig15:\T当å‰é€‰å®šçš„ Fantasy 字体。|M NetSurf 将在网页指定 Fantasy 字体的任何地方使用此字体。
@@ -7570,7 +7606,7 @@ zh_CN.ro.HelpFontConfig16:\S选择一个 Fantasy 字体。
en.ro.HelpFontConfig18:\Tcurrently selected font family.|MNetSurf will use this wherever a web page does not specify a typeface.
de.ro.HelpFontConfig18:Das ist die aktuell gewählte Schriftart für die Standardtextanzeige.|MNetSurf wird diese Schriftart überall dort verwenden, wo von der Webseite KEIN bestimmtes Schriftbild vorgegeben wird.
-fr.ro.HelpFontConfig18:\Tla famille de fontes actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu'une page web ne spécifiera aucune police.
+fr.ro.HelpFontConfig18:\Tla famille de fontes actuellement sélectionnée.|MNetsurf utilisera cette fonte à chaque fois qu’une page web ne spécifiera aucune police.
it.ro.HelpFontConfig18:\Tfamiglia font correntemente selezionata.|MNetSurf lo utilizzerà laddove una pagina Web non specifichi un carattere tipografico.
nl.ro.HelpFontConfig18:Dit is momenteel het geselecteerde lettertypesoort.|MNetSurf gebruikt dit lettertype als een webpagina geen lettertypesoort specificeerd.
zh_CN.ro.HelpFontConfig18:\T当å‰é€‰å®šçš„字体家æ—。|M NetSurf 将在网页未指定字体的地方使用此字体。
@@ -7584,7 +7620,7 @@ zh_CN.ro.HelpFontConfig19:\S选择默认字体家æ—。
en.ro.HelpFontConfig23:You can enter a default font size here.|MNetSurf will use this wherever a web page does not specify a font size of its own.
de.ro.HelpFontConfig23:Hier kann eine Standarfontgröße gewählt werden.|MNetSurf wird diese Größe immer dann verwenden, wenn von der Webseite keine eigene Schriftgröße eingestellt wird.
-fr.ro.HelpFontConfig23:Vous pouvez entrer ici une taille par défaut.|MNetsurf l'utilisera chaque fois qu'une page web ne spécifiera pas de taille de fonte.
+fr.ro.HelpFontConfig23:Vous pouvez entrer ici une taille par défaut.|MNetsurf l’utilisera chaque fois qu’une page web ne spécifiera pas de taille de fonte.
it.ro.HelpFontConfig23:Puoi inserire qui la dimensione predefinita del carattere.|MNetSurf lo utilizzerà laddove una pagina Web non specifichi una propria dimensione del carattere.
nl.ro.HelpFontConfig23:In dit veld kan een standaardlettergrootte ingevoerd worden.|MNetSurf gebruikt deze lettergrootte waar een webpagina niet van zichzelf de grootte specificeerd.
zh_CN.ro.HelpFontConfig23:您å¯ä»¥åœ¨æ­¤è¾“入默认字体大å°ã€‚|MNetSurf 将在网页未指定自己的字体大å°æ—¶ä½¿ç”¨æ­¤å¤§å°ã€‚
@@ -7605,7 +7641,7 @@ zh_CN.ro.HelpFontConfig25:\Sæ高默认字体大å°ã€‚
en.ro.HelpFontConfig28:You can enter a minimum font size here.|MNetSurf will not allow web pages to display smaller text than this.
de.ro.HelpFontConfig28:Hier kann eine minimale Schriftgröße eingestellt werden.|MNetSurf wird keine Darstellung von noch kleineren Schriften zulassen.
-fr.ro.HelpFontConfig28:Vous pouvez entrer ici une taille de fonte minimum.|MNetsurf ne permettra pas aux pages web d'afficher un texte ayant une taille plus petite.
+fr.ro.HelpFontConfig28:Vous pouvez entrer ici une taille de fonte minimum.|MNetsurf ne permettra pas aux pages web d’afficher un texte ayant une taille plus petite.
it.ro.HelpFontConfig28:Puoi inserire qui la dimensione minima del carattere.|MNetSurf non consentirà alle pagine Web di visualizzare un testo più piccolo di questo.
nl.ro.HelpFontConfig28:In dit veld kan een minimum lettertypegrootte ingevoerd worden.|MNetSurf staat webpagina's dan niet toe om kleinere lettertypes te tonen.
zh_CN.ro.HelpFontConfig28:您å¯ä»¥åœ¨æ­¤å¤„输入最å°å­—体大å°ã€‚|MNetSurf ä¸å…许网页显示å°äºŽæ­¤å¤§å°çš„文本。
@@ -7647,21 +7683,21 @@ zh_CN.ro.HelpFontConfig34:\Sä¿å­˜è¿™äº›è®¾ç½®å¹¶å…³é—­ \w。|M\A在ä¸å…³é—­ \w
en.ro.HelpHomeConfig:\Thome page configuration \w
de.ro.HelpHomeConfig:Homepage Konfiguration
-fr.ro.HelpHomeConfig:\Tla fenêtre de configuration de Page d'accueil
+fr.ro.HelpHomeConfig:\Tla fenêtre de configuration de Page d’accueil
it.ro.HelpHomeConfig:\Tconfigurazione della pagina iniziale \w
nl.ro.HelpHomeConfig:De begin/startpagina kan in dit venster gewijzigd worden.
zh_CN.ro.HelpHomeConfig:\T主页é…ç½® \w
en.ro.HelpHomeConfig3:You can enter a default home page address here.
de.ro.HelpHomeConfig3:Hier kann die Webadresse der Homepage eingegeben werden.
-fr.ro.HelpHomeConfig3:Vous pouvez entrer ici une page d'accueil par défaut.
+fr.ro.HelpHomeConfig3:Vous pouvez entrer ici une page d’accueil par défaut.
it.ro.HelpHomeConfig3:Puoi inserire qui l'indirizzo della pagina iniziale.
nl.ro.HelpHomeConfig3:Voer hier een standaard begin-/startpagina-adres in.
zh_CN.ro.HelpHomeConfig3:您å¯ä»¥åœ¨æ­¤å¤„输入默认主页网å€ã€‚
en.ro.HelpHomeConfig4:\Sselect a recently typed URL.|MThese addresses have recently been typed into a NetSurf browser \w's URL bar.
de.ro.HelpHomeConfig4:Klicken mit AUSWAHL zur schnellen Auswahl einer Adresse.|MDie angezeigten Adressen wurden in letzter Zeit in die Adressleiste eines Browserfensters eingegeben.
-fr.ro.HelpHomeConfig4:\Ssélectionner une URL récemment tapée.|MCes adresses ont été récemment tapées dans la barre d'URL du navigateur Netsurf.
+fr.ro.HelpHomeConfig4:\Ssélectionner une URL récemment tapée.|MCes adresses ont été récemment tapées dans la barre d’URL du navigateur Netsurf.
it.ro.HelpHomeConfig4:\Sseleziona un URL digitato di recente.|MQuesti indirizzi sono stati digitati recentemente nella barra indirizzi del browser NetSurf.
nl.ro.HelpHomeConfig4:Klik met KIES om een recent bezochte pagina te selecteren als startpagina.
zh_CN.ro.HelpHomeConfig4:\S选择最近键入的地å€ã€‚|M这些地å€æœ€è¿‘已键入 NetSurf æµè§ˆå™¨ \w 的地å€æ ã€‚
@@ -7675,14 +7711,14 @@ zh_CN.ro.HelpHomeConfig5:这表示 NetSurf 是å¦åœ¨å¯åŠ¨æ—¶æ‰“å¼€æµè§ˆå™¨ \wã
en.ro.HelpHomeConfig6:\Sreset the Home page options back to their default values.
de.ro.HelpHomeConfig6:Stellt die Standardeinstellungen wieder her.
-fr.ro.HelpHomeConfig6:\Srevenir aux valeurs par défaut des options de Page d'accueil.
+fr.ro.HelpHomeConfig6:\Srevenir aux valeurs par défaut des options de Page d’accueil.
it.ro.HelpHomeConfig6:\Sresetta le opzioni della pagina iniziale ai valori predefiniti.
nl.ro.HelpHomeConfig6:Klik met KIES om de startpagina-instellingen in dit venster terug te zetten op de standaardwaarden.
zh_CN.ro.HelpHomeConfig6:\S将主页选项é‡ç½®ä¸ºé»˜è®¤å€¼ã€‚
en.ro.HelpHomeConfig7:\Sclose this \w without saving changes.|M\Areturn the home options to the last saved configuration.
de.ro.HelpHomeConfig7:Klicken mit AUSWAHL schließt das Fenster ohne die Änderungen zu speichern.|MKlicken mit SPEZIAL stellt die zuletzt abgespeicherten Einstellungen wieder her.
-fr.ro.HelpHomeConfig7:\Sfermer cette fenêtre sans sauver les changements|M\Arevenir aux options de Page d'accueil précédemment sauvegardées.
+fr.ro.HelpHomeConfig7:\Sfermer cette fenêtre sans sauver les changements|M\Arevenir aux options de Page d’accueil précédemment sauvegardées.
it.ro.HelpHomeConfig7:\Schiudi questa finestra senza salvare le modifiche.|M\Aripristina le opzioni della home all'ultima configurazione salvata.
nl.ro.HelpHomeConfig7:Klik met KIES om dit venster te sluiten zonder dat de gemaakte wijzigingen worden bewaard.|MKlik met PASAAN om de gemaakte wijzigingen ongedaan te maken; het venster wordt hierbij niet gesloten.
zh_CN.ro.HelpHomeConfig7:\S关闭此 \w 而ä¸ä¿å­˜æ›´æ”¹ã€‚|M\A将主页选项æ¢å¤åˆ°ä¸Šæ¬¡ä¿å­˜çš„é…置。
@@ -7696,63 +7732,63 @@ zh_CN.ro.HelpHomeConfig8:\Sä¿å­˜è¿™äº›è®¾ç½®å¹¶å…³é—­ \w。|M\A在ä¸å…³é—­ \w
en.ro.HelpImageConfig:\Timage configuration \w
de.ro.HelpImageConfig:Das ist das Fenster zur Konfiguration der Bilddarstellungsoptionen.
-fr.ro.HelpImageConfig:\Tla fenêtre de configuration d'Image
+fr.ro.HelpImageConfig:\Tla fenêtre de configuration d’Image
it.ro.HelpImageConfig:\Tconfigurazione della immagini \w
nl.ro.HelpImageConfig:De verwerking van afbeeldingen kan in dit venster gewijzigd worden.
zh_CN.ro.HelpImageConfig:\T图åƒé…ç½® \w
en.ro.HelpImageConfig3:\Tcurrently selected foreground image quality.
de.ro.HelpImageConfig3:Das ist die aktuell gewählte Qualität für die Darstellung der Vordergrundbilder.
-fr.ro.HelpImageConfig3:\Tla qualité d'image de premier plan sélectionnée actuellement.
+fr.ro.HelpImageConfig3:\Tla qualité d’image de premier plan sélectionnée actuellement.
it.ro.HelpImageConfig3:\Tqualità dell'immagine in primo piano correntemente selezionata.
nl.ro.HelpImageConfig3:Dit is momenteel de geselecteerde voorgrondafbeeldingskwaliteit.
zh_CN.ro.HelpImageConfig3:\T当å‰é€‰æ‹©çš„å‰æ™¯å›¾åƒè´¨é‡ã€‚
en.ro.HelpImageConfig4:\Sselect a foreground image quality setting.|MError diffused provides the highest quality.
de.ro.HelpImageConfig4:Klicken mit AUSWAHL zur Wahl der Anzeigequalität für Vordergrundbilder.|MError-Diffusion bietet die beste Qualität.
-fr.ro.HelpImageConfig4:\Schoisir un réglage de qualité pour les images de premier plan.|MAvec diffusion d'erreur correspond à la meilleure qualité.
+fr.ro.HelpImageConfig4:\Schoisir un réglage de qualité pour les images de premier plan.|MAvec diffusion d’erreur correspond à la meilleure qualité.
it.ro.HelpImageConfig4:\Sseleziona una impostazione per la qualità dell'immagine in primo piano.|ML'errore diffuso fornisce la qualità migliore.
nl.ro.HelpImageConfig4:Klik met KIES om een bepaalde voorgrondafbeeldingskwaliteit te selecteren.|MFoutdiffusie biedt de hoogstmogelijke kwaliteit.
zh_CN.ro.HelpImageConfig4:\S选择å‰æ™¯å›¾åƒè´¨é‡è®¾ç½®ã€‚|M误差扩散方法å¯æ供最高质é‡ã€‚
en.ro.HelpImageConfig6:\Tcurrently selected background image quality.
de.ro.HelpImageConfig6:Das ist die aktuell gewählte Qualität für die Darstellung der Hintergrundbilder.
-fr.ro.HelpImageConfig6:\Tla qualité d'image de fond sélectionnée actuellement.
+fr.ro.HelpImageConfig6:\Tla qualité d’image de fond sélectionnée actuellement.
it.ro.HelpImageConfig6:\Tqualità dell'immagine di sfondo correntemente selezionata.
nl.ro.HelpImageConfig6:Dit is momenteel de geselecteerde achtergrondafbeeldingskwaliteit.
zh_CN.ro.HelpImageConfig6:\T当å‰é€‰æ‹©çš„背景图åƒè´¨é‡ã€‚
en.ro.HelpImageConfig7:\Sselect a background image quality setting.|MError diffused provides the highest quality.
de.ro.HelpImageConfig7:Klicken mit AUSWAHL zur Wahl der Anzeigequalität für Hintergrundbilder.|MError-Diffusion bietet die beste Qualität.
-fr.ro.HelpImageConfig7:\Schoisir un réglage de qualité pour les images de fond.|MAvec diffusion d'erreur correspond à la meilleure qualité.
+fr.ro.HelpImageConfig7:\Schoisir un réglage de qualité pour les images de fond.|MAvec diffusion d’erreur correspond à la meilleure qualité.
it.ro.HelpImageConfig7:\Sseleziona una impostazione per la qualità dell'immagine di sfondo.|ML'errore diffuso fornisce la qualità migliore.
nl.ro.HelpImageConfig7:Klik met KIES om een bepaalde achtergrondafbeeldingskwaliteit te selecteren.|MFoutdiffusie biedt de hoogstmogelijke kwaliteit.
zh_CN.ro.HelpImageConfig7:\S选择背景图åƒè´¨é‡è®¾ç½®ã€‚|M误差扩散方法å¯æ供最高质é‡ã€‚
en.ro.HelpImageConfig8:\Timage quality preview image.|MThe optimum results are achived with both foreground and background image quality set to error diffused.|MThe user guide provides more information on the implications of these options.
de.ro.HelpImageConfig8:Das ist das Vorschaubild.|MDie qualitativ besten Anzeigeresultate werden erzielt, wenn Vorder- und Hintergrundbilder per Error-Diffusion dargestellt werden.|MGenauere Informationen gibt es in der Dokumentation.
-fr.ro.HelpImageConfig8:\Timage de prévisualisation de qualité d'image.|MLes résultats optimaux sont obtenus avec des images de premier plan et de fond avec diffusion d'erreur.|MLe guide utilisateur fournit plus d'informations quant aux implications de cette option.
+fr.ro.HelpImageConfig8:\Timage de prévisualisation de qualité d’image.|MLes résultats optimaux sont obtenus avec des images de premier plan et de fond avec diffusion d’erreur.|MLe guide utilisateur fournit plus d’informations quant aux implications de cette option.
it.ro.HelpImageConfig8:\TQualità immagine di anteprima.|MI risultati ottimali vengono raggiunti impostando la qualità dell'immagine in primo piano e di sfondo su errore diffuso.|MLa guida in linea fornisce ulteriori informazioni sulle implicazioni di queste opzioni.
nl.ro.HelpImageConfig8:Dit is een kwaliteitsvoorbeeldafbeelding.|MSelecteer foutdiffusie voor zowel voorgrond- als achtergrond voor de beste kwaliteit.|MDe gebruikershandleiding geeft meer informatie over de implicaties van deze mogelijkheden.
zh_CN.ro.HelpImageConfig8:\T图åƒè´¨é‡é¢„览图åƒã€‚|M在å‰æ™¯å’ŒèƒŒæ™¯å›¾åƒè´¨é‡å‡è®¾ç½®ä¸ºè¯¯å·®æ‰©æ•£çš„情况下å¯èŽ·å¾—最佳效果。|M用户指å—æ供了有关这些选项å«ä¹‰çš„详细信æ¯ã€‚
en.ro.HelpImageConfig12:You can enter the minimum time between animation frames here.|MA very low setting can cause your computer to slow down when rapid animations are displayed and is not suitable for slow computers.
de.ro.HelpImageConfig12:Hier kann die minimale Zeitverzögerung zwischen den Frames einer Animation vorgegeben werden.|MSehr niedrige Werte können bei raschen Animationen hohe Rechenleistungen erfordern und sind darum nicht geeignet für langsamere Computer.
-fr.ro.HelpImageConfig12:Vous pouvez entrer ici le temps minimum entre deux images d'animation.|MUn réglage trop bas peut ralentir les animations affichées et ne convient pas à des ordinateurs lents.
+fr.ro.HelpImageConfig12:Vous pouvez entrer ici le temps minimum entre deux images d’animation.|MUn réglage trop bas peut ralentir les animations affichées et ne convient pas à des ordinateurs lents.
it.ro.HelpImageConfig12:Puoi inserire qui il tempo minimo tra i frame di animazione.|MUn'impostazione molto bassa potrebbe rallentare il computer qualora vengano visualizzate animazioni rapide, potrebbe quindi non essere adatta su computer lenti.
nl.ro.HelpImageConfig12:In dit veld kan de minimumtijd ingevoerd worden tussen de opeenvolgende animatiebeelden.|MEen lage waarde kan er toe leiden dat het systeem traag wordt bij het tonen van snelle animaties en is niet geschikt voor langzame systemen.
zh_CN.ro.HelpImageConfig12:您å¯ä»¥åœ¨æ­¤å¤„输入画帧之间的最短时间。|M一个éžå¸¸ä½Žçš„设置会导致您的计算机在显示快速动画时速度å˜æ…¢ï¼Œä¸é€‚åˆé€Ÿåº¦è¾ƒæ…¢çš„计算机。
en.ro.HelpImageConfig13:\Sreduce the minimum time between animation frames.
de.ro.HelpImageConfig13:Klicken mit AUSWAHL verkleinert die minimale Wartezeit zwischen aufeinanderfolgenden Einzelbildern einer Animation.
-fr.ro.HelpImageConfig13:\Sréduire le temps minimum entre deux images d'animation.
+fr.ro.HelpImageConfig13:\Sréduire le temps minimum entre deux images d’animation.
it.ro.HelpImageConfig13:\Sriduci il tempo di intervallo minimo tra i frame di animazione.
nl.ro.HelpImageConfig13:Klik met KIES om de minimumtijd tussen animatie-afbeeldingen te verkleinen.
zh_CN.ro.HelpImageConfig13:\Så‡å°‘画帧之间的最短时间。
en.ro.HelpImageConfig14:\Sincrease the minimum time between animation frames.
de.ro.HelpImageConfig14:Klicken mit AUSWAHL vergrößert die minimale Wartezeit zwischen aufeinanderfolgenden Einzelbildern einer Animation.
-fr.ro.HelpImageConfig14:\Saugmenter le temps minimum entre deux images d'animation.
+fr.ro.HelpImageConfig14:\Saugmenter le temps minimum entre deux images d’animation.
it.ro.HelpImageConfig14:\Saumenta il tempo di intervallo minimo tra i frame di animazione.
nl.ro.HelpImageConfig14:Klik met KIES om de minimumtijd tussen animatie-afbeeldingen te vergroten.
zh_CN.ro.HelpImageConfig14:\S增加画帧之间的最短时间。
@@ -7766,14 +7802,14 @@ zh_CN.ro.HelpImageConfig16:这表示 NetSurf 是å¦ç¦ç”¨ç½‘页上的动画。|M
en.ro.HelpImageConfig17:\Sreset the Image options back to their default values.
de.ro.HelpImageConfig17:Stellt die Bildoptionen zurück auf die Standardwerte.
-fr.ro.HelpImageConfig17:\Srevenir aux valeurs par défaut des options d'Image.
+fr.ro.HelpImageConfig17:\Srevenir aux valeurs par défaut des options d’Image.
it.ro.HelpImageConfig17:\Sresetta le opzioni della immagini ai valori predefiniti.
nl.ro.HelpImageConfig17:Klik met KIES om de instellingen in dit venster terug te zetten op de standaardwaarden.
zh_CN.ro.HelpImageConfig17:\S将图åƒé€‰é¡¹é‡ç½®ä¸ºé»˜è®¤å€¼ã€‚
en.ro.HelpImageConfig18:\Sclose this \w without saving changes.|M\Areturn the image options to the last saved configuration.
de.ro.HelpImageConfig18:Klicken mit AUSWAHL schließt das Fenster ohne die Änderungen zu speichern.|MKlicken mit SPEZIAL stellt die zuletzt abgespeicherten Einstellungen wieder her.
-fr.ro.HelpImageConfig18:\Sfermer cette fenêtre sans sauver les changements|M\Arevenir aux options d'Image précédemment sauvegardées.
+fr.ro.HelpImageConfig18:\Sfermer cette fenêtre sans sauver les changements|M\Arevenir aux options d’Image précédemment sauvegardées.
it.ro.HelpImageConfig18:\Schiudi questa finestra senza salvare le modifiche.|M\Aripristina le opzioni delle immagini all'ultima configurazione salvata.
nl.ro.HelpImageConfig18:Klik met KIES om dit venster te sluiten zonder dat de gemaakte wijzigingen worden bewaard.|MKlik met PASAAN om de gemaakte wijzigingen ongedaan te maken; het venster wordt hierbij niet gesloten.
zh_CN.ro.HelpImageConfig18:\S关闭此 \w 而ä¸ä¿å­˜æ›´æ”¹ã€‚|M\A将图åƒé€‰é¡¹æ¢å¤åˆ°ä¸Šæ¬¡ä¿å­˜çš„é…置。
@@ -7787,56 +7823,56 @@ zh_CN.ro.HelpImageConfig19:\Sä¿å­˜è¿™äº›è®¾ç½®å¹¶å…³é—­ \w。|M\A在ä¸å…³é—­ \
en.ro.HelpInterfaceConfig:\Tinterface configuration \w
de.ro.HelpInterfaceConfig:Fenster zur Einstellung des Programmverhaltens in ausgewählten Situationen
-fr.ro.HelpInterfaceConfig:\Tla fenêtre de configuration d'interface
+fr.ro.HelpInterfaceConfig:\Tla fenêtre de configuration d’interface
it.ro.HelpInterfaceConfig:\Tconfigurazione dell'interfaccia \w
nl.ro.HelpInterfaceConfig:De interface-instellingen kunnen in dit venster gewijzigd worden.
zh_CN.ro.HelpInterfaceConfig:\Tç•Œé¢é…ç½® \w
en.ro.HelpInterfaceConfig2:This indicates whether NetSurf will strip file extensions when saving files to disc.
de.ro.HelpInterfaceConfig2:Beim Abspeichern von Dateien auf einen Datenträger werden die Dateinamenserweiterungen (Extensions) aus dem Dateinamen entfernt.
-fr.ro.HelpInterfaceConfig2:Ceci indique si Netsurf supprime les extensions de fichiers lors d'une sauvegarde sur disque.
+fr.ro.HelpInterfaceConfig2:Ceci indique si Netsurf supprime les extensions de fichiers lors d’une sauvegarde sur disque.
it.ro.HelpInterfaceConfig2:Indica se NetSurf rimuoverà le estensioni dei file durante il salvataggio dei file su disco.
nl.ro.HelpInterfaceConfig2:Deze optie geeft aan of bestandsextensies verwijderd zullen worden bij het bewaren.
zh_CN.ro.HelpInterfaceConfig2:这表示 NetSurf 是å¦åœ¨å°†æ–‡ä»¶ä¿å­˜åˆ°ç£ç›˜æ—¶çœåŽ»æ–‡ä»¶æ‰©å±•å。
en.ro.HelpInterfaceConfig3:This indicates whether NetSurf will ask for confirmation before overwriting files of the same name.
de.ro.HelpInterfaceConfig3:Beim Abspeichern wird vor dem Ãœberschreiben namensgleicher Dateien von NetSurf nachgefragt, ob dies so erfolgen soll.
-fr.ro.HelpInterfaceConfig3:Ceci indique si Netsurf doit demander confirmation avant d'écraser des fichiers portant le même nom.
+fr.ro.HelpInterfaceConfig3:Ceci indique si Netsurf doit demander confirmation avant d’écraser des fichiers portant le même nom.
it.ro.HelpInterfaceConfig3:Indica se NetSurf chiederà conferma prima di sovrascrivere i file con lo stesso nome.
nl.ro.HelpInterfaceConfig3:Deze optie geeft aan of er toestemming wordt gevraagd voor het overschrijven van bestanden met dezelfde naam.
zh_CN.ro.HelpInterfaceConfig3:这表示 NetSurf 是å¦åœ¨è¦†ç›–åŒå文件之å‰éœ€è¦ç¡®è®¤ã€‚
en.ro.HelpInterfaceConfig6:This indicates whether NetSurf's URL suggestion feature is enabled.|MURL suggestion shows options for completing URLs as you type into NetSurf's URL bar.
de.ro.HelpInterfaceConfig6:Fantastisches Feature zum automatischen Vorschlagen von URL Adressen bei deren Eingabe.|MDiese Funktion zeigt bei der Eingabe von Webadressen in die Adressleiste mögliche sinnvolle Adressvorschläge während des Eintippens an.
-fr.ro.HelpInterfaceConfig6:Ceci indique si la fontion de suggestion d'URL de Netsurf est activée.|MLa suggestion d'URL montre les possibilités de complétion d'URL au fur et à mesure où elles sont tapées dans la barre.
+fr.ro.HelpInterfaceConfig6:Ceci indique si la fontion de suggestion d’URL de Netsurf est activée.|MLa suggestion d’URL montre les possibilités de complétion d’URL au fur et à mesure où elles sont tapées dans la barre.
it.ro.HelpInterfaceConfig6:Indica se la funzione di suggerimento URL di NetSurf sarà abilitata.|MIl suggerimento URL mostra le opzioni per il completamento degli URL durante la digitazione nella barra indirizzi di NetSurf.
nl.ro.HelpInterfaceConfig6:Deze optie geeft aan of het geven van adressuggesties is ingesteld.|MAdressuggestie geeft tijdens het typen van een adres een suggestie van het complete webadres.
zh_CN.ro.HelpInterfaceConfig6:这表示是å¦å¯ç”¨ NetSurf 的地å€å»ºè®®åŠŸèƒ½ã€‚|M当您在 NetSurf 的地å€æ ä¸­é”®å…¥æ—¶ï¼Œåœ°å€å»ºè®®ä¼šæ˜¾ç¤ºç”¨äºŽå¡«å†™åœ°å€çš„选项。
en.ro.HelpInterfaceConfig7:This indicates whether the URL for the item under the pointer in NetSurf's local history \w will be displayed.
de.ro.HelpInterfaceConfig7:In der lokalen History werden die Adressen der besuchten Webseiten schwebend über den zugehörigen Bildern eingeblendet.
-fr.ro.HelpInterfaceConfig7:Ceci indique si l'URL de l'item sous le pointeur dans la fenêtre d'historique local doit être affiché.
+fr.ro.HelpInterfaceConfig7:Ceci indique si l’URL de l’item sous le pointeur dans la fenêtre d’historique local doit être affiché.
it.ro.HelpInterfaceConfig7:Indica se verrà visualizzato l'URL dell'elemento sotto il puntatore del mouse nella finestra della cronologia locale di NetSurf.
nl.ro.HelpInterfaceConfig7:Deze optie geeft aan of het adres van een item onder de muisaanwijzer in de venstergeschiedenis zal worden getoond.
zh_CN.ro.HelpInterfaceConfig7:这表示是å¦åœ¨ NetSurf æœ¬åœ°åŽ†å² \w 中显示鼠标指针下的项地å€ã€‚
en.ro.HelpInterfaceConfig10:This indicates whether NetSurf will use a thumbnail when iconising windows to the Pinboard.
de.ro.HelpInterfaceConfig10:Beim verkleinernden Ablegen eines Browserfensters auf dem Desktophintergrund (Iconisieren) wird von NetSurf ein fensterspezifisches Icon erzeugt, welches den aktuellen Seiteninhalt wiedergibt.
-fr.ro.HelpInterfaceConfig10:Ceci indique si Netsurf doit utiliser une miniature lors de l'iconisation vers le Punaiseur (Pinboard).
+fr.ro.HelpInterfaceConfig10:Ceci indique si Netsurf doit utiliser une miniature lors de l’iconisation vers le Punaiseur (Pinboard).
it.ro.HelpInterfaceConfig10:Indica se NetSurf utilizzerà una miniatura quando si iconificano le finestre nella Pinboard.
nl.ro.HelpInterfaceConfig10:Deze optie geeft aan of er een miniatuur van de pagina wordt getoond bij het symboliseren van vensters naar het prikbord.
zh_CN.ro.HelpInterfaceConfig10:这表示 NetSurf 是å¦åœ¨å°†çª—å£å›¾æ ‡åŒ–到æ’接æ¿æ—¶ä½¿ç”¨ç¼©ç•¥å›¾ã€‚
en.ro.HelpInterfaceConfig11:\Sreset the Interface options back to their default values.
de.ro.HelpInterfaceConfig11:Stellt die Standardeinstellungen wieder her.
-fr.ro.HelpInterfaceConfig11:\Srevenir aux valeurs par défaut des options d'Interface.
+fr.ro.HelpInterfaceConfig11:\Srevenir aux valeurs par défaut des options d’Interface.
it.ro.HelpInterfaceConfig11:\Sresetta le opzioni dell'interfaccia ai valori predefiniti.
nl.ro.HelpInterfaceConfig11:Klik met KIES om de instellingen in dit venster terug te zetten op de standaardwaarden.
zh_CN.ro.HelpInterfaceConfig11:\S将界é¢é€‰é¡¹é‡ç½®ä¸ºé»˜è®¤å€¼ã€‚
en.ro.HelpInterfaceConfig12:\Sclose this \w without saving changes.|M\Areturn the interface options to the last saved configuration.
de.ro.HelpInterfaceConfig12:Klicken mit AUSWAHL schließt das Fenster ohne die Änderungen zu speichern.|MKlicken mit SPEZIAL stellt die zuletzt abgespeicherten Einstellungen wieder her.
-fr.ro.HelpInterfaceConfig12:\Sfermer cette fenêtre sans sauver les changements|M\Arevenir aux options d'Interface précédemment sauvegardées.
+fr.ro.HelpInterfaceConfig12:\Sfermer cette fenêtre sans sauver les changements|M\Arevenir aux options d’Interface précédemment sauvegardées.
it.ro.HelpInterfaceConfig12:\Schiudi questa finestra senza salvare le modifiche.|M\Aripristina le opzioni dell'interfaccia all'ultima configurazione salvata.
nl.ro.HelpInterfaceConfig12:Klik met KIES om dit venster te sluiten zonder dat de gemaakte wijzigingen worden bewaard.|MKlik met PASAAN om de gemaakte wijzigingen ongedaan te maken; het venster wordt hierbij niet gesloten.
zh_CN.ro.HelpInterfaceConfig12:\S关闭此 \w 而ä¸ä¿å­˜æ›´æ”¹ã€‚|M\A将界é¢é€‰é¡¹æ¢å¤åˆ°ä¸Šæ¬¡ä¿å­˜çš„é…置。
@@ -7850,14 +7886,14 @@ zh_CN.ro.HelpInterfaceConfig13:\Sä¿å­˜è¿™äº›è®¾ç½®å¹¶å…³é—­ \w。|M\A在ä¸å…³é
en.ro.HelpInterfaceConfig16:This indicates whether NetSurf will use an external hotlist client if available, in preference to the internal hotlist.
de.ro.HelpInterfaceConfig16:Erlaubt das Benutzen eines externen Programmes zur Verwaltung der Hotlist.
-fr.ro.HelpInterfaceConfig16:This indicates whether NetSurf will use an external hotlist client if available, in preference to the internal hotlist.
+fr.ro.HelpInterfaceConfig16:Indique si NetSurf doit utiliser un client externe pour gérer les marque-pages en remplacement de sa propre liste interne.
it.ro.HelpInterfaceConfig16:Indica se NetSurf tenterà di utilizzare un client segnalibri esterno se disponibile, al posto di quello interno.
nl.ro.HelpInterfaceConfig16:Deze optie geeft aan of de favorietenlijst via een extern programma (indien beschikbaar) beheerd mogen worden.
zh_CN.ro.HelpInterfaceConfig16:这表示 NetSurf 是å¦ä¼˜å…ˆä½¿ç”¨å¤–部常用列表客户端(如果å¯ç”¨),而ä¸æ˜¯å†…部常用列表。
en.ro.HelpInterfaceConfig18:\Tthe path to a hotlist application which will be used to display the hotlist.
de.ro.HelpInterfaceConfig18:\Tder Pfad zu einer Anwendung, die die Hotlist verwalten kann.
-fr.ro.HelpInterfaceConfig18:\Tthe path to a hotlist application which will be used to display the hotlist.
+fr.ro.HelpInterfaceConfig18:\Tle chemin vers l’application externe à utiliser pour afficher les marque-pages.
it.ro.HelpInterfaceConfig18:\Til percorso di un'applicazione esterna da utilizzare per la visualizzazione dei segnalibri.
nl.ro.HelpInterfaceConfig18:Voer in dit invoerveld het pad in van een extern programma dat de favorietenlijst mag beheren.
zh_CN.ro.HelpInterfaceConfig18:\T常用列表应用程åºçš„路径,将用æ¥æ˜¾ç¤ºå¸¸ç”¨åˆ—表。
@@ -7871,14 +7907,14 @@ zh_CN.ro.HelpLanguageConfig:\T语言é…ç½® \w
en.ro.HelpLanguageConfig3:\Tcurrently selected interface language.|MThe interface language is the language used for NetSurf's messages and dialogue boxes.
de.ro.HelpLanguageConfig3:Das ist die aktuell eingestellte Sprache für die Bedienoberfläche.|MDiese Sprache wird genutzt, um NetSurf's Meldungen, Texte der Dialogboxen, Menüs darzustellen.
-fr.ro.HelpLanguageConfig3:\Tla langue d'interface sélectionnée actuellement.|MLa langue d'interface est la langue utilisée pour les messages et les boîtes de dialogue de Netsurf.
+fr.ro.HelpLanguageConfig3:\Tla langue d’interface sélectionnée actuellement.|MLa langue d’interface est la langue utilisée pour les messages et les boîtes de dialogue de Netsurf.
it.ro.HelpLanguageConfig3:\Tla lingua dell'interfaccia correntemente selezionata.|MLa lingua dell'interfaccia � la lingua utilizzata per i messaggi e le finestre di dialogo di NetSurf.
nl.ro.HelpLanguageConfig3:Dit is momenteel de geselecteerde gebruikersinterfacetaal.|MDe interfacetaal is de taal voor de melding- en dialoogvensters.
zh_CN.ro.HelpLanguageConfig3:\T当å‰é€‰æ‹©çš„ç•Œé¢è¯­è¨€ã€‚|Mç•Œé¢è¯­è¨€æ˜¯ NetSurf æµè§ˆå™¨æ¶ˆæ¯å’Œå¯¹è¯æ¡†ä½¿ç”¨çš„语言。
en.ro.HelpLanguageConfig4:\Sselect an interface language.
de.ro.HelpLanguageConfig4:Klicken mit AUSWAHL zum Auswählen einer Oberflächensprache.
-fr.ro.HelpLanguageConfig4:\Schoisir une langue d'interface.
+fr.ro.HelpLanguageConfig4:\Schoisir une langue d’interface.
it.ro.HelpLanguageConfig4:\Sseleziona una lingua per l'interfaccia.
nl.ro.HelpLanguageConfig4:Klik met KIES om de gebruikersinterfacetaal te kiezen.
zh_CN.ro.HelpLanguageConfig4:\S选择界é¢è¯­è¨€ã€‚
@@ -7927,28 +7963,28 @@ zh_CN.ro.HelpSecurityConfig:\T安全é…ç½® \w
en.ro.HelpSecurityConfig2:This indicates whether NetSurf will send site referral information to web servers.|MWhen this is enabled NetSurf will tell the web server of a new page the address of the site you came from, after following a link.
de.ro.HelpSecurityConfig2:NetSurf sendet Seitenreferenzinformationen an Webserver.|MIst diese Option gewählt, schickt NetSurf an den Server einer neuen Webseite die Adresse der Seite von der aus die aktuelle über einen Link aufgerufen wurde.
-fr.ro.HelpSecurityConfig2:Ceci indique si Netsurf doit envoyer l'information de renvoi de site aux serveurs web.|MLorsque ceci est activé Netsurf signalera au serveur web d'une nouvelle page l'adresse du site d'où vous venez, après avoir suivi un lien.
+fr.ro.HelpSecurityConfig2:Ceci indique si Netsurf doit envoyer l’information de renvoi de site aux serveurs web.|MLorsque ceci est activé Netsurf signalera au serveur web d’une nouvelle page l’adresse du site d’où vous venez, après avoir suivi un lien.
it.ro.HelpSecurityConfig2:Indica se NetSurf invierà le informazioni di riferimento del sito ai server Web.|MQuando questo � abilitato, NetSurf comunicherà al server Web di una nuova pagina l'indirizzo del sito dal quale proveniva, dopo aver seguito un link.
nl.ro.HelpSecurityConfig2:Deze optie geeft aan of site-gerelateerde informatie naar webservers wordt meegezonden.|MIndien toegestaan, ontvangt de webserver informatie over de vorige pagina waar, via een koppeling, vandaan is gekomen.
zh_CN.ro.HelpSecurityConfig2:这表示 NetSurf 是å¦å°†ç«™ç‚¹æŽ¨èä¿¡æ¯å‘é€åˆ°ç½‘络æœåŠ¡å™¨ã€‚|Må¯ç”¨æ­¤é€‰é¡¹åŽï¼ŒNetSurf 将在跟踪链接åŽå°†æ‚¨çš„站点网å€å‘ŠçŸ¥æ–°ç½‘页的网络æœåŠ¡å™¨ã€‚
en.ro.HelpSecurityConfig6:You can enter the length of time that items are stored in global history here.
de.ro.HelpSecurityConfig6:Hier kann die Zeitdauer in Tagen angegeben werden, bis zu deren Ablauf Objekte in der globalen History gespeichert bleiben.
-fr.ro.HelpSecurityConfig6:Vous pouvez entrer ici la durée de stockage des items dans l'historique global.
+fr.ro.HelpSecurityConfig6:Vous pouvez entrer ici la durée de stockage des items dans l’historique global.
it.ro.HelpSecurityConfig6:Puoi inserire qui il periodo di tempo nel quale gli oggetti verranno memorizzati nella cronologia globale.
nl.ro.HelpSecurityConfig6:In dit veld kan de tijdsduur ingevoerd worden, dat items bewaard worden in de browsergeschiedenis.
zh_CN.ro.HelpSecurityConfig6:您å¯ä»¥åœ¨æ­¤å¤„输入项在全局历å²è®°å½•ä¸­å­˜å‚¨çš„时长。
en.ro.HelpSecurityConfig7:\Sreduce the global history duration.
de.ro.HelpSecurityConfig7:Klicken mit AUSWAHL verkürzt die Aufbewahrungszeit von Seiten in der globalen History.
-fr.ro.HelpSecurityConfig7:\Sréduire la durée de l'historique global.
+fr.ro.HelpSecurityConfig7:\Sréduire la durée de l’historique global.
it.ro.HelpSecurityConfig7:\Sriduci la durata della cronologia globale.
nl.ro.HelpSecurityConfig7:Klik met KIES om de tijdsduur van de browsergeschiedenis per dag te verminderen.
zh_CN.ro.HelpSecurityConfig7:\S缩短全局历å²è®°å½•ä¿å­˜æ—¶é—´ã€‚
en.ro.HelpSecurityConfig8:\Sincrease the global history duration.
de.ro.HelpSecurityConfig8:Klicken mit AUSWAHL verlängert die Aufbewahrungszeit von Seiten in der globalen History.
-fr.ro.HelpSecurityConfig8:\Saugmenter la durée de l'historique global.
+fr.ro.HelpSecurityConfig8:\Saugmenter la durée de l’historique global.
it.ro.HelpSecurityConfig8:\Saumenta la durata della cronologia globale.
nl.ro.HelpSecurityConfig8:Klik met KIES om de tijdsduur van de browsergeschiedenis per dag te vermeerderen,
zh_CN.ro.HelpSecurityConfig8:\S增加全局历å²è®°å½•ä¿å­˜æ—¶é—´ã€‚
@@ -8004,7 +8040,7 @@ zh_CN.ro.HelpThemeConfig4:\Sä¿å­˜è¿™äº›è®¾ç½®å¹¶å…³é—­ \w。|M\A在ä¸å…³é—­ \w
en.ro.HelpThemePConfig:This pane shows the available themes.|MThe selected icon theme is used for NetSurf browser \ws, the hotlist, global history and cookie management.
de.ro.HelpThemePConfig:Dieser Dialog zeigt die verfügbaren Themen.|MDas ausgewählte Thema wird bei der Anzeige von Browserfenster, Cookieverwaltung, Hotlist und History eingesetzt.
-fr.ro.HelpThemePConfig:Cette fenêtre indique les thèmes disponibles.|MLe thème de l'icône sélectionnée est utilisée pour les fenêtres de navigation de Netsurf, la liste des favoris et l'historique global.
+fr.ro.HelpThemePConfig:Cette fenêtre indique les thèmes disponibles.|MLe thème de l’icône sélectionnée est utilisée pour les fenêtres de navigation de Netsurf, la fenêtre des marque-pages et l’historique global.
it.ro.HelpThemePConfig:Questo pannello mostra i temi disponibili.|MIl tema delle icone selezionato verrà usato dal browser NetSurf \ws, dai segnalibri, dalla cronologia globale e dal gestore dei cookie.
nl.ro.HelpThemePConfig:Dit deelvenster toont de beschikbare thema's.|MHet geselecteerde thema wordt gebruikt in de NetSurf-browservensters, de favorietenlijst en de browsergeschiedenis.
zh_CN.ro.HelpThemePConfig:此窗格显示å¯ç”¨çš„主题。|M选定的图标主题用于 NetSurf æµè§ˆå™¨ \wsã€å¸¸ç”¨åˆ—表ã€å…¨å±€åŽ†å²è®°å½•å’Œ Cookie 管ç†ã€‚
@@ -8063,29 +8099,36 @@ zh_CN.ami.HelpToolbarWebSearch:Webæœç´¢æ \n键入文本并按下回车键使ç”
en.ami.HelpToolbarAddTab:Add tab\nLMB: Adds a new blank tab
de.ami.HelpToolbarAddTab:Tab hinzufügen.
-fr.ami.HelpToolbarAddTab:Add tab\nLMB: Adds a new blank tab
+fr.ami.HelpToolbarAddTab:Ajouter un onglet\nLMB: Ajouter un nouvel onglet vide
it.ami.HelpToolbarAddTab:Apri una nuova scheda
nl.ami.HelpToolbarAddTab:Tabblad toevoegen\nLMB: Een nieuwe leeg tabblad wordt geopend
zh_CN.ami.HelpToolbarAddTab:添加标签页\n鼠标左键:添加新的空白标签页
en.ami.PageInfo:Page info
+fr.ami.PageInfo:Information sur la page
+
en.ami.PageInfoInsecure:Insecure
+fr.ami.PageInfoInsecure:Non sécurisé
it.ami.PageInfoInsecure:Non sicuro
zh_CN.ami.PageInfoInsecure:ä¸å®‰å…¨
en.ami.PageInfoLocal:Local
+fr.ami.PageInfoLocal:Local
it.ami.PageInfoLocal:Locale
zh_CN.ami.PageInfoLocal:本地
en.ami.PageInfoSecure:Secure
+fr.ami.PageInfoSecure:Securisé
it.ami.PageInfoSecure:Sicuro
zh_CN.ami.PageInfoSecure:安全
en.ami.PageInfoWarning:Warning
+fr.ami.PageInfoWarning:Attention
it.ami.PageInfoWarning:Avviso
zh_CN.ami.PageInfoWarning:警告
en.ami.PageInfoInternal:Internal
+fr.ami.PageInfoInternal:Interne
it.ami.PageInfoInternal:Interno
zh_CN.ami.PageInfoInternal:内部
@@ -8126,7 +8169,7 @@ zh_CN.all.con_fonts:字体
en.all.con_home:Home page
de.all.con_home:Homepage
-fr.all.con_home:Page d'accueil
+fr.all.con_home:Page d’accueil
it.all.con_home:Pagina iniziale
nl.all.con_home:Startpagina
zh_CN.all.con_home:主页
@@ -8213,7 +8256,7 @@ zh_CN.all.Use:使用
en.all.HomePageURL:URL
de.all.HomePageURL:URL
-fr.all.HomePageURL:URL
+fr.all.HomePageURL:Adresse
it.all.HomePageURL:URL
nl.all.HomePageURL:Adres
zh_CN.all.HomePageURL:URL
@@ -8234,21 +8277,21 @@ zh_CN.all.HomePageCurrent:使用当å‰é¡µé¢
en.all.HomePageBlank:Use blank page
de.all.HomePageBlank:Use blank page
-fr.all.HomePageBlank:Utiliser une page vierge
+fr.all.HomePageBlank:Utiliser une page vide
it.all.HomePageBlank:Usa pagina vuota
nl.all.HomePageBlank:Gebruik een lege pagina
zh_CN.all.HomePageBlank:使用空白页é¢
en.all.ContentBlocking:Content blocking
de.all.ContentBlocking:Inhalte blockieren
-fr.all.ContentBlocking:blocage de contenu
+fr.all.ContentBlocking:Blocage de contenu
it.all.ContentBlocking:Blocca contenuti (AdBlock)
nl.all.ContentBlocking:Inhoud blokkeren
zh_CN.all.ContentBlocking:å±è”½å†…容
en.all.BlockAds:Hide advertisements
de.all.BlockAds:Werbung unterdrücken
-fr.all.BlockAds:Cacher la publicité
+fr.all.BlockAds:Cacher les publicités
it.all.BlockAds:Nascondi messaggi/banner
nl.all.BlockAds:Verberg advertenties
zh_CN.all.BlockAds:éšè—广告
@@ -8269,7 +8312,7 @@ zh_CN.ami.LocaleLang:从区域设置首选项获å–
en.all.HistoryAge:Keep history for
de.all.HistoryAge:History behalten für
-fr.all.HistoryAge:Conserver l'historique de navigation pendant
+fr.all.HistoryAge:Conserver l’historique de navigation pendant
it.all.HistoryAge:Conserva cronologia per
nl.all.HistoryAge:Bewaar geschiedenis voor
zh_CN.all.HistoryAge:ä¿å­˜åŽ†å²è®°å½•
@@ -8311,14 +8354,14 @@ zh_CN.ami.Privacy:éšç§
en.all.SendReferer:Send site referral information
de.all.SendReferer:Seitenreferenzen senden
-fr.all.SendReferer:Permettre l'envoi du referer en entête
+fr.all.SendReferer:Autoriser le partage du referer
it.all.SendReferer:Invia informazioni sul referral del sito
nl.all.SendReferer:Zend websitereferentie
zh_CN.all.SendReferer:å‘é€ç½‘站推èä¿¡æ¯
en.ami.DoNotTrack:Send header to tell websites not to track
de.ami.DoNotTrack:Webseiten das Tracking verbieten - Wunsch
-fr.ami.DoNotTrack:Activer l'envoi d'une requête "Ne pas suivre à la trace"
+fr.ami.DoNotTrack:Demander aux sites Web de « ne pas me pister »
it.ami.DoNotTrack:Invia header al sito per la richiesta di non tracciamento
nl.ami.DoNotTrack:Websites laten weten dat gebruiker niet gevolgd wil worden
zh_CN.ami.DoNotTrack:å‘é€æŠ¥å¤´ä»¥å‘ŠçŸ¥ç½‘ç«™ä¸è¦è·Ÿè¸ªèŽ·å–用户éšç§ä¿¡æ¯
@@ -8342,14 +8385,14 @@ zh_CN.all.Screen:å±å¹•
en.all.ScreenOwn:Own screen
de.all.ScreenOwn:Eigener Screen
-fr.all.ScreenOwn:Own screen
+fr.all.ScreenOwn:Écran privé
it.all.ScreenOwn:Schermo proprietario
nl.all.ScreenOwn:Eigen scherm
zh_CN.all.ScreenOwn:本机å±å¹•
en.ami.ScreenWB:Workbench
de.ami.ScreenWB:Workbench
-fr.ami.ScreenWB:Plan de travail
+fr.ami.ScreenWB:Espace de travail
it.ami.ScreenWB:Schermo Workbench
nl.ami.ScreenWB:Workbench-scherm
zh_CN.ami.ScreenWB:工作å°
@@ -8377,28 +8420,28 @@ zh_CN.all.Theme:主题
en.ami.ThemeGUI:GUI theme
de.ami.ThemeGUI:GUI theme
-fr.ami.ThemeGUI:GUI theme
+fr.ami.ThemeGUI:Thème de l’interface
it.ami.ThemeGUI:GUI theme
nl.ami.ThemeGUI:GUI theme
zh_CN.ami.ThemeGUI:GUI theme
en.ami.ThemePage:Preferred page theme
de.ami.ThemePage:Preferred page theme
-fr.ami.ThemePage:Preferred page theme
+fr.ami.ThemePage:Thème de page préféré
it.ami.ThemePage:Preferred page theme
nl.ami.ThemePage:Preferred page theme
zh_CN.ami.ThemePage:Preferred page theme
en.ami.Light:Light
de.ami.Light:Light
-fr.ami.Light:Light
+fr.ami.Light:Clair
it.ami.Light:Light
nl.ami.Light:Light
zh_CN.ami.Light:Light
en.ami.Dark:Dark
de.ami.Dark:Dark
-fr.ami.Dark:Dark
+fr.ami.Dark:Sombre
it.ami.Dark:Dark
nl.ami.Dark:Dark
zh_CN.ami.Dark:Dark
@@ -8412,21 +8455,21 @@ zh_CN.all.MousePointers:鼠标指针
en.all.TrueColour:True colour
de.all.TrueColour:TrueColour
-fr.all.TrueColour:Couleur vraie
+fr.all.TrueColour:Vraies couleurs
it.all.TrueColour:True color
nl.all.TrueColour:Ware kleuren
zh_CN.all.TrueColour:真彩
en.all.OSPointers:Use OS mouse pointers when possible
de.all.OSPointers:Mauszeiger vom OS nutzen, wenn möglich
-fr.all.OSPointers:Utiliser les pointeurs de souris du système d'exploitation lorsque cela est possible
+fr.all.OSPointers:Utiliser les pointeurs de souris du système d’exploitation lorsque cela est possible
it.all.OSPointers:Se possibile usa i puntatori del mouse di sistema
nl.all.OSPointers:Gebruik bij voorkeur besturingssysteem-muisaanwijzers
zh_CN.all.OSPointers:å°½å¯èƒ½ä½¿ç”¨æ“作系统的鼠标指针
en.all.NeedRestart:These options will not take effect until the next time NetSurf is started
de.all.NeedRestart:Diese Optionen werden erst nach einem Neustart von NetSurf aktiviert.
-fr.all.NeedRestart:Ces options ne prendront effet qu'au prochain démarrage de NetSurf
+fr.all.NeedRestart:Ces options ne prendront effet qu’au prochain démarrage de NetSurf
it.all.NeedRestart:Queste modifiche avranno effetto al prossimo riavvio di NetSurf
nl.all.NeedRestart:Deze opties worden pas actief nadat NetSurf opieuw is gestart
zh_CN.all.NeedRestart:这些选项在下次å¯åŠ¨ NetSurf 之å‰ä¸ä¼šç”Ÿæ•ˆ
@@ -8450,19 +8493,19 @@ zh_CN.ami.ProxyBypass:绕过代ç†æœåŠ¡å™¨
en.all.Fetching:Fetching
de.all.Fetching:Fetching
-fr.all.Fetching:Connexion
+fr.all.Fetching:Récupération
it.all.Fetching:Ricezione
nl.all.Fetching:ophalen
en.all.FetchesMax:Maximum fetches
de.all.FetchesMax:Maximale Anzahl an Ladevorgängen
-fr.all.FetchesMax:Maximum de connexions
+fr.all.FetchesMax:Maximum de récupération
it.all.FetchesMax:Massima
nl.all.FetchesMax:Maximaal aantal keer ophalen
zh_CN.all.FetchesMax:最大获å–æ•°
en.all.FetchesHost:Fetches per host
de.all.FetchesHost:Ladevorgänge pro Host
-fr.all.FetchesHost:Connexions par hôte
+fr.all.FetchesHost:Récupérations par hôte
it.all.FetchesHost:Per host
nl.all.FetchesHost:Fetches per host
zh_CN.all.FetchesHost:æ¯ä¸ªä¸»æœºçš„获å–次数
@@ -8486,7 +8529,7 @@ zh_CN.all.CacheNative:缓存本机版本
en.all.ScaleQuality:Higher quality scaling
de.all.ScaleQuality:Skalieren hoher Qualität
-fr.all.ScaleQuality:Graduation de qualité supérieur
+fr.all.ScaleQuality:Mise à l’échelle de haute qualité
it.all.ScaleQuality:Massima qualità di visualizzazione
nl.all.ScaleQuality:Hogere schaalkwaliteit
zh_CN.all.ScaleQuality:高质é‡ç¼©æ”¾
@@ -8535,7 +8578,7 @@ zh_CN.all.AnimSpeedLimit:é™åˆ¶é€Ÿåº¦ä¸º
en.all.AnimSpeedFrames:seconds between frames
de.all.AnimSpeedFrames:Bildintervall (Sekunden)
-fr.all.AnimSpeedFrames:secondes entre les images
+fr.all.AnimSpeedFrames:secondes entre chaque image
it.all.AnimSpeedFrames:fotogrammi al secondo
nl.all.AnimSpeedFrames:seconden per beeld
zh_CN.all.AnimSpeedFrames:æ¯å¸§ä¹‹é—´çš„秒数
@@ -8556,7 +8599,7 @@ zh_CN.all.None:æ— 
en.all.Scaled:Scaled
de.all.Scaled:Skaliert
-fr.all.Scaled:Scaled
+fr.all.Scaled:Ajusté
it.all.Scaled:Scalate
nl.all.Scaled:Geschaald
zh_CN.all.Scaled:已缩放
@@ -8589,6 +8632,13 @@ it.all.DPI:DPI
nl.all.DPI:DPI
zh_CN.all.DPI:DPI(Dot Per Inch æ¯è‹±å¯¸ç‚¹æ•°ï¼‰
+en.ami.EnableCSS:Enable CSS
+de.ami.EnableCSS:CSS benutzen
+fr.ami.EnableCSS:Activer le CSS
+it.ami.EnableCSS:Attiva CSS
+nl.ami.EnableCSS:CSS ingeschakeld
+zh_CN.ami.EnableCSS:å¯ç”¨ CSS
+
# Fonts tab
#
@@ -8615,7 +8665,7 @@ zh_CN.all.FontSerif:衬线字体
en.all.FontMono:Monospaced
de.all.FontMono:Monospace
-fr.all.FontMono:Monospace
+fr.all.FontMono:Chasse fixe
it.all.FontMono:Monospaziato
nl.all.FontMono:Monospaced
zh_CN.all.FontMono:等宽字体
@@ -8636,7 +8686,7 @@ zh_CN.all.FontFantasy:Fantasy 字体
en.ami.FontFallback:Preferred fallback
de.ami.FontFallback:wenns nicht klappt
-fr.ami.FontFallback:Police de caractères de secour préférée
+fr.ami.FontFallback:Police de caractères de remplacement préférée
it.ami.FontFallback:Fallback preferito
nl.ami.FontFallback:Favoriete reserve lettertype
zh_CN.ami.FontFallback:字体的首选åŽå¤‡
@@ -8650,7 +8700,7 @@ zh_CN.all.Default:默认
en.all.FontSize:Font size
de.all.FontSize:Schriftgröße
-fr.all.FontSize:Taille de police de caractères
+fr.all.FontSize:Taille de la police de caractères
it.all.FontSize:Dimensione Font
nl.all.FontSize:Lettertypegrootte
zh_CN.all.FontSize:字体大å°
@@ -8671,14 +8721,14 @@ zh_CN.all.Pt:pt
en.ami.FontAntialiasing:Use anti-aliasing (when possible)
de.ami.FontAntialiasing:Anti-aliasing nutzen (wenn möglich)
-fr.ami.FontAntialiasing:Utiliser l'anticrénelage (si possible)
+fr.ami.FontAntialiasing:Utiliser l’anticrénelage (si possible)
it.ami.FontAntialiasing:Usa anti-aliasing (quando possibile)
nl.ami.FontAntialiasing:Anti-aliasing (indien mogelijk) gebruiken
zh_CN.ami.FontAntialiasing:使用抗锯齿处ç†æ–¹å¼ï¼ˆå¦‚æžœå¯èƒ½ï¼‰
en.ami.FontBitmap:Allow bitmap fonts
de.ami.FontBitmap:Bitmap Fonts zulassen
-fr.ami.FontBitmap:Allow bitmap fonts
+fr.ami.FontBitmap:Autoriser les polices de caractères bitmap
it.ami.FontBitmap:Permetti font bitmap
nl.ami.FontBitmap:Allow bitmap fonts
zh_CN.ami.FontBitmap:å…许使用点阵字体
@@ -8686,14 +8736,14 @@ zh_CN.ami.FontBitmap:å…许使用点阵字体
# Font scanning
en.ami.FontScanning:Scanning fonts...
de.ami.FontScanning:Lese Fonts ein...
-fr.ami.FontScanning:Balayage de polices de caractères...
+fr.ami.FontScanning:Lecture des polices de caractères…
it.ami.FontScanning:Scansione dei font in corso...
nl.ami.FontScanning:Scannen lettertypen...
zh_CN.ami.FontScanning:正在扫æ字体…
en.ami.FontGlyphs:%ld unique glyphs found
de.ami.FontGlyphs:%ld eigenständige Glyphen gefunden
-fr.ami.FontGlyphs:%ld glyphe(s) unique(s) trouvé
+fr.ami.FontGlyphs:%ld glyphes uniques trouvés
it.ami.FontGlyphs:%ld glifi unici trovati
nl.ami.FontGlyphs:%ld unieke tekens gevonden
zh_CN.ami.FontGlyphs:找到 %ld 个字形
@@ -8703,14 +8753,14 @@ zh_CN.ami.FontGlyphs:找到 %ld 个字形
en.all.CacheMemory:Memory cache
de.all.CacheMemory:Arbeitsspeicher Cache
-fr.all.CacheMemory:Mémoire cache
+fr.all.CacheMemory:Cache en mémoire vive
it.all.CacheMemory:Memoria cache
nl.all.CacheMemory:Buffergeheugen
zh_CN.all.CacheMemory:内存缓存
en.all.CacheDisc:Disc cache
de.all.CacheDisc:Festplatten Cache
-fr.all.CacheDisc:Cache du disque
+fr.all.CacheDisc:Cache sur le disque
it.all.CacheDisc:Cache su disco
nl.all.CacheDisc:Schijfbuffer
zh_CN.all.CacheDisc:ç£ç›˜ç¼“å­˜
@@ -8748,21 +8798,21 @@ zh_CN.all.TabbedBrowsing:标签页å¼æµè§ˆ
en.all.TabActive:Open new tabs in background
de.all.TabActive:Neuen Tab im Hintergrund öffnen
-fr.all.TabActive:Ouvrir de nouveaux onglets en arrière-plan
+fr.all.TabActive:Ouvrir les nouveaux onglets en arrière plan
it.all.TabActive:Apri le nuove schede in sottofondo
nl.all.TabActive:Open nieuwe tabbladen in de achtergrond
zh_CN.all.TabActive:在åŽå°ä¸­æ‰“开新标签页
en.all.TabMiddle:Middle mouse button opens tabs
de.all.TabMiddle:Mittlere Maustaste öffnet Tab
-fr.all.TabMiddle:Bouton du milieu de la souris ouvre un onglet
+fr.all.TabMiddle:Le bouton du milieu de la souris ouvre un onglet
it.all.TabMiddle:Usa tasto centrale del mouse per aprire le schede
nl.all.TabMiddle:Middelste muisknop opent een nieuw tabblad
zh_CN.all.TabMiddle:鼠标中键点击 URL,并在新标签页中打开
en.all.TabLast:Open new tabs after all existing tabs
de.all.TabLast:Neue Tabs hinter letztem öffnen
-fr.all.TabLast:Ouvrir de nouveaux onglets après tous les onglets existants
+fr.all.TabLast:Placer les nouveaux onglets après tous les autres
it.all.TabLast:Apri le nuove schede dopo quella corrente
nl.all.TabLast:Open nieuw tabblad na alle bestaande tabbladen
zh_CN.all.TabLast:在已有标签页å³ä¾§æ‰“开新标签页
@@ -8786,13 +8836,14 @@ zh_CN.ami.TabAlways:总是显示标签页æ 
en.all.Downloads:Downloads
de.all.Downloads:Downloads
+fr.all.Downloads:Téléchargements
it.all.Downloads:Trasferimenti
nl.all.Downloads:Opgehaalde items
zh_CN.all.Downloads:下载项
en.all.ConfirmOverwrite:Request confirmation when overwriting
de.all.ConfirmOverwrite:vor Ãœberschreiben nachfragen
-fr.all.ConfirmOverwrite:Demande de confirmation lors de l'écrasement
+fr.all.ConfirmOverwrite:Demander une confirmation avant d’écraser
it.all.ConfirmOverwrite:Richiedi conferma prima di sovrascrivere
nl.all.ConfirmOverwrite:Vraag bevestiging bij overschrijven
zh_CN.all.ConfirmOverwrite:覆盖时请求确认
@@ -8806,7 +8857,7 @@ zh_CN.all.DownloadDir:默认下载ä½ç½®
en.all.DownloadNotify:Notify on completion
de.all.DownloadNotify:Downloadende melden
-fr.all.DownloadNotify:Notifier sur complétion
+fr.all.DownloadNotify:Notifier lorsque le téléchargement se termine
it.all.DownloadNotify:Notifica al completamento (Ringhio)
nl.all.DownloadNotify:Melding wanneer ophalenproces gereed is
zh_CN.all.DownloadNotify:完æˆæ—¶é€šçŸ¥
@@ -8820,7 +8871,7 @@ zh_CN.all.SearchWeb:互è”网æœç´¢
en.all.SearchURL:Search from URL bar
de.all.SearchURL:Suche über URL Leiste
-fr.all.SearchURL:Recherche depuis la barre URL
+fr.all.SearchURL:Lancer des recherches depuis la barre d’adresse
it.all.SearchURL:Ricerca da barra URL
nl.all.SearchURL:Zoek via (web)adresveld
zh_CN.all.SearchURL:从地å€æ æœç´¢
@@ -8841,7 +8892,7 @@ zh_CN.ami.OptionDocky:在 AmiDock 中显示
en.ami.PopupMenu:Use popupmenu for forms
de.ami.PopupMenu:Use popupmenu for forms
-fr.ami.PopupMenu:Use popupmenu for forms
+fr.ami.PopupMenu:Utiliser un menu popup pour les formulaires
it.ami.PopupMenu:Usa menu popup nei form
nl.ami.PopupMenu:Gebruik popup-menu for formulieren
zh_CN.ami.PopupMenu:对表格使用弹出å¼èœå•
@@ -8855,7 +8906,7 @@ zh_CN.all.Clipboard:剪贴æ¿
en.all.ClipboardUTF8:Write text as UTF-8
de.all.ClipboardUTF8:Text als UTF-8
-fr.all.ClipboardUTF8:Écrire du texte en UTF-8
+fr.all.ClipboardUTF8:Écrire le texte en UTF-8
it.all.ClipboardUTF8:Scrivi testo come UTF-8
nl.all.ClipboardUTF8:Schrijf tekst in UTF8-formaat
zh_CN.all.ClipboardUTF8:以 UTF-8 ç¼–ç å†™å…¥æ–‡ä»¶
@@ -8897,7 +8948,7 @@ zh_CN.all.OptionNoWindow:å¯åŠ¨æ—¶ä¸æ‰“开窗å£
en.all.OptionNoQuit:Do not quit when last window closed
de.all.OptionNoQuit:Nicht Beenden beim Schließen des letzten Fensters
-fr.all.OptionNoQuit:Ne pas quitter lorsque la dernière fenêtre se trouve fermée
+fr.all.OptionNoQuit:Ne pas quitter lorsque la dernière fenêtre est fermée
it.all.OptionNoQuit:Iconifica su AmiDock alla chiusura di NetSurf
nl.all.OptionNoQuit:Stop programma niet als laatste venster worden gesloten
zh_CN.all.OptionNoQuit:在最åŽä¸€ä¸ªçª—å£å…³é—­æ—¶ä¸é€€å‡º
@@ -8914,28 +8965,28 @@ zh_CN.all.Margins:è¾¹è·
en.all.Top:Top
de.all.Top:Oben
-fr.all.Top:Haut/Supérieur
+fr.all.Top:supérieure
it.all.Top:Superiore
nl.all.Top:Top
zh_CN.all.Top:顶端
en.all.Left:Left
de.all.Left:Links
-fr.all.Left:Gauche
+fr.all.Left:gauche
it.all.Left:Sinistro
nl.all.Left:Links
zh_CN.all.Left:左端
en.all.Right:Right
de.all.Right:Rechts
-fr.all.Right:Droite
+fr.all.Right:droite
it.all.Right:Destro
nl.all.Right:Rechts
zh_CN.all.Right:å³ç«¯
en.all.Bottom:Bottom
de.all.Bottom:Unten
-fr.all.Bottom:Bas/inférieur
+fr.all.Bottom:inférieure
it.all.Bottom:Inferiore
nl.all.Bottom:Onder
zh_CN.all.Bottom:底端
@@ -8949,14 +9000,14 @@ zh_CN.all.MM:毫米
en.all.Scaling:Scaling
de.all.Scaling:Skalierung
-fr.all.Scaling:Mise à l'échelle
+fr.all.Scaling:Mise à l’échelle
it.all.Scaling:Scala
nl.all.Scaling:Schaling
zh_CN.all.Scaling:缩放比例
en.all.Scale:Scale
de.all.Scale:Skalieren
-fr.all.Scale:Échelle (proportion)
+fr.all.Scale:Échelle
it.all.Scale:Scalati
nl.all.Scale:Schaal
zh_CN.all.Scale:缩放
@@ -8977,7 +9028,7 @@ zh_CN.all.SuppressImages:éšè—图åƒ
en.all.RemoveBackground:Remove background
de.all.RemoveBackground:Hintergrund entfernen
-fr.all.RemoveBackground:Retirer l'arrière-plan
+fr.all.RemoveBackground:Supprimer l’arrière plan
it.all.RemoveBackground:Rimuovi sfondo
nl.all.RemoveBackground:Verwijder achtergrond
zh_CN.all.RemoveBackground:删除背景
@@ -9041,12 +9092,12 @@ nl.all.SetPassword:Stel wachtwoord in
#nl.all.FilterImg:Maak afbeelding vloeiend
#en.all.RenderText:Blend text to background
#de.all.RenderText:Text/Hintergrund Ãœbergang weich
-#fr.all.RenderText:Fondre le texte sur l'arrière-plan
+#fr.all.RenderText:Fondre le texte sur l’arrière plan
#it.all.RenderText:Sfuma testo di sfondo
#nl.all.RenderText:Harmoniseer tekst met achtergrond
#en.all.TbarError:An error occurred when constructing the toolbar:
#de.all.TbarError:Fehler beim Aufbau der Toolbar:
-#fr.all.TbarError:Une erreur s'est produite lors de la construction de la barre d'outils:
+#fr.all.TbarError:Une erreur s’est produite lors de la construction de la barre d’outils:
#it.all.TbarError:Si è verificato un errore durante la costruzione della barra strumenti:
#nl.all.TbarError:Fout bij het maken van de gereedschapbalk:
#en.all.JNGTitle:%s (JNG image %lux%lu pixels)
@@ -9063,6 +9114,6 @@ nl.all.SetPassword:Stel wachtwoord in
#it.all.LoginLabel:Il sito web richiede delle credenziali per l'accesso.
#en.gtk.gtkToolBarTitle:Toolbar custom button store
#de.gtk.gtkToolBarTitle:Benutzerdefinierter Ort für Toolbar-Icons
-#fr.gtk.gtkToolBarTitle:Personaliser la barre d'outils
+#fr.gtk.gtkToolBarTitle:Personaliser la barre d’outils
#it.gtk.gtkToolBarTitle:Pulsanti della barra strumenti
#nl.gtk.gtkToolBarTitle:Werkbalk aanpassen
diff --git a/resources/SearchEngines b/resources/SearchEngines
index ab2a8d581..71a22697e 100644
--- a/resources/SearchEngines
+++ b/resources/SearchEngines
@@ -1,8 +1,8 @@
Google|www.google.com|https://www.google.com/search?q=%s|https://www.google.com/favicon.ico|
Yahoo|search.yahoo.com|https://search.yahoo.com/search?p=%s|https://www.yahoo.com/favicon.ico|
Bing|www.bing.com|https://www.bing.com/search?q=%s|https://www.bing.com/favicon.ico|
-Business.com|www.business.com|https://www.business.com/search/rslt_default.asp?query=%s|https://www.business.com/favicon.ico|
-Omgili|www.omgili.com|https://www.omgili.com/AAAAA/%s.html|https://omgili.com/public/images/favicon.ico|
+DuckDuckGo|www.duckduckgo.com|https://www.duckduckgo.com/html/?q=%s|https://www.duckduckgo.com/favicon.ico|fixme:Their ico upsets the current implementation
+Wikipedia|en.wikipedia.org|https://en.wikipedia.org/w/index.php?title=Special%3ASearch&search=%s|https://en.wikipedia.org/favicon.ico|
BBC News|search.bbc.co.uk|https://search.bbc.co.uk/search?q=%s&tab=ns|https://www.bbc.co.uk/favicon.ico|
Ubuntu Packages|packages.ubuntu.com|https://packages.ubuntu.com/search?keywords=%s|https://packages.ubuntu.com/favicon.ico|
Creative Commons|creativecommons.org|https://creativecommons.org/?s=%s|https://creativecommons.org/favicon.ico|fixme:favicon does not work as it is served as x-icon and is a png
@@ -12,8 +12,6 @@ Youtube|www.youtube.com|https://www.youtube.com/results?search_query=%s|https://
AOL|search.aol.com|https://search.aol.com/aol/search?query=%s|https://www.aol.com/favicon.ico|
Baidu|www.baidu.com|https://www.baidu.com/s?wd=%s|https://www.baidu.com/favicon.ico|
Amazon|www.amazon.com|https://www.amazon.com/s/ref=nb_ss_gw?field-keywords=%s|https://www.amazon.com/favicon.ico|
-Ebay|shop.ebay.com|https://shop.ebay.com/items/%s|https://www.ebay.com/favicon.ico|
+Ebay|www.ebay.com|https://www.ebay.com/sch/i.html?_nkw=%s|https://www.ebay.com/favicon.ico|
IMDB|www.imdb.com|https://www.imdb.com/find?q=%s|https://www.imdb.com/favicon.ico|
-ESPN|search.espn.go.com|https://search.espn.go.com/%s/|https://www.espn.go.com/favicon.ico|
-Wikipedia|en.wikipedia.org|https://en.wikipedia.org/w/index.php?title=Special%%3ASearch&search=%s|https://en.wikipedia.org/favicon.ico|
-DuckDuckGo|www.duckduckgo.com|https://www.duckduckgo.com/html/?q=%s|https://www.duckduckgo.com/favicon.ico|fixme:Their ico upsets the current implementation
+Stract|stract.com|https://stract.com/search?q=%s|https://stract.com/favicon.ico|
diff --git a/resources/ca-bundle b/resources/ca-bundle
index a23f26292..fd61b8b49 100644
--- a/resources/ca-bundle
+++ b/resources/ca-bundle
@@ -1,7 +1,7 @@
##
## Bundle of CA Root Certificates
##
-## Certificate data from Mozilla as of: Fri May 27 19:14:46 2022 GMT
+## Certificate data from Mozilla as of: Tue Dec 19 23:28:07 2023 GMT
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,7 +14,7 @@
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.29.
-## SHA256: 34a54d5191775c1bd37be6cfd3f09e831e072555dc3a2e51f4a2c4b0f8ada5cc
+## SHA256: 1970dd65858925d68498d2356aea6d03f764422523c5887deca8ce3ba9e1f845
##
@@ -200,27 +200,6 @@ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
-----END CERTIFICATE-----
-Security Communication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
-8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
-DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
-5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
-DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
-JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
-0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
-mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
-s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
-6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
-FL39vmwLAw==
------END CERTIFICATE-----
-
XRamp Global CA Root
====================
-----BEGIN CERTIFICATE-----
@@ -489,29 +468,6 @@ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
-----END CERTIFICATE-----
-Network Solutions Certificate Authority
-=======================================
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
-EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
-IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
-MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
-jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
-aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
-crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
-/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
-AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
-bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
-A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
-4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
-GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
-ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
COMODO ECC Certification Authority
==================================
-----BEGIN CERTIFICATE-----
@@ -626,26 +582,6 @@ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
-----END CERTIFICATE-----
-Hongkong Post Root CA 1
-=======================
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
-DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
-NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
-IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
-ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
-auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
-qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
-V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
-HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
-h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
-l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
-IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
-T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
-c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
------END CERTIFICATE-----
-
SecureSign RootCA11
===================
-----BEGIN CERTIFICATE-----
@@ -712,39 +648,6 @@ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
kpeDMdmztcpHWD9f
-----END CERTIFICATE-----
-Autoridad de Certificacion Firmaprofesional CIF A62634068
-=========================================================
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
-BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
-MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
-QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
-NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
-Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
-B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
-7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
-ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
-plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
-MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
-LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
-bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
-vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
-EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
-DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
-bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
-ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
-51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
-R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
-T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
-Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
-osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
-crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
-saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
-KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
-6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
Izenpe.com
==========
-----BEGIN CERTIFICATE-----
@@ -993,30 +896,6 @@ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE-----
-Hellenic Academic and Research Institutions RootCA 2011
-=======================================================
------BEGIN CERTIFICATE-----
-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
-O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
-aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
-AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
-IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
-1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
-71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
-8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
-3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
-MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
-MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
-b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
-XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
-/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
-7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
------END CERTIFICATE-----
-
Actalis Authentication Root CA
==============================
-----BEGIN CERTIFICATE-----
@@ -1308,40 +1187,6 @@ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
-----END CERTIFICATE-----
-E-Tugra Certification Authority
-===============================
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
-DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
-ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
-ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
-NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
-QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
-cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
-DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
-hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
-CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
-ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
-BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
-E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
-rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
-jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
-rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
-dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
-/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
-MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
-kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
-XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
-VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
-a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
-dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
-KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
-Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
-8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
-C7TbO6Orb1wdtn7os4I07QZcJA==
------END CERTIFICATE-----
-
T-TeleSec GlobalRoot Class 2
============================
-----BEGIN CERTIFICATE-----
@@ -1678,36 +1523,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----
-Staat der Nederlanden EV Root CA
-================================
------BEGIN CERTIFICATE-----
-MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
-CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
-MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
-cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
-SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
-O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
-0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
-Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
-XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
-08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
-0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
-74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
-fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
-ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
-eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
-c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
-5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
-b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
-f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
-5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
-WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
-DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
-eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
------END CERTIFICATE-----
-
IdenTrust Commercial Root CA 1
==============================
-----BEGIN CERTIFICATE-----
@@ -2159,87 +1974,6 @@ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
-----END CERTIFICATE-----
-TrustCor RootCert CA-1
-======================
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
-MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
-U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
-MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
-YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
-VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
-dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
-jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
-pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
-JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
-gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
-/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
-BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
-mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
-ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
-qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
-3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
------END CERTIFICATE-----
-
-TrustCor RootCert CA-2
-======================
------BEGIN CERTIFICATE-----
-MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
-DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
-eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
-eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
-MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
-bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
-IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
-ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
-RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
-oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
-XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
-/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
-jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
-eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
-rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
-8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
-2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
-Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
-kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
-2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
-S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
-PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
-DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
-RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
-xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
-RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
------END CERTIFICATE-----
-
-TrustCor ECA-1
-==============
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
-MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
-U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
-N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
-MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
-IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
-MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
-xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
-p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
-fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
-YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
-f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
-AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
-/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
-hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
-J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
-jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
------END CERTIFICATE-----
-
SSL.com Root Certification Authority RSA
========================================
-----BEGIN CERTIFICATE-----
@@ -3345,3 +3079,456 @@ PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR
AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW
-----END CERTIFICATE-----
+
+DigiCert TLS ECC P384 Root G5
+=============================
+-----BEGIN CERTIFICATE-----
+MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4
+NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg
+Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd
+lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj
+n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB
+/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds
+Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx
+AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA==
+-----END CERTIFICATE-----
+
+DigiCert TLS RSA4096 Root G5
+============================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG
+EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0
+MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2
+IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8
+7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU
+AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces
+tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa
+zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV
+DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q
+TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy
+z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/
+MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk
+wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E
+FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw
+GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN
+lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN
+MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/
+u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G
+OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh
+47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU
+FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ
+yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP
+bEtoL8pU9ozaMv7Da4M/OMZ+
+-----END CERTIFICATE-----
+
+Certainly Root R1
+=================
+-----BEGIN CERTIFICATE-----
+MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE
+BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN
+MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy
+dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O
+5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl
+8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl
+DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI
+XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN
+KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ
+AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb
+rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1
+VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS
+p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
+DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz
+HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d
+8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v
+MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB
+GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+
+gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH
+JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7
+fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw
+x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S
+X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8=
+-----END CERTIFICATE-----
+
+Certainly Root E1
+=================
+-----BEGIN CERTIFICATE-----
+MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0
+MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu
+bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4
+fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9
+YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E
+AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
+rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
+-----END CERTIFICATE-----
+
+Security Communication RootCA3
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw
+IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD
+b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw
+CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE
+AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r
+hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE
+NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2
+/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm
+npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY
+XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK
+p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC
+3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf
+GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw
+CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB
+/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS
+YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu
+Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O
+H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx
+YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ
+XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml
++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn
+KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9
+dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm
+6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg==
+-----END CERTIFICATE-----
+
+Security Communication ECC RootCA1
+==================================
+-----BEGIN CERTIFICATE-----
+MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD
+VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t
+dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL
+MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV
+BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo
+5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW
+BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK
+BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L
+snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
+N9k=
+-----END CERTIFICATE-----
+
+BJCA Global Root CA1
+====================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG
+EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK
+Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG
+A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD
+DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm
+CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS
+sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn
+P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW
+yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj
+eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn
+MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b
+OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh
+GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK
+H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB
+AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4
+YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ
+dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8
+60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh
+TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW
+4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp
+GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx
+4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps
+3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S
+SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI=
+-----END CERTIFICATE-----
+
+BJCA Global Root CA2
+====================
+-----BEGIN CERTIFICATE-----
+MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD
+TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg
+R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE
+BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC
+SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl
+SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK
+/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI
+1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8
+W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g
+UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==
+-----END CERTIFICATE-----
+
+Sectigo Public Server Authentication Root E46
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH
+QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2
+ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5
+WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0
+aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr
+gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0
+NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud
+DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH
+lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U
+SAGKcw==
+-----END CERTIFICATE-----
+
+Sectigo Public Server Authentication Root R46
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT
+ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1
+OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T
+ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3
+DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k
+1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf
+GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP
+FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu
+ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz
+Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A
+wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF
+plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ
+EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW
+6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI
+IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c
+mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp
+E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4
+exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M
+0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI
+84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m
+pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd
+Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b
+E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm
+J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL
+-----END CERTIFICATE-----
+
+SSL.com TLS RSA Root CA 2022
+============================
+-----BEGIN CERTIFICATE-----
+MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG
+EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg
+Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC
+VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv
+b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u
+9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y
+7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac
+oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M
+R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG
+D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW
+TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk
+8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq
+g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk
+7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud
+EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu
+N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt
+hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN
+j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by
+iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU
+o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo
+ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib
+MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi
+vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7
+P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0
+9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=
+-----END CERTIFICATE-----
+
+SSL.com TLS ECC Root CA 2022
+============================
+-----BEGIN CERTIFICATE-----
+MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
+UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v
+dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx
+GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg
+Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy
+JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1
+5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7
+81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG
+MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w
+7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5
+Zn6g6g==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot Root CA ECC TLS 2021
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB
+dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD
+VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg
+VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT
+AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K
+DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS
+b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX
+NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+
+uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY
+a3cpetskz2VAv9LcjBHo9H1/IISpQuQo
+-----END CERTIFICATE-----
+
+Atos TrustedRoot Root CA RSA TLS 2021
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD
+DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw
+CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0
+b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV
+BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB
+l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG
+vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK
+ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt
+0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK
+PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY
+sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY
+Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+
+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa
+fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G
+CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS
+4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl
+Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX
+AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G
+slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt
+afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q
+TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj
+1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l
+PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W
+HYMfRsCbvUOZ58SWLs5fyQ==
+-----END CERTIFICATE-----
+
+TrustAsia Global Root CA G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG
+A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM
+G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw
+MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu
+MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz
+lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ
+Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V
+P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag
+dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm
+9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc
+D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg
+WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea
+mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF
+TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj
+7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E
+BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1
+D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T
+G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj
+duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl
+cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys
++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli
+2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y
+aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS
+ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR
+JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH
+-----END CERTIFICATE-----
+
+TrustAsia Global Root CA G4
+===========================
+-----BEGIN CERTIFICATE-----
+MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE
+BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry
+dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa
+MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw
+IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
+AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8
+m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/
+pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA
+bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk
+dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA==
+-----END CERTIFICATE-----
+
+CommScope Public Trust ECC Root-01
+==================================
+-----BEGIN CERTIFICATE-----
+MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE
+BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz
+dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT
+AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg
+RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx
+eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot
+6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2
+Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW
+pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE=
+-----END CERTIFICATE-----
+
+CommScope Public Trust ECC Root-02
+==================================
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE
+BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz
+dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT
+AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg
+RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M
+MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE
+SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9
+Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7
+3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag==
+-----END CERTIFICATE-----
+
+CommScope Public Trust RSA Root-01
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG
+A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU
+cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV
+BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1
+c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft
+nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6
+uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq
+ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs
+vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c
+Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif
+BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9
+lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo
+KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH
++VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4
+5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6
+NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM
+3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck
+jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf
+Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W
+NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+
+o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/
+oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc
+1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM
+6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw
+-----END CERTIFICATE-----
+
+CommScope Public Trust RSA Root-02
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG
+A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU
+cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV
+BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1
+c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V
+rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx
+7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC
+e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W
+Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp
+M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf
+hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr
+eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE
+VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t
+Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx
+cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB
+KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF
+1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa
+MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd
+gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O
+HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm
+YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr
+dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ
+iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN
+lM47ni3niAIi9G7oyOzWPPO5std3eqx7
+-----END CERTIFICATE-----
diff --git a/resources/en/credits.html b/resources/en/credits.html
index 436e1d242..1a728d376 100644
--- a/resources/en/credits.html
+++ b/resources/en/credits.html
@@ -91,7 +91,7 @@ div#DevList ul {
</div>
<div class="footer ns-even-fg-subtle">
-<p class="ns-even-fg-faded ns-border">Copyright 2003&ndash;2020 The NetSurf Developers</p>
+<p class="ns-even-fg-faded ns-border">Copyright 2003&ndash;2023 The NetSurf Developers</p>
</div>
</body>
diff --git a/resources/en/licence.html b/resources/en/licence.html
index 8df32804c..0ab4c2b40 100644
--- a/resources/en/licence.html
+++ b/resources/en/licence.html
@@ -64,19 +64,19 @@ version.</p>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libcss/">LibCSS</a></dt>
<dd>
-<span>&copy; 2007&ndash;2019 John-Mark Bell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/hubbub/">Hubbub</a></dt>
<dd>
-<span>&copy; 2007&ndash;2019 John-Mark Bell<br>&copy; 2008&ndash;2009 Andrew Sidwell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell<br>&copy; 2008&ndash;2009 Andrew Sidwell</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libparserutils/">LibParserUtils</a></dt>
<dd>
-<span>&copy; 2007&ndash;2019 John-Mark Bell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell</span>
<span><a href="#mit">MIT</a></span>
</dd>
@@ -106,25 +106,25 @@ version.</p>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsbmp/">Libnsbmp</a></dt>
<dd>
-<span>&copy; 2006 Richard Wilson<br>&copy; 2008 Sean Fox<br>&copy; 2017 Vincent Sanders</span>
+<span>&copy; 2006 Richard Wilson<br>&copy; 2008 Sean Fox<br>&copy; 2017&ndash;2023 Vincent Sanders</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsfb/">Libnsfb</a></dt>
<dd>
-<span>&copy; 2009&ndash;2017 Vincent Sanders<br>&copy; 2009&ndash;2017 Michael Drake</span>
+<span>&copy; 2009&ndash;2017 Vincent Sanders<br>&copy; 2009&ndash;2023 Michael Drake</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsgif/">Libnsgif</a></dt>
<dd>
-<span>&copy; 2004 Richard Wilson</br>&copy; 2008 Sean Fox</span>
+<span>&copy; 2004 Richard Wilson</br>&copy; 2008 Sean Fox<br>&copy; 2020&ndash;2023 Michael Drake</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libwapcaplet">LibWapcaplet</a></dt>
<dd>
-<span>&copy; 2009&ndash;2020 NetSurf Browser Project, Daniel Silverstone</span>
+<span>&copy; 2009&ndash;2023 NetSurf Browser Project, Daniel Silverstone</span>
<span><a href="#mit">MIT</a></span>
</dd>
</dl>
diff --git a/resources/fr/credits.html b/resources/fr/credits.html
new file mode 100644
index 000000000..dc4b19f15
--- /dev/null
+++ b/resources/fr/credits.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>NetSurf | &Agrave; propos des cr&eacute;dits</title>
+<link rel="stylesheet" type="text/css" href="resource:internal.css">
+<style>
+div#DevList li {
+ float: left;
+ width: 18em; }
+div#DevList ul {
+ overflow: hidden; }
+</style>
+</head>
+
+<body class="ns-even-bg ns-even-fg ns-border">
+
+<h1 class="ns-border">Cr&eacute;dits NetSurf</h1>
+
+<p>NetSurf est rendu possible gr&acirc;ce &agrave; toutes ces personnes&nbsp;:</p>
+
+<div id="DevList">
+
+<h2 class="ns-border">Code</h2>
+<ul>
+<li>John-Mark Bell</li>
+<li>Michael Drake</li>
+<li>Rob Kendrick</li>
+<li>Fran&ccedil;ois Revol</li>
+<li>Vincent Sanders</li>
+<li>Daniel Silverstone</li>
+<li>Chris Young</li>
+<li>Kevin Bagust</li>
+<li>Mark Benjamin</li>
+<li>Adam Blokus</li>
+<li>Pawe&#x0142 Blokus</li>
+<li>James Bursa</li>
+<li>Stefaan Claes</li>
+<li>Calin Dobos</li>
+<li>Sean Fox</li>
+<li>Stephen Fryatt</li>
+<li>Rik Griffin</li>
+<li>Matthew Hambley</li>
+<li>Rob Jackson</li>
+<li>Jeffrey Lee</li>
+<li>Adrian Lees</li>
+<li>Michael Lester</li>
+<li>Ole Loots</li>
+<li>Phil Mellor</li>
+<li>Philip Pemberton</li>
+<li>Darren Salt</li>
+<li>James Shaw</li>
+<li>Andrew Sidwell</li>
+<li>Andrew Timmins</li>
+<li>John Tytgat</li>
+<li>Sven Weidauer</li>
+<li>Chris Williams</li>
+<li>Richard Wilson</li>
+<li>Bo Yang</li>
+</ul>
+
+<h2 class="ns-border">Documentation</h2>
+<ul>
+<li>John-Mark Bell</li>
+<li>James Bursa</li>
+<li>Michael Drake</li>
+<li>Rob Kendrick</li>
+<li>James Shaw</li>
+<li>Richard Wilson</li>
+</ul>
+
+<h2 class="ns-border">Graphismes</h2>
+<ul>
+<li>Michael Drake</li>
+<li>Andrew Duffell</li>
+<li>John Duffell</li>
+<li>Richard Hallas</li>
+<li>Phil Mellor</li>
+</ul>
+
+<h2 class="ns-border">Traductions</h2>
+<ul>
+<li>Sebastian Barthel</li>
+<li>Bruno D'Arcangeli</li>
+<li>Samir Hawamdeh</li>
+<li>Gerard van Katwijk</li>
+<li>J&eacute;r&ocirc;me Mathevet</li>
+<li>Simon Voortman</li>
+</ul>
+
+</div>
+
+<div class="footer ns-even-fg-subtle">
+<p class="ns-even-fg-faded ns-border">Copyright 2003&ndash;2023 Les d&eacute;veloppeurs de NetSurf</p>
+</div>
+
+</body>
+</html>
diff --git a/resources/fr/licence.html b/resources/fr/licence.html
new file mode 100644
index 000000000..50b68730a
--- /dev/null
+++ b/resources/fr/licence.html
@@ -0,0 +1,1876 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>NetSurf | &Agrave; propos de la licence</title>
+<link rel="stylesheet" type="text/css" href="resource:internal.css">
+<style>
+div.licence {
+ white-space: pre;
+ font-family: monospace;
+ border-width: 1px;
+ border-style: solid;
+ margin: 10mm;
+ padding: 1em 0.5em;
+}
+dl.components > dt {
+ border-bottom-width: 1px;
+ border-bottom-style: solid;
+}
+dl.components > dt > a {
+ text-decoration: none;
+}
+dl.components > dd > span {
+ display: table-cell;
+ width: 100%;
+}
+dl.components > dd > span + span {
+ width: auto;
+}
+</style>
+</head>
+
+<body class="ns-even-bg ns-even-fg ns-border">
+
+<h1 class="ns-border">Licence NetSurf</h1>
+
+<p>NetSurf, son code source, sa documentation, ses traductions et ses fichiers
+de d&eacute;finition d'interface sont disponibles selon les termes de la
+licence publique g&eacute;n&eacute;rale GNU en version 2.0. De plus, une
+exception sp&eacute;cifique est garantie de pouvoir lier le code de cette
+version de NetSurf avec la librairie &laquo;&nbsp;OpenSSL&nbsp;&raquo; mise
+&agrave; disposition par le projet OpenSSL (ou avec une version modifi&eacute;e
+de cette librairie, tant qu'elle utilise la m&ecirc;me licence que la librairie
+&laquo;&nbsp;OpenSSL&nbsp;&raquo; originale) et de distribuer les fichiers
+ex&eacute;cutables r&eacute;sultant.</p>
+
+<p>Vous devez ob&eacute;ir &agrave; la licence publique g&eacute;n&eacute;rale
+GNU en version 2 pour l'ensemble du code, autre que
+&laquo;&nbsp;OpenSSL&nbsp;&raquo;. Si vous modifiez le code, vous pouvez
+&eacute;tendre cette exception &agrave; votre propre version du code, mais vous
+n'y &ecirc;tes pas oblig&eacute;. Si vous ne souhaitez pas utiliser cette
+exception, pensez &agrave; supprimer la mention de cette exception de votre
+version du code.</p>
+
+<h2 class="ns-border">Licence des composants</h2>
+
+<p>Les cr&eacute;ations graphiques de NetSurf sont distribu&eacute;es selon la licence MIT.</p>
+
+<p>NetSurf peut &eacute;galement contenir les diff&eacute;rents composants suivant.</p>
+
+<h3>Composants issus du projet NetSurf</h3>
+
+<dl class="components">
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/">NetSurf</a></dt>
+<dd>
+<span>&copy; 2002&ndash;2020 Les d&eacute;veloppeurs de NetSurf</span>
+<span><a href="#gplv2">GPLv2</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libcss/">LibCSS</a></dt>
+<dd>
+<span>&copy; 2007&ndash;2023 John-Mark Bell</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/hubbub/">Hubbub</a></dt>
+<dd>
+<span>&copy; 2007&ndash;2023 John-Mark Bell<br>&copy; 2008&ndash;2009 Andrew Sidwell</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libparserutils/">LibParserUtils</a></dt>
+<dd>
+<span>&copy; 2007&ndash;2023 John-Mark Bell</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/librosprite/">LibROSprite</a></dt>
+<dd>
+<span>&copy; 2008 James Shaw</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libpencil">Libpencil</a></dt>
+<dd>
+<span>&copy; 2005&ndash;2006 James Bursa</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/rufl">RUfl</a></dt>
+<dd>
+<span>&copy; 2005&ndash;2009 James Bursa</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libsvgtiny">Libsvgtiny</a></dt>
+<dd>
+<span>&copy; 2008&ndash;2009 James Bursa<br>&copy; 2017 Michael Drake</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsbmp/">Libnsbmp</a></dt>
+<dd>
+<span>&copy; 2006 Richard Wilson<br>&copy; 2008 Sean Fox<br>&copy; 2017&ndash;2023 Vincent Sanders</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsfb/">Libnsfb</a></dt>
+<dd>
+<span>&copy; 2009&ndash;2017 Vincent Sanders<br>&copy; 2009&ndash;2023 Michael Drake</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsgif/">Libnsgif</a></dt>
+<dd>
+<span>&copy; 2004 Richard Wilson</br>&copy; 2008 Sean Fox<br>&copy; 2020&ndash;2023 Michael Drake</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libwapcaplet">LibWapcaplet</a></dt>
+<dd>
+<span>&copy; 2009&ndash;2023 NetSurf Browser Project, Daniel Silverstone</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+</dl>
+
+<h3>Composants tiers</h3>
+
+<dl class="components">
+<dt class="ns-border"><a href="https://curl.haxx.se/">cURL</a></dt>
+<dd>
+<span>&copy; 1996&ndash;2020 Daniel Stenberg</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://libharu.org/">Haru PDF</a></dt>
+<dd>
+<span>&copy; 2000&ndash;2008 Takeshi Kanno</span>
+<span><a href="#zlib">ZLib</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.ijg.org">libjpeg</a></dt>
+<dd>
+<span>&copy; 1991&ndash;2010 Thomas G. Lane, Guido Vollbeding</span>
+<span><a href="#ijg">IJG</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.littlecms.com/">liblcms</a></dt>
+<dd>
+<span>&copy; 1998&ndash;2007 Marti Maria Saguer</span>
+<span><a href="#mit">MIT</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://ro-oslib.sourceforge.net/">OSLib</a></dt>
+<dd>
+<span>&copy; 1994&ndash;1998 Jonathan Coxhead et contributeurs</span>
+<span><a href="#oslib">OSLib</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.openssl.org/">OpenSSL</a></dt>
+<dd>
+<span>&copy; 1995&ndash;1998 Eric A. Young, Tim J. Hudson<br>&copy; 1998&ndash;2010 The OpenSSL Project</span>
+<span><a href="#openssl">OpenSSL</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.libpng.org">libpng</a></dt>
+<dd>
+<span>&copy; 2004&ndash;2010 Glenn Randers-Pehrson</span>
+<span><a href="#png">PNG</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://www.riscos.info/websvn/listing.php?repname=gccsdk&path=%2Ftrunk%2Fgcc4%2Frecipe%2Ffiles%2Fgcc%2Flibunixlib%2F&#a9586e56e500c7fdfb58279167b82472d">UnixLib</a></dt>
+<dd>
+<span>&copy; 1995&ndash;1999 Simon Callan, Nick Burrett, Nicholas Clark et
+Peter Burwood<br>&copy; 1999&ndash;2009 Nick Burrett, John Tytgat, Peter Naulls,
+Lee Noar, Peter Teichmann, Alex Waugh, Christian Ludlam, Theo Markettos,
+Graham Shaw, James Bursa et John-Mark Bell.</span>
+<span><a href="#unixlib">UnixLib</a></span>
+</dd>
+
+<dt class="ns-border"><a href="https://zlib.net/">ZLib</a></dt>
+<dd>
+<span>&copy; 1995&ndash;2010 Jean-loup Gailly et Mark Adler</span>
+<span><a href="#zlib">ZLib</a></span>
+</dd>
+</dl>
+
+<h2 class="ns-border">Textes des licences</h2>
+
+<p>La version g&eacute;n&eacute;rique des textes des licences sont reproduits ici lorsque
+c'est possible. Certains composants utilisent des versions l&eacute;g&egrave;rement
+diff&eacute;rentes de ces textes de r&eacute;f&eacute;rence. Nous avons fait de notre mieux pour
+d&eacute;tecter ces changements et les lister ci-apr&egrave;s. Les changements dans les
+espacements, etc. n'ont pas &eacute;t&eacute; consid&eacute;r&eacute;s.</p>
+
+<a name="gplv2" />
+<h3>GNU General Public Licence, Version 2</h3>
+<div class="licence ns-border ns-odd-bg"> GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+</div>
+
+<a name="mit" />
+<h3>MIT/X Licence</h3>
+<div class="licence ns-border ns-odd-bg">Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+</div>
+
+<a name="zlib" />
+<h3>ZLib Licence</h3>
+<div class="licence ns-border ns-odd-bg"> This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+</div>
+
+<a name="ijg" />
+<h3>IJG Licence</h3>
+<div class="licence ns-border ns-odd-bg">The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it. (See the file
+ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
+of any program generated from the IJG code, this does not limit you more than
+the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltmain.sh). Another support script, install-sh, is copyright by X Consortium
+but is also freely distributable.
+</div>
+
+
+<a name="oslib" />
+<h3>OSLib Licence</h3>
+<div class="licence ns-border ns-odd-bg">The copyright holder has granted a small relaxation of the
+conditions of the GNU Public Licence, in that OSLib is itself
+free software, but applications linked to it need not be.
+This means that any changes to OSLib itself (the contents of
+the OSLib, OSLibHelp, OSLibSrc, and OSLibSupport archives)
+fall under the terms of the GNU Public Licence; but programs
+written using OSLib need not be so restricted.
+
+ GNU GENERAL PUBLIC LICENCE
+ Version 1, February 1989
+
+ Copyright (C) 1989 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, U S A
+ Everyone is permitted to copy and distribute verbatim copies
+ of this licence document, but changing it is not allowed.
+
+ Preamble
+
+ The licence agreements of most software companies try to keep users
+at the mercy of those companies. By contrast, our General Public
+Licence is intended to guarantee your freedom to share and change free
+software---to make sure the software is free for all its users. The
+General Public Licence applies to the Free Software Foundation's
+software and to any other programme whose authors commit to using it.
+You can use it for your programmes, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Specifically, the General Public Licence is designed to make
+sure that you have the freedom to give away or sell copies of free
+software, that you receive source code or can get it if you want it,
+that you can change the software or use pieces of it in new free
+programmes; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of a such a programme, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must tell them their rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this licence which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENCE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This Licence Agreement applies to any programme or other work which
+contains a notice placed by the copyright holder saying it may be
+distributed under the terms of this General Public Licence. The
+"Programme", below, refers to any such programme or work, and a "work based
+on the Programme" means either the Programme or any work containing the
+Programme or a portion of it, either verbatim or with modifications. Each
+licensee is addressed as "you".
+
+ 1. You may copy and distribute verbatim copies of the Programme's source
+code as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this
+General Public Licence and to the absence of any warranty; and give any
+other recipients of the Programme a copy of this General Public Licence
+along with the Programme. You may charge a fee for the physical act of
+transferring a copy.
+
+ 2. You may modify your copy or copies of the Programme or any portion of
+it, and copy and distribute such modifications under the terms of Paragraph
+1 above, provided that you also do the following:
+
+ a) cause the modified files to carry prominent notices stating that
+ you changed the files and the date of any change; and
+
+ b) cause the whole of any work that you distribute or publish, that
+ in whole or in part contains the Programme or any part thereof, either
+ with or without modifications, to be licensed at no charge to all
+ third parties under the terms of this General Public Licence (except
+ that you may choose to grant warranty protection to some or all
+ third parties, at your option).
+
+ c) If the modified programme normally reads commands interactively when
+ run, you must cause it, when started running for such interactive use
+ in the simplest and most usual way, to print or display an
+ announcement including an appropriate copyright notice and a notice
+ that there is no warranty (or else, saying that you provide a
+ warranty) and that users may redistribute the programme under these
+ conditions, and telling the user how to view a copy of this General
+ Public Licence.
+
+ d) You may charge a fee for the physical act of transferring a
+ copy, and you may at your option offer warranty protection in
+ exchange for a fee.
+
+Mere aggregation of another independent work with the Programme (or its
+derivative) on a volume of a storage or distribution medium does not bring
+the other work under the scope of these terms.
+
+ 3. You may copy and distribute the Programme (or a portion or derivative of
+it, under Paragraph 2) in object code or executable form under the terms of
+Paragraphs 1 and 2 above provided that you also do one of the following:
+
+ a) accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Paragraphs 1 and 2 above; or,
+
+ b) accompany it with a written offer, valid for at least three
+ years, to give any third party free (except for a nominal charge
+ for the cost of distribution) a complete machine-readable copy of the
+ corresponding source code, to be distributed under the terms of
+ Paragraphs 1 and 2 above; or,
+
+ c) accompany it with the information you received as to where the
+ corresponding source code may be obtained. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the programme in object code or executable form alone.)
+
+Source code for a work means the preferred form of the work for making
+modifications to it. For an executable file, complete source code means
+all the source code for all modules it contains; but, as a special
+exception, it need not include source code for modules which are standard
+libraries that accompany the operating system on which the executable
+file runs, or for standard header files or definitions files that
+accompany that operating system.
+
+ 4. You may not copy, modify, sublicense, distribute or transfer the
+Programme except as expressly provided under this General Public Licence.
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
+the Programme is void, and will automatically terminate your rights to use
+the Programme under this Licence. However, parties who have received
+copies, or rights to use copies, from you under this General Public
+Licence will not have their licences terminated so long as such parties
+remain in full compliance.
+
+ 5. By copying, distributing or modifying the Programme (or any work based
+on the Programme) you indicate your acceptance of this licence to do so,
+and all its terms and conditions.
+
+ 6. Each time you redistribute the Programme (or any work based on the
+Programme), the recipient automatically receives a licence from the original
+licensor to copy, distribute or modify the Programme subject to these
+terms and conditions. You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein.
+
+ 7. The Free Software Foundation may publish revised and/or new versions
+of the General Public Licence from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Programme
+specifies a version number of the licence which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Programme does not specify a version number of
+the licence, you may choose any version ever published by the Free Software
+Foundation.
+
+ 8. If you wish to incorporate parts of the Programme into other free
+programmes whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 9. BECAUSE THE PROGRAMME IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAMME, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAMME "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAMME IS WITH YOU. SHOULD THE
+PROGRAMME PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAMME AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAMME (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAMME TO OPERATE WITH ANY OTHER
+PROGRAMMES), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programmes
+
+ If you develop a new programme, and you want it to be of the greatest
+possible use to humanity, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the programme. It is safest to
+attach them to the start of each source file to most effectively convey
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the programme's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This programme is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public Licence as published by
+ the Free Software Foundation; either version 1, or (at your option)
+ any later version.
+
+ This programme is 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 General Public Licence for more details.
+
+ You should have received a copy of the GNU General Public Licence
+ along with this programme; if not, write to the Free Software
+ Foundation, Inc, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the programme is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19xx name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public Licence. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+programme.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the programme, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ programme `Gnomovision' (a programme to direct compilers to make passes
+ at assemblers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+That's all there is to it!
+</div>
+
+<a name="openssl" />
+<h3>OpenSSL Licence</h3>
+<div class="licence ns-border ns-odd-bg"> The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+ the OpenSSL License and the original SSLeay license apply to the toolkit.
+ See below for the actual license texts. Actually both licenses are BSD-style
+ Open Source licenses. In case of any license issues related to OpenSSL
+ please contact openssl-core@openssl.org.
+
+ OpenSSL License
+ ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2008 The OpenSSL Project. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ * nor may "OpenSSL" appear in their names without prior written
+ * permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com). This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+</div>
+
+<a name="png" />
+<h3>PNG Licence</h3>
+<div class="licence ns-border ns-odd-bg"> * This code is released under the libpng license.
+ *
+ * libpng versions 1.2.6, August 15, 2004, through 1.4.1, February 25, 2010, are
+ * Copyright (c) 2004, 2006-2010 Glenn Randers-Pehrson, and are
+ * distributed according to the same disclaimer and license as libpng-1.2.5
+ * with the following individual added to the list of Contributing Authors:
+ *
+ * Cosmin Truta
+ *
+ * libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are
+ * Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+ * distributed according to the same disclaimer and license as libpng-1.0.6
+ * with the following individuals added to the list of Contributing Authors:
+ *
+ * Simon-Pierre Cadieux
+ * Eric S. Raymond
+ * Gilles Vollant
+ *
+ * and with the following additions to the disclaimer:
+ *
+ * There is no warranty against interference with your enjoyment of the
+ * library or against infringement. There is no warranty that our
+ * efforts or the library will fulfill any of your particular purposes
+ * or needs. This library is provided with all faults, and the entire
+ * risk of satisfactory quality, performance, accuracy, and effort is with
+ * the user.
+ *
+ * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+ * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are
+ * distributed according to the same disclaimer and license as libpng-0.96,
+ * with the following individuals added to the list of Contributing Authors:
+ *
+ * Tom Lane
+ * Glenn Randers-Pehrson
+ * Willem van Schaik
+ *
+ * libpng versions 0.89, June 1996, through 0.96, May 1997, are
+ * Copyright (c) 1996, 1997 Andreas Dilger
+ * Distributed according to the same disclaimer and license as libpng-0.88,
+ * with the following individuals added to the list of Contributing Authors:
+ *
+ * John Bowler
+ * Kevin Bracey
+ * Sam Bushell
+ * Magnus Holmgren
+ * Greg Roelofs
+ * Tom Tanner
+ *
+ * libpng versions 0.5, May 1995, through 0.88, January 1996, are
+ * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+ *
+ * For the purposes of this copyright and license, "Contributing Authors"
+ * is defined as the following set of individuals:
+ *
+ * Andreas Dilger
+ * Dave Martindale
+ * Guy Eric Schalnat
+ * Paul Schmidt
+ * Tim Wegner
+ *
+ * The PNG Reference Library is supplied "AS IS". The Contributing Authors
+ * and Group 42, Inc. disclaim all warranties, expressed or implied,
+ * including, without limitation, the warranties of merchantability and of
+ * fitness for any purpose. The Contributing Authors and Group 42, Inc.
+ * assume no liability for direct, indirect, incidental, special, exemplary,
+ * or consequential damages, which may result from the use of the PNG
+ * Reference Library, even if advised of the possibility of such damage.
+ *
+ * Permission is hereby granted to use, copy, modify, and distribute this
+ * source code, or portions hereof, for any purpose, without fee, subject
+ * to the following restrictions:
+ *
+ * 1. The origin of this source code must not be misrepresented.
+ *
+ * 2. Altered versions must be plainly marked as such and
+ * must not be misrepresented as being the original source.
+ *
+ * 3. This Copyright notice may not be removed or altered from
+ * any source or altered source distribution.
+ *
+ * The Contributing Authors and Group 42, Inc. specifically permit, without
+ * fee, and encourage the use of this source code as a component to
+ * supporting the PNG file format in commercial products. If you use this
+ * source code in a product, acknowledgment is not required but would be
+ * appreciated.
+ */
+</div>
+
+<a name="unixlib" />
+<h3>UnixLib Licence</h3>
+<div class="licence ns-border ns-odd-bg">In January 2005, permission was obtained from all relevant contributors
+by Peter Naulls to license all past and present contributions to UnixLib
+(where possible) under the revised BSD license. The license is included
+in the next section and is applicable to all code in UnixLib that does not
+have an explicit license in its source.
+
+Prior to 4th January 2005 and after May 2001, UnixLib contained code licensed
+under the GNU General Public License, and versions of UnixLib produced
+between these dates are subject to the provisions of the GPL. We realised
+that this might cause potential problems with the wider use of UnixLib in
+RISC OS, and along with the desire to clarify the overall licensing status of
+UnixLib, GPL code was removed from UnixLib and the above permission from all
+copyright holders allowed UnixLib contributions to be relicensed as per the
+revised BSD license. The GPL is therefore not included in this notice
+as it is no longer relevant to UnixLib.
+
+
+Practical notes on using UnixLib in your own programs:
+
+This is a plain English version of guidelines for use of UnixLib in
+your programs. It does not override any of the licenses included
+below, but is intended to state instances when it may be used in
+free and non-free software. Where there is contradiction or
+ambiguity in this wording, please refer to the specifics of the licence
+in question. These recommendations are based upon our understading
+of the GPL/LGPL and BSD licenses and are subject to change should
+our understanding of the topics improve.
+
+ - Because UnixLib contains code that is subject to the Lesser GNU
+ Public License, the LGPL is the overriding consideration when
+ linking UnixLib to programs (unless the program itself is GPL).
+
+ - You are free to use sections of UnixLib in your own programs
+ subject to the conditions of that code. If the entirety of
+ that code is under a BSD license, then you can generally use
+ that code as you see fit, and there is no further obligation
+ from you as long as the copyright notice remains. If you
+ use LGPL code in your program, then your program must also be
+ distributed under the LGPL (or GPL).
+
+ - If you use UnixLib in its intended original form - that is as a
+ supporting library for ported programs to RISC OS - then your program
+ is subject to the LGPL; or the GPL if the program is covered by that.
+ Note that you must make the source and any modifications available to for
+ both if requested. This is of course equally true if you write an original
+ GPL program using UnixLib. In most cases, no additional action is
+ required of you, especially since source is usually readibly available.
+
+ - If you use UnixLib for a non-free program - whether that's commercial or
+ otherwise, then you should carefully read section 6 of the LGPL. This
+ applies, because at the present time, there is no practical method of
+ dynamic linking on RISC OS. At such time that UnixLib is available as a
+ shared library, then programs dynamically linking to it will no longer be
+ subject to the LPGL as applied to UnixLib.
+
+ - Section 6 means that in practice, you must supply, or offer to
+ supply either source or object code for your program.
+ This is mainly to allow rebuilding of the executable program
+ with later or modified versions of UnixLib. You must of course
+ supply (or better, contribute to the GCCSDK project) any
+ modifications you make to UnixLib upon request.
+
+
+Recommended reading:
+
+Frequently Asked Questions about the GNU GPL
+http://www.fsf.org/licenses/gpl-faq.html (has some sections on LGPL)
+
+About the justifications for using LGPL
+http://www.fsf.org/licenses/why-not-lgpl.html
+
+
+
+===========================================================================
+
+ Copyright (c) 1995-2009 UnixLib Developers
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+===========================================================================
+
+Portions of UnixLib are copyright The Regents of the University of
+California.
+
+Portions of this library are copyright Sun Microsystems, Inc. The
+
+Portions of this library are derived from the GNU C Library and fall under
+the GNU Library General Public License.
+
+Portions of this library are copyright Henry Spencer.
+
+Portions of this library are copyright The Regents of the University of
+California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
+Corporation and other parties.
+
+Portions of this library are copyright PostgreSQL Global Development Group.
+
+The licenses for the above are duplicated below.
+
+
+===========================================================================
+
+ Copyright (c) The Regents of the University of California.
+ All rights reserved.
+
+ This code is derived from software contributed to Berkeley by
+ Chris Torek.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement:
+ This product includes software developed by the University of
+ California, Berkeley and its contributors.
+ 4. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+===========================================================================
+
+ Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+ Developed at SunPro, a Sun Microsystems, Inc. business.
+ Permission to use, copy, modify, and distribute this
+ software is freely granted, provided that this notice
+ is preserved.
+
+===========================================================================
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+===========================================================================
+
+Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
+
+Development of this software was funded, in part, by Cray Research Inc.,
+UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
+Corporation, none of whom are responsible for the results. The author
+thanks all of them.
+
+Redistribution and use in source and binary forms -- with or without
+modification -- are permitted for any purpose, provided that
+redistributions in source form retain this entire copyright notice and
+indicate the origin and nature of any modifications.
+
+I'd appreciate being given credit for this package in the documentation
+of software which uses it, but that is not a requirement.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+===========================================================================
+
+This software is copyrighted by the Regents of the University of
+California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
+Corporation and other parties. The following terms apply to all files
+associated with the software unless explicitly disclaimed in
+individual files.
+
+The authors hereby grant permission to use, copy, modify, distribute,
+and license this software and its documentation for any purpose, provided
+that existing copyright notices are retained in all copies and that this
+notice is included verbatim in any distributions. No written agreement,
+license, or royalty fee is required for any of the authorized uses.
+Modifications to this software may be copyrighted by their authors
+and need not follow the licensing terms described here, provided that
+the new terms are clearly indicated on the first page of each file where
+they apply.
+
+IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+MODIFICATIONS.
+
+GOVERNMENT USE: If you are acquiring this software on behalf of the
+U.S. government, the Government shall have only "Restricted Rights"
+in the software and related documentation as defined in the Federal
+Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
+are acquiring the software on behalf of the Department of Defense, the
+software shall be classified as "Commercial Computer Software" and the
+Government shall have only "Restricted Rights" as defined in Clause
+252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the
+authors grant the U.S. Government and others acting in its behalf
+permission to use and distribute the software in accordance with the
+terms specified in this license.
+
+===========================================================================
+
+PostgreSQL Database Management System
+(formerly known as Postgres, then as Postgres95)
+
+Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
+
+Portions Copyright (c) 1994, The Regents of the University of California
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose, without fee, and without a written agreement
+is hereby granted, provided that the above copyright notice and this
+paragraph and the following two paragraphs appear in all copies.
+
+IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
+DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
+LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
+DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO
+PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+</div>
+
+<div class="footer ns-even-fg-subtle">
+<p class="ns-even-fg-faded ns-border">Copyright 2003&ndash;2019 Les d&eacute;veloppeurs de NetSurf</p>
+</div>
+
+</body>
+</html>
diff --git a/resources/fr/welcome.html b/resources/fr/welcome.html
new file mode 100644
index 000000000..241ea180e
--- /dev/null
+++ b/resources/fr/welcome.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>Bienvenue sur NetSurf</title>
+<style type="text/css">html,body{margin:0;padding:0;}body{color:#000;background:#fff;font-family:sans-serif;margin:0 auto;}a:link{text-decoration:underline;color:#00f;}a:visited{text-decoration:underline;color:#60a;}a:hover{text-decoration:none;}a:active{text-decoration:underline;color:#f00;}.banner{margin:0;padding:0;background:#94adff;text-align:left;}.banner img{border:none;color:#000;height:86px;width:308px;display:block;}.onlycontent{margin:0 1em;}.nslinks{display:table;width:100%;margin:0;border-spacing:0;padding:0;background:#ccd8ff;font-size:94%;}.nslinks li{display:table-cell;text-align:center;padding:0.2em 0.3em 0.3em;vertical-align:middle;}.nslinks li+li{border-left:2px solid #b1c3ff;}.version{padding:0;margin:1.2em auto 0;width:90%;color:#444;font-size:160%;}.intro{width: 90%;margin:1em auto;color:#666;}.websearch{margin:1.5em auto;padding:1.2em 0.3em;background:#d8e2ff;border:2px solid #c5d3ff;width:80%;text-align:center;}input[type=text]{border:2px solid #b6c7ff;background:#f9faff;color:#000;margin:2px;}input[type=submit]{border:2px outset #cedaff;color:#000;background:#cedaff;margin:2px;}.links{display:table;width:80%;margin:0 auto 3em;font-size:94%;}.links ul{display:table-cell;padding-left:2.5em;}.links ul+ul{padding-left:1em;}.footer{font-style:italic;color:#666;text-align:right;}.footer p{margin-top:1.5em;padding-top:0.4em;border-top:2px solid #94adff;}</style>
+</head>
+
+<body>
+<h1 class="banner"><a href="https://www.netsurf-browser.org/"><img src="about:logo" alt="NetSurf"></a></h1>
+
+<ul class="nslinks">
+<li><a href="https://www.netsurf-browser.org/">Site&nbsp;Web de NetSurf</a></li>
+<li><a href="https://www.netsurf-browser.org/documentation/">Documentation</a></li>
+<li><a href="https://www.netsurf-browser.org/downloads/">T&eacute;l&eacute;charger la derni&egrave;re version de NetSurf</a></li>
+<li><a href="https://www.netsurf-browser.org/contact/">Contacter les d&eacute;veloppeurs</a></li>
+</ul>
+
+<div class="onlycontent">
+<h2 class="version">Bienvenue sur NetSurf</h2>
+
+<p class="intro">NetSurf est un petit et rapide navigateur Web &agrave; code source ouvert. Nous sommes toujours pr&ecirc;t &agrave; am&eacute;liorer notre navigateur, donc n'h&eacute;sitez pas &agrave; nous contacter si vous rencontrez le moindre p&eacute;pin. Merci d'avoir choisi Netsurf&nbsp;!</p>
+
+<form method="get" action="https://www.google.fr/search">
+<div class="websearch">
+<input type="text" name="q" size="42" maxlength="255">
+<input type="submit" value="Recherche Google" name="btnG">
+</div>
+</form>
+
+<div class="links">
+<ul>
+<li><a href="https://news.bbc.co.uk/">BBC News</a></li>
+<li><a href="https://www.reuters.com/news">Reuters</a></li>
+<li><a href="https://www.cnn.com/">CNN</a></li>
+</ul>
+
+<ul>
+<li><a href="https://slashdot.org/">Slashdot</a></li>
+<li><a href="https://arstechnica.com/">Ars Technica</a></li>
+<li><a href="https://www.theregister.co.uk/">The Register</a></li>
+<li><a href="https://www.w3.org/">W3C</a></li>
+</ul>
+
+<ul>
+<li><a href="https://fr.wikipedia.org/">Wikipedia</a></li>
+<li><a href="https://google.fr/">Google</a></li>
+<li><a href="https://yahoo.fr/">Yahoo!</a></li>
+<li><a href="https://www.imdb.com/">IMDB</a></li>
+</ul>
+
+<ul>
+<li><a href="https://www.iconbar.com/">The Icon Bar</a></li>
+<li><a href="https://www.riscosopen.org/">ROOL</a></li>
+<li><a href="https://www.riscos.info/">riscos.info</a></li>
+</ul>
+</div>
+
+<div class="footer">
+<p>NetSurf est distribu&eacute; selon la licence publique GNU version 2</p>
+</div>
+</div>
+
+</body>
+</html>
diff --git a/resources/it/credits.html b/resources/it/credits.html
index 533fbe7aa..c700f3184 100644
--- a/resources/it/credits.html
+++ b/resources/it/credits.html
@@ -90,7 +90,7 @@ div#DevList ul {
</div>
<div class="footer ns-even-fg-subtle">
-<p class="ns-even-fg-faded ns-border">Copyright 2003&ndash;2020 The NetSurf Developers</p>
+<p class="ns-even-fg-faded ns-border">Copyright 2003&ndash;2023 The NetSurf Developers</p>
</div>
</body>
diff --git a/resources/nl/credits.html b/resources/nl/credits.html
index ed131b039..0bd3f02ea 100644
--- a/resources/nl/credits.html
+++ b/resources/nl/credits.html
@@ -95,7 +95,7 @@ div#DevList ul {
</div>
<div class="footer ns-even-fg-subtle">
-<p class="ns-border">Auteursrecht 2003&ndash;2020 De NetSurf-ontwikkelaars</p>
+<p class="ns-border">Auteursrecht 2003&ndash;2023 De NetSurf-ontwikkelaars</p>
</div>
</body>
diff --git a/resources/nl/licence.html b/resources/nl/licence.html
index 6ea3714fb..f30ce1440 100644
--- a/resources/nl/licence.html
+++ b/resources/nl/licence.html
@@ -67,19 +67,19 @@ dan verwijder deze uitzonderingverklaring uit uw eigen versie.</p>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libcss/">LibCSS</a></dt>
<dd>
-<span>&copy; 2007&ndash;2018 John-Mark Bell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/hubbub/">Hubbub</a></dt>
<dd>
-<span>&copy; 2007&ndash;2018 John-Mark Bell<br>&copy; 2008&ndash;2009 Andrew Sidwell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell<br>&copy; 2008&ndash;2009 Andrew Sidwell</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libparserutils/">LibParserUtils</a></dt>
<dd>
-<span>&copy; 2007&ndash;2018 John-Mark Bell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell</span>
<span><a href="#mit">MIT</a></span>
</dd>
@@ -103,19 +103,19 @@ dan verwijder deze uitzonderingverklaring uit uw eigen versie.</p>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libsvgtiny">Libsvgtiny</a></dt>
<dd>
-<span>&copy; 2008&ndash;2009 James Bursa<br>&copy; 2016&ndash;2018 Michael Drake</span>
+<span>&copy; 2008&ndash;2009 James Bursa<br>&copy; 2016&ndash;2023 Michael Drake</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsbmp/">Libnsbmp</a></dt>
<dd>
-<span>&copy; 2006 Richard Wilson<br>&copy; 2008 Sean Fox<br>&copy; 2016 Vincent Sanders</span>
+<span>&copy; 2006 Richard Wilson<br>&copy; 2008 Sean Fox<br>&copy; 2016&ndash;2023 Vincent Sanders</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsfb/">Libnsfb</a></dt>
<dd>
-<span>&copy; 2009&ndash;2017 Vincent Sanders<br>&copy; 2009&ndash;2017 Michael Drake</span>
+<span>&copy; 2009&ndash;2017 Vincent Sanders<br>&copy; 2009&ndash;2023 Michael Drake</span>
<span><a href="#mit">MIT</a></span>
</dd>
@@ -127,7 +127,7 @@ dan verwijder deze uitzonderingverklaring uit uw eigen versie.</p>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libwapcaplet">LibWapcaplet</a></dt>
<dd>
-<span>&copy; 2009&ndash;2017 NetSurf Browser Project, Daniel Silverstone</span>
+<span>&copy; 2009&ndash;2023 NetSurf Browser Project, Daniel Silverstone</span>
<span><a href="#mit">MIT</a></span>
</dd>
</dl>
diff --git a/resources/zh_CN/credits.html b/resources/zh_CN/credits.html
index 864827cb2..aa669f417 100644
--- a/resources/zh_CN/credits.html
+++ b/resources/zh_CN/credits.html
@@ -91,7 +91,7 @@ div#DevList ul {
</div>
<div class="footer">
-<p class="ns-even-fg-faded ns-border">Copyright 2003&ndash;2020 NetSurf å¼€å‘人员</p>
+<p class="ns-even-fg-faded ns-border">Copyright 2003&ndash;2023 NetSurf å¼€å‘人员</p>
</div>
</body>
diff --git a/resources/zh_CN/licence.html b/resources/zh_CN/licence.html
index c8e910922..2d7a29f4a 100644
--- a/resources/zh_CN/licence.html
+++ b/resources/zh_CN/licence.html
@@ -58,25 +58,25 @@ version.</p>
<dl class="components">
<dt class="ns-border"><a href="https://www.netsurf-browser.org/">NetSurf</a></dt>
<dd>
-<span>&copy; 2002&ndash;2020 NetSurf å¼€å‘人员</span>
+<span>&copy; 2002&ndash;2023 NetSurf å¼€å‘人员</span>
<span><a href="#gplv2">GPLv2</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libcss/">LibCSS</a></dt>
<dd>
-<span>&copy; 2007&ndash;2019 John-Mark Bell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/hubbub/">Hubbub</a></dt>
<dd>
-<span>&copy; 2007&ndash;2019 John-Mark Bell<br>&copy; 2008&ndash;2009 Andrew Sidwell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell<br>&copy; 2008&ndash;2009 Andrew Sidwell</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libparserutils/">LibParserUtils</a></dt>
<dd>
-<span>&copy; 2007&ndash;2019 John-Mark Bell</span>
+<span>&copy; 2007&ndash;2023 John-Mark Bell</span>
<span><a href="#mit">MIT</a></span>
</dd>
@@ -88,13 +88,13 @@ version.</p>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libpencil">Libpencil</a></dt>
<dd>
-<span>&copy; 2005&ndash;2006 James Bursa</span>
+<span>&copy; 2005&ndash;2023 James Bursa</span>
<span><a href="#mit">MIT</a></span>
</dd>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/rufl">RUfl</a></dt>
<dd>
-<span>&copy; 2005&ndash;2009 James Bursa</span>
+<span>&copy; 2005&ndash;2023 James Bursa</span>
<span><a href="#mit">MIT</a></span>
</dd>
@@ -112,7 +112,7 @@ version.</p>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libnsfb/">Libnsfb</a></dt>
<dd>
-<span>&copy; 2009&ndash;2017 Vincent Sanders<br>&copy; 2009&ndash;2017 Michael Drake</span>
+<span>&copy; 2009&ndash;2017 Vincent Sanders<br>&copy; 2009&ndash;2023 Michael Drake</span>
<span><a href="#mit">MIT</a></span>
</dd>
@@ -124,7 +124,7 @@ version.</p>
<dt class="ns-border"><a href="https://www.netsurf-browser.org/projects/libwapcaplet">LibWapcaplet</a></dt>
<dd>
-<span>&copy; 2009&ndash;2020 NetSurf æµè§ˆå™¨é¡¹ç›®ï¼ŒDaniel Silverstone</span>
+<span>&copy; 2009&ndash;2023 NetSurf æµè§ˆå™¨é¡¹ç›®ï¼ŒDaniel Silverstone</span>
<span><a href="#mit">MIT</a></span>
</dd>
</dl>
@@ -134,7 +134,7 @@ version.</p>
<dl class="components">
<dt class="ns-border"><a href="https://curl.haxx.se/">cURL</a></dt>
<dd>
-<span>&copy; 1996&ndash;2020 Daniel Stenberg</span>
+<span>&copy; 1996&ndash;2023 Daniel Stenberg</span>
<span><a href="#mit">MIT</a></span>
</dd>
diff --git a/test/assert.c b/test/assert.c
index d21926e5e..fb4db8cc9 100644
--- a/test/assert.c
+++ b/test/assert.c
@@ -30,7 +30,23 @@ __ns_assert_fail(const char *__assertion, const char *__file,
unsigned int __line, const char *__function)
__THROW __attribute__ ((__noreturn__));
-/* We use this to flush coverage data */
+#if __GNUC__ > 10
+
+/* We use this to dump coverage data in gcc 11 and later */
+extern void __gcov_dump(void);
+
+/* And here's our entry point */
+void
+__ns_assert_fail(const char *__assertion, const char *__file,
+ unsigned int __line, const char *__function)
+{
+ __gcov_dump();
+ __assert_fail(__assertion, __file, __line, __function);
+}
+
+#else
+
+/* We use this to flush coverage data before gcc 11 */
extern void __gcov_flush(void);
/* And here's our entry point */
@@ -41,3 +57,4 @@ __ns_assert_fail(const char *__assertion, const char *__file,
__gcov_flush();
__assert_fail(__assertion, __file, __line, __function);
}
+#endif
diff --git a/test/corestrings.c b/test/corestrings.c
index 43eb5130e..c3c4e93eb 100644
--- a/test/corestrings.c
+++ b/test/corestrings.c
@@ -40,7 +40,7 @@
*
* This is used to test all the out of memory paths in initialisation.
*/
-#define CORESTRING_TEST_COUNT 487
+#define CORESTRING_TEST_COUNT 488
START_TEST(corestrings_test)
{
diff --git a/test/data/Choices-all b/test/data/Choices-all
index baae231a2..5c26f2887 100644
--- a/test/data/Choices-all
+++ b/test/data/Choices-all
@@ -26,6 +26,7 @@ foreground_images:1
background_images:1
animate_images:1
enable_javascript:1
+author_level_css:1
script_timeout:10
expire_url:28
font_default:0
@@ -65,6 +66,7 @@ remove_backgrounds:0
enable_loosening:1
enable_PDF_compression:1
enable_PDF_password:0
+prefer_dark_mode:0
sys_colour_ActiveBorder:d3d3d3
sys_colour_ActiveCaption:f1f1f1
sys_colour_AppWorkspace:f1f1f1
diff --git a/test/js/class-list.html b/test/js/class-list.html
new file mode 100644
index 000000000..4c73283e5
--- /dev/null
+++ b/test/js/class-list.html
@@ -0,0 +1,29 @@
+<html>
+ <head>
+ <title>Class List (and other token lists?)</title>
+ <style>
+ .bad { background-color: red; }
+ .ok { background-color: green; }
+ </style>
+ </head>
+ <body>
+ <h1>This is a set of demonstrators for the token list Element.classList</h1>
+ <h2>This first is taken from the MDN for DOMTokenList</h2>
+ <span id="demo1" class=" d d e f bad"></span>
+ <script>
+ var span = document.getElementById("demo1");
+ var classes = span.classList;
+ classes.add("x", "d", "g");
+ classes.remove("e", "g");
+ classes.toggle("d"); // Toggles d off
+ classes.toggle("q", false); // Forces q off (won't be present)
+ classes.toggle("d"); // Toggles d on
+ classes.toggle("d", true); // Forces d on (won't toggle it off again)
+ if (classes.contains("d")) {
+ classes.add("ok")
+ classes.remove("bad")
+ span.textContent = "span classList is \"" + classes + '"';
+ }
+ </script>
+ </body>
+</html>
diff --git a/test/js/index.html b/test/js/index.html
index 032946726..6d2c6541e 100644
--- a/test/js/index.html
+++ b/test/js/index.html
@@ -104,6 +104,7 @@
<li><a href="assorted-log-doc-write.html">console.log and document.write</a></li>
<li><a href="wikipedia-lcm.html">Example from wikipedia</a></li>
<li><a href="verify-instanceofness.html">Check instanceof behaviour</a></li>
+<li><a href="class-list.html">Class list (and other token lists?)</a></li>
<li><a href="mandelbrot.html">Canvas/ImageData Mandelbrot ploter</a></li>
<li><a href="life.html">Game of Life</a></li>
</ul>
diff --git a/test/monkey-see-monkey-do b/test/monkey-see-monkey-do
index 4dc761aae..72b8685ec 100755
--- a/test/monkey-see-monkey-do
+++ b/test/monkey-see-monkey-do
@@ -117,7 +117,7 @@ def main():
index = index.read()
print("Parsing tests...")
- test_set = yaml.load_all(index)
+ test_set = yaml.load_all(index, Loader=yaml.SafeLoader)
print("Running tests...")
ret = 0
diff --git a/tools/jenkins-build.sh b/tools/jenkins-build.sh
index d31b233b4..7dcd788a0 100755
--- a/tools/jenkins-build.sh
+++ b/tools/jenkins-build.sh
@@ -54,11 +54,16 @@ MAKE=make
# NetSurf version number haiku needs it for package name
NETSURF_VERSION="3.11"
+UPDATE_LATEST=yes
+
# Ensure the combination of target and toolchain works and set build
# specific parameters too
case ${TARGET} in
"riscos")
case ${HOST} in
+ "arm-riscos-gnueabi")
+ UPDATE_LATEST=no
+ ;;
"arm-unknown-riscos")
;;
@@ -69,6 +74,10 @@ case ${TARGET} in
esac
+ export GCCSDK_INSTALL_ENV=/opt/netsurf/${HOST}/env
+ export GCCSDK_INSTALL_CROSSBIN=/opt/netsurf/${HOST}/cross/bin
+ IDENTIFIER="${HOST}-${IDENTIFIER}"
+ OLD_IDENTIFIER="${HOST}-${OLD_IDENTIFIER}"
PKG_SRC=netsurf
PKG_SFX=.zip
;;
@@ -285,6 +294,11 @@ case ${TARGET} in
MAKE=gmake
;;
+ "arm-riscos-gnueabi")
+ export GCCSDK_INSTALL_ENV=/opt/netsurf/${HOST}/env
+ export GCCSDK_INSTALL_CROSSBIN=/opt/netsurf/${HOST}/cross/bin
+ ;;
+
"arm-unknown-riscos")
export GCCSDK_INSTALL_ENV=/opt/netsurf/${HOST}/env
export GCCSDK_INSTALL_CROSSBIN=/opt/netsurf/${HOST}/cross/bin
@@ -341,6 +355,11 @@ case ${TARGET} in
MAKE=gmake
;;
+ "arm-riscos-gnueabi")
+ export GCCSDK_INSTALL_ENV=/opt/netsurf/${HOST}/env
+ export GCCSDK_INSTALL_CROSSBIN=/opt/netsurf/${HOST}/cross/bin
+ ;;
+
"arm-unknown-riscos")
export GCCSDK_INSTALL_ENV=/opt/netsurf/${HOST}/env
export GCCSDK_INSTALL_CROSSBIN=/opt/netsurf/${HOST}/cross/bin
@@ -483,4 +502,7 @@ done
############ Expired package artifact removal and latest linking ##############
-ssh netsurf@ci.netsurf-browser.org "rm -f ${OLD_ARTIFACT_TARGETS} ${DESTDIR}/LATEST && echo "${NEW_ARTIFACT_TARGET}${PKG_SFX}" > ${DESTDIR}/LATEST"
+ssh netsurf@ci.netsurf-browser.org "rm -f ${OLD_ARTIFACT_TARGETS}"
+if [ ${UPDATE_LATEST} = "yes" ]; then
+ ssh netsurf@ci.netsurf-browser.org "rm -f ${DESTDIR}/LATEST && echo "${NEW_ARTIFACT_TARGET}${PKG_SFX}" > ${DESTDIR}/LATEST"
+fi
diff --git a/utils/config.h b/utils/config.h
index 0227f4177..f54326dba 100644
--- a/utils/config.h
+++ b/utils/config.h
@@ -146,6 +146,15 @@ char *realpath(const char *path, char *resolved_path);
#undef HAVE_SCANDIR
#endif
+#define HAVE_DIRFD
+#define HAVE_UNLINKAT
+#define HAVE_FSTATAT
+#if (defined(_WIN32) || defined(__riscos__) || defined(__HAIKU__) || defined(__BEOS__) || defined(__amigaos4__) || defined(__AMIGA__) || defined(__MINT__))
+#undef HAVE_DIRFD
+#undef HAVE_UNLINKAT
+#undef HAVE_FSTATAT
+#endif
+
#define HAVE_REGEX
#if (defined(__serenity__))
#undef HAVE_REGEX
diff --git a/utils/corestringlist.h b/utils/corestringlist.h
index b253b3b56..5cdbb3af7 100644
--- a/utils/corestringlist.h
+++ b/utils/corestringlist.h
@@ -167,6 +167,7 @@ CORESTRING_LWC_VALUE(application_octet_stream, "application/octet-stream");
CORESTRING_LWC_VALUE(image_gif, "image/gif");
CORESTRING_LWC_VALUE(image_png, "image/png");
CORESTRING_LWC_VALUE(image_jpeg, "image/jpeg");
+CORESTRING_LWC_VALUE(image_jxl, "image/jxl");
CORESTRING_LWC_VALUE(image_bmp, "image/bmp");
CORESTRING_LWC_VALUE(image_vnd_microsoft_icon, "image/vnd.microsoft.icon");
CORESTRING_LWC_VALUE(image_webp, "image/webp");
diff --git a/utils/file.c b/utils/file.c
index c460e49e9..75a8a1c03 100644
--- a/utils/file.c
+++ b/utils/file.c
@@ -26,6 +26,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <fcntl.h>
#include <errno.h>
#include "desktop/gui_internal.h"
@@ -318,16 +319,13 @@ nserror netsurf_mkdir_all(const char *fname)
nserror
netsurf_recursive_rm(const char *path)
{
- struct dirent **listing = NULL; /* directory entry listing */
- int nentries, ent;
+ DIR *parent;
+ struct dirent *entry;
nserror ret = NSERROR_OK;
struct stat ent_stat; /* stat result of leaf entry */
- char *leafpath = NULL;
- const char *leafname;
-
- nentries = scandir(path, &listing, 0, alphasort);
- if (nentries < 0) {
+ parent = opendir(path);
+ if (parent == NULL) {
switch (errno) {
case ENOENT:
return NSERROR_NOT_FOUND;
@@ -336,26 +334,44 @@ netsurf_recursive_rm(const char *path)
}
}
- for (ent = 0; ent < nentries; ent++) {
- leafname = listing[ent]->d_name;
- if (strcmp(leafname, ".") == 0 ||
- strcmp(leafname, "..") == 0)
+ while ((entry = readdir(parent))) {
+ char *leafpath = NULL;
+
+ if (strcmp(entry->d_name, ".") == 0 ||
+ strcmp(entry->d_name, "..") == 0)
continue;
- ret = netsurf_mkpath(&leafpath, NULL, 2, path, leafname);
- if (ret != NSERROR_OK) goto out;
+
+ ret = netsurf_mkpath(&leafpath, NULL, 2, path, entry->d_name);
+ if (ret != NSERROR_OK)
+ goto out;
+
+#if (defined(HAVE_DIRFD) && defined(HAVE_FSTATAT))
+ if (fstatat(dirfd(parent), entry->d_name, &ent_stat,
+ AT_SYMLINK_NOFOLLOW) != 0) {
+#else
if (stat(leafpath, &ent_stat) != 0) {
+#endif
+ free(leafpath);
goto out_via_errno;
}
if (S_ISDIR(ent_stat.st_mode)) {
ret = netsurf_recursive_rm(leafpath);
- if (ret != NSERROR_OK) goto out;
+ if (ret != NSERROR_OK) {
+ free(leafpath);
+ goto out;
+ }
} else {
+#if (defined(HAVE_DIRFD) && defined(HAVE_UNLINKAT))
+ if (unlinkat(dirfd(parent), entry->d_name, 0) != 0) {
+#else
if (unlink(leafpath) != 0) {
+#endif
+ free(leafpath);
goto out_via_errno;
}
}
+
free(leafpath);
- leafpath = NULL;
}
if (rmdir(path) != 0) {
@@ -373,16 +389,7 @@ out_via_errno:
ret = NSERROR_UNKNOWN;
}
out:
- if (listing != NULL) {
- for (ent = 0; ent < nentries; ent++) {
- free(listing[ent]);
- }
- free(listing);
- }
-
- if (leafpath != NULL) {
- free(leafpath);
- }
+ closedir(parent);
return ret;
}
diff --git a/utils/filename.c b/utils/filename.c
index 00ade7409..346fa85cc 100644
--- a/utils/filename.c
+++ b/utils/filename.c
@@ -29,10 +29,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
+#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include "utils/dirent.h"
+#include "utils/errors.h"
+#include "utils/file.h"
#include "utils/filename.h"
#include "utils/log.h"
#include "utils/utils.h"
@@ -55,7 +58,6 @@ static char filename_directory[256];
static struct directory *filename_create_directory(const char *prefix);
static bool filename_flush_directory(const char *folder, int depth);
-static bool filename_delete_recursive(char *folder);
/**
* Request a new, unique, filename.
@@ -272,6 +274,8 @@ bool filename_flush_directory(const char *folder, int depth)
}
parent = opendir(folder);
+ if (parent == NULL)
+ return false;
while ((entry = readdir(parent))) {
int written;
@@ -288,7 +292,12 @@ bool filename_flush_directory(const char *folder, int depth)
child[sizeof(child) - 1] = '\0';
}
+#if (defined(HAVE_DIRFD) && defined(HAVE_FSTATAT))
+ if (fstatat(dirfd(parent), entry->d_name, &statbuf,
+ AT_SYMLINK_NOFOLLOW) == -1) {
+#else
if (stat(child, &statbuf) == -1) {
+#endif
NSLOG(netsurf, INFO, "Unable to stat %s: %s", child,
strerror(errno));
continue;
@@ -354,14 +363,20 @@ bool filename_flush_directory(const char *folder, int depth)
/* delete or recurse */
if (del) {
- if (S_ISDIR(statbuf.st_mode))
- filename_delete_recursive(child);
-
- if (remove(child))
- NSLOG(netsurf, INFO, "Failed to remove '%s'",
- child);
- else
- changed = true;
+ if (S_ISDIR(statbuf.st_mode)) {
+ changed = (netsurf_recursive_rm(child) ==
+ NSERROR_OK);
+ } else {
+#if (defined(HAVE_DIRFD) && defined(HAVE_UNLINKAT))
+ if (unlinkat(dirfd(parent), entry->d_name, 0)) {
+#else
+ if (unlink(child)) {
+#endif
+ NSLOG(netsurf, INFO,
+ "Failed to remove '%s'", child);
+ } else
+ changed = true;
+ }
} else {
while (filename_flush_directory(child, depth + 1));
}
@@ -374,61 +389,6 @@ bool filename_flush_directory(const char *folder, int depth)
/**
- * Recursively deletes the contents of a directory
- *
- * \param folder the directory to delete
- * \return true on success, false otherwise
- */
-bool filename_delete_recursive(char *folder)
-{
- DIR *parent;
- struct dirent *entry;
- char child[256];
- struct stat statbuf;
-
- parent = opendir(folder);
-
- while ((entry = readdir(parent))) {
- int written;
-
- /* Ignore '.' and '..' */
- if (strcmp(entry->d_name, ".") == 0 ||
- strcmp(entry->d_name, "..") == 0)
- continue;
-
- written = snprintf(child, sizeof(child), "%s/%s",
- folder, entry->d_name);
- if (written == sizeof(child)) {
- child[sizeof(child) - 1] = '\0';
- }
-
- if (stat(child, &statbuf) == -1) {
- NSLOG(netsurf, INFO, "Unable to stat %s: %s", child,
- strerror(errno));
- continue;
- }
-
- if (S_ISDIR(statbuf.st_mode)) {
- if (!filename_delete_recursive(child)) {
- closedir(parent);
- return false;
- }
- }
-
- if (remove(child)) {
- NSLOG(netsurf, INFO, "Failed to remove '%s'", child);
- closedir(parent);
- return false;
- }
- }
-
- closedir(parent);
-
- return true;
-}
-
-
-/**
* Creates a new directory.
*
* \param prefix the prefix to use, or NULL to allocate a new one
diff --git a/utils/idna.c b/utils/idna.c
index 628ef1fac..3ce3e1be1 100644
--- a/utils/idna.c
+++ b/utils/idna.c
@@ -440,7 +440,7 @@ static bool idna__is_valid(int32_t *label, size_t len)
/* 4. Check characters not DISALLOWED by RFC5892 */
if (idna_prop == IDNA_P_DISALLOWED) {
NSLOG(netsurf, INFO,
- "Check failed: character %"PRIsizet" (%x) is DISALLOWED",
+ "Check failed: character %"PRIsizet" (%"PRIx32") is DISALLOWED",
i,
label[i]);
return false;
@@ -450,7 +450,7 @@ static bool idna__is_valid(int32_t *label, size_t len)
if (idna_prop == IDNA_P_CONTEXTJ) {
if (idna__contextj_rule(label, i, len) == false) {
NSLOG(netsurf, INFO,
- "Check failed: character %"PRIsizet" (%x) does not conform to CONTEXTJ rule",
+ "Check failed: character %"PRIsizet" (%"PRIx32") does not conform to CONTEXTJ rule",
i,
label[i]);
return false;
@@ -462,7 +462,7 @@ static bool idna__is_valid(int32_t *label, size_t len)
if (idna_prop == IDNA_P_CONTEXTO) {
if (idna__contexto_rule(label[i]) == false) {
NSLOG(netsurf, INFO,
- "Check failed: character %"PRIsizet" (%x) has no CONTEXTO rule defined",
+ "Check failed: character %"PRIsizet" (%"PRIx32") has no CONTEXTO rule defined",
i,
label[i]);
return false;
@@ -472,7 +472,7 @@ static bool idna__is_valid(int32_t *label, size_t len)
/* 7. Check characters are not UNASSIGNED */
if (idna_prop == IDNA_P_UNASSIGNED) {
NSLOG(netsurf, INFO,
- "Check failed: character %"PRIsizet" (%x) is UNASSIGNED",
+ "Check failed: character %"PRIsizet" (%"PRIx32") is UNASSIGNED",
i,
label[i]);
return false;
diff --git a/utils/inet.h b/utils/inet.h
index da1798432..29010efc1 100644
--- a/utils/inet.h
+++ b/utils/inet.h
@@ -40,6 +40,15 @@
#include <arpa/inet.h>
#include <sys/select.h>
+#define ns_close_socket close
+
+#ifdef WITH_AMISSL
+/* AmiSSL needs everything to be using bsdsocket directly to avoid conflicts */
+#include <proto/bsdsocket.h>
+#undef ns_close_socket
+#define ns_close_socket CloseSocket
+#endif
+
#else
#include <winsock2.h>
@@ -49,6 +58,8 @@
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#endif
+#define ns_close_socket closesocket
+
#endif
diff --git a/utils/libdom.c b/utils/libdom.c
index a996e98bf..c39aad343 100644
--- a/utils/libdom.c
+++ b/utils/libdom.c
@@ -28,129 +28,6 @@
#include "utils/log.h"
#include "utils/libdom.h"
-/* exported interface documented in libdom.h */
-bool libdom_treewalk(dom_node *root,
- bool (*callback)(dom_node *node, dom_string *name, void *ctx),
- void *ctx)
-{
- dom_node *node;
- bool result = true;
-
- node = dom_node_ref(root); /* tree root */
-
- while (node != NULL) {
- dom_node *next = NULL;
- dom_node_type type;
- dom_string *name;
- dom_exception exc;
-
- exc = dom_node_get_first_child(node, &next);
- if (exc != DOM_NO_ERR) {
- dom_node_unref(node);
- break;
- }
-
- if (next != NULL) {
- /* 1. Got children */
- dom_node_unref(node);
- node = next;
- } else {
- /* No children; siblings & ancestor's siblings */
- while (node != NULL) {
- exc = dom_node_get_next_sibling(node, &next);
- if (exc != DOM_NO_ERR) {
- dom_node_unref(node);
- node = NULL;
- break;
- }
-
- if (next != NULL) {
- /* 2. Got sibling */
- break;
- }
-
- exc = dom_node_get_parent_node(node, &next);
- if (exc != DOM_NO_ERR) {
- dom_node_unref(node);
- node = NULL;
- break;
- }
-
- /* 3. Try parent */
- dom_node_unref(node);
- node = next;
- }
-
- if (node == NULL)
- break;
-
- dom_node_unref(node);
- node = next;
- }
-
- assert(node != NULL);
-
- exc = dom_node_get_node_type(node, &type);
- if ((exc != DOM_NO_ERR) || (type != DOM_ELEMENT_NODE))
- continue;
-
- exc = dom_node_get_node_name(node, &name);
- if (exc != DOM_NO_ERR)
- continue;
-
- result = callback(node, name, ctx);
-
- dom_string_unref(name);
-
- if (result == false) {
- break; /* callback caused early termination */
- }
-
- }
- return result;
-}
-
-
-/* libdom_treewalk context for libdom_find_element */
-struct find_element_ctx {
- lwc_string *search;
- dom_node *found;
-};
-
-/* libdom_treewalk callback for libdom_find_element */
-static bool libdom_find_element_callback(dom_node *node, dom_string *name,
- void *ctx)
-{
- struct find_element_ctx *data = ctx;
-
- if (dom_string_caseless_lwc_isequal(name, data->search)) {
- /* Found element */
- data->found = node;
- return false; /* Discontinue search */
- }
-
- return true; /* Continue search */
-}
-
-
-/* exported interface documented in libdom.h */
-dom_node *libdom_find_element(dom_node *node, lwc_string *element_name)
-{
- struct find_element_ctx data;
-
- assert(element_name != NULL);
-
- if (node == NULL)
- return NULL;
-
- data.search = element_name;
- data.found = NULL;
-
- libdom_treewalk(node, libdom_find_element_callback, &data);
-
- return data.found;
-}
-
/* exported interface documented in libdom.h */
dom_node *libdom_find_first_element(dom_node *parent, lwc_string *element_name)
diff --git a/utils/libdom.h b/utils/libdom.h
index 306aa0f8b..63841934f 100644
--- a/utils/libdom.h
+++ b/utils/libdom.h
@@ -33,29 +33,6 @@
#include <dom/bindings/hubbub/errors.h>
/**
- * depth-first walk the dom calling callback for each element
- *
- * \param root the dom node to use as the root of the tree walk
- * \param callback The function called for each element
- * \param ctx The context passed to the callback.
- * \return true if all nodes were examined, false if the callback terminated
- * the walk early.
- */
-bool libdom_treewalk(dom_node *root,
- bool (*callback)(dom_node *node, dom_string *name, void *ctx),
- void *ctx);
-
-/**
- * Search the descendants of a node for an element.
- *
- * \param node dom_node to search children of, or NULL
- * \param element_name name of element to find
- * \return first child of node which is an element and matches name, or
- * NULL if not found or parameter node is NULL
- */
-dom_node *libdom_find_element(dom_node *node, lwc_string *element_name);
-
-/**
* Search children of a node for first named element
* \param parent dom_node to search children of, or NULL
* \param element_name name of element to find
diff --git a/utils/log.c b/utils/log.c
index 68b188e0f..a083b5720 100644
--- a/utils/log.c
+++ b/utils/log.c
@@ -99,6 +99,7 @@ NSLOG_DEFINE_CATEGORY(plot, "Rendering system");
NSLOG_DEFINE_CATEGORY(schedule, "Scheduler");
NSLOG_DEFINE_CATEGORY(fbtk, "Framebuffer toolkit");
NSLOG_DEFINE_CATEGORY(layout, "Layout");
+NSLOG_DEFINE_CATEGORY(flex, "Flex");
NSLOG_DEFINE_CATEGORY(dukky, "Duktape JavaScript Binding");
NSLOG_DEFINE_CATEGORY(jserrors, "JavaScript error messages");
@@ -285,7 +286,7 @@ nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv)
/* exported interface documented in utils/log.h */
nserror
-nslog_set_filter_by_options()
+nslog_set_filter_by_options(void)
{
if (verbose_log)
return nslog_set_filter(nsoption_charp(verbose_filter));
@@ -295,7 +296,7 @@ nslog_set_filter_by_options()
/* exported interface documented in utils/log.h */
void
-nslog_finalise()
+nslog_finalise(void)
{
NSLOG(netsurf, INFO,
"Finalising logging, please report any further messages");
diff --git a/utils/log.h b/utils/log.h
index 02a886c01..b7aa83358 100644
--- a/utils/log.h
+++ b/utils/log.h
@@ -84,6 +84,7 @@ NSLOG_DECLARE_CATEGORY(plot);
NSLOG_DECLARE_CATEGORY(schedule);
NSLOG_DECLARE_CATEGORY(fbtk);
NSLOG_DECLARE_CATEGORY(layout);
+NSLOG_DECLARE_CATEGORY(flex);
NSLOG_DECLARE_CATEGORY(dukky);
NSLOG_DECLARE_CATEGORY(jserrors);
diff --git a/utils/nscolour.c b/utils/nscolour.c
index a07175201..5a772b8a6 100644
--- a/utils/nscolour.c
+++ b/utils/nscolour.c
@@ -28,6 +28,7 @@
#include <stddef.h>
#include <stdbool.h>
+#include "netsurf/inttypes.h"
#include "netsurf/plot_style.h"
#include "utils/errors.h"
@@ -211,49 +212,49 @@ nserror nscolour_get_stylesheet(const char **stylesheet_out)
ret = snprintf(buffer, sizeof(buffer),
".ns-odd-bg {\n"
- "\tbackground-color: #%06x;\n"
+ "\tbackground-color: #%06"PRIx32";\n"
"}\n"
".ns-odd-bg-hover {\n"
- "\tbackground-color: #%06x;\n"
+ "\tbackground-color: #%06"PRIx32";\n"
"}\n"
".ns-odd-fg {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-odd-fg-subtle {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-odd-fg-faded {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-odd-fg-good {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-odd-fg-bad {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-even-bg {\n"
- "\tbackground-color: #%06x;\n"
+ "\tbackground-color: #%06"PRIx32";\n"
"}\n"
".ns-even-bg-hover {\n"
- "\tbackground-color: #%06x;\n"
+ "\tbackground-color: #%06"PRIx32";\n"
"}\n"
".ns-even-fg {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-even-fg-subtle {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-even-fg-faded {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-even-fg-good {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-even-fg-bad {\n"
- "\tcolor: #%06x;\n"
+ "\tcolor: #%06"PRIx32";\n"
"}\n"
".ns-border {\n"
- "\tborder-color: #%06x;\n"
+ "\tborder-color: #%06"PRIx32";\n"
"}\n",
colour_rb_swap(nscolours[NSCOLOUR_WIN_ODD_BG]),
colour_rb_swap(nscolours[NSCOLOUR_WIN_ODD_BG_HOVER]),
diff --git a/utils/nsoption.c b/utils/nsoption.c
index a8a29b3bf..7306dee1b 100644
--- a/utils/nsoption.c
+++ b/utils/nsoption.c
@@ -32,6 +32,7 @@
#include <string.h>
#include <strings.h>
+#include "netsurf/inttypes.h"
#include "netsurf/plot_style.h"
#include "utils/errors.h"
#include "utils/log.h"
@@ -112,7 +113,7 @@ strtooption(const char *value, struct nsoption_s *option)
break;
case OPTION_COLOUR:
- if (sscanf(value, "%x", &rgbcolour) == 1) {
+ if (sscanf(value, "%"SCNx32"", &rgbcolour) == 1) {
option->value.c = (((0x000000FF & rgbcolour) << 16) |
((0x0000FF00 & rgbcolour) << 0) |
((0x00FF0000 & rgbcolour) >> 16));
@@ -323,7 +324,7 @@ nsoption_output(FILE *fp,
rgbcolour = (((0x000000FF & opts[entry].value.c) << 16) |
((0x0000FF00 & opts[entry].value.c) << 0) |
((0x00FF0000 & opts[entry].value.c) >> 16));
- fprintf(fp, "%s:%06x\n",
+ fprintf(fp, "%s:%06"PRIx32"\n",
opts[entry].key,
rgbcolour);
@@ -387,10 +388,10 @@ nsoption_output_value_html(struct nsoption_s *option,
slen = snprintf(string + pos,
size - pos,
"<span style=\"font-family:Monospace;\">"
- "#%06X"
+ "#%06"PRIX32
"</span> "
- "<span style=\"background-color: #%06x; "
- "border: 1px solid #%06x; "
+ "<span style=\"background-color: #%06"PRIx32"; "
+ "border: 1px solid #%06"PRIx32"; "
"display: inline-block; "
"width: 1em; height: 1em;\">"
"</span>",
@@ -459,7 +460,7 @@ nsoption_output_value_text(struct nsoption_s *option,
rgbcolour = (((0x000000FF & option->value.c) << 16) |
((0x0000FF00 & option->value.c) << 0) |
((0x00FF0000 & option->value.c) >> 16));
- slen = snprintf(string + pos, size - pos, "%06x", rgbcolour);
+ slen = snprintf(string + pos, size - pos, "%06"PRIx32, rgbcolour);
break;
case OPTION_STRING:
diff --git a/utils/ssl_certs.c b/utils/ssl_certs.c
index d0f2a6c18..8546165ac 100644
--- a/utils/ssl_certs.c
+++ b/utils/ssl_certs.c
@@ -248,12 +248,23 @@ nserror cert_chain_to_query(struct cert_chain *chain, struct nsurl **url_out )
urlstrlen = snprintf((char *)urlstr, allocsize, "about:certificate");
for (depth = 0; depth < chain->depth; depth++) {
+ int written;
nsuerror nsures;
size_t output_length;
- urlstrlen += snprintf((char *)urlstr + urlstrlen,
- allocsize - urlstrlen,
- "&cert=");
+ written = snprintf((char *)urlstr + urlstrlen,
+ allocsize - urlstrlen,
+ "&cert=");
+ if (written < 0) {
+ free(urlstr);
+ return NSERROR_UNKNOWN;
+ }
+ if ((size_t)written >= allocsize - urlstrlen) {
+ free(urlstr);
+ return NSERROR_UNKNOWN;
+ }
+
+ urlstrlen += (size_t)written;
output_length = allocsize - urlstrlen;
nsures = nsu_base64_encode_url(
@@ -268,10 +279,20 @@ nserror cert_chain_to_query(struct cert_chain *chain, struct nsurl **url_out )
urlstrlen += output_length;
if (chain->certs[depth].err != SSL_CERT_ERR_OK) {
- urlstrlen += snprintf((char *)urlstr + urlstrlen,
- allocsize - urlstrlen,
- "&certerr=%d",
- chain->certs[depth].err);
+ written = snprintf((char *)urlstr + urlstrlen,
+ allocsize - urlstrlen,
+ "&certerr=%d",
+ chain->certs[depth].err);
+ if (written < 0) {
+ free(urlstr);
+ return NSERROR_UNKNOWN;
+ }
+ if ((size_t)written >= allocsize - urlstrlen) {
+ free(urlstr);
+ return NSERROR_UNKNOWN;
+ }
+
+ urlstrlen += (size_t)written;
}
}
diff --git a/utils/utf8.c b/utils/utf8.c
index f0ac0c9b2..3eedd0810 100644
--- a/utils/utf8.c
+++ b/utils/utf8.c
@@ -32,6 +32,7 @@
#include "utils/log.h"
#include "utils/utf8.h"
+#include "netsurf/inttypes.h"
#include "netsurf/utf8.h"
#include "desktop/gui_internal.h"
@@ -44,7 +45,7 @@ uint32_t utf8_to_ucs4(const char *s_in, size_t l)
parserutils_error perror;
perror = parserutils_charset_utf8_to_ucs4((const uint8_t *) s_in, l,
- &ucs4, &len);
+ &ucs4, &len);
if (perror != PARSERUTILS_OK)
ucs4 = 0xfffd;
@@ -106,7 +107,7 @@ size_t utf8_char_byte_length(const char *s)
parserutils_error perror;
perror = parserutils_charset_utf8_char_byte_length((const uint8_t *) s,
- &len);
+ &len);
assert(perror == PARSERUTILS_OK);
return len;
@@ -131,7 +132,7 @@ size_t utf8_next(const char *s, size_t l, size_t o)
parserutils_error perror;
perror = parserutils_charset_utf8_next((const uint8_t *) s, l, o,
- &next);
+ &next);
assert(perror == PARSERUTILS_OK);
return next;
@@ -151,6 +152,47 @@ static inline void utf8_clear_cd_cache(void)
last_cd.cd = 0;
}
+/**
+ * obtain a cached conversion descriptor
+ *
+ * either return the cached conversion descriptor or create one if required
+ */
+static nserror
+get_cached_cd(const char *enc_from, const char *enc_to, iconv_t *cd_out)
+{
+ iconv_t cd;
+ /* we cache the last used conversion descriptor,
+ * so check if we're trying to use it here */
+ if (strncasecmp(last_cd.from, enc_from, sizeof(last_cd.from)) == 0 &&
+ strncasecmp(last_cd.to, enc_to, sizeof(last_cd.to)) == 0 &&
+ last_cd.cd != 0) {
+ *cd_out = last_cd.cd;
+ return NSERROR_OK;
+ }
+
+ /* no match, so create a new cd */
+ cd = iconv_open(enc_to, enc_from);
+ if (cd == (iconv_t) -1) {
+ if (errno == EINVAL) {
+ return NSERROR_BAD_ENCODING;
+ }
+ /* default to no memory */
+ return NSERROR_NOMEM;
+ }
+
+ /* close the last cd - we don't care if this fails */
+ if (last_cd.cd) {
+ iconv_close(last_cd.cd);
+ }
+
+ /* and safely copy the to/from/cd data into last_cd */
+ snprintf(last_cd.from, sizeof(last_cd.from), "%s", enc_from);
+ snprintf(last_cd.to, sizeof(last_cd.to), "%s", enc_to);
+ *cd_out = last_cd.cd = cd;
+
+ return NSERROR_OK;
+}
+
/* exported interface documented in utils/utf8.h */
nserror utf8_finalise(void)
{
@@ -168,95 +210,72 @@ nserror utf8_finalise(void)
* Convert a string from one encoding to another
*
* \param string The NULL-terminated string to convert
- * \param len Length of input string to consider (in bytes), or 0
+ * \param slen Length of input string to consider (in bytes), or 0
* \param from The encoding name to convert from
* \param to The encoding name to convert to
- * \param result Pointer to location in which to store result.
- * \param result_len Pointer to location in which to store result length.
+ * \param result_out Pointer to location in which to store result.
+ * \param result_len_out Pointer to location in which to store result length.
* \return NSERROR_OK for no error, NSERROR_NOMEM on allocation error,
* NSERROR_BAD_ENCODING for a bad character encoding
*/
static nserror
utf8_convert(const char *string,
- size_t len,
+ size_t slen,
const char *from,
const char *to,
- char **result,
- size_t *result_len)
+ char **result_out,
+ size_t *result_len_out)
{
iconv_t cd;
- char *temp, *out, *in;
- size_t slen, rlen;
-
- assert(string && from && to && result);
-
- if (string[0] == '\0') {
- /* On AmigaOS, iconv() returns an error if we pass an
- * empty string. This prevents iconv() being called as
- * there is no conversion necessary anyway. */
- *result = strdup("");
- if (!(*result)) {
- *result = NULL;
- return NSERROR_NOMEM;
- }
+ char *temp, *out, *in, *result;
+ size_t result_len;
+ nserror res;
- return NSERROR_OK;
+ assert(string && from && to && result_out);
+
+ /* calculate the source length if not given */
+ if (slen==0) {
+ slen = strlen(string);
}
- if (strcasecmp(from, to) == 0) {
- /* conversion from an encoding to itself == strdup */
- slen = len ? len : strlen(string);
- *(result) = strndup(string, slen);
- if (!(*result)) {
- *(result) = NULL;
+ /* process the empty string separately avoiding any conversion
+ * check for the source and destination encoding being the same
+ *
+ * This optimisation is necessary on AmigaOS as iconv()
+ * returns an error if an empty string is passed.
+ */
+ if ((slen == 0) || (strcasecmp(from, to) == 0)) {
+ *result_out = strndup(string, slen);
+ if (*result_out == NULL) {
return NSERROR_NOMEM;
}
+ if (result_len_out != NULL) {
+ *result_len_out = slen;
+ }
return NSERROR_OK;
}
in = (char *)string;
- /* we cache the last used conversion descriptor,
- * so check if we're trying to use it here */
- if (strncasecmp(last_cd.from, from, sizeof(last_cd.from)) == 0 &&
- strncasecmp(last_cd.to, to, sizeof(last_cd.to)) == 0) {
- cd = last_cd.cd;
- }
- else {
- /* no match, so create a new cd */
- cd = iconv_open(to, from);
- if (cd == (iconv_t)-1) {
- if (errno == EINVAL)
- return NSERROR_BAD_ENCODING;
- /* default to no memory */
- return NSERROR_NOMEM;
- }
-
- /* close the last cd - we don't care if this fails */
- if (last_cd.cd)
- iconv_close(last_cd.cd);
-
- /* and copy the to/from/cd data into last_cd */
- snprintf(last_cd.from, sizeof(last_cd.from), "%s", from);
- snprintf(last_cd.to, sizeof(last_cd.to), "%s", to);
- last_cd.cd = cd;
+ res = get_cached_cd(from, to, &cd);
+ if (res != NSERROR_OK) {
+ return res;
}
- slen = len ? len : strlen(string);
/* Worst case = ASCII -> UCS4, so allocate an output buffer
* 4 times larger than the input buffer, and add 4 bytes at
* the end for the NULL terminator
*/
- rlen = slen * 4 + 4;
+ result_len = slen * 4 + 4;
- temp = out = malloc(rlen);
+ temp = out = malloc(result_len);
if (!out) {
return NSERROR_NOMEM;
}
/* perform conversion */
- if (iconv(cd, (void *) &in, &slen, &out, &rlen) == (size_t)-1) {
+ if (iconv(cd, (void *) &in, &slen, &out, &result_len) == (size_t)-1) {
free(temp);
/* clear the cached conversion descriptor as it's invalid */
if (last_cd.cd)
@@ -270,19 +289,22 @@ utf8_convert(const char *string,
return NSERROR_NOMEM;
}
- *(result) = realloc(temp, out - temp + 4);
- if (!(*result)) {
+ result_len = out - temp;
+
+ /* resize buffer allowing for null termination */
+ result = realloc(temp, result_len + 4);
+ if (result == NULL) {
free(temp);
- *(result) = NULL; /* for sanity's sake */
return NSERROR_NOMEM;
}
/* NULL terminate - needs 4 characters as we may have
* converted to UTF-32 */
- memset((*result) + (out - temp), 0, 4);
+ memset(result + result_len, 0, 4);
- if (result_len != NULL) {
- *result_len = (out - temp);
+ *result_out = result;
+ if (result_len_out != NULL) {
+ *result_len_out = result_len;
}
return NSERROR_OK;
@@ -290,14 +312,14 @@ utf8_convert(const char *string,
/* exported interface documented in utils/utf8.h */
nserror utf8_to_enc(const char *string, const char *encname,
- size_t len, char **result)
+ size_t len, char **result)
{
return utf8_convert(string, len, "UTF-8", encname, result, NULL);
}
/* exported interface documented in utils/utf8.h */
nserror utf8_from_enc(const char *string, const char *encname,
- size_t len, char **result, size_t *result_len)
+ size_t len, char **result, size_t *result_len)
{
return utf8_convert(string, len, encname, "UTF-8", result, result_len);
}
@@ -325,10 +347,10 @@ utf8_convert_html_chunk(iconv_t cd,
return NSERROR_NOMEM;
ucs4 = utf8_to_ucs4(chunk, inlen);
- esclen = snprintf(escape, sizeof(escape), "&#x%06x;", ucs4);
+ esclen = snprintf(escape, sizeof(escape), "&#x%06"PRIx32";", ucs4);
pescape = escape;
ret = iconv(cd, (void *) &pescape, &esclen,
- (void *) out, outlen);
+ (void *) out, outlen);
if (ret == (size_t) -1)
return NSERROR_NOMEM;
@@ -340,45 +362,26 @@ utf8_convert_html_chunk(iconv_t cd,
return NSERROR_OK;
}
+
+
/* exported interface documented in utils/utf8.h */
nserror
-utf8_to_html(const char *string, const char *encname, size_t len, char **result)
+utf8_to_html(const char *string, const char *encname, size_t len, char **result_out)
{
iconv_t cd;
const char *in;
- char *out, *origout;
+ char *out, *origout, *result;
size_t off, prev_off, inlen, outlen, origoutlen, esclen;
nserror ret;
char *pescape, escape[11];
+ nserror res;
if (len == 0)
len = strlen(string);
- /* we cache the last used conversion descriptor,
- * so check if we're trying to use it here */
- if (strncasecmp(last_cd.from, "UTF-8", sizeof(last_cd.from)) == 0 &&
- strncasecmp(last_cd.to, encname,
- sizeof(last_cd.to)) == 0 &&
- last_cd.cd != 0) {
- cd = last_cd.cd;
- } else {
- /* no match, so create a new cd */
- cd = iconv_open(encname, "UTF-8");
- if (cd == (iconv_t) -1) {
- if (errno == EINVAL)
- return NSERROR_BAD_ENCODING;
- /* default to no memory */
- return NSERROR_NOMEM;
- }
-
- /* close the last cd - we don't care if this fails */
- if (last_cd.cd)
- iconv_close(last_cd.cd);
-
- /* and safely copy the to/from/cd data into last_cd */
- snprintf(last_cd.from, sizeof(last_cd.from), "UTF-8");
- snprintf(last_cd.to, sizeof(last_cd.to), "%s", encname);
- last_cd.cd = cd;
+ res = get_cached_cd("UTF-8", encname, &cd);
+ if (res != NSERROR_OK) {
+ return res;
}
/* Worst case is ASCII -> UCS4, with all characters escaped:
@@ -398,13 +401,13 @@ utf8_to_html(const char *string, const char *encname, size_t len, char **result)
while (off < len) {
/* Must escape '&', '<', and '>' */
if (string[off] == '&' || string[off] == '<' ||
- string[off] == '>') {
+ string[off] == '>') {
if (off - prev_off > 0) {
/* Emit chunk */
in = string + prev_off;
inlen = off - prev_off;
ret = utf8_convert_html_chunk(cd, in, inlen,
- &out, &outlen);
+ &out, &outlen);
if (ret != NSERROR_OK) {
free(origout);
iconv_close(cd);
@@ -415,10 +418,10 @@ utf8_to_html(const char *string, const char *encname, size_t len, char **result)
/* Emit mandatory escape */
esclen = snprintf(escape, sizeof(escape),
- "&#x%06x;", string[off]);
+ "&#x%06x;", string[off]);
pescape = escape;
ret = utf8_convert_html_chunk(cd, pescape, esclen,
- &out, &outlen);
+ &out, &outlen);
if (ret != NSERROR_OK) {
free(origout);
iconv_close(cd);
@@ -450,11 +453,12 @@ utf8_to_html(const char *string, const char *encname, size_t len, char **result)
outlen -= 4;
/* Shrink-wrap */
- *result = realloc(origout, origoutlen - outlen);
- if (*result == NULL) {
+ result = realloc(origout, origoutlen - outlen);
+ if (result == NULL) {
free(origout);
return NSERROR_NOMEM;
}
+ *result_out = result;
return NSERROR_OK;
}
diff --git a/utils/utils.h b/utils/utils.h
index 3995071cd..cb9e04b45 100644
--- a/utils/utils.h
+++ b/utils/utils.h
@@ -89,4 +89,31 @@
*/
bool is_dir(const char *path);
+/**
+ * switch fall through
+ */
+#if defined __cplusplus && defined __has_cpp_attribute
+ #if __has_cpp_attribute(fallthrough) && __cplusplus >= __has_cpp_attribute(fallthrough)
+ #define fallthrough [[fallthrough]]
+ #elif __has_cpp_attribute(gnu::fallthrough) && __STDC_VERSION__ >= __has_cpp_attribute(gnu::fallthrough)
+ #define fallthrough [[gnu::fallthrough]]
+ #elif __has_cpp_attribute(clang::fallthrough) && __STDC_VERSION__ >= __has_cpp_attribute(clang::fallthrough)
+ #define fallthrough [[clang::fallthrough]]
+ #endif
+#elif defined __STDC_VERSION__ && defined __has_c_attribute
+ #if __has_c_attribute(fallthrough) && __STDC_VERSION__ >= __has_c_attribute(fallthrough)
+ #define fallthrough [[fallthrough]]
+ #endif
+#endif
+#if !defined fallthrough && defined __has_attribute
+ #if __has_attribute(__fallthrough__)
+ #define fallthrough __attribute__((__fallthrough__))
+ #endif
+#endif
+#if !defined fallthrough
+/* early gcc and clang have no implicit fallthrough warning */
+ #define fallthrough do {} while(0)
+#endif
+
+
#endif