summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/animate/ChangeLog3
-rw-r--r--macros/latex/contrib/animate/animate.pdf5779
-rw-r--r--macros/latex/contrib/animate/animate.sty6
-rw-r--r--macros/latex/contrib/animate/animate.tex7
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.dtx27
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.ins2
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.pdfbin281164 -> 281850 bytes
-rw-r--r--macros/latex/contrib/iftex/ann.txt52
-rw-r--r--macros/latex/contrib/iftex/iftex.pdfbin201646 -> 201807 bytes
-rw-r--r--macros/latex/contrib/iftex/iftex.sty15
-rw-r--r--macros/luatex/generic/lualibs/NEWS3
-rw-r--r--macros/luatex/generic/lualibs/README.md4
-rw-r--r--macros/luatex/generic/lualibs/lualibs-basic-merged.lua205
-rw-r--r--macros/luatex/generic/lualibs/lualibs-extended-merged.lua68
-rw-r--r--macros/luatex/generic/lualibs/lualibs-gzip.lua135
-rw-r--r--macros/luatex/generic/lualibs/lualibs-lpeg.lua2
-rw-r--r--macros/luatex/generic/lualibs/lualibs-lua.lua6
-rw-r--r--macros/luatex/generic/lualibs/lualibs-table.lua31
-rw-r--r--macros/luatex/generic/lualibs/lualibs-unicode.lua84
-rw-r--r--macros/luatex/generic/lualibs/lualibs-util-lua.lua10
-rw-r--r--macros/luatex/generic/lualibs/lualibs-util-str.lua35
-rw-r--r--macros/luatex/generic/lualibs/lualibs-util-tab.lua20
-rw-r--r--macros/luatex/generic/lualibs/lualibs-util-tpl.lua66
-rw-r--r--macros/luatex/generic/lualibs/lualibs.dtx18
-rw-r--r--macros/luatex/generic/lualibs/lualibs.pdfbin80996 -> 96295 bytes
-rw-r--r--macros/luatex/generic/luaotfload/NEWS7
-rw-r--r--macros/luatex/generic/luaotfload/README.md4
-rw-r--r--macros/luatex/generic/luaotfload/filegraph.pdfbin39711 -> 39841 bytes
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-2019-10-29.lua (renamed from macros/luatex/generic/luaotfload/fontloader-2019-08-11.lua)371
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-basics-nod.lua18
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-con.lua7
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-dsp.lua14
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-ocl.lua204
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-osd.lua2
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-otc.lua18
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-otl.lua3
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-ots.lua16
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-oup.lua20
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-l-lpeg.lua2
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-l-lua.lua6
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-l-table.lua31
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-l-unicode.lua84
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-reference.lua227
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-util-str.lua35
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua133
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-colors.lua5
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-conf.pdfbin77515 -> 77675 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-configuration.lua8
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-database.lua70
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-embolden.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-features.lua31
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-filelist.lua7
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-define.lua394
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua983
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-init.lua395
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-latex.pdfbin353062 -> 394415 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-letterspace.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-loaders.lua17
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-log.lua10
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-main.lua42
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-main.tex138
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-multiscript.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-notdef.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-parsers.lua8
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-resolvers.lua12
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-status.lua87
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.12
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.lua5
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.pdfbin76761 -> 76923 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.rst4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tounicode.lua200
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-unicode.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.conf.52
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.conf.rst4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.sty2
-rw-r--r--macros/luatex/generic/luaotfload/scripts-demo.pdfbin0 -> 21422 bytes
-rw-r--r--macros/luatex/generic/luaotfload/scripts-demo.tex15
-rw-r--r--macros/luatex/generic/luaotfload/shaper-demo-graphite.pdfbin0 -> 8487 bytes
-rw-r--r--macros/luatex/generic/luaotfload/shaper-demo-graphite.tex9
-rw-r--r--macros/luatex/generic/luaotfload/shaper-demo.pdfbin0 -> 8411 bytes
-rw-r--r--macros/luatex/generic/luaotfload/shaper-demo.tex7
83 files changed, 6197 insertions, 4068 deletions
diff --git a/macros/latex/contrib/animate/ChangeLog b/macros/latex/contrib/animate/ChangeLog
index 917e25b1f0..ad6e89bff1 100644
--- a/macros/latex/contrib/animate/ChangeLog
+++ b/macros/latex/contrib/animate/ChangeLog
@@ -1,3 +1,6 @@
+2019-11-05
+ * fix: old engine testing pkgs replaced by `iftex'
+
2019-08-20
* fix: now, on PageClosePageInvisible event, seeking to poster frame only if
currently not on display.
diff --git a/macros/latex/contrib/animate/animate.pdf b/macros/latex/contrib/animate/animate.pdf
index ff57e3c9f0..b71ffdaf72 100644
--- a/macros/latex/contrib/animate/animate.pdf
+++ b/macros/latex/contrib/animate/animate.pdf
@@ -1,7 +1,7 @@
%PDF-1.4
%
720 0 obj
-<< /Linearized 1 /L 3924455 /H [ 3291852 573 ] /O 2397 /E 3327069 /N 30 /T 3909935 >>
+<< /Linearized 1 /L 3924604 /H [ 3291977 576 ] /O 2397 /E 3327207 /N 30 /T 3910084 >>
endobj
xref
@@ -40,1721 +40,1721 @@ xref
0000048321 00000 n
0000048480 00000 n
0000048900 00000 n
-0000049329 00000 n
-0000049619 00000 n
-0000049845 00000 n
-0000050103 00000 n
-0000050281 00000 n
-0000050525 00000 n
-0000050700 00000 n
-0000050934 00000 n
-0000051121 00000 n
-0000051378 00000 n
-0000053774 00000 n
-0000053960 00000 n
-0000054216 00000 n
-0000054400 00000 n
-0000054642 00000 n
-0000055720 00000 n
-0000055904 00000 n
-0000056146 00000 n
-0000057248 00000 n
-0000057432 00000 n
-0000057678 00000 n
-0000059733 00000 n
-0000059917 00000 n
-0000060160 00000 n
-0000062288 00000 n
-0000062472 00000 n
-0000062717 00000 n
-0000064856 00000 n
-0000065040 00000 n
-0000065284 00000 n
-0000067402 00000 n
-0000067586 00000 n
-0000067832 00000 n
-0000069974 00000 n
-0000070158 00000 n
-0000070404 00000 n
-0000072551 00000 n
-0000072846 00000 n
-0000073056 00000 n
-0000073373 00000 n
-0000073583 00000 n
-0000073900 00000 n
-0000074110 00000 n
-0000074427 00000 n
-0000074637 00000 n
-0000074954 00000 n
-0000075164 00000 n
-0000075481 00000 n
-0000075691 00000 n
-0000076007 00000 n
-0000076217 00000 n
-0000076534 00000 n
-0000076744 00000 n
-0000077061 00000 n
-0000077271 00000 n
-0000078448 00000 n
-0000078607 00000 n
-0000079389 00000 n
-0000079777 00000 n
-0000080059 00000 n
-0000080437 00000 n
-0000080717 00000 n
-0000081060 00000 n
-0000081282 00000 n
-0000081634 00000 n
-0000081855 00000 n
-0000082086 00000 n
-0000082373 00000 n
-0000082713 00000 n
-0000082937 00000 n
-0000083289 00000 n
-0000083512 00000 n
-0000083801 00000 n
-0000084181 00000 n
-0000084463 00000 n
-0000084852 00000 n
-0000085134 00000 n
-0000085511 00000 n
-0000085802 00000 n
-0000086218 00000 n
-0000086517 00000 n
-0000086904 00000 n
-0000087194 00000 n
-0000087383 00000 n
-0000087867 00000 n
-0000088148 00000 n
-0000088477 00000 n
-0000088802 00000 n
-0000089161 00000 n
-0000089486 00000 n
-0000089844 00000 n
-0000090169 00000 n
-0000090529 00000 n
-0000090854 00000 n
-0000091216 00000 n
-0000091541 00000 n
-0000091899 00000 n
-0000092224 00000 n
-0000092580 00000 n
-0000092905 00000 n
-0000093261 00000 n
-0000093586 00000 n
-0000093945 00000 n
-0000094270 00000 n
-0000094631 00000 n
-0000094956 00000 n
-0000095313 00000 n
-0000095638 00000 n
-0000095999 00000 n
-0000096324 00000 n
-0000096685 00000 n
-0000097010 00000 n
-0000097368 00000 n
-0000097693 00000 n
-0000098051 00000 n
-0000098376 00000 n
-0000098735 00000 n
-0000099060 00000 n
-0000099419 00000 n
-0000099744 00000 n
-0000100107 00000 n
-0000100432 00000 n
-0000100792 00000 n
-0000101117 00000 n
-0000101477 00000 n
-0000101802 00000 n
-0000102163 00000 n
-0000102488 00000 n
-0000102851 00000 n
-0000103176 00000 n
-0000103538 00000 n
-0000103863 00000 n
-0000104223 00000 n
-0000104548 00000 n
-0000104910 00000 n
-0000105235 00000 n
-0000105593 00000 n
-0000105918 00000 n
-0000106279 00000 n
-0000106602 00000 n
-0000106962 00000 n
-0000107287 00000 n
-0000107648 00000 n
-0000107973 00000 n
-0000108333 00000 n
-0000108658 00000 n
-0000109018 00000 n
-0000109343 00000 n
-0000109703 00000 n
-0000110027 00000 n
-0000110386 00000 n
-0000110711 00000 n
-0000111068 00000 n
-0000111393 00000 n
-0000111753 00000 n
-0000112078 00000 n
-0000112438 00000 n
-0000112763 00000 n
-0000113123 00000 n
-0000113448 00000 n
-0000113810 00000 n
-0000114135 00000 n
-0000114498 00000 n
-0000114823 00000 n
-0000115182 00000 n
-0000115506 00000 n
-0000115868 00000 n
-0000116193 00000 n
-0000116555 00000 n
-0000116880 00000 n
-0000117241 00000 n
-0000117565 00000 n
-0000117924 00000 n
-0000118249 00000 n
-0000118610 00000 n
-0000118935 00000 n
-0000119298 00000 n
-0000119623 00000 n
-0000119986 00000 n
-0000120311 00000 n
-0000120672 00000 n
-0000120997 00000 n
-0000121359 00000 n
-0000121684 00000 n
-0000122045 00000 n
-0000122370 00000 n
-0000122733 00000 n
-0000123058 00000 n
-0000123419 00000 n
-0000123744 00000 n
-0000124106 00000 n
-0000124431 00000 n
-0000124792 00000 n
-0000125117 00000 n
-0000125479 00000 n
-0000125804 00000 n
-0000126167 00000 n
-0000126492 00000 n
-0000126852 00000 n
-0000127177 00000 n
-0000127539 00000 n
-0000127864 00000 n
-0000128224 00000 n
-0000128549 00000 n
-0000128909 00000 n
-0000129234 00000 n
-0000129591 00000 n
-0000129916 00000 n
-0000130274 00000 n
-0000130599 00000 n
-0000130956 00000 n
-0000131281 00000 n
-0000131640 00000 n
-0000131965 00000 n
-0000132327 00000 n
-0000132652 00000 n
-0000133012 00000 n
-0000133337 00000 n
-0000133698 00000 n
-0000134023 00000 n
-0000134380 00000 n
-0000134705 00000 n
-0000135066 00000 n
-0000135391 00000 n
-0000135747 00000 n
-0000136072 00000 n
-0000136427 00000 n
-0000136752 00000 n
-0000137111 00000 n
-0000137436 00000 n
-0000137796 00000 n
-0000138121 00000 n
-0000138481 00000 n
-0000138806 00000 n
-0000139165 00000 n
-0000139490 00000 n
-0000139850 00000 n
-0000140175 00000 n
-0000140535 00000 n
-0000140859 00000 n
-0000141221 00000 n
-0000141546 00000 n
-0000141904 00000 n
-0000142229 00000 n
-0000142589 00000 n
-0000142914 00000 n
-0000143277 00000 n
-0000143603 00000 n
-0000143966 00000 n
-0000144292 00000 n
-0000144655 00000 n
-0000144982 00000 n
-0000145344 00000 n
-0000145671 00000 n
-0000146029 00000 n
-0000146356 00000 n
-0000146718 00000 n
-0000147045 00000 n
-0000147404 00000 n
-0000147731 00000 n
-0000148092 00000 n
-0000148419 00000 n
-0000148775 00000 n
-0000149102 00000 n
-0000149464 00000 n
-0000149790 00000 n
-0000150150 00000 n
-0000150477 00000 n
-0000150837 00000 n
-0000151164 00000 n
-0000151524 00000 n
-0000151851 00000 n
-0000152208 00000 n
-0000152535 00000 n
-0000152895 00000 n
-0000153222 00000 n
-0000153584 00000 n
-0000153911 00000 n
-0000154273 00000 n
-0000154600 00000 n
-0000154960 00000 n
-0000155287 00000 n
-0000155648 00000 n
-0000155975 00000 n
-0000156339 00000 n
-0000156666 00000 n
-0000157030 00000 n
-0000157357 00000 n
-0000157612 00000 n
-0000157865 00000 n
-0000158473 00000 n
-0000158800 00000 n
-0000159384 00000 n
-0000159711 00000 n
-0000160296 00000 n
-0000160623 00000 n
-0000161209 00000 n
-0000161536 00000 n
-0000162120 00000 n
-0000162447 00000 n
-0000163033 00000 n
-0000163360 00000 n
-0000163946 00000 n
-0000164273 00000 n
-0000164859 00000 n
-0000165186 00000 n
-0000165771 00000 n
-0000166098 00000 n
-0000166683 00000 n
-0000167010 00000 n
-0000167595 00000 n
-0000167922 00000 n
-0000168511 00000 n
-0000168838 00000 n
-0000169420 00000 n
-0000169747 00000 n
-0000170335 00000 n
-0000170662 00000 n
-0000171250 00000 n
-0000171577 00000 n
-0000172163 00000 n
-0000172490 00000 n
-0000173080 00000 n
-0000173407 00000 n
-0000173993 00000 n
-0000174320 00000 n
-0000174908 00000 n
-0000175235 00000 n
-0000175823 00000 n
-0000176150 00000 n
-0000176737 00000 n
-0000177064 00000 n
-0000177651 00000 n
-0000177978 00000 n
-0000178564 00000 n
-0000178890 00000 n
-0000179480 00000 n
-0000179807 00000 n
-0000180422 00000 n
-0000180748 00000 n
-0000181360 00000 n
-0000181687 00000 n
-0000182305 00000 n
-0000182632 00000 n
-0000183248 00000 n
-0000183575 00000 n
-0000184190 00000 n
-0000184517 00000 n
-0000185129 00000 n
-0000185454 00000 n
-0000186066 00000 n
-0000186393 00000 n
-0000187008 00000 n
-0000187335 00000 n
-0000187947 00000 n
-0000188274 00000 n
-0000188891 00000 n
-0000189218 00000 n
-0000189831 00000 n
-0000190158 00000 n
-0000190770 00000 n
-0000191097 00000 n
-0000191712 00000 n
-0000192039 00000 n
-0000192654 00000 n
-0000192980 00000 n
-0000193593 00000 n
-0000193920 00000 n
-0000194532 00000 n
-0000194859 00000 n
-0000195473 00000 n
-0000195800 00000 n
-0000196415 00000 n
-0000196742 00000 n
-0000197357 00000 n
-0000197684 00000 n
-0000198298 00000 n
-0000198625 00000 n
-0000199240 00000 n
-0000199567 00000 n
-0000200179 00000 n
-0000200506 00000 n
-0000201121 00000 n
-0000201448 00000 n
-0000202060 00000 n
-0000202387 00000 n
-0000203000 00000 n
-0000203327 00000 n
-0000203943 00000 n
-0000204270 00000 n
-0000204860 00000 n
-0000205187 00000 n
-0000205773 00000 n
-0000206100 00000 n
-0000206687 00000 n
-0000207014 00000 n
-0000207599 00000 n
-0000207926 00000 n
-0000208513 00000 n
-0000208840 00000 n
-0000209424 00000 n
-0000209751 00000 n
-0000210333 00000 n
-0000210660 00000 n
-0000211244 00000 n
-0000211571 00000 n
-0000212157 00000 n
-0000212484 00000 n
-0000213070 00000 n
-0000213397 00000 n
-0000213981 00000 n
-0000214308 00000 n
-0000214895 00000 n
-0000215222 00000 n
-0000215812 00000 n
-0000216139 00000 n
-0000216727 00000 n
-0000217054 00000 n
-0000217642 00000 n
-0000217969 00000 n
-0000218558 00000 n
-0000218885 00000 n
-0000219471 00000 n
-0000219798 00000 n
-0000220385 00000 n
-0000220712 00000 n
-0000221300 00000 n
-0000221627 00000 n
-0000222214 00000 n
-0000222541 00000 n
-0000223128 00000 n
-0000223455 00000 n
-0000224043 00000 n
-0000224370 00000 n
-0000224960 00000 n
-0000225287 00000 n
-0000225877 00000 n
-0000226204 00000 n
-0000226795 00000 n
-0000227121 00000 n
-0000227710 00000 n
-0000228037 00000 n
-0000228625 00000 n
-0000228952 00000 n
-0000229565 00000 n
-0000229892 00000 n
-0000230508 00000 n
-0000230835 00000 n
-0000231445 00000 n
-0000231771 00000 n
-0000232383 00000 n
-0000232710 00000 n
-0000233328 00000 n
-0000233655 00000 n
-0000234268 00000 n
-0000234595 00000 n
-0000235211 00000 n
-0000235538 00000 n
-0000236151 00000 n
-0000236478 00000 n
-0000237094 00000 n
-0000237421 00000 n
-0000238035 00000 n
-0000238362 00000 n
-0000238975 00000 n
-0000239301 00000 n
-0000239914 00000 n
-0000240241 00000 n
-0000240851 00000 n
-0000241178 00000 n
-0000241789 00000 n
-0000242116 00000 n
-0000242731 00000 n
-0000243058 00000 n
-0000243668 00000 n
-0000243995 00000 n
-0000244603 00000 n
-0000244930 00000 n
-0000245539 00000 n
-0000245866 00000 n
-0000246478 00000 n
-0000246805 00000 n
-0000247417 00000 n
-0000247744 00000 n
-0000248355 00000 n
-0000248682 00000 n
-0000249291 00000 n
-0000249618 00000 n
-0000250228 00000 n
-0000250555 00000 n
-0000250897 00000 n
-0000251224 00000 n
-0000251564 00000 n
-0000251891 00000 n
-0000252235 00000 n
-0000252562 00000 n
-0000252906 00000 n
-0000253233 00000 n
-0000253577 00000 n
-0000253904 00000 n
-0000254246 00000 n
-0000254573 00000 n
-0000254912 00000 n
-0000255239 00000 n
-0000255581 00000 n
-0000255908 00000 n
-0000256247 00000 n
-0000256574 00000 n
-0000256919 00000 n
-0000257246 00000 n
-0000257588 00000 n
-0000257915 00000 n
-0000258260 00000 n
-0000258587 00000 n
-0000258929 00000 n
-0000259256 00000 n
-0000259601 00000 n
-0000259928 00000 n
-0000260273 00000 n
-0000260600 00000 n
-0000260946 00000 n
-0000261273 00000 n
-0000261617 00000 n
-0000261944 00000 n
-0000262285 00000 n
-0000262612 00000 n
-0000262954 00000 n
-0000263281 00000 n
-0000263625 00000 n
-0000263952 00000 n
-0000264293 00000 n
-0000264620 00000 n
-0000264965 00000 n
-0000265292 00000 n
-0000265636 00000 n
-0000265963 00000 n
-0000266304 00000 n
-0000266631 00000 n
-0000266976 00000 n
-0000267302 00000 n
-0000267644 00000 n
-0000267971 00000 n
-0000268315 00000 n
-0000268642 00000 n
-0000268986 00000 n
-0000269313 00000 n
-0000269654 00000 n
-0000269981 00000 n
-0000270325 00000 n
-0000270651 00000 n
-0000270993 00000 n
-0000271320 00000 n
-0000271660 00000 n
-0000271987 00000 n
-0000272332 00000 n
-0000272659 00000 n
-0000273004 00000 n
-0000273331 00000 n
-0000273676 00000 n
-0000274003 00000 n
-0000274345 00000 n
-0000274673 00000 n
-0000275017 00000 n
-0000275346 00000 n
-0000275688 00000 n
-0000276016 00000 n
-0000276356 00000 n
-0000276684 00000 n
-0000277025 00000 n
-0000277354 00000 n
-0000277698 00000 n
-0000278027 00000 n
-0000278372 00000 n
-0000278701 00000 n
-0000279046 00000 n
-0000279375 00000 n
-0000279720 00000 n
-0000280049 00000 n
-0000280390 00000 n
-0000280719 00000 n
-0000281061 00000 n
-0000281390 00000 n
-0000281731 00000 n
-0000282060 00000 n
-0000282405 00000 n
-0000282734 00000 n
-0000283079 00000 n
-0000283408 00000 n
-0000283750 00000 n
-0000284079 00000 n
-0000284394 00000 n
-0000284670 00000 n
-0000284910 00000 n
-0000285180 00000 n
-0000285357 00000 n
-0000285592 00000 n
-0000285915 00000 n
-0000286180 00000 n
-0000286467 00000 n
-0000286704 00000 n
-0000287683 00000 n
-0000288011 00000 n
-0000288391 00000 n
-0000288605 00000 n
-0000289004 00000 n
-0000289218 00000 n
-0000289653 00000 n
-0000289867 00000 n
-0000290319 00000 n
-0000290533 00000 n
-0000291021 00000 n
-0000291235 00000 n
-0000291741 00000 n
-0000291955 00000 n
-0000292499 00000 n
-0000292713 00000 n
-0000293274 00000 n
-0000293488 00000 n
-0000294084 00000 n
-0000294298 00000 n
-0000294910 00000 n
-0000295124 00000 n
-0000295770 00000 n
-0000295985 00000 n
-0000296647 00000 n
-0000296862 00000 n
-0000297557 00000 n
-0000297772 00000 n
-0000298483 00000 n
-0000298698 00000 n
-0000299443 00000 n
-0000299658 00000 n
-0000300420 00000 n
-0000300635 00000 n
-0000301433 00000 n
-0000301648 00000 n
-0000302462 00000 n
-0000302677 00000 n
-0000303524 00000 n
-0000303739 00000 n
-0000304602 00000 n
-0000304817 00000 n
-0000305712 00000 n
-0000305927 00000 n
-0000306839 00000 n
-0000307054 00000 n
-0000308000 00000 n
-0000308215 00000 n
-0000309177 00000 n
-0000309392 00000 n
-0000310388 00000 n
-0000310603 00000 n
-0000311615 00000 n
-0000311830 00000 n
-0000312875 00000 n
-0000313090 00000 n
-0000314152 00000 n
-0000314367 00000 n
-0000315461 00000 n
-0000315676 00000 n
-0000316786 00000 n
-0000317001 00000 n
-0000318145 00000 n
-0000318360 00000 n
-0000319520 00000 n
-0000319735 00000 n
-0000320928 00000 n
-0000321143 00000 n
-0000322352 00000 n
-0000322567 00000 n
-0000323810 00000 n
-0000324025 00000 n
-0000325284 00000 n
-0000325499 00000 n
-0000326792 00000 n
-0000327007 00000 n
-0000328316 00000 n
-0000328531 00000 n
-0000329873 00000 n
-0000330088 00000 n
-0000331448 00000 n
-0000331663 00000 n
-0000333059 00000 n
-0000333274 00000 n
-0000334687 00000 n
-0000334902 00000 n
-0000336348 00000 n
-0000336563 00000 n
-0000338025 00000 n
-0000338240 00000 n
-0000339736 00000 n
-0000339951 00000 n
-0000341463 00000 n
-0000341678 00000 n
-0000343223 00000 n
-0000343438 00000 n
-0000344999 00000 n
-0000345214 00000 n
-0000346808 00000 n
-0000347023 00000 n
-0000348633 00000 n
-0000348848 00000 n
-0000350492 00000 n
-0000350707 00000 n
-0000352368 00000 n
-0000352583 00000 n
-0000354278 00000 n
-0000354493 00000 n
-0000356205 00000 n
-0000356420 00000 n
-0000358167 00000 n
-0000358382 00000 n
-0000360145 00000 n
-0000360360 00000 n
-0000362158 00000 n
-0000362373 00000 n
-0000364187 00000 n
-0000364402 00000 n
-0000366249 00000 n
-0000366464 00000 n
-0000368328 00000 n
-0000368543 00000 n
-0000370441 00000 n
-0000370656 00000 n
-0000372570 00000 n
-0000372785 00000 n
-0000374733 00000 n
-0000374948 00000 n
-0000376912 00000 n
-0000377127 00000 n
-0000379126 00000 n
-0000379341 00000 n
-0000381357 00000 n
-0000381572 00000 n
-0000383622 00000 n
-0000383837 00000 n
-0000385903 00000 n
-0000386118 00000 n
-0000388216 00000 n
-0000388431 00000 n
-0000390546 00000 n
-0000390761 00000 n
-0000392912 00000 n
-0000393127 00000 n
-0000395294 00000 n
-0000395509 00000 n
-0000397711 00000 n
-0000397926 00000 n
-0000400145 00000 n
-0000400360 00000 n
-0000402615 00000 n
-0000402830 00000 n
-0000405102 00000 n
-0000405317 00000 n
-0000407623 00000 n
-0000407838 00000 n
-0000410161 00000 n
-0000410376 00000 n
-0000412734 00000 n
-0000412949 00000 n
-0000415323 00000 n
-0000415538 00000 n
-0000417948 00000 n
-0000418163 00000 n
-0000420590 00000 n
-0000420805 00000 n
-0000423267 00000 n
-0000423482 00000 n
-0000425961 00000 n
-0000426176 00000 n
-0000428692 00000 n
-0000428907 00000 n
-0000431442 00000 n
-0000431657 00000 n
-0000434227 00000 n
-0000434442 00000 n
-0000437030 00000 n
-0000437245 00000 n
-0000439865 00000 n
-0000440080 00000 n
-0000442718 00000 n
-0000442933 00000 n
-0000445607 00000 n
-0000445822 00000 n
-0000448514 00000 n
-0000448729 00000 n
-0000451456 00000 n
-0000451671 00000 n
-0000454415 00000 n
-0000454630 00000 n
-0000457412 00000 n
-0000457627 00000 n
-0000460426 00000 n
-0000460641 00000 n
-0000463476 00000 n
-0000463691 00000 n
-0000466544 00000 n
-0000466759 00000 n
-0000469647 00000 n
-0000469862 00000 n
-0000472767 00000 n
-0000472982 00000 n
-0000475909 00000 n
-0000476125 00000 n
-0000477011 00000 n
-0000477171 00000 n
-0000477963 00000 n
-0000478246 00000 n
-0000478527 00000 n
-0000478750 00000 n
-0000478972 00000 n
-0000479260 00000 n
-0000479485 00000 n
-0000479709 00000 n
-0000479999 00000 n
-0000480282 00000 n
-0000480565 00000 n
-0000480857 00000 n
-0000481157 00000 n
-0000481448 00000 n
-0000482327 00000 n
-0000482651 00000 n
-0000482865 00000 n
-0000509546 00000 n
-0000509870 00000 n
-0000510084 00000 n
-0000538010 00000 n
-0000538334 00000 n
-0000538548 00000 n
-0000566849 00000 n
-0000567173 00000 n
-0000567387 00000 n
-0000595950 00000 n
-0000596274 00000 n
-0000596488 00000 n
-0000625012 00000 n
-0000625336 00000 n
-0000625550 00000 n
-0000653644 00000 n
-0000653968 00000 n
-0000654182 00000 n
-0000682837 00000 n
-0000683161 00000 n
-0000683375 00000 n
-0000712039 00000 n
-0000712363 00000 n
-0000712577 00000 n
-0000740482 00000 n
-0000740806 00000 n
-0000741020 00000 n
-0000768566 00000 n
-0000768890 00000 n
-0000769105 00000 n
-0000797178 00000 n
-0000797502 00000 n
-0000797717 00000 n
-0000826795 00000 n
-0000827119 00000 n
-0000827334 00000 n
-0000856444 00000 n
-0000856768 00000 n
-0000856983 00000 n
-0000886075 00000 n
-0000886399 00000 n
-0000886614 00000 n
-0000914885 00000 n
-0000915209 00000 n
-0000915424 00000 n
-0000944655 00000 n
-0000944979 00000 n
-0000945194 00000 n
-0000974518 00000 n
-0000974842 00000 n
-0000975057 00000 n
-0001003057 00000 n
-0001003381 00000 n
-0001003596 00000 n
-0001033105 00000 n
-0001033429 00000 n
-0001033644 00000 n
-0001063161 00000 n
-0001063485 00000 n
-0001063700 00000 n
-0001092426 00000 n
-0001092750 00000 n
-0001092965 00000 n
-0001120978 00000 n
-0001121302 00000 n
-0001121517 00000 n
-0001151390 00000 n
-0001151714 00000 n
-0001151929 00000 n
-0001181826 00000 n
-0001182150 00000 n
-0001182365 00000 n
-0001212334 00000 n
-0001212658 00000 n
-0001212873 00000 n
-0001242950 00000 n
-0001243274 00000 n
-0001243489 00000 n
-0001273578 00000 n
-0001273902 00000 n
-0001274117 00000 n
-0001301640 00000 n
-0001301964 00000 n
-0001302179 00000 n
-0001303061 00000 n
-0001303222 00000 n
-0001303988 00000 n
-0001304271 00000 n
-0001304552 00000 n
-0001304775 00000 n
-0001304997 00000 n
-0001305285 00000 n
-0001305510 00000 n
-0001305734 00000 n
-0001306024 00000 n
-0001306307 00000 n
-0001306590 00000 n
-0001306882 00000 n
-0001307182 00000 n
-0001307473 00000 n
-0001308032 00000 n
-0001308515 00000 n
-0001308998 00000 n
-0001309480 00000 n
-0001309962 00000 n
-0001310440 00000 n
-0001310927 00000 n
-0001311410 00000 n
-0001311895 00000 n
-0001312384 00000 n
-0001312869 00000 n
-0001313350 00000 n
-0001313830 00000 n
-0001314316 00000 n
-0001314799 00000 n
-0001315285 00000 n
-0001315772 00000 n
-0001316254 00000 n
-0001316744 00000 n
-0001317225 00000 n
-0001317710 00000 n
-0001318196 00000 n
-0001318673 00000 n
-0001319159 00000 n
-0001319644 00000 n
-0001320131 00000 n
-0001320619 00000 n
-0001321106 00000 n
-0001321592 00000 n
-0001322076 00000 n
-0001322565 00000 n
-0001323054 00000 n
-0001323547 00000 n
-0001324033 00000 n
-0001324525 00000 n
-0001325018 00000 n
-0001325481 00000 n
-0001325951 00000 n
-0001326423 00000 n
-0001326920 00000 n
-0001327419 00000 n
-0001327905 00000 n
-0001328394 00000 n
-0001328872 00000 n
-0001329357 00000 n
-0001329835 00000 n
-0001330320 00000 n
-0001330804 00000 n
-0001331290 00000 n
-0001331783 00000 n
-0001332267 00000 n
-0001332752 00000 n
-0001333245 00000 n
-0001333735 00000 n
-0001334228 00000 n
-0001334722 00000 n
-0001335205 00000 n
-0001335700 00000 n
-0001336186 00000 n
-0001336676 00000 n
-0001337170 00000 n
-0001337658 00000 n
-0001338153 00000 n
-0001338646 00000 n
-0001339134 00000 n
-0001339627 00000 n
-0001340118 00000 n
-0001340604 00000 n
-0001341103 00000 n
-0001341595 00000 n
-0001342076 00000 n
-0001342563 00000 n
-0001343057 00000 n
-0001343545 00000 n
-0001344035 00000 n
-0001344535 00000 n
-0001345019 00000 n
-0001345507 00000 n
-0001346009 00000 n
-0001346500 00000 n
-0001346987 00000 n
-0001347483 00000 n
-0001347964 00000 n
-0001348451 00000 n
-0001348942 00000 n
-0001349434 00000 n
-0001349920 00000 n
-0001350424 00000 n
-0001350910 00000 n
-0001351397 00000 n
-0001351896 00000 n
-0001352392 00000 n
-0001352879 00000 n
-0001353374 00000 n
-0001353859 00000 n
-0001354345 00000 n
-0001354838 00000 n
-0001355323 00000 n
-0001355789 00000 n
-0001356266 00000 n
-0001356753 00000 n
-0001375222 00000 n
-0001393653 00000 n
-0001412093 00000 n
-0001430513 00000 n
-0001448945 00000 n
-0001467306 00000 n
-0001485661 00000 n
-0001503978 00000 n
-0001522253 00000 n
-0001540504 00000 n
-0001558733 00000 n
-0001576994 00000 n
-0001595204 00000 n
-0001613321 00000 n
-0001631431 00000 n
-0001649441 00000 n
-0001667399 00000 n
-0001685265 00000 n
-0001703131 00000 n
-0001720863 00000 n
-0001738684 00000 n
-0001756472 00000 n
-0001774334 00000 n
-0001792287 00000 n
-0001810269 00000 n
-0001828309 00000 n
-0001846421 00000 n
-0001864503 00000 n
-0001882692 00000 n
-0001900905 00000 n
-0001919205 00000 n
-0001937497 00000 n
-0001955852 00000 n
-0001974270 00000 n
-0001992735 00000 n
-0002011275 00000 n
-0002029796 00000 n
-0002048349 00000 n
-0002066869 00000 n
-0002085373 00000 n
-0002103932 00000 n
-0002122566 00000 n
-0002141198 00000 n
-0002159826 00000 n
-0002178341 00000 n
-0002196860 00000 n
-0002215335 00000 n
-0002233867 00000 n
-0002252330 00000 n
-0002270812 00000 n
-0002289193 00000 n
-0002307596 00000 n
-0002325981 00000 n
-0002344305 00000 n
-0002362626 00000 n
-0002380921 00000 n
-0002399183 00000 n
-0002417444 00000 n
-0002435582 00000 n
-0002453610 00000 n
-0002471614 00000 n
-0002489585 00000 n
-0002507455 00000 n
-0002525289 00000 n
-0002543086 00000 n
-0002560836 00000 n
-0002578578 00000 n
-0002596443 00000 n
-0002614320 00000 n
-0002632307 00000 n
-0002650304 00000 n
-0002668326 00000 n
-0002686422 00000 n
-0002704593 00000 n
-0002722746 00000 n
-0002740966 00000 n
-0002759222 00000 n
-0002777459 00000 n
-0002795802 00000 n
-0002814222 00000 n
-0002832681 00000 n
-0002851117 00000 n
-0002869615 00000 n
-0002888084 00000 n
-0002906571 00000 n
-0002925064 00000 n
-0002943636 00000 n
-0002962144 00000 n
-0002980625 00000 n
-0002999128 00000 n
-0002999441 00000 n
-0002999653 00000 n
-0002999988 00000 n
-0003000200 00000 n
-0003000554 00000 n
-0003000766 00000 n
-0003001140 00000 n
-0003001352 00000 n
-0003001745 00000 n
-0003001957 00000 n
-0003002369 00000 n
-0003002581 00000 n
-0003003013 00000 n
-0003003225 00000 n
-0003003677 00000 n
-0003003889 00000 n
-0003004360 00000 n
-0003004572 00000 n
-0003005062 00000 n
-0003005274 00000 n
-0003005783 00000 n
-0003005996 00000 n
-0003006524 00000 n
-0003006737 00000 n
-0003007285 00000 n
-0003007498 00000 n
-0003008066 00000 n
-0003008279 00000 n
-0003008866 00000 n
-0003009079 00000 n
-0003009684 00000 n
-0003009897 00000 n
-0003010521 00000 n
-0003010734 00000 n
-0003011377 00000 n
-0003011590 00000 n
-0003012251 00000 n
-0003012464 00000 n
-0003013145 00000 n
-0003013358 00000 n
-0003014057 00000 n
-0003014270 00000 n
-0003014988 00000 n
-0003015201 00000 n
-0003015937 00000 n
-0003016150 00000 n
-0003016906 00000 n
-0003017119 00000 n
-0003017893 00000 n
-0003018106 00000 n
-0003018898 00000 n
-0003019111 00000 n
-0003019922 00000 n
-0003020135 00000 n
-0003020964 00000 n
-0003021177 00000 n
-0003022024 00000 n
-0003022237 00000 n
-0003023102 00000 n
-0003023315 00000 n
-0003024197 00000 n
-0003024410 00000 n
-0003025310 00000 n
-0003025523 00000 n
-0003026441 00000 n
-0003026654 00000 n
-0003027590 00000 n
-0003027803 00000 n
-0003028756 00000 n
-0003028969 00000 n
-0003029940 00000 n
-0003030153 00000 n
-0003031142 00000 n
-0003031355 00000 n
-0003032362 00000 n
-0003032575 00000 n
-0003033600 00000 n
-0003033813 00000 n
-0003034856 00000 n
-0003035069 00000 n
-0003036130 00000 n
-0003036343 00000 n
-0003037422 00000 n
-0003037635 00000 n
-0003038732 00000 n
-0003038945 00000 n
-0003040060 00000 n
-0003040273 00000 n
-0003041406 00000 n
-0003041619 00000 n
-0003042770 00000 n
-0003042983 00000 n
-0003044152 00000 n
-0003044365 00000 n
-0003045553 00000 n
-0003045766 00000 n
-0003046972 00000 n
-0003047185 00000 n
-0003048409 00000 n
-0003048622 00000 n
-0003049864 00000 n
-0003050077 00000 n
-0003051338 00000 n
-0003051551 00000 n
-0003052830 00000 n
-0003053043 00000 n
-0003054340 00000 n
-0003054553 00000 n
-0003055868 00000 n
-0003056081 00000 n
-0003057414 00000 n
-0003057627 00000 n
-0003058978 00000 n
-0003059191 00000 n
-0003060560 00000 n
-0003060773 00000 n
-0003062160 00000 n
-0003062373 00000 n
-0003063778 00000 n
-0003063991 00000 n
-0003065414 00000 n
-0003065627 00000 n
-0003067068 00000 n
-0003067281 00000 n
-0003068740 00000 n
-0003068953 00000 n
-0003070428 00000 n
-0003070641 00000 n
-0003072134 00000 n
-0003072347 00000 n
-0003073858 00000 n
-0003074071 00000 n
-0003075600 00000 n
-0003075813 00000 n
-0003077360 00000 n
-0003077573 00000 n
-0003079137 00000 n
-0003079350 00000 n
-0003080932 00000 n
-0003081145 00000 n
-0003082745 00000 n
-0003082958 00000 n
-0003084576 00000 n
-0003084789 00000 n
-0003086425 00000 n
-0003086638 00000 n
-0003088292 00000 n
-0003088505 00000 n
-0003090177 00000 n
-0003090390 00000 n
-0003092080 00000 n
-0003092293 00000 n
-0003094003 00000 n
-0003094216 00000 n
-0003095945 00000 n
-0003096158 00000 n
-0003097905 00000 n
-0003098118 00000 n
-0003099883 00000 n
-0003100096 00000 n
-0003101878 00000 n
-0003102091 00000 n
-0003103891 00000 n
-0003104104 00000 n
-0003105922 00000 n
-0003106135 00000 n
-0003107971 00000 n
-0003108184 00000 n
-0003110038 00000 n
-0003110251 00000 n
-0003112123 00000 n
-0003112336 00000 n
-0003114227 00000 n
-0003114440 00000 n
-0003116349 00000 n
-0003116562 00000 n
-0003118489 00000 n
-0003118702 00000 n
-0003120647 00000 n
-0003120860 00000 n
-0003122823 00000 n
-0003123036 00000 n
-0003125017 00000 n
-0003125230 00000 n
-0003127229 00000 n
-0003127442 00000 n
-0003129459 00000 n
-0003129672 00000 n
-0003131707 00000 n
-0003131920 00000 n
-0003133973 00000 n
-0003134186 00000 n
-0003136257 00000 n
-0003136470 00000 n
-0003138560 00000 n
-0003138773 00000 n
-0003140881 00000 n
-0003141094 00000 n
-0003143219 00000 n
-0003143432 00000 n
-0003145577 00000 n
-0003145791 00000 n
-0003146104 00000 n
-0003146318 00000 n
-0003146631 00000 n
-0003146845 00000 n
-0003147158 00000 n
-0003147372 00000 n
-0003147685 00000 n
-0003147899 00000 n
-0003148212 00000 n
-0003148426 00000 n
-0003148739 00000 n
-0003148953 00000 n
-0003149266 00000 n
-0003149480 00000 n
-0003149793 00000 n
-0003150007 00000 n
-0003150320 00000 n
-0003150534 00000 n
-0003150847 00000 n
-0003151061 00000 n
-0003151374 00000 n
-0003151588 00000 n
-0003151901 00000 n
-0003152115 00000 n
-0003152428 00000 n
-0003152642 00000 n
-0003152955 00000 n
-0003153169 00000 n
-0003153482 00000 n
-0003153696 00000 n
-0003154009 00000 n
-0003154223 00000 n
-0003154536 00000 n
-0003154750 00000 n
-0003155063 00000 n
-0003155277 00000 n
-0003155590 00000 n
-0003155804 00000 n
-0003156117 00000 n
-0003156331 00000 n
-0003156644 00000 n
-0003156858 00000 n
-0003157171 00000 n
-0003157385 00000 n
-0003157698 00000 n
-0003157912 00000 n
-0003158225 00000 n
-0003158439 00000 n
-0003158752 00000 n
-0003158966 00000 n
-0003159279 00000 n
-0003159493 00000 n
-0003159806 00000 n
-0003160020 00000 n
-0003160333 00000 n
-0003160547 00000 n
-0003160860 00000 n
-0003161074 00000 n
-0003161387 00000 n
-0003161601 00000 n
-0003161914 00000 n
-0003162128 00000 n
-0003162441 00000 n
-0003162655 00000 n
-0003162968 00000 n
-0003163182 00000 n
-0003163495 00000 n
-0003163709 00000 n
-0003164021 00000 n
-0003164235 00000 n
-0003164548 00000 n
-0003164762 00000 n
-0003165075 00000 n
-0003165289 00000 n
-0003165602 00000 n
-0003165816 00000 n
-0003166129 00000 n
-0003166343 00000 n
-0003166656 00000 n
-0003166870 00000 n
-0003167183 00000 n
-0003167397 00000 n
-0003167710 00000 n
-0003167924 00000 n
-0003168237 00000 n
-0003168451 00000 n
-0003168764 00000 n
-0003168978 00000 n
-0003169291 00000 n
-0003169505 00000 n
-0003169818 00000 n
-0003170032 00000 n
-0003170345 00000 n
-0003170559 00000 n
-0003170872 00000 n
-0003171086 00000 n
-0003171399 00000 n
-0003171613 00000 n
-0003171926 00000 n
-0003172140 00000 n
-0003172453 00000 n
-0003172667 00000 n
-0003172980 00000 n
-0003173194 00000 n
-0003173507 00000 n
-0003173721 00000 n
-0003174034 00000 n
-0003174248 00000 n
-0003174561 00000 n
-0003174775 00000 n
-0003175088 00000 n
-0003175302 00000 n
-0003175615 00000 n
-0003175829 00000 n
-0003176142 00000 n
-0003176356 00000 n
-0003176669 00000 n
-0003176883 00000 n
-0003177196 00000 n
-0003177410 00000 n
-0003177723 00000 n
-0003177937 00000 n
-0003178250 00000 n
-0003178464 00000 n
-0003178777 00000 n
-0003178991 00000 n
-0003179304 00000 n
-0003179518 00000 n
-0003179831 00000 n
-0003180045 00000 n
-0003180358 00000 n
-0003180572 00000 n
-0003180885 00000 n
-0003181099 00000 n
-0003181412 00000 n
-0003181626 00000 n
-0003181939 00000 n
-0003182153 00000 n
-0003182466 00000 n
-0003182680 00000 n
-0003182993 00000 n
-0003183207 00000 n
-0003183520 00000 n
-0003183734 00000 n
-0003184047 00000 n
-0003184261 00000 n
-0003184574 00000 n
-0003184788 00000 n
-0003185101 00000 n
-0003185315 00000 n
-0003185628 00000 n
-0003185842 00000 n
-0003186155 00000 n
-0003186369 00000 n
-0003186682 00000 n
-0003186896 00000 n
-0003187209 00000 n
-0003187423 00000 n
-0003187736 00000 n
-0003187950 00000 n
-0003188263 00000 n
-0003188477 00000 n
-0003188790 00000 n
-0003189004 00000 n
-0003189317 00000 n
-0003189531 00000 n
-0003189844 00000 n
-0003190058 00000 n
-0003190371 00000 n
-0003190585 00000 n
-0003190898 00000 n
-0003191112 00000 n
-0003191425 00000 n
-0003191639 00000 n
-0003191952 00000 n
-0003192166 00000 n
-0003192479 00000 n
-0003192693 00000 n
-0003193006 00000 n
-0003193220 00000 n
-0003194091 00000 n
-0003194253 00000 n
-0003195043 00000 n
-0003195326 00000 n
-0003195607 00000 n
-0003195830 00000 n
-0003196052 00000 n
-0003196340 00000 n
-0003196565 00000 n
-0003196789 00000 n
-0003197079 00000 n
-0003197362 00000 n
-0003197645 00000 n
-0003197937 00000 n
-0003198237 00000 n
-0003198528 00000 n
-0003198780 00000 n
-0003198961 00000 n
-0003199034 00000 n
-0003200682 00000 n
-0003201679 00000 n
-0003202785 00000 n
-0003203916 00000 n
-0003205035 00000 n
-0003206170 00000 n
-0003207314 00000 n
-0003208457 00000 n
-0003209612 00000 n
-0003210760 00000 n
-0003211901 00000 n
-0003213045 00000 n
-0003214135 00000 n
-0003215227 00000 n
-0003216308 00000 n
-0003217425 00000 n
-0003218549 00000 n
-0003219621 00000 n
-0003220735 00000 n
-0003221837 00000 n
-0003222957 00000 n
-0003224094 00000 n
-0003225235 00000 n
-0003226353 00000 n
-0003227461 00000 n
-0003228565 00000 n
-0003229600 00000 n
-0003229944 00000 n
-0003230155 00000 n
-0003230499 00000 n
-0003230710 00000 n
-0003231054 00000 n
-0003231265 00000 n
-0003231609 00000 n
-0003231820 00000 n
-0003232164 00000 n
-0003232375 00000 n
-0003232719 00000 n
-0003232930 00000 n
-0003233274 00000 n
-0003233485 00000 n
-0003233831 00000 n
-0003234042 00000 n
-0003234388 00000 n
-0003234599 00000 n
-0003234944 00000 n
-0003235155 00000 n
-0003235501 00000 n
-0003235713 00000 n
-0003236059 00000 n
-0003236271 00000 n
-0003236617 00000 n
-0003236829 00000 n
-0003237175 00000 n
-0003237387 00000 n
-0003237732 00000 n
-0003237944 00000 n
-0003238290 00000 n
-0003238502 00000 n
-0003238848 00000 n
-0003239060 00000 n
-0003239406 00000 n
-0003239618 00000 n
-0003239964 00000 n
-0003240176 00000 n
-0003240521 00000 n
-0003240733 00000 n
-0003241079 00000 n
-0003241291 00000 n
-0003241637 00000 n
-0003241849 00000 n
-0003242195 00000 n
-0003242407 00000 n
-0003242753 00000 n
-0003242965 00000 n
-0003243311 00000 n
-0003243523 00000 n
-0003243869 00000 n
-0003244081 00000 n
-0003245085 00000 n
-0003245245 00000 n
-0003246008 00000 n
-0003246290 00000 n
-0003246570 00000 n
-0003246792 00000 n
-0003247013 00000 n
-0003247300 00000 n
-0003247524 00000 n
-0003247747 00000 n
-0003248036 00000 n
-0003248318 00000 n
-0003248600 00000 n
-0003248891 00000 n
-0003249190 00000 n
-0003249480 00000 n
-0003253394 00000 n
-0003255268 00000 n
-0003255900 00000 n
-0003256550 00000 n
-0003257222 00000 n
-0003257497 00000 n
-0003258161 00000 n
-0003258894 00000 n
-0003260315 00000 n
-0003260946 00000 n
-0003262493 00000 n
-0003262768 00000 n
-0003263436 00000 n
-0003270435 00000 n
-0003270765 00000 n
-0003271957 00000 n
-0003272591 00000 n
-0003273260 00000 n
-0003273926 00000 n
-0003274696 00000 n
-0003275689 00000 n
-0003276343 00000 n
-0003279526 00000 n
-0003289327 00000 n
-0003289426 00000 n
-0003289661 00000 n
-0003289826 00000 n
-0003290404 00000 n
-0003290529 00000 n
-0003290774 00000 n
-0003290881 00000 n
-0003291650 00000 n
-0003291852 00000 n
-0003292425 00000 n
-0003293013 00000 n
-0003293144 00000 n
-0003297035 00000 n
-0003297290 00000 n
-0003297479 00000 n
-0003297668 00000 n
-0003297815 00000 n
-0003297962 00000 n
-0003298109 00000 n
-0003298256 00000 n
-0003298403 00000 n
-0003298550 00000 n
-0003298697 00000 n
-0003298844 00000 n
-0003298991 00000 n
-0003299138 00000 n
-0003299285 00000 n
-0003299432 00000 n
-0003299584 00000 n
-0003299736 00000 n
-0003299888 00000 n
-0003300040 00000 n
-0003300187 00000 n
-0003300334 00000 n
-0003300481 00000 n
-0003300628 00000 n
-0003300780 00000 n
-0003300932 00000 n
-0003301084 00000 n
-0003301236 00000 n
-0003301383 00000 n
-0003301530 00000 n
-0003301706 00000 n
-0003301882 00000 n
-0003302064 00000 n
-0003302246 00000 n
-0003302284 00000 n
-0003302425 00000 n
-0003302476 00000 n
-0003302581 00000 n
-0003302705 00000 n
-0003302830 00000 n
-0003302878 00000 n
-0003303229 00000 n
-0003303530 00000 n
-0003304009 00000 n
-0003304408 00000 n
-0003304933 00000 n
-0003305577 00000 n
-0003315855 00000 n
-0003322100 00000 n
-0003324359 00000 n
-0003324476 00000 n
-0003325033 00000 n
-0003325158 00000 n
-0003325223 00000 n
-0003325321 00000 n
-0003325434 00000 n
-0003325547 00000 n
-0003325665 00000 n
-0003325784 00000 n
-0003325941 00000 n
-0003326047 00000 n
-0003326161 00000 n
-0003326283 00000 n
-0003326433 00000 n
-0003326580 00000 n
-0003326735 00000 n
-0003326858 00000 n
-0003326965 00000 n
-trailer << /Info 323 0 R /Root 721 0 R /Size 2468 /Prev 3909925 /ID [<ef3b060afb9703a691cade546761b679><2b66b437f6640f1fc678130bc823fb34>] >>
+0000049331 00000 n
+0000049626 00000 n
+0000049852 00000 n
+0000050110 00000 n
+0000050288 00000 n
+0000050532 00000 n
+0000050707 00000 n
+0000050941 00000 n
+0000051128 00000 n
+0000051385 00000 n
+0000053781 00000 n
+0000053967 00000 n
+0000054223 00000 n
+0000054407 00000 n
+0000054649 00000 n
+0000055727 00000 n
+0000055911 00000 n
+0000056153 00000 n
+0000057255 00000 n
+0000057439 00000 n
+0000057685 00000 n
+0000059740 00000 n
+0000059924 00000 n
+0000060167 00000 n
+0000062295 00000 n
+0000062479 00000 n
+0000062724 00000 n
+0000064863 00000 n
+0000065047 00000 n
+0000065291 00000 n
+0000067409 00000 n
+0000067593 00000 n
+0000067839 00000 n
+0000069981 00000 n
+0000070165 00000 n
+0000070411 00000 n
+0000072558 00000 n
+0000072853 00000 n
+0000073063 00000 n
+0000073380 00000 n
+0000073590 00000 n
+0000073907 00000 n
+0000074117 00000 n
+0000074434 00000 n
+0000074644 00000 n
+0000074961 00000 n
+0000075171 00000 n
+0000075488 00000 n
+0000075698 00000 n
+0000076014 00000 n
+0000076224 00000 n
+0000076541 00000 n
+0000076751 00000 n
+0000077068 00000 n
+0000077278 00000 n
+0000078455 00000 n
+0000078614 00000 n
+0000079396 00000 n
+0000079784 00000 n
+0000080066 00000 n
+0000080444 00000 n
+0000080724 00000 n
+0000081067 00000 n
+0000081289 00000 n
+0000081641 00000 n
+0000081862 00000 n
+0000082093 00000 n
+0000082380 00000 n
+0000082720 00000 n
+0000082944 00000 n
+0000083296 00000 n
+0000083519 00000 n
+0000083808 00000 n
+0000084188 00000 n
+0000084470 00000 n
+0000084859 00000 n
+0000085141 00000 n
+0000085518 00000 n
+0000085809 00000 n
+0000086225 00000 n
+0000086524 00000 n
+0000086911 00000 n
+0000087201 00000 n
+0000087390 00000 n
+0000087874 00000 n
+0000088155 00000 n
+0000088484 00000 n
+0000088809 00000 n
+0000089168 00000 n
+0000089493 00000 n
+0000089851 00000 n
+0000090176 00000 n
+0000090536 00000 n
+0000090861 00000 n
+0000091223 00000 n
+0000091548 00000 n
+0000091906 00000 n
+0000092231 00000 n
+0000092587 00000 n
+0000092912 00000 n
+0000093268 00000 n
+0000093593 00000 n
+0000093952 00000 n
+0000094277 00000 n
+0000094638 00000 n
+0000094963 00000 n
+0000095320 00000 n
+0000095645 00000 n
+0000096006 00000 n
+0000096331 00000 n
+0000096692 00000 n
+0000097017 00000 n
+0000097375 00000 n
+0000097700 00000 n
+0000098058 00000 n
+0000098383 00000 n
+0000098742 00000 n
+0000099067 00000 n
+0000099426 00000 n
+0000099751 00000 n
+0000100114 00000 n
+0000100439 00000 n
+0000100799 00000 n
+0000101124 00000 n
+0000101484 00000 n
+0000101809 00000 n
+0000102170 00000 n
+0000102495 00000 n
+0000102858 00000 n
+0000103183 00000 n
+0000103545 00000 n
+0000103870 00000 n
+0000104230 00000 n
+0000104555 00000 n
+0000104917 00000 n
+0000105242 00000 n
+0000105600 00000 n
+0000105925 00000 n
+0000106286 00000 n
+0000106609 00000 n
+0000106969 00000 n
+0000107294 00000 n
+0000107655 00000 n
+0000107980 00000 n
+0000108340 00000 n
+0000108665 00000 n
+0000109025 00000 n
+0000109350 00000 n
+0000109710 00000 n
+0000110034 00000 n
+0000110393 00000 n
+0000110718 00000 n
+0000111075 00000 n
+0000111400 00000 n
+0000111760 00000 n
+0000112085 00000 n
+0000112445 00000 n
+0000112770 00000 n
+0000113130 00000 n
+0000113455 00000 n
+0000113817 00000 n
+0000114142 00000 n
+0000114505 00000 n
+0000114830 00000 n
+0000115189 00000 n
+0000115513 00000 n
+0000115875 00000 n
+0000116200 00000 n
+0000116562 00000 n
+0000116887 00000 n
+0000117248 00000 n
+0000117572 00000 n
+0000117931 00000 n
+0000118256 00000 n
+0000118617 00000 n
+0000118942 00000 n
+0000119305 00000 n
+0000119630 00000 n
+0000119993 00000 n
+0000120318 00000 n
+0000120679 00000 n
+0000121004 00000 n
+0000121366 00000 n
+0000121691 00000 n
+0000122052 00000 n
+0000122377 00000 n
+0000122740 00000 n
+0000123065 00000 n
+0000123426 00000 n
+0000123751 00000 n
+0000124113 00000 n
+0000124438 00000 n
+0000124799 00000 n
+0000125124 00000 n
+0000125486 00000 n
+0000125811 00000 n
+0000126174 00000 n
+0000126499 00000 n
+0000126859 00000 n
+0000127184 00000 n
+0000127546 00000 n
+0000127871 00000 n
+0000128231 00000 n
+0000128556 00000 n
+0000128916 00000 n
+0000129241 00000 n
+0000129598 00000 n
+0000129923 00000 n
+0000130281 00000 n
+0000130606 00000 n
+0000130963 00000 n
+0000131288 00000 n
+0000131647 00000 n
+0000131972 00000 n
+0000132334 00000 n
+0000132659 00000 n
+0000133019 00000 n
+0000133344 00000 n
+0000133705 00000 n
+0000134030 00000 n
+0000134387 00000 n
+0000134712 00000 n
+0000135073 00000 n
+0000135398 00000 n
+0000135754 00000 n
+0000136079 00000 n
+0000136434 00000 n
+0000136759 00000 n
+0000137118 00000 n
+0000137443 00000 n
+0000137803 00000 n
+0000138128 00000 n
+0000138488 00000 n
+0000138813 00000 n
+0000139172 00000 n
+0000139497 00000 n
+0000139857 00000 n
+0000140182 00000 n
+0000140542 00000 n
+0000140866 00000 n
+0000141228 00000 n
+0000141553 00000 n
+0000141911 00000 n
+0000142236 00000 n
+0000142596 00000 n
+0000142921 00000 n
+0000143284 00000 n
+0000143610 00000 n
+0000143973 00000 n
+0000144299 00000 n
+0000144662 00000 n
+0000144989 00000 n
+0000145351 00000 n
+0000145678 00000 n
+0000146036 00000 n
+0000146363 00000 n
+0000146725 00000 n
+0000147052 00000 n
+0000147411 00000 n
+0000147738 00000 n
+0000148099 00000 n
+0000148426 00000 n
+0000148782 00000 n
+0000149109 00000 n
+0000149471 00000 n
+0000149797 00000 n
+0000150157 00000 n
+0000150484 00000 n
+0000150844 00000 n
+0000151171 00000 n
+0000151531 00000 n
+0000151858 00000 n
+0000152215 00000 n
+0000152542 00000 n
+0000152902 00000 n
+0000153229 00000 n
+0000153591 00000 n
+0000153918 00000 n
+0000154280 00000 n
+0000154607 00000 n
+0000154967 00000 n
+0000155294 00000 n
+0000155655 00000 n
+0000155982 00000 n
+0000156346 00000 n
+0000156673 00000 n
+0000157037 00000 n
+0000157364 00000 n
+0000157619 00000 n
+0000157872 00000 n
+0000158480 00000 n
+0000158807 00000 n
+0000159391 00000 n
+0000159718 00000 n
+0000160303 00000 n
+0000160630 00000 n
+0000161216 00000 n
+0000161543 00000 n
+0000162127 00000 n
+0000162454 00000 n
+0000163040 00000 n
+0000163367 00000 n
+0000163953 00000 n
+0000164280 00000 n
+0000164866 00000 n
+0000165193 00000 n
+0000165778 00000 n
+0000166105 00000 n
+0000166690 00000 n
+0000167017 00000 n
+0000167602 00000 n
+0000167929 00000 n
+0000168518 00000 n
+0000168845 00000 n
+0000169427 00000 n
+0000169754 00000 n
+0000170342 00000 n
+0000170669 00000 n
+0000171257 00000 n
+0000171584 00000 n
+0000172170 00000 n
+0000172497 00000 n
+0000173087 00000 n
+0000173414 00000 n
+0000174000 00000 n
+0000174327 00000 n
+0000174915 00000 n
+0000175242 00000 n
+0000175830 00000 n
+0000176157 00000 n
+0000176744 00000 n
+0000177071 00000 n
+0000177658 00000 n
+0000177985 00000 n
+0000178571 00000 n
+0000178897 00000 n
+0000179487 00000 n
+0000179814 00000 n
+0000180429 00000 n
+0000180755 00000 n
+0000181367 00000 n
+0000181694 00000 n
+0000182312 00000 n
+0000182639 00000 n
+0000183255 00000 n
+0000183582 00000 n
+0000184197 00000 n
+0000184524 00000 n
+0000185136 00000 n
+0000185461 00000 n
+0000186073 00000 n
+0000186400 00000 n
+0000187015 00000 n
+0000187342 00000 n
+0000187954 00000 n
+0000188281 00000 n
+0000188898 00000 n
+0000189225 00000 n
+0000189838 00000 n
+0000190165 00000 n
+0000190777 00000 n
+0000191104 00000 n
+0000191719 00000 n
+0000192046 00000 n
+0000192661 00000 n
+0000192987 00000 n
+0000193600 00000 n
+0000193927 00000 n
+0000194539 00000 n
+0000194866 00000 n
+0000195480 00000 n
+0000195807 00000 n
+0000196422 00000 n
+0000196749 00000 n
+0000197364 00000 n
+0000197691 00000 n
+0000198305 00000 n
+0000198632 00000 n
+0000199247 00000 n
+0000199574 00000 n
+0000200186 00000 n
+0000200513 00000 n
+0000201128 00000 n
+0000201455 00000 n
+0000202067 00000 n
+0000202394 00000 n
+0000203007 00000 n
+0000203334 00000 n
+0000203950 00000 n
+0000204277 00000 n
+0000204867 00000 n
+0000205194 00000 n
+0000205780 00000 n
+0000206107 00000 n
+0000206694 00000 n
+0000207021 00000 n
+0000207606 00000 n
+0000207933 00000 n
+0000208520 00000 n
+0000208847 00000 n
+0000209431 00000 n
+0000209758 00000 n
+0000210340 00000 n
+0000210667 00000 n
+0000211251 00000 n
+0000211578 00000 n
+0000212164 00000 n
+0000212491 00000 n
+0000213077 00000 n
+0000213404 00000 n
+0000213988 00000 n
+0000214315 00000 n
+0000214902 00000 n
+0000215229 00000 n
+0000215819 00000 n
+0000216146 00000 n
+0000216734 00000 n
+0000217061 00000 n
+0000217649 00000 n
+0000217976 00000 n
+0000218565 00000 n
+0000218892 00000 n
+0000219478 00000 n
+0000219805 00000 n
+0000220392 00000 n
+0000220719 00000 n
+0000221307 00000 n
+0000221634 00000 n
+0000222221 00000 n
+0000222548 00000 n
+0000223135 00000 n
+0000223462 00000 n
+0000224050 00000 n
+0000224377 00000 n
+0000224967 00000 n
+0000225294 00000 n
+0000225884 00000 n
+0000226211 00000 n
+0000226802 00000 n
+0000227128 00000 n
+0000227717 00000 n
+0000228044 00000 n
+0000228632 00000 n
+0000228959 00000 n
+0000229572 00000 n
+0000229899 00000 n
+0000230515 00000 n
+0000230842 00000 n
+0000231452 00000 n
+0000231778 00000 n
+0000232390 00000 n
+0000232717 00000 n
+0000233335 00000 n
+0000233662 00000 n
+0000234275 00000 n
+0000234602 00000 n
+0000235218 00000 n
+0000235545 00000 n
+0000236158 00000 n
+0000236485 00000 n
+0000237101 00000 n
+0000237428 00000 n
+0000238042 00000 n
+0000238369 00000 n
+0000238982 00000 n
+0000239308 00000 n
+0000239921 00000 n
+0000240248 00000 n
+0000240858 00000 n
+0000241185 00000 n
+0000241796 00000 n
+0000242123 00000 n
+0000242738 00000 n
+0000243065 00000 n
+0000243675 00000 n
+0000244002 00000 n
+0000244610 00000 n
+0000244937 00000 n
+0000245546 00000 n
+0000245873 00000 n
+0000246485 00000 n
+0000246812 00000 n
+0000247424 00000 n
+0000247751 00000 n
+0000248362 00000 n
+0000248689 00000 n
+0000249298 00000 n
+0000249625 00000 n
+0000250235 00000 n
+0000250562 00000 n
+0000250904 00000 n
+0000251231 00000 n
+0000251571 00000 n
+0000251898 00000 n
+0000252242 00000 n
+0000252569 00000 n
+0000252913 00000 n
+0000253240 00000 n
+0000253584 00000 n
+0000253911 00000 n
+0000254253 00000 n
+0000254580 00000 n
+0000254919 00000 n
+0000255246 00000 n
+0000255588 00000 n
+0000255915 00000 n
+0000256254 00000 n
+0000256581 00000 n
+0000256926 00000 n
+0000257253 00000 n
+0000257595 00000 n
+0000257922 00000 n
+0000258267 00000 n
+0000258594 00000 n
+0000258936 00000 n
+0000259263 00000 n
+0000259608 00000 n
+0000259935 00000 n
+0000260280 00000 n
+0000260607 00000 n
+0000260953 00000 n
+0000261280 00000 n
+0000261624 00000 n
+0000261951 00000 n
+0000262292 00000 n
+0000262619 00000 n
+0000262961 00000 n
+0000263288 00000 n
+0000263632 00000 n
+0000263959 00000 n
+0000264300 00000 n
+0000264627 00000 n
+0000264972 00000 n
+0000265299 00000 n
+0000265643 00000 n
+0000265970 00000 n
+0000266311 00000 n
+0000266638 00000 n
+0000266983 00000 n
+0000267309 00000 n
+0000267651 00000 n
+0000267978 00000 n
+0000268322 00000 n
+0000268649 00000 n
+0000268993 00000 n
+0000269320 00000 n
+0000269661 00000 n
+0000269988 00000 n
+0000270332 00000 n
+0000270658 00000 n
+0000271000 00000 n
+0000271327 00000 n
+0000271667 00000 n
+0000271994 00000 n
+0000272339 00000 n
+0000272666 00000 n
+0000273011 00000 n
+0000273338 00000 n
+0000273683 00000 n
+0000274010 00000 n
+0000274352 00000 n
+0000274680 00000 n
+0000275024 00000 n
+0000275353 00000 n
+0000275695 00000 n
+0000276023 00000 n
+0000276363 00000 n
+0000276691 00000 n
+0000277032 00000 n
+0000277361 00000 n
+0000277705 00000 n
+0000278034 00000 n
+0000278379 00000 n
+0000278708 00000 n
+0000279053 00000 n
+0000279382 00000 n
+0000279727 00000 n
+0000280056 00000 n
+0000280397 00000 n
+0000280726 00000 n
+0000281068 00000 n
+0000281397 00000 n
+0000281738 00000 n
+0000282067 00000 n
+0000282412 00000 n
+0000282741 00000 n
+0000283086 00000 n
+0000283415 00000 n
+0000283757 00000 n
+0000284086 00000 n
+0000284401 00000 n
+0000284677 00000 n
+0000284917 00000 n
+0000285187 00000 n
+0000285364 00000 n
+0000285599 00000 n
+0000285922 00000 n
+0000286187 00000 n
+0000286474 00000 n
+0000286711 00000 n
+0000287690 00000 n
+0000288018 00000 n
+0000288398 00000 n
+0000288612 00000 n
+0000289011 00000 n
+0000289225 00000 n
+0000289660 00000 n
+0000289874 00000 n
+0000290326 00000 n
+0000290540 00000 n
+0000291028 00000 n
+0000291242 00000 n
+0000291748 00000 n
+0000291962 00000 n
+0000292506 00000 n
+0000292720 00000 n
+0000293281 00000 n
+0000293495 00000 n
+0000294091 00000 n
+0000294305 00000 n
+0000294917 00000 n
+0000295131 00000 n
+0000295777 00000 n
+0000295992 00000 n
+0000296654 00000 n
+0000296869 00000 n
+0000297564 00000 n
+0000297779 00000 n
+0000298490 00000 n
+0000298705 00000 n
+0000299450 00000 n
+0000299665 00000 n
+0000300427 00000 n
+0000300642 00000 n
+0000301440 00000 n
+0000301655 00000 n
+0000302469 00000 n
+0000302684 00000 n
+0000303531 00000 n
+0000303746 00000 n
+0000304609 00000 n
+0000304824 00000 n
+0000305719 00000 n
+0000305934 00000 n
+0000306846 00000 n
+0000307061 00000 n
+0000308007 00000 n
+0000308222 00000 n
+0000309184 00000 n
+0000309399 00000 n
+0000310395 00000 n
+0000310610 00000 n
+0000311622 00000 n
+0000311837 00000 n
+0000312882 00000 n
+0000313097 00000 n
+0000314159 00000 n
+0000314374 00000 n
+0000315468 00000 n
+0000315683 00000 n
+0000316793 00000 n
+0000317008 00000 n
+0000318152 00000 n
+0000318367 00000 n
+0000319527 00000 n
+0000319742 00000 n
+0000320935 00000 n
+0000321150 00000 n
+0000322359 00000 n
+0000322574 00000 n
+0000323817 00000 n
+0000324032 00000 n
+0000325291 00000 n
+0000325506 00000 n
+0000326799 00000 n
+0000327014 00000 n
+0000328323 00000 n
+0000328538 00000 n
+0000329880 00000 n
+0000330095 00000 n
+0000331455 00000 n
+0000331670 00000 n
+0000333066 00000 n
+0000333281 00000 n
+0000334694 00000 n
+0000334909 00000 n
+0000336355 00000 n
+0000336570 00000 n
+0000338032 00000 n
+0000338247 00000 n
+0000339743 00000 n
+0000339958 00000 n
+0000341470 00000 n
+0000341685 00000 n
+0000343230 00000 n
+0000343445 00000 n
+0000345006 00000 n
+0000345221 00000 n
+0000346815 00000 n
+0000347030 00000 n
+0000348640 00000 n
+0000348855 00000 n
+0000350499 00000 n
+0000350714 00000 n
+0000352375 00000 n
+0000352590 00000 n
+0000354285 00000 n
+0000354500 00000 n
+0000356212 00000 n
+0000356427 00000 n
+0000358174 00000 n
+0000358389 00000 n
+0000360152 00000 n
+0000360367 00000 n
+0000362165 00000 n
+0000362380 00000 n
+0000364194 00000 n
+0000364409 00000 n
+0000366256 00000 n
+0000366471 00000 n
+0000368335 00000 n
+0000368550 00000 n
+0000370448 00000 n
+0000370663 00000 n
+0000372577 00000 n
+0000372792 00000 n
+0000374740 00000 n
+0000374955 00000 n
+0000376919 00000 n
+0000377134 00000 n
+0000379133 00000 n
+0000379348 00000 n
+0000381364 00000 n
+0000381579 00000 n
+0000383629 00000 n
+0000383844 00000 n
+0000385910 00000 n
+0000386125 00000 n
+0000388223 00000 n
+0000388438 00000 n
+0000390553 00000 n
+0000390768 00000 n
+0000392919 00000 n
+0000393134 00000 n
+0000395301 00000 n
+0000395516 00000 n
+0000397718 00000 n
+0000397933 00000 n
+0000400152 00000 n
+0000400367 00000 n
+0000402622 00000 n
+0000402837 00000 n
+0000405109 00000 n
+0000405324 00000 n
+0000407630 00000 n
+0000407845 00000 n
+0000410168 00000 n
+0000410383 00000 n
+0000412741 00000 n
+0000412956 00000 n
+0000415330 00000 n
+0000415545 00000 n
+0000417955 00000 n
+0000418170 00000 n
+0000420597 00000 n
+0000420812 00000 n
+0000423274 00000 n
+0000423489 00000 n
+0000425968 00000 n
+0000426183 00000 n
+0000428699 00000 n
+0000428914 00000 n
+0000431449 00000 n
+0000431664 00000 n
+0000434234 00000 n
+0000434449 00000 n
+0000437037 00000 n
+0000437252 00000 n
+0000439872 00000 n
+0000440087 00000 n
+0000442725 00000 n
+0000442940 00000 n
+0000445614 00000 n
+0000445829 00000 n
+0000448521 00000 n
+0000448736 00000 n
+0000451463 00000 n
+0000451678 00000 n
+0000454422 00000 n
+0000454637 00000 n
+0000457419 00000 n
+0000457634 00000 n
+0000460433 00000 n
+0000460648 00000 n
+0000463483 00000 n
+0000463698 00000 n
+0000466551 00000 n
+0000466766 00000 n
+0000469654 00000 n
+0000469869 00000 n
+0000472774 00000 n
+0000472989 00000 n
+0000475916 00000 n
+0000476132 00000 n
+0000477018 00000 n
+0000477178 00000 n
+0000477970 00000 n
+0000478253 00000 n
+0000478534 00000 n
+0000478757 00000 n
+0000478979 00000 n
+0000479267 00000 n
+0000479492 00000 n
+0000479716 00000 n
+0000480006 00000 n
+0000480289 00000 n
+0000480572 00000 n
+0000480864 00000 n
+0000481164 00000 n
+0000481455 00000 n
+0000482334 00000 n
+0000482658 00000 n
+0000482872 00000 n
+0000509553 00000 n
+0000509877 00000 n
+0000510091 00000 n
+0000538017 00000 n
+0000538341 00000 n
+0000538555 00000 n
+0000566856 00000 n
+0000567180 00000 n
+0000567394 00000 n
+0000595957 00000 n
+0000596281 00000 n
+0000596495 00000 n
+0000625019 00000 n
+0000625343 00000 n
+0000625557 00000 n
+0000653651 00000 n
+0000653975 00000 n
+0000654189 00000 n
+0000682844 00000 n
+0000683168 00000 n
+0000683382 00000 n
+0000712046 00000 n
+0000712370 00000 n
+0000712584 00000 n
+0000740489 00000 n
+0000740813 00000 n
+0000741027 00000 n
+0000768573 00000 n
+0000768897 00000 n
+0000769112 00000 n
+0000797185 00000 n
+0000797509 00000 n
+0000797724 00000 n
+0000826802 00000 n
+0000827126 00000 n
+0000827341 00000 n
+0000856451 00000 n
+0000856775 00000 n
+0000856990 00000 n
+0000886082 00000 n
+0000886406 00000 n
+0000886621 00000 n
+0000914892 00000 n
+0000915216 00000 n
+0000915431 00000 n
+0000944662 00000 n
+0000944986 00000 n
+0000945201 00000 n
+0000974525 00000 n
+0000974849 00000 n
+0000975064 00000 n
+0001003064 00000 n
+0001003388 00000 n
+0001003603 00000 n
+0001033112 00000 n
+0001033436 00000 n
+0001033651 00000 n
+0001063168 00000 n
+0001063492 00000 n
+0001063707 00000 n
+0001092433 00000 n
+0001092757 00000 n
+0001092972 00000 n
+0001120985 00000 n
+0001121309 00000 n
+0001121524 00000 n
+0001151397 00000 n
+0001151721 00000 n
+0001151936 00000 n
+0001181833 00000 n
+0001182157 00000 n
+0001182372 00000 n
+0001212341 00000 n
+0001212665 00000 n
+0001212880 00000 n
+0001242957 00000 n
+0001243281 00000 n
+0001243496 00000 n
+0001273585 00000 n
+0001273909 00000 n
+0001274124 00000 n
+0001301647 00000 n
+0001301971 00000 n
+0001302186 00000 n
+0001303068 00000 n
+0001303229 00000 n
+0001303995 00000 n
+0001304278 00000 n
+0001304559 00000 n
+0001304782 00000 n
+0001305004 00000 n
+0001305292 00000 n
+0001305517 00000 n
+0001305741 00000 n
+0001306031 00000 n
+0001306314 00000 n
+0001306597 00000 n
+0001306889 00000 n
+0001307189 00000 n
+0001307480 00000 n
+0001308039 00000 n
+0001308522 00000 n
+0001309005 00000 n
+0001309487 00000 n
+0001309969 00000 n
+0001310447 00000 n
+0001310934 00000 n
+0001311417 00000 n
+0001311902 00000 n
+0001312391 00000 n
+0001312876 00000 n
+0001313357 00000 n
+0001313837 00000 n
+0001314323 00000 n
+0001314806 00000 n
+0001315292 00000 n
+0001315779 00000 n
+0001316261 00000 n
+0001316751 00000 n
+0001317232 00000 n
+0001317717 00000 n
+0001318203 00000 n
+0001318680 00000 n
+0001319166 00000 n
+0001319651 00000 n
+0001320138 00000 n
+0001320626 00000 n
+0001321113 00000 n
+0001321599 00000 n
+0001322083 00000 n
+0001322572 00000 n
+0001323061 00000 n
+0001323554 00000 n
+0001324040 00000 n
+0001324532 00000 n
+0001325025 00000 n
+0001325488 00000 n
+0001325958 00000 n
+0001326430 00000 n
+0001326927 00000 n
+0001327426 00000 n
+0001327912 00000 n
+0001328401 00000 n
+0001328879 00000 n
+0001329364 00000 n
+0001329842 00000 n
+0001330327 00000 n
+0001330811 00000 n
+0001331297 00000 n
+0001331790 00000 n
+0001332274 00000 n
+0001332759 00000 n
+0001333252 00000 n
+0001333742 00000 n
+0001334235 00000 n
+0001334729 00000 n
+0001335212 00000 n
+0001335707 00000 n
+0001336193 00000 n
+0001336683 00000 n
+0001337177 00000 n
+0001337665 00000 n
+0001338160 00000 n
+0001338653 00000 n
+0001339141 00000 n
+0001339634 00000 n
+0001340125 00000 n
+0001340611 00000 n
+0001341110 00000 n
+0001341602 00000 n
+0001342083 00000 n
+0001342570 00000 n
+0001343064 00000 n
+0001343552 00000 n
+0001344042 00000 n
+0001344542 00000 n
+0001345026 00000 n
+0001345514 00000 n
+0001346016 00000 n
+0001346507 00000 n
+0001346994 00000 n
+0001347490 00000 n
+0001347971 00000 n
+0001348458 00000 n
+0001348949 00000 n
+0001349441 00000 n
+0001349927 00000 n
+0001350431 00000 n
+0001350917 00000 n
+0001351404 00000 n
+0001351903 00000 n
+0001352399 00000 n
+0001352886 00000 n
+0001353381 00000 n
+0001353866 00000 n
+0001354352 00000 n
+0001354845 00000 n
+0001355330 00000 n
+0001355796 00000 n
+0001356273 00000 n
+0001356760 00000 n
+0001375229 00000 n
+0001393660 00000 n
+0001412100 00000 n
+0001430520 00000 n
+0001448952 00000 n
+0001467313 00000 n
+0001485668 00000 n
+0001503985 00000 n
+0001522260 00000 n
+0001540511 00000 n
+0001558740 00000 n
+0001577001 00000 n
+0001595211 00000 n
+0001613328 00000 n
+0001631438 00000 n
+0001649448 00000 n
+0001667406 00000 n
+0001685272 00000 n
+0001703138 00000 n
+0001720870 00000 n
+0001738691 00000 n
+0001756479 00000 n
+0001774341 00000 n
+0001792294 00000 n
+0001810276 00000 n
+0001828316 00000 n
+0001846428 00000 n
+0001864510 00000 n
+0001882699 00000 n
+0001900912 00000 n
+0001919212 00000 n
+0001937504 00000 n
+0001955859 00000 n
+0001974277 00000 n
+0001992742 00000 n
+0002011282 00000 n
+0002029803 00000 n
+0002048356 00000 n
+0002066876 00000 n
+0002085380 00000 n
+0002103939 00000 n
+0002122573 00000 n
+0002141205 00000 n
+0002159833 00000 n
+0002178348 00000 n
+0002196867 00000 n
+0002215342 00000 n
+0002233874 00000 n
+0002252337 00000 n
+0002270819 00000 n
+0002289200 00000 n
+0002307603 00000 n
+0002325988 00000 n
+0002344312 00000 n
+0002362633 00000 n
+0002380928 00000 n
+0002399190 00000 n
+0002417451 00000 n
+0002435589 00000 n
+0002453617 00000 n
+0002471621 00000 n
+0002489592 00000 n
+0002507462 00000 n
+0002525296 00000 n
+0002543093 00000 n
+0002560843 00000 n
+0002578585 00000 n
+0002596450 00000 n
+0002614327 00000 n
+0002632314 00000 n
+0002650311 00000 n
+0002668333 00000 n
+0002686429 00000 n
+0002704600 00000 n
+0002722753 00000 n
+0002740973 00000 n
+0002759229 00000 n
+0002777466 00000 n
+0002795809 00000 n
+0002814229 00000 n
+0002832688 00000 n
+0002851124 00000 n
+0002869622 00000 n
+0002888091 00000 n
+0002906578 00000 n
+0002925071 00000 n
+0002943643 00000 n
+0002962151 00000 n
+0002980632 00000 n
+0002999135 00000 n
+0002999448 00000 n
+0002999660 00000 n
+0002999995 00000 n
+0003000207 00000 n
+0003000561 00000 n
+0003000773 00000 n
+0003001147 00000 n
+0003001359 00000 n
+0003001752 00000 n
+0003001964 00000 n
+0003002376 00000 n
+0003002588 00000 n
+0003003020 00000 n
+0003003232 00000 n
+0003003684 00000 n
+0003003896 00000 n
+0003004367 00000 n
+0003004579 00000 n
+0003005069 00000 n
+0003005281 00000 n
+0003005790 00000 n
+0003006003 00000 n
+0003006531 00000 n
+0003006744 00000 n
+0003007292 00000 n
+0003007505 00000 n
+0003008073 00000 n
+0003008286 00000 n
+0003008873 00000 n
+0003009086 00000 n
+0003009691 00000 n
+0003009904 00000 n
+0003010528 00000 n
+0003010741 00000 n
+0003011384 00000 n
+0003011597 00000 n
+0003012258 00000 n
+0003012471 00000 n
+0003013152 00000 n
+0003013365 00000 n
+0003014064 00000 n
+0003014277 00000 n
+0003014995 00000 n
+0003015208 00000 n
+0003015944 00000 n
+0003016157 00000 n
+0003016913 00000 n
+0003017126 00000 n
+0003017900 00000 n
+0003018113 00000 n
+0003018905 00000 n
+0003019118 00000 n
+0003019929 00000 n
+0003020142 00000 n
+0003020971 00000 n
+0003021184 00000 n
+0003022031 00000 n
+0003022244 00000 n
+0003023109 00000 n
+0003023322 00000 n
+0003024204 00000 n
+0003024417 00000 n
+0003025317 00000 n
+0003025530 00000 n
+0003026448 00000 n
+0003026661 00000 n
+0003027597 00000 n
+0003027810 00000 n
+0003028763 00000 n
+0003028976 00000 n
+0003029947 00000 n
+0003030160 00000 n
+0003031149 00000 n
+0003031362 00000 n
+0003032369 00000 n
+0003032582 00000 n
+0003033607 00000 n
+0003033820 00000 n
+0003034863 00000 n
+0003035076 00000 n
+0003036137 00000 n
+0003036350 00000 n
+0003037429 00000 n
+0003037642 00000 n
+0003038739 00000 n
+0003038952 00000 n
+0003040067 00000 n
+0003040280 00000 n
+0003041413 00000 n
+0003041626 00000 n
+0003042777 00000 n
+0003042990 00000 n
+0003044159 00000 n
+0003044372 00000 n
+0003045560 00000 n
+0003045773 00000 n
+0003046979 00000 n
+0003047192 00000 n
+0003048416 00000 n
+0003048629 00000 n
+0003049871 00000 n
+0003050084 00000 n
+0003051345 00000 n
+0003051558 00000 n
+0003052837 00000 n
+0003053050 00000 n
+0003054347 00000 n
+0003054560 00000 n
+0003055875 00000 n
+0003056088 00000 n
+0003057421 00000 n
+0003057634 00000 n
+0003058985 00000 n
+0003059198 00000 n
+0003060567 00000 n
+0003060780 00000 n
+0003062167 00000 n
+0003062380 00000 n
+0003063785 00000 n
+0003063998 00000 n
+0003065421 00000 n
+0003065634 00000 n
+0003067075 00000 n
+0003067288 00000 n
+0003068747 00000 n
+0003068960 00000 n
+0003070435 00000 n
+0003070648 00000 n
+0003072141 00000 n
+0003072354 00000 n
+0003073865 00000 n
+0003074078 00000 n
+0003075607 00000 n
+0003075820 00000 n
+0003077367 00000 n
+0003077580 00000 n
+0003079144 00000 n
+0003079357 00000 n
+0003080939 00000 n
+0003081152 00000 n
+0003082752 00000 n
+0003082965 00000 n
+0003084583 00000 n
+0003084796 00000 n
+0003086432 00000 n
+0003086645 00000 n
+0003088299 00000 n
+0003088512 00000 n
+0003090184 00000 n
+0003090397 00000 n
+0003092087 00000 n
+0003092300 00000 n
+0003094010 00000 n
+0003094223 00000 n
+0003095952 00000 n
+0003096165 00000 n
+0003097912 00000 n
+0003098125 00000 n
+0003099890 00000 n
+0003100103 00000 n
+0003101885 00000 n
+0003102098 00000 n
+0003103898 00000 n
+0003104111 00000 n
+0003105929 00000 n
+0003106142 00000 n
+0003107978 00000 n
+0003108191 00000 n
+0003110045 00000 n
+0003110258 00000 n
+0003112130 00000 n
+0003112343 00000 n
+0003114234 00000 n
+0003114447 00000 n
+0003116356 00000 n
+0003116569 00000 n
+0003118496 00000 n
+0003118709 00000 n
+0003120654 00000 n
+0003120867 00000 n
+0003122830 00000 n
+0003123043 00000 n
+0003125024 00000 n
+0003125237 00000 n
+0003127236 00000 n
+0003127449 00000 n
+0003129466 00000 n
+0003129679 00000 n
+0003131714 00000 n
+0003131927 00000 n
+0003133980 00000 n
+0003134193 00000 n
+0003136264 00000 n
+0003136477 00000 n
+0003138567 00000 n
+0003138780 00000 n
+0003140888 00000 n
+0003141101 00000 n
+0003143226 00000 n
+0003143439 00000 n
+0003145584 00000 n
+0003145798 00000 n
+0003146111 00000 n
+0003146325 00000 n
+0003146638 00000 n
+0003146852 00000 n
+0003147165 00000 n
+0003147379 00000 n
+0003147692 00000 n
+0003147906 00000 n
+0003148219 00000 n
+0003148433 00000 n
+0003148746 00000 n
+0003148960 00000 n
+0003149273 00000 n
+0003149487 00000 n
+0003149800 00000 n
+0003150014 00000 n
+0003150327 00000 n
+0003150541 00000 n
+0003150854 00000 n
+0003151068 00000 n
+0003151381 00000 n
+0003151595 00000 n
+0003151908 00000 n
+0003152122 00000 n
+0003152435 00000 n
+0003152649 00000 n
+0003152962 00000 n
+0003153176 00000 n
+0003153489 00000 n
+0003153703 00000 n
+0003154016 00000 n
+0003154230 00000 n
+0003154543 00000 n
+0003154757 00000 n
+0003155070 00000 n
+0003155284 00000 n
+0003155597 00000 n
+0003155811 00000 n
+0003156124 00000 n
+0003156338 00000 n
+0003156651 00000 n
+0003156865 00000 n
+0003157178 00000 n
+0003157392 00000 n
+0003157705 00000 n
+0003157919 00000 n
+0003158232 00000 n
+0003158446 00000 n
+0003158759 00000 n
+0003158973 00000 n
+0003159286 00000 n
+0003159500 00000 n
+0003159813 00000 n
+0003160027 00000 n
+0003160340 00000 n
+0003160554 00000 n
+0003160867 00000 n
+0003161081 00000 n
+0003161394 00000 n
+0003161608 00000 n
+0003161921 00000 n
+0003162135 00000 n
+0003162448 00000 n
+0003162662 00000 n
+0003162975 00000 n
+0003163189 00000 n
+0003163502 00000 n
+0003163716 00000 n
+0003164028 00000 n
+0003164242 00000 n
+0003164555 00000 n
+0003164769 00000 n
+0003165082 00000 n
+0003165296 00000 n
+0003165609 00000 n
+0003165823 00000 n
+0003166136 00000 n
+0003166350 00000 n
+0003166663 00000 n
+0003166877 00000 n
+0003167190 00000 n
+0003167404 00000 n
+0003167717 00000 n
+0003167931 00000 n
+0003168244 00000 n
+0003168458 00000 n
+0003168771 00000 n
+0003168985 00000 n
+0003169298 00000 n
+0003169512 00000 n
+0003169825 00000 n
+0003170039 00000 n
+0003170352 00000 n
+0003170566 00000 n
+0003170879 00000 n
+0003171093 00000 n
+0003171406 00000 n
+0003171620 00000 n
+0003171933 00000 n
+0003172147 00000 n
+0003172460 00000 n
+0003172674 00000 n
+0003172987 00000 n
+0003173201 00000 n
+0003173514 00000 n
+0003173728 00000 n
+0003174041 00000 n
+0003174255 00000 n
+0003174568 00000 n
+0003174782 00000 n
+0003175095 00000 n
+0003175309 00000 n
+0003175622 00000 n
+0003175836 00000 n
+0003176149 00000 n
+0003176363 00000 n
+0003176676 00000 n
+0003176890 00000 n
+0003177203 00000 n
+0003177417 00000 n
+0003177730 00000 n
+0003177944 00000 n
+0003178257 00000 n
+0003178471 00000 n
+0003178784 00000 n
+0003178998 00000 n
+0003179311 00000 n
+0003179525 00000 n
+0003179838 00000 n
+0003180052 00000 n
+0003180365 00000 n
+0003180579 00000 n
+0003180892 00000 n
+0003181106 00000 n
+0003181419 00000 n
+0003181633 00000 n
+0003181946 00000 n
+0003182160 00000 n
+0003182473 00000 n
+0003182687 00000 n
+0003183000 00000 n
+0003183214 00000 n
+0003183527 00000 n
+0003183741 00000 n
+0003184054 00000 n
+0003184268 00000 n
+0003184581 00000 n
+0003184795 00000 n
+0003185108 00000 n
+0003185322 00000 n
+0003185635 00000 n
+0003185849 00000 n
+0003186162 00000 n
+0003186376 00000 n
+0003186689 00000 n
+0003186903 00000 n
+0003187216 00000 n
+0003187430 00000 n
+0003187743 00000 n
+0003187957 00000 n
+0003188270 00000 n
+0003188484 00000 n
+0003188797 00000 n
+0003189011 00000 n
+0003189324 00000 n
+0003189538 00000 n
+0003189851 00000 n
+0003190065 00000 n
+0003190378 00000 n
+0003190592 00000 n
+0003190905 00000 n
+0003191119 00000 n
+0003191432 00000 n
+0003191646 00000 n
+0003191959 00000 n
+0003192173 00000 n
+0003192486 00000 n
+0003192700 00000 n
+0003193013 00000 n
+0003193227 00000 n
+0003194098 00000 n
+0003194260 00000 n
+0003195050 00000 n
+0003195333 00000 n
+0003195614 00000 n
+0003195837 00000 n
+0003196059 00000 n
+0003196347 00000 n
+0003196572 00000 n
+0003196796 00000 n
+0003197086 00000 n
+0003197369 00000 n
+0003197652 00000 n
+0003197944 00000 n
+0003198244 00000 n
+0003198535 00000 n
+0003198787 00000 n
+0003198968 00000 n
+0003199041 00000 n
+0003200689 00000 n
+0003201686 00000 n
+0003202792 00000 n
+0003203923 00000 n
+0003205042 00000 n
+0003206177 00000 n
+0003207321 00000 n
+0003208464 00000 n
+0003209619 00000 n
+0003210767 00000 n
+0003211908 00000 n
+0003213052 00000 n
+0003214142 00000 n
+0003215234 00000 n
+0003216315 00000 n
+0003217432 00000 n
+0003218556 00000 n
+0003219628 00000 n
+0003220742 00000 n
+0003221844 00000 n
+0003222964 00000 n
+0003224101 00000 n
+0003225242 00000 n
+0003226360 00000 n
+0003227468 00000 n
+0003228572 00000 n
+0003229607 00000 n
+0003229951 00000 n
+0003230162 00000 n
+0003230506 00000 n
+0003230717 00000 n
+0003231061 00000 n
+0003231272 00000 n
+0003231616 00000 n
+0003231827 00000 n
+0003232171 00000 n
+0003232382 00000 n
+0003232726 00000 n
+0003232937 00000 n
+0003233281 00000 n
+0003233492 00000 n
+0003233838 00000 n
+0003234049 00000 n
+0003234395 00000 n
+0003234606 00000 n
+0003234951 00000 n
+0003235162 00000 n
+0003235508 00000 n
+0003235720 00000 n
+0003236066 00000 n
+0003236278 00000 n
+0003236624 00000 n
+0003236836 00000 n
+0003237182 00000 n
+0003237394 00000 n
+0003237739 00000 n
+0003237951 00000 n
+0003238297 00000 n
+0003238509 00000 n
+0003238855 00000 n
+0003239067 00000 n
+0003239413 00000 n
+0003239625 00000 n
+0003239971 00000 n
+0003240183 00000 n
+0003240528 00000 n
+0003240740 00000 n
+0003241086 00000 n
+0003241298 00000 n
+0003241644 00000 n
+0003241856 00000 n
+0003242202 00000 n
+0003242414 00000 n
+0003242760 00000 n
+0003242972 00000 n
+0003243318 00000 n
+0003243530 00000 n
+0003243876 00000 n
+0003244088 00000 n
+0003245092 00000 n
+0003245252 00000 n
+0003246015 00000 n
+0003246297 00000 n
+0003246577 00000 n
+0003246799 00000 n
+0003247020 00000 n
+0003247307 00000 n
+0003247531 00000 n
+0003247754 00000 n
+0003248043 00000 n
+0003248325 00000 n
+0003248607 00000 n
+0003248898 00000 n
+0003249197 00000 n
+0003249487 00000 n
+0003253401 00000 n
+0003254035 00000 n
+0003254365 00000 n
+0003255557 00000 n
+0003257213 00000 n
+0003257882 00000 n
+0003258548 00000 n
+0003265548 00000 n
+0003266541 00000 n
+0003267311 00000 n
+0003267965 00000 n
+0003269839 00000 n
+0003270471 00000 n
+0003271121 00000 n
+0003271396 00000 n
+0003272068 00000 n
+0003275251 00000 n
+0003275915 00000 n
+0003285716 00000 n
+0003286449 00000 n
+0003287080 00000 n
+0003288501 00000 n
+0003289169 00000 n
+0003289444 00000 n
+0003289688 00000 n
+0003289795 00000 n
+0003290040 00000 n
+0003290205 00000 n
+0003290783 00000 n
+0003290908 00000 n
+0003291007 00000 n
+0003291775 00000 n
+0003291977 00000 n
+0003292553 00000 n
+0003293141 00000 n
+0003293272 00000 n
+0003297171 00000 n
+0003297426 00000 n
+0003297615 00000 n
+0003297804 00000 n
+0003297951 00000 n
+0003298098 00000 n
+0003298245 00000 n
+0003298392 00000 n
+0003298539 00000 n
+0003298686 00000 n
+0003298833 00000 n
+0003298980 00000 n
+0003299127 00000 n
+0003299274 00000 n
+0003299421 00000 n
+0003299568 00000 n
+0003299720 00000 n
+0003299872 00000 n
+0003300024 00000 n
+0003300176 00000 n
+0003300323 00000 n
+0003300470 00000 n
+0003300617 00000 n
+0003300764 00000 n
+0003300916 00000 n
+0003301068 00000 n
+0003301220 00000 n
+0003301372 00000 n
+0003301519 00000 n
+0003301666 00000 n
+0003301842 00000 n
+0003302018 00000 n
+0003302200 00000 n
+0003302382 00000 n
+0003302420 00000 n
+0003302561 00000 n
+0003302612 00000 n
+0003302717 00000 n
+0003302841 00000 n
+0003302966 00000 n
+0003303014 00000 n
+0003303365 00000 n
+0003303666 00000 n
+0003304145 00000 n
+0003304544 00000 n
+0003305069 00000 n
+0003305713 00000 n
+0003311958 00000 n
+0003314219 00000 n
+0003324497 00000 n
+0003325054 00000 n
+0003325179 00000 n
+0003325296 00000 n
+0003325361 00000 n
+0003325459 00000 n
+0003325572 00000 n
+0003325685 00000 n
+0003325803 00000 n
+0003325922 00000 n
+0003326079 00000 n
+0003326185 00000 n
+0003326299 00000 n
+0003326421 00000 n
+0003326571 00000 n
+0003326718 00000 n
+0003326873 00000 n
+0003326996 00000 n
+0003327103 00000 n
+trailer << /Info 323 0 R /Root 721 0 R /Size 2468 /Prev 3910074 /ID [<ac2766e5606f0ba83762ec0fe44ecf3b><5de7766056e26cbadc83bd3a2e2294c7>] >>
startxref
0
%%EOF
@@ -1762,16 +1762,16 @@ startxref
<< /AcroForm << /Fields 2363 0 R /NeedAppearances false >> /Metadata 719 0 R /Names << /Dests << /Kids [ 324 0 R ] >> >> /OCProperties << /D << /AS [ << /Category [ /View ] /Event /View /OCGs 717 0 R >> << /Category [ /Print ] /Event /Print /OCGs 717 0 R >> << /Category [ /Export ] /Event /Export /OCGs 717 0 R >> ] /BaseState /ON /ListMode /VisiblePages /OFF 718 0 R >> /OCGs 717 0 R >> /OpenAction [ 2397 0 R /Fit ] /Outlines 2452 0 R /PageMode /UseOutlines /Pages 322 0 R /Type /Catalog >>
endobj
722 0 obj
-<< /BaseFont /WEFHKV+LinLibertineT /Encoding 2395 0 R /FirstChar 21 /FontDescriptor 723 0 R /LastChar 231 /Subtype /Type1 /ToUnicode 2394 0 R /Type /Font /Widths [ 548 742 0 0 0 0 560 829 582 540 0 0 288 0 0 0 0 705 268 298 298 341 550 220 338 220 323 465 465 465 465 465 465 465 465 465 465 236 236 0 550 0 0 0 695 588 646 701 557 485 685 730 297 322 637 528 839 699 702 541 0 587 485 597 661 652 951 660 575 604 356 0 356 0 486 268 457 493 428 506 447 310 500 538 271 272 512 264 790 542 504 519 503 372 390 316 531 497 747 490 515 424 0 0 0 0 0 0 0 0 0 0 0 0 0 351 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 428 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 428 ] >>
+<< /BaseFont /CDADAP+LinLibertineT /Encoding 2395 0 R /FirstChar 21 /FontDescriptor 723 0 R /LastChar 231 /Subtype /Type1 /ToUnicode 2394 0 R /Type /Font /Widths [ 548 742 0 0 0 0 560 829 582 540 0 0 288 0 0 0 0 705 268 298 298 341 550 220 338 220 323 465 465 465 465 465 465 465 465 465 465 236 236 0 550 0 0 0 695 588 646 701 557 485 685 730 297 322 637 528 839 699 702 541 0 587 485 597 661 652 951 660 575 604 356 0 356 0 486 268 457 493 428 506 447 310 500 538 271 272 512 264 790 542 504 519 503 372 390 316 531 497 747 490 515 424 0 0 0 0 0 0 0 0 0 0 0 0 0 351 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 428 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 428 ] >>
endobj
723 0 obj
-<< /Ascent 735 /CapHeight 735 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/ampersand/asteriskmath/b/bracketleft/bracketright/bullet/c/ccaron/ccedilla/colon/comma/d/e/eight/emdash/endash/equal/exclam/f/f_f/f_f_i/f_i/f_l/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /Descent -238 /Flags 4 /FontBBox [ -68 -238 947 735 ] /FontFile3 2386 0 R /FontName /WEFHKV+LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 142 /Type /FontDescriptor >>
+<< /Ascent 735 /CapHeight 735 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/ampersand/asteriskmath/b/bracketleft/bracketright/bullet/c/ccaron/ccedilla/colon/comma/d/e/eight/emdash/endash/equal/exclam/f/f_f/f_f_i/f_i/f_l/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /Descent -238 /Flags 4 /FontBBox [ -68 -238 947 735 ] /FontFile3 2381 0 R /FontName /CDADAP+LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 142 /Type /FontDescriptor >>
endobj
724 0 obj
<< /BaseFont /ZNQSDP+LinBiolinumT /Encoding /WinAnsiEncoding /FirstChar 65 /FontDescriptor 725 0 R /LastChar 116 /Subtype /Type1 /Type /Font /Widths [ 629 0 677 710 538 0 717 0 294 0 0 515 886 718 741 559 0 600 506 540 0 631 0 0 0 0 0 0 0 0 0 0 481 0 0 0 453 0 0 0 260 0 0 0 807 539 0 0 0 0 0 340 ] >>
endobj
725 0 obj
-<< /Ascent 698 /CapHeight 662 /CharSet (/A/C/D/E/G/I/L/M/N/O/P/R/S/T/V/a/e/i/m/n/t) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 819 698 ] /FontFile3 2385 0 R /FontName /ZNQSDP+LinBiolinumT /ItalicAngle 0 /MissingWidth 500 /StemV 122 /Type /FontDescriptor /XHeight 439 >>
+<< /Ascent 698 /CapHeight 662 /CharSet (/A/C/D/E/G/I/L/M/N/O/P/R/S/T/V/a/e/i/m/n/t) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 819 698 ] /FontFile3 2379 0 R /FontName /ZNQSDP+LinBiolinumT /ItalicAngle 0 /MissingWidth 500 /StemV 122 /Type /FontDescriptor /XHeight 439 >>
endobj
726 0 obj
<< /BBox [ 0 8239 259.2 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 6865.83 ] /Resources << /ProcSet [ /PDF /ImageC ] >> /Subtype /Form /Type /XObject /Length 762 >>
@@ -1900,13 +1900,13 @@ stream
xLH4/IK׬KS5JJS5k34b M["k4%jj NJHuqjj[Qbn5
endobj
741 0 obj
-<< /AA << /PC << /JS 740 0 R /S /JavaScript >> /PI << /JS 740 0 R /S /JavaScript >> /PO << /JS 739 0 R /S /JavaScript >> /PV << /JS 739 0 R /S /JavaScript >> >> /AP << /N 728 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/08/20]) /F 4 /FT /Btn /Ff 65537 /H /N /MK << /I 728 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 333.72 629.38 347.04 638.62 ] /Subtype /Widget /T (anm0) /Type /Annot >>
+<< /AA << /PC << /JS 740 0 R /S /JavaScript >> /PI << /JS 740 0 R /S /JavaScript >> /PO << /JS 739 0 R /S /JavaScript >> /PV << /JS 739 0 R /S /JavaScript >> >> /AP << /N 728 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/11/05]) /F 4 /FT /Btn /Ff 65537 /H /N /MK << /I 728 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 333.72 629.38 347.04 638.62 ] /Subtype /Widget /T (anm0) /Type /Annot >>
endobj
742 0 obj
-<< /BaseFont /HMNYAQ+LinLibertineTI /Encoding 2391 0 R /FirstChar 27 /FontDescriptor 743 0 R /LastChar 246 /Subtype /Type1 /ToUnicode 2390 0 R /Type /Font /Widths [ 564 0 0 0 0 0 0 0 0 0 0 0 268 306 313 0 0 219 333 219 291 0 0 0 0 0 0 0 0 0 444 219 0 0 527 0 0 0 667 557 0 667 526 457 664 0 280 414 637 519 804 0 668 499 0 0 454 544 0 597 0 628 0 0 0 0 0 0 0 268 486 478 389 489 401 314 477 519 276 259 486 266 783 518 447 489 0 357 353 307 521 472 688 475 503 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 447 ] >>
+<< /BaseFont /GULBTF+LinLibertineTI /Encoding 2392 0 R /FirstChar 27 /FontDescriptor 743 0 R /LastChar 246 /Subtype /Type1 /ToUnicode 2391 0 R /Type /Font /Widths [ 564 0 0 0 0 0 0 0 0 0 0 0 268 306 313 0 0 219 333 219 291 0 0 0 0 0 0 0 0 0 444 219 0 0 527 0 0 0 667 557 0 667 526 457 664 0 280 414 637 519 804 0 668 499 0 0 454 544 0 597 0 628 0 0 0 0 0 0 0 268 486 478 389 489 401 314 477 519 276 259 486 266 783 518 447 489 0 357 353 307 521 472 688 475 503 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 447 ] >>
endobj
743 0 obj
-<< /Ascent 726 /CapHeight 726 /CharSet (/A/B/D/E/F/G/I/J/K/L/M/O/P/S/T/V/X/a/b/c/colon/comma/d/e/equal/f/f_i/g/h/hyphen/i/j/k/l/m/n/nine/o/odieresis/p/parenleft/parenright/period/quoteleft/quoteright/r/s/slash/t/u/v/w/x/y) /Descent -238 /Flags 4 /FontBBox [ -78 -238 874 726 ] /FontFile3 2376 0 R /FontName /HMNYAQ+LinLibertineTI /ItalicAngle 0 /MissingWidth 500 /StemV 131 /Type /FontDescriptor >>
+<< /Ascent 726 /CapHeight 726 /CharSet (/A/B/D/E/F/G/I/J/K/L/M/O/P/S/T/V/X/a/b/c/colon/comma/d/e/equal/f/f_i/g/h/hyphen/i/j/k/l/m/n/nine/o/odieresis/p/parenleft/parenright/period/quoteleft/quoteright/r/s/slash/t/u/v/w/x/y) /Descent -238 /Flags 4 /FontBBox [ -78 -238 874 726 ] /FontFile3 2370 0 R /FontName /GULBTF+LinLibertineTI /ItalicAngle 0 /MissingWidth 500 /StemV 131 /Type /FontDescriptor >>
endobj
744 0 obj
<< /BBox [ 0.00006104 8299 420 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 -0.00005086 6945.83 ] /Resources << /Font << /R58 742 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 138 >>
@@ -1947,37 +1947,37 @@ stream
xLH4/IK׬KS5JJS5k34b M["k4%jj NJHuqjj[Qbn5
endobj
752 0 obj
-<< /AA << /PC << /JS 751 0 R /S /JavaScript >> /PI << /JS 751 0 R /S /JavaScript >> /PO << /JS 750 0 R /S /JavaScript >> /PV << /JS 750 0 R /S /JavaScript >> >> /AP << /N 745 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/08/20]) /F 4 /FT /Btn /Ff 65537 /H /N /MK << /I 745 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 124.8 594.94 166.8 606.94 ] /Subtype /Widget /T (anm1) /Type /Annot >>
+<< /AA << /PC << /JS 751 0 R /S /JavaScript >> /PI << /JS 751 0 R /S /JavaScript >> /PO << /JS 750 0 R /S /JavaScript >> /PV << /JS 750 0 R /S /JavaScript >> >> /AP << /N 745 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/11/05]) /F 4 /FT /Btn /Ff 65537 /H /N /MK << /I 745 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 124.8 594.94 166.8 606.94 ] /Subtype /Widget /T (anm1) /Type /Annot >>
endobj
753 0 obj
-<< /BaseFont /EPUAGO+LibertinusT1Math /Encoding 2389 0 R /FirstChar 11 /FontDescriptor 754 0 R /LastChar 122 /Subtype /Type1 /ToUnicode 2388 0 R /Type /Font /Widths [ 522 472 458 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 299 0 0 0 475 503 436 ] >>
+<< /BaseFont /DQEGUT+LibertinusT1Math /Encoding 2390 0 R /FirstChar 11 /FontDescriptor 754 0 R /LastChar 122 /Subtype /Type1 /ToUnicode 2389 0 R /Type /Font /Widths [ 522 472 458 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 465 0 0 0 0 0 0 0 0 0 0 220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 299 0 0 0 475 503 436 ] >>
endobj
754 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/comma/u1D461/u1D465/u1D466/u1D467/u1D6FC/u1D6FD/u1D6FE) /Descent -235 /Flags 4 /FontBBox [ -4 -235 588 698 ] /FontFile3 2373 0 R /FontName /EPUAGO+LibertinusT1Math /ItalicAngle 0 /MissingWidth 500 /StemV 88 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/comma/u1D461/u1D465/u1D466/u1D467/u1D6FC/u1D6FD/u1D6FE/zero) /Descent -235 /Flags 4 /FontBBox [ -4 -235 588 698 ] /FontFile3 2367 0 R /FontName /DQEGUT+LibertinusT1Math /ItalicAngle 0 /MissingWidth 500 /StemV 88 /Type /FontDescriptor >>
endobj
755 0 obj
<< /BaseFont /WXNJOJ+SLHPCV-LinLibertineI /Encoding /WinAnsiEncoding /FirstChar 101 /FontDescriptor 756 0 R /LastChar 120 /Subtype /Type1 /Type /Font /Widths [ 401 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 475 ] >>
endobj
756 0 obj
-<< /Ascent 439 /CapHeight 439 /CharSet (/e/x) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 536 439 ] /FontFile3 2382 0 R /FontName /WXNJOJ+SLHPCV-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 80 /Type /FontDescriptor /XHeight 439 >>
+<< /Ascent 439 /CapHeight 439 /CharSet (/e/x) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 536 439 ] /FontFile3 2372 0 R /FontName /WXNJOJ+SLHPCV-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 80 /Type /FontDescriptor /XHeight 439 >>
endobj
757 0 obj
-<< /BaseFont /VXEDWX+UAMGWD-LinLibertineI /Encoding 2387 0 R /FirstChar 121 /FontDescriptor 758 0 R /LastChar 121 /Subtype /Type1 /Type /Font /Widths [ 511 ] >>
+<< /BaseFont /VXEDWX+UAMGWD-LinLibertineI /Encoding 2393 0 R /FirstChar 121 /FontDescriptor 758 0 R /LastChar 121 /Subtype /Type1 /Type /Font /Widths [ 511 ] >>
endobj
758 0 obj
-<< /Ascent 439 /CapHeight 439 /CharSet (/y.alt) /Descent -235 /Flags 4 /FontBBox [ 0 -235 526 439 ] /FontFile3 2366 0 R /FontName /VXEDWX+UAMGWD-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 78 /Type /FontDescriptor >>
+<< /Ascent 439 /CapHeight 439 /CharSet (/y.alt) /Descent -235 /Flags 4 /FontBBox [ 0 -235 526 439 ] /FontFile3 2376 0 R /FontName /VXEDWX+UAMGWD-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 78 /Type /FontDescriptor >>
endobj
759 0 obj
<< /BaseFont /VRAOLX+UAJQJL-rtxr /Encoding /WinAnsiEncoding /FirstChar 61 /FontDescriptor 760 0 R /LastChar 61 /Subtype /Type1 /Type /Font /Widths [ 636 ] >>
endobj
760 0 obj
-<< /Ascent 386 /CapHeight 386 /CharSet (/equal) /Descent 0 /Flags 65568 /FontBBox [ 0 0 574 386 ] /FontFile3 2368 0 R /FontName /VRAOLX+UAJQJL-rtxr /ItalicAngle 0 /MissingWidth 1000 /StemV 86 /Type /FontDescriptor >>
+<< /Ascent 386 /CapHeight 386 /CharSet (/equal) /Descent 0 /Flags 65568 /FontBBox [ 0 0 574 386 ] /FontFile3 2377 0 R /FontName /VRAOLX+UAJQJL-rtxr /ItalicAngle 0 /MissingWidth 1000 /StemV 86 /Type /FontDescriptor >>
endobj
761 0 obj
<< /BaseFont /UXWFZF+KPCITQ-LinLibertineI7 /Encoding /WinAnsiEncoding /FirstChar 120 /FontDescriptor 762 0 R /LastChar 120 /Subtype /Type1 /Type /Font /Widths [ 515 ] >>
endobj
762 0 obj
-<< /Ascent 700 /CapHeight 700 /CharSet (/x) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 580 700 ] /FontFile3 2370 0 R /FontName /UXWFZF+KPCITQ-LinLibertineI7 /ItalicAngle 0 /MissingWidth 544 /StemV 87 /Type /FontDescriptor /XHeight 439 >>
+<< /Ascent 700 /CapHeight 700 /CharSet (/x) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 580 700 ] /FontFile3 2382 0 R /FontName /UXWFZF+KPCITQ-LinLibertineI7 /ItalicAngle 0 /MissingWidth 544 /StemV 87 /Type /FontDescriptor /XHeight 439 >>
endobj
763 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R411 755 0 R /R413 757 0 R /R415 759 0 R /R417 761 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 2099 >>
@@ -2001,13 +2001,13 @@ endobj
<< /BaseFont /MMUZJD+OKAXEK-LinLibertineI /Encoding /WinAnsiEncoding /FirstChar 110 /FontDescriptor 765 0 R /LastChar 110 /Subtype /Type1 /Type /Font /Widths [ 518 ] >>
endobj
765 0 obj
-<< /Ascent 439 /CapHeight 439 /CharSet (/n) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 520 439 ] /FontFile3 2381 0 R /FontName /MMUZJD+OKAXEK-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 78 /Type /FontDescriptor /XHeight 439 >>
+<< /Ascent 439 /CapHeight 439 /CharSet (/n) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 520 439 ] /FontFile3 2369 0 R /FontName /MMUZJD+OKAXEK-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 78 /Type /FontDescriptor /XHeight 439 >>
endobj
766 0 obj
<< /BaseFont /EXDNIL+LTNAYU-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 49 /FontDescriptor 767 0 R /LastChar 49 /Subtype /Type1 /Type /Font /Widths [ 465 ] >>
endobj
767 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/one) /Descent -2 /Flags 65568 /FontBBox [ 0 -2 500 698 ] /FontFile3 2365 0 R /FontName /EXDNIL+LTNAYU-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/one) /Descent -2 /Flags 65568 /FontBBox [ 0 -2 500 698 ] /FontFile3 2375 0 R /FontName /EXDNIL+LTNAYU-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
endobj
768 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R415 759 0 R /R420 764 0 R /R422 766 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 796 >>
@@ -2022,7 +2022,7 @@ endobj
<< /BaseFont /XZTVPU+HYNAYU-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 50 /FontDescriptor 770 0 R /LastChar 50 /Subtype /Type1 /Type /Font /Widths [ 465 ] >>
endobj
770 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/two) /Descent -2 /Flags 65568 /FontBBox [ 0 -2 500 698 ] /FontFile3 2380 0 R /FontName /XZTVPU+HYNAYU-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/two) /Descent -2 /Flags 65568 /FontBBox [ 0 -2 500 698 ] /FontFile3 2368 0 R /FontName /XZTVPU+HYNAYU-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
endobj
771 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R415 759 0 R /R420 764 0 R /R425 769 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 820 >>
@@ -2037,7 +2037,7 @@ endobj
<< /BaseFont /QNZYSR+ZMQPBN-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 51 /FontDescriptor 773 0 R /LastChar 51 /Subtype /Type1 /Type /Font /Widths [ 465 ] >>
endobj
773 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/three) /Descent -10 /Flags 65568 /FontBBox [ 0 -10 500 698 ] /FontFile3 2375 0 R /FontName /QNZYSR+ZMQPBN-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/three) /Descent -10 /Flags 65568 /FontBBox [ 0 -10 500 698 ] /FontFile3 2385 0 R /FontName /QNZYSR+ZMQPBN-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
endobj
774 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R415 759 0 R /R420 764 0 R /R428 772 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1772 >>
@@ -2053,7 +2053,7 @@ endobj
<< /BaseFont /QTYBSX+KUPHTM-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 52 /FontDescriptor 776 0 R /LastChar 52 /Subtype /Type1 /Type /Font /Widths [ 465 ] >>
endobj
776 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/four) /Descent -2 /Flags 65568 /FontBBox [ 0 -2 500 698 ] /FontFile3 2369 0 R /FontName /QTYBSX+KUPHTM-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/four) /Descent -2 /Flags 65568 /FontBBox [ 0 -2 500 698 ] /FontFile3 2380 0 R /FontName /QTYBSX+KUPHTM-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
endobj
777 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R415 759 0 R /R420 764 0 R /R431 775 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1845 >>
@@ -2070,7 +2070,7 @@ endobj
<< /BaseFont /ZYZQVE+JQPHTM-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 53 /FontDescriptor 779 0 R /LastChar 53 /Subtype /Type1 /Type /Font /Widths [ 465 ] >>
endobj
779 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/five) /Descent -11 /Flags 65568 /FontBBox [ 0 -11 500 698 ] /FontFile3 2384 0 R /FontName /ZYZQVE+JQPHTM-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/five) /Descent -11 /Flags 65568 /FontBBox [ 0 -11 500 698 ] /FontFile3 2373 0 R /FontName /ZYZQVE+JQPHTM-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
endobj
780 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R415 759 0 R /R420 764 0 R /R434 778 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1856 >>
@@ -2090,7 +2090,7 @@ endobj
<< /BaseFont /RQSIXQ+WVNAYU-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 54 /FontDescriptor 782 0 R /LastChar 54 /Subtype /Type1 /Type /Font /Widths [ 465 ] >>
endobj
782 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/six) /Descent -11 /Flags 65568 /FontBBox [ 0 -11 500 698 ] /FontFile3 2379 0 R /FontName /RQSIXQ+WVNAYU-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/six) /Descent -11 /Flags 65568 /FontBBox [ 0 -11 500 698 ] /FontFile3 2364 0 R /FontName /RQSIXQ+WVNAYU-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
endobj
783 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R415 759 0 R /R420 764 0 R /R437 781 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1835 >>
@@ -2102,7 +2102,7 @@ endobj
<< /BaseFont /AWYAYJ+OYPPBN-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 55 /FontDescriptor 785 0 R /LastChar 55 /Subtype /Type1 /Type /Font /Widths [ 465 ] >>
endobj
785 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/seven) /Descent -13 /Flags 65568 /FontBBox [ 0 -13 500 698 ] /FontFile3 2372 0 R /FontName /AWYAYJ+OYPPBN-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/seven) /Descent -13 /Flags 65568 /FontBBox [ 0 -13 500 698 ] /FontFile3 2383 0 R /FontName /AWYAYJ+OYPPBN-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
endobj
786 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R415 759 0 R /R420 764 0 R /R440 784 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1859 >>
@@ -2120,7 +2120,7 @@ endobj
<< /BaseFont /GMJKQS+ASKPBN-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 56 /FontDescriptor 788 0 R /LastChar 56 /Subtype /Type1 /Type /Font /Widths [ 465 ] >>
endobj
788 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/eight) /Descent -10 /Flags 65568 /FontBBox [ 0 -10 500 698 ] /FontFile3 2367 0 R /FontName /GMJKQS+ASKPBN-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/eight) /Descent -10 /Flags 65568 /FontBBox [ 0 -10 500 698 ] /FontFile3 2378 0 R /FontName /GMJKQS+ASKPBN-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor >>
endobj
789 0 obj
<< /BBox [ 0 6799 1590 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 5665.83 ] /Resources << /Font << /R415 759 0 R /R420 764 0 R /R443 787 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 1864 >>
@@ -2234,7 +2234,7 @@ stream
xLH4/IK׬KS5JJS5k34b M["k4%jj NJHuqjj[Qbn5
endobj
810 0 obj
-<< /AA << /D << /JS (try{if\(a2_playing\){a2_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 809 0 R /S /JavaScript >> /PI << /JS 809 0 R /S /JavaScript >> /PO << /JS 808 0 R /S /JavaScript >> /PV << /JS 808 0 R /S /JavaScript >> /U << /JS (try{if\(!a2_isPaused\)a2_stopFirst\(\);if\(event.shift\)a2_playsRight=!a2_playsRight;if\(a2_idx==8&&a2_playsRight\)a2_stopFirst\(\);if\(a2_idx==0&&!a2_playsRight\)a2_stopLast\(\);if\(a2_playsRight\){a2_playRight\(\);}else{a2_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 790 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/08/20]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 790 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 217.2 541.18 376.2 703.18 ] /Subtype /Widget /T (anm2) /Type /Annot >>
+<< /AA << /D << /JS (try{if\(a2_playing\){a2_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 809 0 R /S /JavaScript >> /PI << /JS 809 0 R /S /JavaScript >> /PO << /JS 808 0 R /S /JavaScript >> /PV << /JS 808 0 R /S /JavaScript >> /U << /JS (try{if\(!a2_isPaused\)a2_stopFirst\(\);if\(event.shift\)a2_playsRight=!a2_playsRight;if\(a2_idx==8&&a2_playsRight\)a2_stopFirst\(\);if\(a2_idx==0&&!a2_playsRight\)a2_stopLast\(\);if\(a2_playsRight\){a2_playRight\(\);}else{a2_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 790 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/11/05]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 790 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 217.2 541.18 376.2 703.18 ] /Subtype /Widget /T (anm2) /Type /Annot >>
endobj
811 0 obj
<< /BBox [ 0 8269 150 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 0 6890.83 ] /Resources << /ProcSet [ /PDF ] >> /Subtype /Form /Type /XObject /Length 167 >>
@@ -3559,7 +3559,7 @@ endobj
<< /BaseFont /URVUCN+SHCLBH-LinLibertineI /Encoding /WinAnsiEncoding /FirstChar 77 /FontDescriptor 1042 0 R /LastChar 108 /Subtype /Type1 /Type /Font /Widths [ 804 0 0 499 668 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 266 ] >>
endobj
1042 0 obj
-<< /Ascent 698 /CapHeight 658 /CharSet (/M/P/Q/l) /Descent -209 /Flags 131104 /FontBBox [ 0 -209 874 698 ] /FontFile3 2378 0 R /FontName /URVUCN+SHCLBH-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 131 /Type /FontDescriptor >>
+<< /Ascent 698 /CapHeight 658 /CharSet (/M/P/Q/l) /Descent -209 /Flags 131104 /FontBBox [ 0 -209 874 698 ] /FontFile3 2366 0 R /FontName /URVUCN+SHCLBH-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 131 /Type /FontDescriptor >>
endobj
1043 0 obj
<< /BBox [ 0.00006104 5678.2 2850 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 -0.00005086 4731.83 ] /Resources << /Font << /R425 769 0 R /R728 1041 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 317 >>
@@ -5337,31 +5337,31 @@ endobj
<< /BaseFont /GIUHSV+UODFAG-LinLibertineI /Encoding /WinAnsiEncoding /FirstChar 65 /FontDescriptor 1344 0 R /LastChar 120 /Subtype /Type1 /Type /Font /Widths [ 667 557 616 667 0 0 0 0 0 0 0 0 0 0 668 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 486 0 0 0 0 0 0 0 0 0 0 266 0 0 0 0 0 357 0 307 0 0 0 475 ] >>
endobj
1344 0 obj
-<< /Ascent 698 /CapHeight 658 /CharSet (/A/B/C/D/O/a/l/r/t/x) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 706 698 ] /FontFile3 2364 0 R /FontName /GIUHSV+UODFAG-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 105 /Type /FontDescriptor /XHeight 439 >>
+<< /Ascent 698 /CapHeight 658 /CharSet (/A/B/C/D/O/a/l/r/t/x) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 706 698 ] /FontFile3 2374 0 R /FontName /GIUHSV+UODFAG-LinLibertineI /ItalicAngle 0 /MissingWidth 500 /StemV 105 /Type /FontDescriptor /XHeight 439 >>
endobj
1345 0 obj
<< /BaseFont /FNGGIE+LZRFGQ-LinLibertineTI /Encoding /WinAnsiEncoding /FirstChar 97 /FontDescriptor 1346 0 R /LastChar 117 /Subtype /Type1 /Type /Font /Widths [ 486 478 389 0 401 0 0 0 0 0 0 0 0 0 0 0 0 357 353 0 521 ] >>
endobj
1346 0 obj
-<< /Ascent 700 /CapHeight 700 /CharSet (/a/b/c/e/r/s/u) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 537 700 ] /FontFile3 2371 0 R /FontName /FNGGIE+LZRFGQ-LinLibertineTI /ItalicAngle 0 /MissingWidth 500 /StemV 80 /Type /FontDescriptor /XHeight 439 >>
+<< /Ascent 700 /CapHeight 700 /CharSet (/a/b/c/e/r/s/u) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 537 700 ] /FontFile3 2384 0 R /FontName /FNGGIE+LZRFGQ-LinLibertineTI /ItalicAngle 0 /MissingWidth 500 /StemV 80 /Type /FontDescriptor /XHeight 439 >>
endobj
1347 0 obj
<< /BaseFont /FJXBXE+SRRGAV-rtxr /Encoding /WinAnsiEncoding /FirstChar 61 /FontDescriptor 1348 0 R /LastChar 61 /Subtype /Type1 /Type /Font /Widths [ 636 ] >>
endobj
1348 0 obj
-<< /Ascent 386 /CapHeight 386 /CharSet (/equal) /Descent 0 /Flags 65568 /FontBBox [ 0 0 574 386 ] /FontFile3 2374 0 R /FontName /FJXBXE+SRRGAV-rtxr /ItalicAngle 0 /MissingWidth 1000 /StemV 86 /Type /FontDescriptor >>
+<< /Ascent 386 /CapHeight 386 /CharSet (/equal) /Descent 0 /Flags 65568 /FontBBox [ 0 0 574 386 ] /FontFile3 2386 0 R /FontName /FJXBXE+SRRGAV-rtxr /ItalicAngle 0 /MissingWidth 1000 /StemV 86 /Type /FontDescriptor >>
endobj
1349 0 obj
<< /BaseFont /IORYZZ+VLLQEB-LinLibertineT /Encoding /WinAnsiEncoding /FirstChar 50 /FontDescriptor 1350 0 R /LastChar 115 /Subtype /Type1 /Type /Font /Widths [ 465 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 428 0 0 0 0 0 0 0 0 0 0 0 504 0 0 0 390 ] >>
endobj
1350 0 obj
-<< /Ascent 698 /CapHeight 698 /CharSet (/c/o/s/two) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 500 698 ] /FontFile3 2383 0 R /FontName /IORYZZ+VLLQEB-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor /XHeight 439 >>
+<< /Ascent 698 /CapHeight 698 /CharSet (/c/o/s/two) /Descent -10 /Flags 131104 /FontBBox [ 0 -10 500 698 ] /FontFile3 2371 0 R /FontName /IORYZZ+VLLQEB-LinLibertineT /ItalicAngle 0 /MissingWidth 500 /StemV 75 /Type /FontDescriptor /XHeight 439 >>
endobj
1351 0 obj
-<< /BaseFont /KHPDRF+LREGAV-txsys /Encoding 2393 0 R /FirstChar 0 /FontDescriptor 1352 0 R /LastChar 48 /Subtype /Type1 /ToUnicode 2392 0 R /Type /Font /Widths [ 636 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 347 ] >>
+<< /BaseFont /KHPDRF+LREGAV-txsys /Encoding 2388 0 R /FirstChar 0 /FontDescriptor 1352 0 R /LastChar 48 /Subtype /Type1 /ToUnicode 2387 0 R /Type /Font /Widths [ 636 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 347 ] >>
endobj
1352 0 obj
-<< /Ascent 470 /CapHeight 470 /CharSet (/minus/prime) /Descent 0 /Flags 4 /FontBBox [ 0 0 574 470 ] /FontFile3 2377 0 R /FontName /KHPDRF+LREGAV-txsys /ItalicAngle 0 /MissingWidth 500 /StemV 86 /Type /FontDescriptor >>
+<< /Ascent 470 /CapHeight 470 /CharSet (/minus/prime) /Descent 0 /Flags 4 /FontBBox [ 0 0 574 470 ] /FontFile3 2365 0 R /FontName /KHPDRF+LREGAV-txsys /ItalicAngle 0 /MissingWidth 500 /StemV 86 /Type /FontDescriptor >>
endobj
1353 0 obj
<< /BBox [ 0.00006104 5678.2 2850 8419 ] /Filter /FlateDecode /FormType 1 /Matrix [ 0.833333 0 0 -0.833333 -0.00005086 4731.83 ] /Resources << /Font << /R1030 1343 0 R /R1032 1345 0 R /R1034 1347 0 R /R1036 1349 0 R /R1038 1351 0 R /R413 757 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 623 >>
@@ -6294,7 +6294,7 @@ stream
xLH4/IK׬KS5JJS5k34b M["k4%jj NJHuqjj[Qbn5
endobj
1559 0 obj
-<< /AA << /D << /JS (try{if\(a3_playing\){a3_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 1558 0 R /S /JavaScript >> /PI << /JS 1558 0 R /S /JavaScript >> /PO << /JS 1557 0 R /S /JavaScript >> /PV << /JS 1557 0 R /S /JavaScript >> /U << /JS (try{if\(!a3_isPaused\)a3_stopFirst\(\);if\(event.shift\)a3_playsRight=!a3_playsRight;if\(a3_idx==100&&a3_playsRight\)a3_stopFirst\(\);if\(a3_idx==0&&!a3_playsRight\)a3_stopLast\(\);if\(a3_playsRight\){a3_playRight\(\);}else{a3_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 1355 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/08/20]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 1355 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 159.12 450.7 434.16 715.06 ] /Subtype /Widget /T (anm3) /Type /Annot >>
+<< /AA << /D << /JS (try{if\(a3_playing\){a3_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 1558 0 R /S /JavaScript >> /PI << /JS 1558 0 R /S /JavaScript >> /PO << /JS 1557 0 R /S /JavaScript >> /PV << /JS 1557 0 R /S /JavaScript >> /U << /JS (try{if\(!a3_isPaused\)a3_stopFirst\(\);if\(event.shift\)a3_playsRight=!a3_playsRight;if\(a3_idx==100&&a3_playsRight\)a3_stopFirst\(\);if\(a3_idx==0&&!a3_playsRight\)a3_stopLast\(\);if\(a3_playsRight\){a3_playRight\(\);}else{a3_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 1355 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/11/05]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 1355 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 159.12 450.7 434.16 715.06 ] /Subtype /Widget /T (anm3) /Type /Annot >>
endobj
1560 0 obj
<< /AA << /D << /JS (a3_stopFirst\(\);) /S /JavaScript >> >> /AP << /N 811 0 R >> /BS << /W 0 >> /F 0 /FT /Btn /Ff 65536 /H /I /MK << /I 811 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 229.92 434.98 244.32 449.26 ] /Subtype /Widget /T (3.EndLeft) /Type /Annot >>
@@ -10003,7 +10003,7 @@ stream
xLH4/IK׬KS5JJS5k34b M["k4%jj NJHyqjj[Qbno
endobj
1662 0 obj
-<< /AA << /D << /JS (try{if\(a4_playing\){a4_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 1661 0 R /S /JavaScript >> /PI << /JS 1661 0 R /S /JavaScript >> /PO << /JS 1660 0 R /S /JavaScript >> /PV << /JS 1660 0 R /S /JavaScript >> /U << /JS (try{if\(!a4_isPaused\)a4_stopFirst\(\);if\(event.shift\)a4_playsRight=!a4_playsRight;if\(a4_idx==0\)a4_playsRight=true;if\(a4_idx==28\)a4_playsRight=false;if\(a4_playsRight\){a4_playRight\(\);}else{a4_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 1658 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/08/20]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 1658 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 174.6 583.18 418.68 715.06 ] /Subtype /Widget /T (anm4) /Type /Annot >>
+<< /AA << /D << /JS (try{if\(a4_playing\){a4_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 1661 0 R /S /JavaScript >> /PI << /JS 1661 0 R /S /JavaScript >> /PO << /JS 1660 0 R /S /JavaScript >> /PV << /JS 1660 0 R /S /JavaScript >> /U << /JS (try{if\(!a4_isPaused\)a4_stopFirst\(\);if\(event.shift\)a4_playsRight=!a4_playsRight;if\(a4_idx==0\)a4_playsRight=true;if\(a4_idx==28\)a4_playsRight=false;if\(a4_playsRight\){a4_playRight\(\);}else{a4_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 1658 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/11/05]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 1658 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 174.6 583.18 418.68 715.06 ] /Subtype /Widget /T (anm4) /Type /Annot >>
endobj
1663 0 obj
<< /AA << /D << /JS (a4_stopFirst\(\);) /S /JavaScript >> >> /AP << /N 811 0 R >> /BS << /W 0 >> /F 0 /FT /Btn /Ff 65536 /H /I /MK << /I 811 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 229.92 567.34 244.32 581.74 ] /Subtype /Widget /T (4.EndLeft) /Type /Annot >>
@@ -18838,7 +18838,7 @@ stream
xLH4/IK׬KS5JJS5k34b M["k4%jj NJH}qjj[QbnH
endobj
2251 0 obj
-<< /AA << /D << /JS (try{if\(a5_playing\){a5_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 2250 0 R /S /JavaScript >> /PI << /JS 2250 0 R /S /JavaScript >> /PO << /JS 2249 0 R /S /JavaScript >> /PV << /JS 2249 0 R /S /JavaScript >> /U << /JS (try{if\(!a5_isPaused\)a5_stopFirst\(\);if\(event.shift\)a5_playsRight=!a5_playsRight;if\(a5_idx==190&&a5_playsRight\)a5_stopFirst\(\);if\(a5_idx==0&&!a5_playsRight\)a5_stopLast\(\);if\(a5_playsRight\){a5_playRight\(\);}else{a5_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 2247 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/08/20]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 2247 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 125.28 394.42 468 715.06 ] /Subtype /Widget /T (anm5) /Type /Annot >>
+<< /AA << /D << /JS (try{if\(a5_playing\){a5_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 2250 0 R /S /JavaScript >> /PI << /JS 2250 0 R /S /JavaScript >> /PO << /JS 2249 0 R /S /JavaScript >> /PV << /JS 2249 0 R /S /JavaScript >> /U << /JS (try{if\(!a5_isPaused\)a5_stopFirst\(\);if\(event.shift\)a5_playsRight=!a5_playsRight;if\(a5_idx==190&&a5_playsRight\)a5_stopFirst\(\);if\(a5_idx==0&&!a5_playsRight\)a5_stopLast\(\);if\(a5_playsRight\){a5_playRight\(\);}else{a5_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 2247 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/11/05]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 2247 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 125.28 394.42 468 715.06 ] /Subtype /Widget /T (anm5) /Type /Annot >>
endobj
2252 0 obj
<< /AA << /D << /JS (a5_stopFirst\(\);) /S /JavaScript >> >> /AP << /N 811 0 R >> /BS << /W 0 >> /F 0 /FT /Btn /Ff 65536 /H /I /MK << /I 811 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 229.92 378.58 244.32 392.98 ] /Subtype /Widget /T (5.EndLeft) /Type /Annot >>
@@ -19333,7 +19333,7 @@ stream
xLH4/IK׬KS5JJS5k34b M["k4%jj NJHuqjj[Qbn5
endobj
2349 0 obj
-<< /AA << /D << /JS (try{if\(a6_playing\){a6_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 2348 0 R /S /JavaScript >> /PI << /JS 2348 0 R /S /JavaScript >> /PO << /JS 2347 0 R /S /JavaScript >> /PV << /JS 2347 0 R /S /JavaScript >> /U << /JS (try{if\(!a6_isPaused\)a6_stopFirst\(\);if\(event.shift\)a6_playsRight=!a6_playsRight;if\(a6_idx==0\)a6_playsRight=true;if\(a6_idx==25\)a6_playsRight=false;if\(a6_playsRight\){a6_playRight\(\);}else{a6_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 2295 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/08/20]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 2295 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 176.4 165.34 417 418.66 ] /Subtype /Widget /T (anm6) /Type /Annot >>
+<< /AA << /D << /JS (try{if\(a6_playing\){a6_pause\(\);}}catch\(e\){}) /S /JavaScript >> /PC << /JS 2348 0 R /S /JavaScript >> /PI << /JS 2348 0 R /S /JavaScript >> /PO << /JS 2347 0 R /S /JavaScript >> /PV << /JS 2347 0 R /S /JavaScript >> /U << /JS (try{if\(!a6_isPaused\)a6_stopFirst\(\);if\(event.shift\)a6_playsRight=!a6_playsRight;if\(a6_idx==0\)a6_playsRight=true;if\(a6_idx==25\)a6_playsRight=false;if\(a6_playsRight\){a6_playRight\(\);}else{a6_playLeft\(\);}}catch\(e\){}) /S /JavaScript >> >> /AP << /N 2295 0 R >> /BS << /W 0 >> /Contents (animation by animate[2019/11/05]) /F 4 /FT /Btn /Ff 65536 /H /N /MK << /I 2295 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 176.4 165.34 417 418.66 ] /Subtype /Widget /T (anm6) /Type /Annot >>
endobj
2350 0 obj
<< /AA << /D << /JS (a6_stopFirst\(\);) /S /JavaScript >> >> /AP << /N 811 0 R >> /BS << /W 0 >> /F 0 /FT /Btn /Ff 65536 /H /I /MK << /I 811 0 R /IF << /FB true /S /A >> /TP 1 >> /Rect [ 229.92 149.62 244.32 163.9 ] /Subtype /Widget /T (6.EndLeft) /Type /Annot >>
@@ -19378,56 +19378,52 @@ endobj
[ 2362 0 R 2361 0 R 2360 0 R 2359 0 R 2358 0 R 2357 0 R 2356 0 R 2355 0 R 2354 0 R 2353 0 R 2352 0 R 2351 0 R 2350 0 R 2349 0 R 2346 0 R 2344 0 R 2342 0 R 2340 0 R 2338 0 R 2336 0 R 2334 0 R 2332 0 R 2330 0 R 2328 0 R 2326 0 R 2324 0 R 2322 0 R 2320 0 R 2318 0 R 2316 0 R 2314 0 R 2312 0 R 2310 0 R 2308 0 R 2306 0 R 2304 0 R 2302 0 R 2300 0 R 2298 0 R 2296 0 R 2266 0 R 2264 0 R 2263 0 R 2262 0 R 2261 0 R 2260 0 R 2259 0 R 2258 0 R 2257 0 R 2256 0 R 2255 0 R 2254 0 R 2253 0 R 2252 0 R 2251 0 R 2248 0 R 2246 0 R 2244 0 R 2242 0 R 2240 0 R 2238 0 R 2236 0 R 2234 0 R 2232 0 R 2230 0 R 2228 0 R 2226 0 R 2224 0 R 2222 0 R 2220 0 R 2218 0 R 2216 0 R 2214 0 R 2212 0 R 2210 0 R 2208 0 R 2206 0 R 2204 0 R 2202 0 R 2200 0 R 2198 0 R 2196 0 R 2194 0 R 2192 0 R 2190 0 R 2188 0 R 2186 0 R 2184 0 R 2182 0 R 2180 0 R 2178 0 R 2176 0 R 2174 0 R 2172 0 R 2170 0 R 2168 0 R 2166 0 R 2164 0 R 2162 0 R 2160 0 R 2158 0 R 2156 0 R 2154 0 R 2152 0 R 2150 0 R 2148 0 R 2146 0 R 2144 0 R 2142 0 R 2140 0 R 2138 0 R 2136 0 R 2134 0 R 2132 0 R 2130 0 R 2128 0 R 2126 0 R 2124 0 R 2122 0 R 2120 0 R 2118 0 R 2116 0 R 2114 0 R 2112 0 R 2110 0 R 2108 0 R 2106 0 R 2104 0 R 2102 0 R 2100 0 R 2098 0 R 2096 0 R 2094 0 R 2092 0 R 2090 0 R 2088 0 R 2086 0 R 2084 0 R 2082 0 R 2080 0 R 2078 0 R 2076 0 R 2074 0 R 2072 0 R 2070 0 R 2068 0 R 2066 0 R 2064 0 R 2062 0 R 2060 0 R 2058 0 R 2056 0 R 2054 0 R 2052 0 R 2050 0 R 2048 0 R 2046 0 R 2044 0 R 2042 0 R 2040 0 R 2038 0 R 2036 0 R 2034 0 R 2032 0 R 2030 0 R 2028 0 R 2026 0 R 2024 0 R 2022 0 R 2020 0 R 2018 0 R 2016 0 R 2014 0 R 2012 0 R 2010 0 R 2008 0 R 2006 0 R 2004 0 R 2002 0 R 2000 0 R 1998 0 R 1996 0 R 1994 0 R 1992 0 R 1990 0 R 1988 0 R 1986 0 R 1984 0 R 1982 0 R 1980 0 R 1978 0 R 1976 0 R 1974 0 R 1972 0 R 1970 0 R 1968 0 R 1966 0 R 1964 0 R 1962 0 R 1960 0 R 1958 0 R 1956 0 R 1954 0 R 1952 0 R 1950 0 R 1948 0 R 1946 0 R 1944 0 R 1942 0 R 1940 0 R 1938 0 R 1936 0 R 1934 0 R 1932 0 R 1930 0 R 1928 0 R 1926 0 R 1924 0 R 1922 0 R 1920 0 R 1918 0 R 1916 0 R 1914 0 R 1912 0 R 1910 0 R 1908 0 R 1906 0 R 1904 0 R 1902 0 R 1900 0 R 1898 0 R 1896 0 R 1894 0 R 1892 0 R 1890 0 R 1888 0 R 1886 0 R 1884 0 R 1882 0 R 1880 0 R 1878 0 R 1876 0 R 1874 0 R 1872 0 R 1870 0 R 1868 0 R 1675 0 R 1674 0 R 1673 0 R 1672 0 R 1671 0 R 1670 0 R 1669 0 R 1668 0 R 1667 0 R 1666 0 R 1665 0 R 1664 0 R 1663 0 R 1662 0 R 1659 0 R 1656 0 R 1653 0 R 1650 0 R 1647 0 R 1644 0 R 1641 0 R 1638 0 R 1635 0 R 1632 0 R 1629 0 R 1626 0 R 1623 0 R 1620 0 R 1617 0 R 1614 0 R 1611 0 R 1608 0 R 1605 0 R 1602 0 R 1599 0 R 1596 0 R 1593 0 R 1590 0 R 1587 0 R 1584 0 R 1581 0 R 1578 0 R 1575 0 R 1572 0 R 1571 0 R 1570 0 R 1569 0 R 1568 0 R 1567 0 R 1566 0 R 1565 0 R 1564 0 R 1563 0 R 1562 0 R 1561 0 R 1560 0 R 1559 0 R 1556 0 R 1554 0 R 1552 0 R 1550 0 R 1548 0 R 1546 0 R 1544 0 R 1542 0 R 1540 0 R 1538 0 R 1536 0 R 1534 0 R 1532 0 R 1530 0 R 1528 0 R 1526 0 R 1524 0 R 1522 0 R 1520 0 R 1518 0 R 1516 0 R 1514 0 R 1512 0 R 1510 0 R 1508 0 R 1506 0 R 1504 0 R 1502 0 R 1500 0 R 1498 0 R 1496 0 R 1494 0 R 1492 0 R 1490 0 R 1488 0 R 1486 0 R 1484 0 R 1482 0 R 1480 0 R 1478 0 R 1476 0 R 1474 0 R 1472 0 R 1470 0 R 1468 0 R 1466 0 R 1464 0 R 1462 0 R 1460 0 R 1458 0 R 1456 0 R 1454 0 R 1452 0 R 1450 0 R 1448 0 R 1446 0 R 1444 0 R 1442 0 R 1440 0 R 1438 0 R 1436 0 R 1434 0 R 1432 0 R 1430 0 R 1428 0 R 1426 0 R 1424 0 R 1422 0 R 1420 0 R 1418 0 R 1416 0 R 1414 0 R 1412 0 R 1410 0 R 1408 0 R 1406 0 R 1404 0 R 1402 0 R 1400 0 R 1398 0 R 1396 0 R 1394 0 R 1392 0 R 1390 0 R 1388 0 R 1386 0 R 1384 0 R 1382 0 R 1380 0 R 1378 0 R 1376 0 R 1374 0 R 1372 0 R 1370 0 R 1368 0 R 1366 0 R 1364 0 R 1362 0 R 1360 0 R 1358 0 R 1356 0 R 838 0 R 835 0 R 833 0 R 831 0 R 829 0 R 827 0 R 825 0 R 824 0 R 822 0 R 820 0 R 818 0 R 816 0 R 814 0 R 812 0 R 810 0 R 807 0 R 805 0 R 803 0 R 801 0 R 799 0 R 797 0 R 795 0 R 793 0 R 791 0 R 752 0 R 749 0 R 746 0 R 741 0 R 738 0 R 737 0 R 733 0 R 729 0 R ]
endobj
2364 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 1782 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 543 >>
stream
-x]{PWkLIVi6$~4y16iq;<V RFZIHl1؄'vۍvL'm=vt8si贳3޳w;+!VDlkVW&~i9%W OJYzei R4~ T'@M-w lԶh RҲ%@RDuz6Sz *54Uט:jutr*ƚ\ۢ6КEδVjtTEߢ~RlkLt׉˱RM&Îefy%]MRD*t^3['+ZϮs+mE/k~ފ[̵zT#:貴RXT\b4X*ķLb#""ED5G!֊M&ےUi.HJO&e&IV.ش\n5%퐠Mxy^PH''e~M~eb!(QQhb,,
-/'{;睂$z'{A ϭb:ГP
- v;
-ʣpX +4{L ^߀W@A^7( (!ća2MrA<]hZ(a"z[-wtTh\ݭ;,Io%g|d8:RTW7{ހU=]&0 1ࣇ1__(;E/FȌE=;xJ z@Wd9Oe9Jp6=Բ:NNls^?%Y':.E"?/w۞/nyHZOo<pV=-w)afG`ܯto
-wrƺy#c_9,V\G +_S˲6H>G{e f7*6
-_v2V YNѠ@d&CqWwFCF&t1Wп'$w>CHrW$p>ίWyeb;7ffw +;!f;e5ns@j *|6`2Oϼw&3vftC>d=.P:;?ËVm6?=8MEupahbq|[S.n+<(QiaWg؉#F ꦮb_f'4Aamc#2c
-viKyL\G\r{A*$G8պԍ,«ܼSԘL hP@A<0Ə2 x rX#xWh*/I5:P!JQBL~}3
-[!-&2V"hlk#
+xcd`ab`dd s LJ-*K If!CGO?nnc?.
+!CP d,Pwi
+F: LI30i&-%44
+y&r~}Ң#ac,e~{=ߏYgN7ۅڑ#|~_Իt
+)E=;S'&{:tpΞ|-S\+W?㌹ӿL]7cTMQ8Bnqq1O9k=ϭI<
endobj
2365 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 541 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 239 >>
stream
-xcd`ab`dd s LJ-*K If!CGO?nnc?.!CP d,Pwi
-F: LI30i&-%44
-y&r~}Ң#s͏o0O{='zgpLn +2NmoҺs‰9gmQ]6cOݻwˣ<qb։}UqO8c"SX9w4vT!z[r\pNZsk/
+xcd`ab`dd ruw -(, (f!CǥY<<, }|BQPL:,83?OX@G=l@AQfn*2NZQ|?Wfq{?Si鹍rʿw4Tv7I6M:k΂i[|>sK%VYr6\\rA sq1+Epʙ-j/'?XF`Ѵ<
endobj
2366 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 559 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 1100 >>
stream
-xcd`ab`dd uuwLJ-*KIf!CwE?YyyX*C[U!@#J+($U*ddd(x)p)(楤)+)3܊RSJR%[q(h%(&d&d53K2fV$d)$(5!,r.JM,IMhɹ*hdX냌J奖hrMU0200&`LIs0i&-A4DҤϒD*r*sJ+Y1w==!?E#~DvKw7oNVO=Or^̀X3\=kj7ǤBU53Sl9NF&ݾ Dvs4%jް~Ǵ=;叜XqwC%NY=cNf9?f̝bڹ+n^?#\wdM\׹帘y87\e`
+xemL[Uoi˺vf0]@Ysc_|!h[ڭ];e@{o{@ȺC /э?3Fũ`Em 3sysGJDionhypb Վ.$%I)x99m͔}{y@A%%'ELJ=`0j:X3:lecػp{'z\ÌŴkwcck"p׉]딲؂U5v00fVc^"2øw;fwambѿ7(ƻ),D7UYn#G
+(s!bp v]lc5}Nj|QOdQ ZW[Ժpn$gCDj|E\ HriE䢥L䛒X<ߠOYIqҽ4J8XC5&\,B7Be&JF˺@
+gLm4IlE&)YBYps;H"d5Cr⺫< 
+]+tfy
+u.S0 '2 ʖ=d Q +>#<IgDۼB(]D/@q#\p+r! :.wQBA҇=fYeXq.":GIZX;Y-D D?zY4ns{~`ǘ1P|l+T#]qx0KC$KG@DCs~pi2D)Z\?lŸ/2 n*{([o*1*2᫱*g[[>ӯGTz2>_[Y90:8U@@Gs f=
++߅C ³B :)BtNrojnfs6zOʭjҟ(TxDn(J1tD.-O%t_У6/ZňtX0>==C%cDd2WSZ+Fw M/=(=:lR^QA?endstream
endobj
2367 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 581 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 1564 >>
stream
-xcd`ab`ddu pLJ-*K If!CGO?nnc?
-!CP d,Pwi
-F: LI30i&-%44
-y&r~}Ң#qݏ]vKbq~\=8!64,\>gϖ5ݫ$wx\~v˒N-Ϋ),*~^"z9wӯ-ZeۮEwm'A4}ӕ3.><"+d꒘hIu89?g̝]d+nƎ*\u[yΉ<\yxnMe`
+x]SPkPL4#i\V'm]U7Bk45@$$$Mސ7B~
+mke*IUR#]UҬ,v\z^Ce%, ܿ6 ,p8ܟn2s89[ %&zenspl:$+d~~77/%™KQhm0Z f~ yQڞo$BZdQ3GG* Ц=s1Ȇ< #6z}wwHMY%foH: bt_4d*G ?q,wavF^D
+bm̗9J
+oV.em9?|SQcH~jpCjGGtB=V ;FKs` fx To9vl.}`uV&`CJ'5krY}q Hqѳgb2foi_OOJ_-#F8h˥ĵw|8OK ɕ\T
+H|zdf̑>FdR)qW{l v; jֈ\U?aw&;<?gB CxsS"[Z鶡1G+ݙAj׼?/4X,]~.u~޴/0'ZR4L]sG] Qh eϝ@>&B\qwskdo~3wH^t,0D=A2"}MgQn%|mDh{×?M$9f:d|K:`Nԗ
+nk
+X(d L`FI(ƀV͇Ct #,UǸ4Z5h3WFQHEe#)`:F'1oabBJESv`zdc eqq49<|{7COE}h6v|W"3Rd<nsyˡ
endobj
2368 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 184 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 578 >>
stream
-xcd`ab`dd u
--*(H3a!1nn#ń > ((ZT`gh Rw\~O)?jg=n&v9Z{bɉlY&񟇗
+xcd`ab`dds LJ-*K If!CGO?nnc?> !CP d,Pwi
+F: LI30i&-%44
+y&r~}Ң#ѲjN\`?2DU.rɝ;'uNj=cW+. stT׻Z3ꝝ_fzge넺*nnlݻ/0 Gm~];vnr|8Θ;u3VNe4U(Ĺ<yܚ
endobj
2369 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 573 >>
-stream
-x]MhAw]jB$P" $^D4q7l6MA&ֺ4UPBڃRoBوT M,Mˑ A1!.tYHUH%;⬈#ߎ8LYGO"!+r`"R6f9($* bPRu[*
-$VquI(a~@ςH!n(
-JF~89EDS C/?a0%yތF^*mL<GJ3&Ϛ18391(),4@ʨIi=Mk|q@j7{\5]쭇N.
-b>8?yVͪwOߩsO븳rQsh}Զ8Z~rm*Ǯqn;HQ
-endobj
-2370 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 642 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 575 >>
stream
-xcd`ab`ddp LJ-*K4ɨf!CǍ<<, !CBd>Ѐ
-
+xcd`ab`ddvpLJ-*KIf!Cǜެ<<,<,C
+
I
9
z
@@ -19441,123 +19437,164 @@ i@̼tTĢTqɩyũV\>
I90YM̒ y%ɩ%y
y)
n@MKaRKRS ArnE
-%%V @"zizy%\@S u@ 4f`LZIKih
-H&`23rҽǛG8e>wߓ18 d`I쿳 ?QDlg ߏ{N?q甐'E7hmoolnmoom(.-XdYv_y7Ӫ7Jo3o){4-n*q;˜EK'uKN1eRi_$/$VQhFK\s % R
-{릴̘~:'6q;7OXW?Ì3_L;7cTMpp̹:sZZ=&<
+%%V @"zizy%\@S u@ 4f`LZIKih
+endobj
+2370 0 obj
+<< /Filter /FlateDecode /Subtype /Type1C /Length 6908 >>
+stream
+xy xUv@&jzZt QPEVH $},ޗ>]wY;F@&
+(3n37̭|v7=ÓPN{{[AxAAAFr4;79CyU`j:><
+ ǟxmރlƞ4/hy*l$ G;IiYY+gEDf͜>K<3#7"/#^Yog'g$F,ϖJ#6e&ΖbsqҌi΂I+"߈B!ޝݧ"sgqҬ̌~?kl\i؃{33rs̞00+CԤMjssnf`|~t7:0:8:4:s猎sg_fsĪxOIx/,غ$3ksV歒߽ ¸ IɛR6mIٻ/+Ox*{7/o:oIf ޛ-yQgx[yKx3yxKyyxxVVVV[{^(~żp5G&&y/ =~y/4!@(&ΚX;iѤdoƅN=~>%mPУ5O?N4A&=GKkoL7m4ӴŗY
+㇃W9Bv#W:@GFBF \;&pM}}A*a$ a{9_w%pzzF *&M@Qf#]@ZnQK7wdjB(X6E/D%*#UdLn8j3S9fml0cfL b*Dd\vVhNbZ[?-6E>:z@؋~CT/>j-Vǵ(;bTnخCGef4 84AC(J{znq/Z"xc'kˍi*C>S"\եjc  v< W 35@){^ht+{5}`4u8Dh69njѵlM:V=6`uz2+}w&
+wb%ܒH[zA ^3@>cLo# G<G )N}'$7=9xq[vZCL.ne&(l0R1R4i DQI $WhݶJEf؛mMt3Kؔ+0]nr!v[EwM".&CNՆE׃Q ;ChvAQJ!F+#%&g&l%n}5ԵU?>C2U4f0:.ڻi3Loid)ŌGo֢V=pyɭ ,1MBtri,6.]
+2[ϣeђ
+A=wy 2z%l.M8PDMt;5A@<=b$ d:#&ZrL-K;:m1-<өtC$= baftk~6ej"X*dJ\D0t 8&B1:L@.zJ
+?{OTDa/O_@|F҉0tz9H9/o
+;U8)&.ߺ N\'++l-6wKu u*p#ZTS4VP?ݯMfpK^ "5*#,uvqhܗ_ ]-=b6X ԉ=K/3G* +{NC,_SS2ڽgWutQ\7꒝EҨ|E~I!C ʣ^mZa.OM2%Q’aX%nPl>F?
+fg JkX[}Ǿ8%ahn}.*KY百MbTB.'%nȨ|h"ꋩ@$k߽}U[WH
+^i WLPEa `TN*Ʒexqey=ko[ǂ'Nys%C=(yZⴶ$wž %`% h聒#l-ލݮ)Φs(Oq*];7^]w逐g秥k\;9$ڃn\G.#Fx <cRJjk4>8E޻uŘbuQLh5 EUso:Vbb[R^ِRYX6?)ӳhL(quҊ{[Q+ti"f4 a ^ӂ34 MV!qAW"
+6)ArcA6cNq3]O P"{dg)3k1pЭ cn ږ{9LE\Ս$f&`]2ۄq9wѷh f+Hտsɯzrvdl2^/3
+&ƍedUdʓ$p+B|U[F4Ӹ:wX'Q /,tG۫͐p"!*tzCK%KW9 }+o\8uXj`\[@LkVs47Aɮ"]9<^x/M$nţ8\_C4Z[mQ*Aiy;n:{mYT6?F7Hš`#uG`Ns|zkʧ
+yEb(z jp5\.i]񣍕U~RqZEỡƸZ4c`F(=-,k5[]PjmyN ڝ e늣wKbe>"tOei(k͌h cK> ~B{'/L9[3 r pVfEx*gEe8iwaQƔ8d ~$#}*RxW)x=|!^B%i<Cn61Ӝ\PhNCY7݆4}ma z-N<JXmz/!iro<X-|CNtP͆_Eyc`5ZvS[ DZQ+jR$kʘpn|̢15S%oٲbm*ޒ13'`'hڗνfxaWப4[ܩ$yZ\~cm[RɱE. {тϝe!.%=^//'F :Gk!4;^d(jkś0)/^Ꚛd<#/C!(BNv/B4n̷s>UEmњna ^FݤۧXV3nu9 (VsWt 'փڬJ S m{")w@pVŋWT,Fǥ޳@x#i֣,vC3Ȇ<K\?c2S'HӚ7
+K.,,BS{#h=2-vx(׺+~o~0m2slhUF^ˈ%^󭍾#~ph3GTQ#u-&^!U 선G}K !eέQ<@K܍^pY0*
+0iJ!kz[{Գ i6[AlTz/*s-"gܞQr?
+NLG!_!`!Tj
+BohU2 6 } ii>C9#uT8)N5y"UHT :x?
+e)Y2_~SW?JN~UM!5Bh(.++l6CeV798B9֚vn92w]Aoр01/\p-p
+SE\LA(,MF,Z]w~Yq͏b[ \,E浾@#]9w>F7Ep g~A;iRXwí>ůD6 k卍l<[,A?Ynȓ?*!w CWzp$a#h/ZQ*Ag#Cu ODV):.~Ϛ?ݻ׊Ec+s)T*@3byTc-¼k7_\H&C"wz95yW_XXQDÓ7\^ú:`H?T|u;#ܞ"cnP](碴Ui^b?2cUW~ J)Ywջ
+WuLod¹ s~~4=0BYUXTy`św%|+ma)ЬƗse\D>g޵Jy^yt] \'<1y+_endstream
endobj
2371 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 1329 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 902 >>
stream
-xeiPw7DpVhY;:3`*b G$l 6D0?ʩ\A#XR,E ZS|h?8kNIG;~{o.x7S)i+SxBi eU2o"> H1/1;2^cVCE<1gїTz *j5+WDSc8*V1-iKtJʹʠ P 0i1N'p"IE`8+F%ziB5(B΁+1 S
->1wߦ/ONbyPM`BPoZ*2 :yˣ38+:1! sm\07f
-Lt7M<A:}TAP eAۡdh$`n>sFD)~*00a0T@oa,wEr{#Y G3C\z:jfßKfXyQ&Nnw\| o4 OZ}ERbVWx,
-N%
-eJQ,Lӓ<E.i aչl66.{ <fun]{/a`BrqY<Fk0[zFni(=0
-7q9+-EV)4֚C.#Tk@FNJQ^ރ|&)P]2
-N nTeAdrt*g {
-gC/Z2sش󃟁 g~<&J gU$PM3>pO/2zN)&{|#߀۟}IHʔYkL-[V0˿qۡ;*ʚ:Z;*=MRnI@9l
+xcd`ab`dd tuLJ-*K If!CGO?nnc4~(!(2CQBnBRB@FfNfAB@~NAj[~^Bi^JjBHjQnB~BP:<3/](5U!8?<(h\rj^qj{{j^jQbB@iRNf2LVS<$hF^njErjAIf~Bb^PRz=.ĒF[~QzFFII>Ȩ4^q^^j&W0T#ci&M4`DIC a6! ,F  ! . `dgXȨXGG/1I{n{o f]dVc3w D/Xٟ6=~c{C-EUftzϢ5kvl_u=C *}8G~}xo!B7-xTTkO^xyw9ĩS{&tO=sY˲ ?-{w>jyEɳqlYh£f3&8o}59gws8zD{;ɹ-/s^YwGTtYZJir.iXáq5~}Ch҄n'93>{䌌~M 9,Pfm EJE/}:~`ݽ@v!Z]mЉkqGhټsV]8sb$IS's,Y}E%rNzW}wf[[^ˌSlPYRUۍ{&|x#!ȡmۯK}g0n_~snʩl
+q
endobj
2372 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 540 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 679 >>
stream
-xcd`ab`dd pLJ-*K If!CGO?nnc? !CP d,Pwi
-F: LI30i&-%44
-y&r~}Ң#urُg [-.|ݏբlw3E|ߑv[}gTRxCtV mUҿ2{Vsono1kZ LZ-W?㌹ӿL]7cTMQ8Bnqq1O9k=ϭI<
+x]_LRQ,$L8j)jP%Fi[ ^&a@EҲ5_lsѓ/mд{ߏ$9I
+UyPhe,hؖ $6/a2S_<×KN%} )[)eV536[ieht7d=>u
+.UW_JYey5,eXSeg18M@27plA At1 1E*|mv}vRw M"YJ|Ͻ .
+`h F}Xp%=k u!?W1ckIje;4zGz^x q-LqDxEq|x"8>4aJx>:{7{;"M־ox0.){9țq[_}~\Ǿc
+\sїJ?,Òq?B
+}o$KhS#yփdPăv C,ydK|*s?&˱cgo>HO4o]:,,o]&KN[E(wendstream
endobj
2373 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 1455 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 563 >>
stream
-x]kLWR
-/R;յq-8u#
-UebZJ[-<{)PnJP.dbbN&}Ybxtf,u/Vp~9ϓy?'bchȖ+rUվԜBdarFɟHثI(_A j|
-MD)LKIyݴ4aF["I+*Y녻2zዺԴ]pP&.fɫ5SdsŒBLWRXY!^]_U권O.r"G1#uX4 pi2eFK-k\}.`Wbܦkc9ɇ(׌ɧl1壢_#B͠hbb{hA} n~?<6i.1QFJ-SUˏGP}pL4 L#|&a^GԠE4u%V6ڌF끫GP9x}gTR}O*l/&F;KxV~v[๾|e@Yf$6^@M9VAu|U
-{Xsvg;LRFV>$" ?M'H7 6իu-֐'%`
-~JNo+3ϠG˚;!HdW؂Sy!r| pc!k ymwZjs1,9\rNkr$ (yxg'(:ȶᱮ}xղuFJ0
-mPHcipmQY(㴹 Ah=Z]]1TKEۖ6?q' |&0]CFgt$"ka:v#8p \8!2m7:?5zcoo&F81
- 0k().ߪVeJnR.%reCWeom)Z0d-^GӓC8f(K=!jJtvyg)#dLҳɬur7[@zw~gq_y< gt]h ^
+xcd`ab`dd
+ LJ-*K If!CGO?nnc?
+!CP d,Pwi
+F: LI30i&-%44
+y&r~}Ң#a{+,q/ՉtO[2FnNլnG <~]ǣ, iM-[oh_ݶ[R[ghg~&֝ޛї{āwsٗQ~snʩl
+q
endobj
2374 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 184 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 1782 >>
stream
-xcd`ab`dd 
-rw -*(H3a!1nn#ń > ((ZT`gh Rw\~O)?jg=n&v9Z{bɉlY&񟇗
+x]{PWkLIVi6$~4y16iq;<V RFZIHl1؄'vۍvL'm=vt8si贳3޳w;+!VDlkVW&~i9%W OJYzei R4~ T'@M-w lԶh RҲ%@RDuz6Sz *54Uט:jutr*ƚ\ۢ6КEδVjtTEߢ~RlkLt׉˱RM&Îefy%]MRD*t^3['+ZϮs+mE/k~ފ[̵zT#:貴RXT\b4X*ķLb#""ED5G!֊M&ےUi.HJO&e&IV.ش\n5%퐠Mxy^PH''e~M~eb!(QQhb,,
+/'{;睂$z'{A ϭb:ГP
+ v;
+ʣpX +4{L ^߀W@A^7( (!ća2MrA<]hZ(a"z[-wtTh\ݭ;,Io%g|d8:RTW7{ހU=]&0 1ࣇ1__(;E/FȌE=;xJ z@Wd9Oe9Jp6=Բ:NNls^?%Y':.E"?/w۞/nyHZOo<pV=-w)afG`ܯto
+wrƺy#c_9,V\G +_S˲6H>G{e f7*6
+_v2V YNѠ@d&CqWwFCF&t1Wп'$w>CHrW$p>ίWyeb;7ffw +;!f;e5ns@j *|6`2Oϼw&3vftC>d=.P:;?ËVm6?=8MEupahbq|[S.n+<(QiaWg؉#F ꦮb_f'4Aamc#2c
+viKyL\G\r{A*$G8պԍ,«ܼSԘL hP@A<0Ə2 x rX#xWh*/I5:P!JQBL~}3
+[!-&2V"hlk#
endobj
2375 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 577 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 541 >>
stream
-xcd`ab`dd pLJ-*K If!CGO?nnc?>
-!CP d,Pwi
-F: LI30i&-%44
-y&r~}Ң#qͫWu͈?g,mswdF9sgtK
-9r7oIEsgM/(+N_p;%3Zn
-**E[HulY\taƜnYS_3Kp1wwfi;Ps=-n9.iy8'p5
+xcd`ab`dd s LJ-*K If!CGO?nnc?.!CP d,Pwi
+F: LI30i&-%44
+y&r~}Ң#s͏o0O{='zgpLn +2NmoҺs‰9gmQ]6cOݻwˣ<qb։}UqO8c"SX9w4vT!z[r\pNZsk/
endobj
2376 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 6907 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 559 >>
stream
-xy xUǐ@&jzZt QPEVH $},ޗ>]wY;F@&("ʌ̛anU7}[]=~wn
-
-דcٹM+S {ة/sN I0iֆ>θAsF
-"~[bfDdfZڌ벤23r#29  vf~rFbIJl4bcfBnl)6'ȑ̟<˥]iyiq?}2"?97 }FZ'M̈ؕn~/3'.ɖʕƏ=,3;Q1=)77kYS 9 33ON܈F<;{fFǹ ㋣8g8go6E݅wd-3,gynJ] b_/[/]1eSjvΛחgyGxxx"yy6mM{{7 /7oo6o9ooo%o9j\5xky-M<77^h=o]0tpx㖅BMÉb Nl{ORI[vߙcѰӂyۿm*|&$׊ƋD|8N%]~HPCN1U1uŗX
-
-cW8Bv#W:@GBFm \&pEA$*a$q a{8_w)wzzmFe *&M@Qf#]@ZnK7wdjB(X6E/D%* #UdšL.8j3S9f-l0cfL b*Dd\vVhNk'cZЂ>-:Y>_؋~Cd/>j-Vǵ(;bTfئCGef4 94AC(Jջ{nq/"xڙ'kˍi*C>S" \ѥjc  v/W 35@){^ht+{5}`4e8Dh69njѵE:V=6`uK:2+}WF
-1RX51!=3Id+q뫡ҐYJ5Pl4(!p@aB|N3&K,fdvWg?zP{v_#/%F'$(h.7Yˤظt) +o=^ .xFK~~epM* DQzlgꡖ@`4v@, ji #iH-P'8L8hQ,8H xnV.:$[|/5}fd!cP"ʀSL| ck" hg2B^E`6>5b^/QI b
-^w(%=|Ͽ8ײ;ic0R9vPJT(ScmVp8)}
-:NƇ[M\A5
-'|p kSt._>FY֜& Z\ՕQkۼzm\γ1ÉMq;d%:JL՗cN'\4at# qiBnp;,S-9==wzzX\Li="HGWj0ۛH0 s FY
-5
- ( S\2[~ݤv[DU:Oj"#AzTV1*#Ո3{qaKPidj͒}nܐ]l:t
-Fo_&۪%ÆȤ͌e(54
-%[*)VQU)y@dG|IZђvkcU@j3=D1 ?}Tѯ>tX=+o:5n,3|ݻ}u]Gy.![(*W䗔R;<<v"J*D!Qrmu ,)Ž]ƀb4G}1Q0;}MeUZ〈bFK7;I C+ws|Pἔu;$6N%dᒏb`9Z0/wr@FE[aW^H"Ywu4:Fy8{5D4I:Q]%BhҪ5ufn:|Kk@LTa1 +e{
-Esȫqڝ]E4y`nbՐì6KAY?UjJi"n )NQ25A.9&x®3bI"Mk0y
-EKUPq_r{?"y=.i2.5#KQԸ뽺7\2WY`s^ʭw*$'ʫ}Ƭܭ)EK[d,RA bdMҗ;*kqzh֦s95]l)?g/⬧0QV8KDKQ9$emv:2"c䱑%k޸v{<-Pe[^MӖ"InDB=vA.R2 ˭2И9Fc9DvZp&T*Ʒfn {9zOa{6R'jOϣr+˃(9 1?W7D(M>_rXYE5?s;t6Re+vŔk.~mg;}#Ҝ@\{kh`$/١sGB|L\f[IMq' 7S 2)=£jn5M9^*YL8zs+0R;Rj3: `BC )2=ƪd7]-B&bFhdLcBS6y[& a…c#
-DmfÊmƜfvD3H1Rfb\[-,h-w5rދ-,nHH%Mn% OK KO>F >
-Fߢ͘6,"U;'mJ-ڞY8̐c*w7$?AUdʓ$pC|U[F4SܜM:w$NDZOG
-Q[+K4\-^½ [q'R]jbGZ×vd KvqB{ H:O$qyUp&Z~9ڛ\Gq ؘEeC,(z=$h_s+?Rw? Fa>WӼ|A], LmAQ^C΅=}e?PQ'7Um*l
-і NszrsrD@A9 eeV9=6,8Fs)aݼc<H"qƽsttcX59!4K|卥Nph5uNm%jEeLIMR+c¹q1 jNQg2L.xsƼM埠_;f _yRӠo'>-zprźKʎWu9J%cEK/ {3Ξe!.%=^//'B  QMp|l25~Ϳudmg euyMMuuMMyu2Y^L܏3/C!(B6/B4n̷q>UEmњna ^Bޠ' XV3nq9 VW?'ցڬJSu{")-@pOVŋWT, FǥО3@x#+i#,tCwU3Ȇ<{K\?c2SIS M.,,BS{h2%vx(׺~o~0m2slhUF^ˈ%^s~ph3FTQ#u-&^#!U 선G}K !{c%ݳ|=:aT
-`l鿣Dn?9
-
-3S}'  Ld|M]ͻkd8+AW|ojYӗA(~0}BCqY]a+A5 *)9E紷ִcF܅NtEļ4s<מC螷0-4d B(9{4nVZe:vaﹳ\:eU?yopa-
- w心f  dE:n*F%;b
-zWZw)+̮7666kl`=f#OӁ?ҧo?4^>‘6:෣88881 !BUc4U2E(U2  } iiz`{n*rUe>Co:PYU{]jq59ӷo~9yb1JrFUl?ʱEw5܆"K ;dHvݶY/ſ* *?~xzתwXwC 释ɑ(oK0|zڲ 69ΣaIuɓZ'X:njnM|1X.sQZZv4-߇X_>+R
-p/oV]c{
+xcd`ab`dd uuwLJ-*KIf!CwE?YyyX*C[U!@#J+($U*ddd(x)p)(楤)+)3܊RSJR%[q(h%(&d&d53K2fV$d)$(5!,r.JM,IMhɹ*hdX냌J奖hrMU0200&`LIs0i&-A4DҤϒD*r*sJ+Y1w==!?E#~DvKw7oNVO=Or^̀X3\=kj7ǤBU53Sl9NF&ݾ Dvs4%jް~Ǵ=;叜XqwC%NY=cNf9?f̝bڹ+n^?#\wdM\׹帘y87\e`
endobj
2377 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 239 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 184 >>
stream
-xcd`ab`dd ruw -(, (f!CǥY<<, }|BQPL:,83?OX@G=l@AQfn*2NZQ|?Wfq{?Si鹍rʿw4Tv7I6M:k΂i[|>sK%VYr6\\rA sq1+Epʙ-j/'?XF`Ѵ<
+xcd`ab`dd u
+-*(H3a!1nn#ń > ((ZT`gh Rw\~O)?jg=n&v9Z{bɉlY&񟇗
endobj
2378 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 1100 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 581 >>
stream
-xemL[Uoi˺vf0]@Ysc_|!h[ڭ];e@{o{@ȺC /э?3Fũ`Em 3sysGJDionhypb Վ.$%I)x99m͔}{y@A%%'ELJ=`0j:X3:lecػp{'z\ÌŴkwcck"p׉]딲؂U5v00fVc^"2øw;fwambѿ7(ƻ),D7UYn#G
-(s!bp v]lc5}Nj|QOdQ ZW[Ժpn$gCDj|E\ HriE䢥L䛒X<ߠOYIqҽ4J8XC5&\,B7Be&JF˺@
-gLm4IlE&)YBYps;H"d5Cr⺫< 
-]+tfy
-u.S0 '2 ʖ=d Q +>#<IgDۼB(]D/@q#\p+r! :.wQBA҇=fYeXq.":GIZX;Y-D D?zY4ns{~`ǘ1P|l+T#]qx0KC$KG@DCs~pi2D)Z\?lŸ/2 n*{([o*1*2᫱*g[[>ӯGTz2>_[Y90:8U@@Gs f=
-+߅C ³B :)BtNrojnfs6zOʭjҟ(TxDn(J1tD.-O%t_У6/ZňtX0>==C%cDd2WSZ+Fw M/=(=:lR^QA?endstream
+xcd`ab`ddu pLJ-*K If!CGO?nnc?
+!CP d,Pwi
+F: LI30i&-%44
+y&r~}Ң#qݏ]vKbq~\=8!64,\>gϖ5ݫ$wx\~v˒N-Ϋ),*~^"z9wӯ-ZeۮEwm'A4}ӕ3.><"+d꒘hIu89?g̝]d+nƎ*\u[yΉ<\yxnMe`
endobj
2379 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 543 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 3091 >>
stream
-xcd`ab`dd s LJ-*K If!CGO?nnc?.
-!CP d,Pwi
-F: LI30i&-%44
-y&r~}Ң#ac,e~{=ߏYgN7ۅڑ#|~_Իt
-)E=;S'&{:tpΞ|-S\+W?㌹ӿL]7cTMQ8Bnqq1O9k=ϭI<
+xW{xSE?!4-% |R4PvYy ȫ]@`h4myP!4J-BxɫFTy(Z
+
+Թu37~rsg\ ԯc=-LM픖zZ[wnTԒGnj J17RC=1 ΜeaO8]vŜ<ۜ0ÞbOO71'tO8̃.sciN8S3iV_e6`bNL:-nőa1$a✚bNLNO{9>.Y,.{<1?'kc":-S]顉4b0Jӵpe=11"-qڞ}^T[T۽3B<ל
+4AD#nE]>n׊oV @%>ӥ Wsx1
+_pxZ ̀ D1
+?Aa8oAXW FBz.ip
+Ia~WMZ"-h j!Ѿ%^E<~\˛E$V{3 52o[@HQ~ir#arX S^.)Mݧ\؇!RZ^*{i<Yo5hjikƿPo8CDvFY?"kYHV01Ň*+cKcߞG~#!hR8h׋v )эf i~9Y*HpTAqNd-A^q0oisD &Ld jZI{ IIykϖ=&*;%Q_gъ|_ CO<f^rBMvEO#ZBЙe~ q0aQq:ti Swx4 [] /\[37tj+/Brp^h/V-Yu"-)'rRrc-|H>G~9to!9>J>*ME:3-=E3ŬyGegicUk~&s##0C 6შXaQXZ"hD2 Ql@r1wCү$B Z:ՁUv
+bіU$k^\>twc]HXXnotLV;dHToo\QudPJIr>: !Ȥ2?Jji7?Dбulr4Sbw}̩X!%5?t *ҝ> |FVo,JT&P3L'A)RWR4Xr8ohypSddW%ֈoK uɡģpLtLK.J.dc\f_}?;zr2`x^ق2 KJW-t@uy9_E9?^ͫ}a5;'0T8RAfB2>=:bmKtU-}nq1g^~ /ʍ3,$jհXkCPe ]+.XV|9>3m׋= r$QI5ދ2Qk%y|-U~ikϲlHNL"6M{nF/NN`is6 aXg6X#ڏ&RFӉqö{dy_e/oZYzY'Z;9zP7ڼJ6"aﰑ3#?q=vu7=-$>I|A2*
+b&ZMEK**:Bjɡ9m[_z?8RzJd3I=.Խ_zd+M4ӵy5 9"2"==##z{('=Ʃ/To zCU+(HgPQOgRzŚ)T(aJ
+ݣxG'wͮjPC%GZhHLy/k\lo]#46c*Q#A胡ӸU6Kd]kؔʑE%ۋnFJU,<=uQÔ7 mN4#~S7zjq F9ͷÿSJ6b4eW\a_qyɇTߖA5(ΪkQ8łAEim5Th gEݲB
+;6,sQV*P{jdIu7m:33˻M~(kϫDUq>(jk\=}ħãPH3Fzkm=z]o؆4܏=+~i7H0mxɐS_2@m[H%aW"#EF֬lO5endstream
endobj
2380 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 578 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 573 >>
stream
-xcd`ab`dds LJ-*K If!CGO?nnc?> !CP d,Pwi
-F: LI30i&-%44
-y&r~}Ң#ѲjN\`?2DU.rɝ;'uNj=cW+. stT׻Z3ꝝ_fzge넺*nnlݻ/0 Gm~];vnr|8Θ;u3VNe4U(Ĺ<yܚ
+x]MhAw]jB$P" $^D4q7l6MA&ֺ4UPBڃRoBوT M,Mˑ A1!.tYHUH%;⬈#ߎ8LYGO"!+r`"R6f9($* bPRu[*
+$VquI(a~@ςH!n(
+JF~89EDS C/?a0%yތF^*mL<GJ3&Ϛ18391(),4@ʨIi=Mk|q@j7{\5]쭇N.
+b>8?yVͪwOߩsO븳rQsh}Զ8Z~rm*Ǯqn;HQ
endobj
2381 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 575 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 9709 >>
stream
-xcd`ab`ddvpLJ-*KIf!Cǜެ<<,<,C
-
+xzxSeX16M)ٛZ(M;Id{&ADApn9}'-EyusѓwB#<Eh4mm
+=;73VꖕFf7`(Wbf7`RL
+\϶kDF( UxKsh-[-ɀȴRz
+.aGrNiƣASE VGҶp
+:6
+@$,I6 |ePjRrpD:!Mp;[o5@ r}6|cj{ c+hM 6lȓ6l.O]CuN
+
+30][fzd(As6w(19!;;]*@$gњ:D{ %]Ű"4"L" LˇaVAڂg5:p{QuE/:.!5Bn9Dpkܞgj}KYdfM^z\%[`]NT M9Tʴ=6jlM(XU uԷ]9 I pdzH-8J&KR)&ƧJ݇OmVХzGm UYup
+tvT_
+ɪe Do07I<1ft8pZےEUe:G8"mMlGNtWD}7RY2A67!U)$}]}TGGOٱ,ыT1I1]B s-ahj)om\#eɤYD$͔ d"9N 8.BR@0~tۣ[yJ<*_Su\׈}_}~?߄scwjD?V7tt&J50u*ȞހGK[uYŠ:qte:8\L"OHVdgpXD? y06m {LV<CJ%QlWu1]'"1%Rs0-:) !/vZY =)]2 eÔ0l0q,pBbH+/+l}^ 7B7.XN)I8e WŎƮ}jO{FO9T i_TXr%_̑Xr1 !'R63 M,xxCx}2@*fdNit&lF L7_j薛>«삶š^ͣ3&(#@V
+.Ef.FAlQ d.QNĈģbG>d"_}{=ZPf6-].3uPE4z.ؕ;`  S"Ζ$
+$ԋ%L@F*[:pNYQfqAymQiAiPh9JR3]f[g*+J΢ı̶68a驘:`s 8{7Ò';6e$"$&/ZFUr-D*u + DiQeg;RT΀;[Àc~ Utr-j(1>>3TNuA@U
+&I leň`z%C+Qa]j0xX6[[p+ѢU,g۽7Xz#`bd&]xzdezFwvSgqS5z{My\X$SeD6q U'> X˪*3a]pgk~pIJ$.897c+S 1AĊVe4ܢɁtR3t:h2[e'I>s./Fc1W5C6Z]pKI{טΙ{菋tB@A2&<q=(K|#pzQ|#0'ɪ*y~vC Y55[гpLɑN(0CA I R,yv|N9"->5qB|FFJsXT6%E Q¤Xd!ĒVF *Q;)_dlm/k?Oç}14TDe&ow3'GS|rD=XRXqaInLe:F\+A-eN.?<!rUQS)\'7"JFCӹ]Usْ#mU
+]9RcZR+ՈQ
+A[釁@Qh%0+~g S,|Z^k~)̒4BTzHY⌡Ôdf>P>Ћ B!0fp(!& Tq1lYݮveb[d ҋQ6ö;* ǐ`~d펪ڱʱJ Z 2l ߨ&r2sr
+&,\J
+ݢFX،gO wMAt=`w~Q mD{X4_é9:}qt5fFq E-P`sZ8Z2gFy4騰B8Ɣ Å%¢nLQs֠@/FtD;\At$M9?2
+D;X~6gz&w^Vmڕ+񈉈}^ Tk/<Ύns 6|V2r>̝Ab ))9j߫z+>*se>k5'9xqV6]\A;V@ A&#ڴK!N0!k/ԕv.|*.**)M.NpưK_Mϊh.WaT\)$MXi 8N 镑`bqtH)3* ;Z/r+2j-;3#sI^.V>K+2އ1V2X,-^y?M }C) ^LrXT0U|`cװY;ExQ}m֐}&\찹`O
+ڕ/XI4.57LZs Yp3P;Zfv?71:Ai}A-(ry_Զwv6! x4'rN,9A$$^S_M}I}NJ.H0j =KA6'J'5KޏP.}YkCQg*gomagN.x 4y=sFY2_sv!)DRJmEPhGsegσKΥ;f4dso\QLYFt?<?.r':YH@lzn0SksDfAA I)ť5Mk
+×#'
+)4/)^YP
+hbelN:ju vc0e4sPG)Y\h >2-HJ'Dmý;n'jPn 3f,ȃ@л=e ?wC& pP{H(q>0n_2)hL:VxFpt*>`,^oo:};_#'0_zFULt+`}(щh4Rǟ^6=zWxG
+y'5VoLl}Al9`@.,hhx$C)F7?ޥ~sq|0 *^fJ=F^6BPTc/R[1̧&ndK=eBC ʑ_sL@u=<:GYt?4 3Hk{>\.*LYmA .+Xi!:d^  W!,]cӸ="}̝b7d2;;P[B)wZgWO R92Eܠ,;ٺ40Pg٦sZ>2>U'8 ˇFvo8<"1 M*Oé&@$8A  Afrz>ąkJzQb/εpBWn6L"9\E7c* 8hVӠkӯ߲«DErnP=-1L R s9gU\LK kBS{C`aȹ~ϕ9
+̪ΐBu7hp{NPBt^^9BC:XH@X^ 'a(~ZaqܼYfpE)"} vM{fInrfIlMV)z@;QVdE\mmEEmm\Edd\\$,9FS`z6Jc6IӍFPm) I|X;'Hϱmxw>t}U_VZcJpթz,J; 6UAxINui- L
+A"~ M R
+zޡXpuyt-PVbqJia]QQW8
+deUo߷sgY3ҼN7Ыn2=a2"E@ tuNӿLtcMĂcːӆ;pD
+IL
+#/^؄)_s׾peǺkk;x%D@&'&ំ5t{h_p8[7]un\fc%={'u'J||hnÐNXecYˬB@~_~v*}-ȪOЭXpMgsHt2o@דy嘠T;9I. +p%+}l}YsXlJe^&HxQ
+<uJ 4&U:˅nLNFq'epU\7`&vw*zNok[A[GC9\0umωY6SpǩJLNMpc~4a5wYwZ>Xe]ջQx>mƪT_NU0a+Zϐ0e* g%|:}4DrBXsNGn@eTwȩw.\
+$!h]\=sѢc^Za8 AP턁\>iqe'Pʼ館keYNŸp?+pg+8X9yzՁM!!
+Dl<ʃO#@#pFd(3?߇t /!0/!' }D89|p0/ġ a@;zmGs%9͏ *j2v^o lo`{x 0 tKfal{%2Ȱf~HSµf7ԙ%airuHII$Gk8R|@eeD4\o)cR._ބ7]PJ~ :(QmyT@(0%Հ,/i;h];a/wEmh#Nl [3y>}`R8Ҿb&mt:1BoTh ?_jPGGG'lJ ;++$2yѮ/.՞}Q\N)ɔT@R0:=Cn\jD'@"2됨e'HeD4[Gm
+ު=<FޘEt#l>95=?t,Uâ:3;V&K?h WנejƼ4n1eϽ:pE1-,4,2 U
+A9%K-h}{G:l4I}n ?mNPcəlh_ 60IK>iPc)e@&Bhzlˆl0Q> 8?b^&u4/UZm?YViiQiShKp%70 6]ѡ$2ꈇPIbxxUY'Ńϓ
+=ڶm*0,Ps,E=LGY9oӍn>֏8~Mg m%Bendstream
+endobj
+2382 0 obj
+<< /Filter /FlateDecode /Subtype /Type1C /Length 642 >>
+stream
+xcd`ab`ddp LJ-*K4ɨf!CǍ<<, !CBd>Ѐ
+
I
9
z
@@ -19571,134 +19608,87 @@ i@̼tTĢTqɩyũV\>
I90YM̒ y%ɩ%y
y)
n@MKaRKRS ArnE
-%%V @"zizy%\@S u@ 4f`LZIKih
-endobj
-2382 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 679 >>
-stream
-x]_LRQ,$L8j)jP%Fi[ ^&a@EҲ5_lsѓ/mд{ߏ$9I
-UyPhe,hؖ $6/a2S_<×KN%} )[)eV536[ieht7d=>u
-.UW_JYey5,eXSeg18M@27plA At1 1E*|mv}vRw M"YJ|Ͻ .
-`h F}Xp%=k u!?W1ckIje;4zGz^x q-LqDxEq|x"8>4aJx>:{7{;"M־ox0.){9țq[_}~\Ǿc
-\sїJ?,Òq?B
-}o$KhS#yփdPăv C,ydK|*s?&˱cgo>HO4o]:,,o]&KN[E(wendstream
+%%V @"zizy%\@S u@ 4f`LZIKih
+H&`23rҽǛG8e>wߓ18 d`I쿳 ?QDlg ߏ{N?q甐'E7hmoolnmoom(.-XdYv_y7Ӫ7Jo3o){4-n*q;˜EK'uKN1eRi_$/$VQhFK\s % R
+{릴̘~:'6q;7OXW?Ì3_L;7cTMpp̹:sZZ=&<
endobj
2383 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 902 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 540 >>
stream
-xcd`ab`dd tuLJ-*K If!CGO?nnc4~(!(2CQBnBRB@FfNfAB@~NAj[~^Bi^JjBHjQnB~BP:<3/](5U!8?<(h\rj^qj{{j^jQbB@iRNf2LVS<$hF^njErjAIf~Bb^PRz=.ĒF[~QzFFII>Ȩ4^q^^j&W0T#ci&M4`DIC a6! ,F  ! . `dgXȨXGG/1I{n{o f]dVc3w D/Xٟ6=~c{C-EUftzϢ5kvl_u=C *}8G~}xo!B7-xTTkO^xyw9ĩS{&tO=sY˲ ?-{w>jyEɳqlYh£f3&8o}59gws8zD{;ɹ-/s^YwGTtYZJir.iXáq5~}Ch҄n'93>{䌌~M 9,Pfm EJE/}:~`ݽ@v!Z]mЉkqGhټsV]8sb$IS's,Y}E%rNzW}wf[[^ˌSlPYRUۍ{&|x#!ȡmۯK}g0n_~snʩl
-q
+xcd`ab`dd pLJ-*K If!CGO?nnc? !CP d,Pwi
+F: LI30i&-%44
+y&r~}Ң#urُg [-.|ݏբlw3E|ߑv[}gTRxCtV mUҿ2{Vsono1kZ LZ-W?㌹ӿL]7cTMQ8Bnqq1O9k=ϭI<
endobj
2384 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 563 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 1329 >>
stream
-xcd`ab`dd
- LJ-*K If!CGO?nnc?
-!CP d,Pwi
-F: LI30i&-%44
-y&r~}Ң#a{+,q/ՉtO[2FnNլnG <~]ǣ, iM-[oh_ݶ[R[ghg~&֝ޛї{āwsٗQ~snʩl
-q
+xeiPw7DpVhY;:3`*b G$l 6D0?ʩ\A#XR,E ZS|h?8kNIG;~{o.x7S)i+SxBi eU2o"> H1/1;2^cVCE<1gїTz *j5+WDSc8*V1-iKtJʹʠ P 0i1N'p"IE`8+F%ziB5(B΁+1 S
+>1wߦ/ONbyPM`BPoZ*2 :yˣ38+:1! sm\07f
+Lt7M<A:}TAP eAۡdh$`n>sFD)~*00a0T@oa,wEr{#Y G3C\z:jfßKfXyQ&Nnw\| o4 OZ}ERbVWx,
+N%
+eJQ,Lӓ<E.i aչl66.{ <fun]{/a`BrqY<Fk0[zFni(=0
+7q9+-EV)4֚C.#Tk@FNJQ^ރ|&)P]2
+N nTeAdrt*g {
+gC/Z2sش󃟁 g~<&J gU$PM3>pO/2zN)&{|#߀۟}IHʔYkL-[V0˿qۡ;*ʚ:Z;*=MRnI@9l
endobj
2385 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 3091 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 577 >>
stream
-xW{xSE?!4-% |R4PvYy ȫ]@`h4myP!4J-BxɫFTy(Z
-
-Թu37~rsg\ ԯc=-LM픖zZ[wnTԒGnj J17RC=1 ΜeaO8]vŜ<ۜ0ÞbOO71'tO8̃.sciN8S3iV_e6`bNL:-nőa1$a✚bNLNO{9>.Y,.{<1?'kc":-S]顉4b0Jӵpe=11"-qڞ}^T[T۽3B<ל
-4AD#nE]>n׊oV @%>ӥ Wsx1
-_pxZ ̀ D1
-?Aa8oAXW FBz.ip
-Ia~WMZ"-h j!Ѿ%^E<~\˛E$V{3 52o[@HQ~ir#arX S^.)Mݧ\؇!RZ^*{i<Yo5hjikƿPo8CDvFY?"kYHV01Ň*+cKcߞG~#!hR8h׋v )эf i~9Y*HpTAqNd-A^q0oisD &Ld jZI{ IIykϖ=&*;%Q_gъ|_ CO<f^rBMvEO#ZBЙe~ q0aQq:ti Swx4 [] /\[37tj+/Brp^h/V-Yu"-)'rRrc-|H>G~9to!9>J>*ME:3-=E3ŬyGegicUk~&s##0C 6შXaQXZ"hD2 Ql@r1wCү$B Z:ՁUv
-bіU$k^\>twc]HXXnotLV;dHToo\QudPJIr>: !Ȥ2?Jji7?Dбulr4Sbw}̩X!%5?t *ҝ> |FVo,JT&P3L'A)RWR4Xr8ohypSddW%ֈoK uɡģpLtLK.J.dc\f_}?;zr2`x^ق2 KJW-t@uy9_E9?^ͫ}a5;'0T8RAfB2>=:bmKtU-}nq1g^~ /ʍ3,$jհXkCPe ]+.XV|9>3m׋= r$QI5ދ2Qk%y|-U~ikϲlHNL"6M{nF/NN`is6 aXg6X#ڏ&RFӉqö{dy_e/oZYzY'Z;9zP7ڼJ6"aﰑ3#?q=vu7=-$>I|A2*
-b&ZMEK**:Bjɡ9m[_z?8RzJd3I=.Խ_zd+M4ӵy5 9"2"==##z{('=Ʃ/To zCU+(HgPQOgRzŚ)T(aJ
-ݣxG'wͮjPC%GZhHLy/k\lo]#46c*Q#A胡ӸU6Kd]kؔʑE%ۋnFJU,<=uQÔ7 mN4#~S7zjq F9ͷÿSJ6b4eW\a_qyɇTߖA5(ΪkQ8łAEim5Th gEݲB
-;6,sQV*P{jdIu7m:33˻M~(kϫDUq>(jk\=}ħãPH3Fzkm=z]o؆4܏=+~i7H0mxɐS_2@m[H%aW"#EF֬lO5endstream
+xcd`ab`dd pLJ-*K If!CGO?nnc?>
+!CP d,Pwi
+F: LI30i&-%44
+y&r~}Ң#qͫWu͈?g,mswdF9sgtK
+9r7oIEsgM/(+N_p;%3Zn
+**E[HulY\taƜnYS_3Kp1wwfi;Ps=-n9.iy8'p5
endobj
2386 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 9709 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 184 >>
stream
-xztT3WĨe:P"R= -@BH4{d^{̤@P)O$.r}AќGo 'G<wSiKOQ/9mD7$qg_2Jyt,6e%?3,<2<6}1'EoNtOŻ{cBC1)ѡy<=1!)<,.KX6am37y;#ÃFeD'K &DD؀n: kyᅎ6ćg%&.{Mǝ9 !sy&Rϝ`phuuu:oul|Gl<cy B
-9s( kb=.n}6'oI ؚ--h{zoGа{"<{EǚsM1_`ᢷOYt+f̜Q˓9/TbxI,#^%vˉinb:Ax3 /bxGNxk~b-qXG!|ěb.Gl"6 -Bb+FEl'"xXE<O&^ \9$ •`On$b2 8I<ML IL$%#V49MA4%MES#MkxiS8q=SquO3g'n[;G>7_B ߹]1+^|ŏYJo;@nw&N`_t}/rpWOu_.t/tpʒ)SNL85l${^=6m4fDhLgfޙ6yמ}M5}9P2K}GW{zYp%#o|?;jVBxx>?YlcPFw*#3)4XXI@֘~ Z?N4 ϠpG&dlV+[A;hQ_@X Ww@
-;S(eʎ%>${ZiUuu<tZnBNp%JLr\ bq BX%`1Rt&6ehM Kh1[;[A)(˶$RT DHCN㐜a9Z,Gۣə
-_>rޚ4{}vy.ZEU*+%4X.Y?y4jg
-   G4GUd"}tEq(
-48jo`<$֋)[Ys|B>Xޑ8b(L؍-o+-giOZT|u6\hr%ejZNk~
-|Ek~.F{pb||Ƣv{~|Eszv?2_1ubꄲ4#q *bo O:)Ɓw8S9S`Ȭ(f pNc&i2A M!%*2
-7XfI+iNn U
-.U$M tf?
-Ċ%P:3kݷ{ 5 t9lLM dD
-0+NTe
-GM\#.}pc zm\TXͅV 0 ,E*I <%tڌ?b=QkdSV+5ybm
-o
-[E .9f:}:EëÕ񣫱k_G:pdPܨ++U@DfY
-DE!ϊJN
-=V`s5d95=5}bq$fA>L>b /0N_T÷t^e阤QSu :+l1
-f lavL'F *~8Cj.eףrEvrڭ,V9S8K7࢏]fŢ\q\rxb '5tu~XeFDKXHsl/aUTV*H|H.d g05k.ڝ`ɩ+.+r GVpk8bnu"T,Jl=aލj7؎qJ ;GC ,ubaSK<Ǫ2HR*ey0$udy\G5
-l4M5,T'
-ȉ=:6jTVJ6vlY+iОjUt4X8/Rruu@`Uq lfV\*s~0"K?h(W썈>b0Ȁ$b;uichvޔ}
-?8UjАZ$hJ? r.tjXri co2ye8 ^{qKq.MP@$GE%6BYHfX C"i`lxq;jه0ͥm=#fNPFH|4MQY}.\
-Mg%\T)n9)A=3%Cf(npi~W>Ys|SC ߿tځ̲Byh
-,06'=<c( H;2$dO1$u8ހw јY] n\ i ^ T,~tXR][U+jߕU]՛Jpǫ鄚<}h>\q';尕52+Ychᰯu8E?aVޓX?2+ߑQ& @&oc#ФS;fgD+̳N ȯ]U_KB b^4z>gɠW0>%5lfoрs @ʤF">q+MotlWo @
-pp'-g zR +1֥~t8S_R߱**k+k*kcb8_cAFrˉ=KLb{x×yHaDԙJY[}(̉<ePLy8\1`/`GHdkrDRg9p&~:QLSyp <X޵aGlN:K9fyҨvKk'U(u?ȡOV:YH@l)zn??[q$@SҢJʎ]-
--b[R99_STa+.cK2  Pi4ŮoF(#Cl2q& s#R2bsRq'_Yv[\5Ԑho0f_ܐw5{89@3 LSVQ7HUX}]T$H`qhZX\9%]{o0~ǙTTT'FyR>d/4p[JG .=Hp
-SFk6F.C/23u0ҳK
-[/aCc R 8>Nxw/R%[ hxE*m5`S`/êPCj*  +,':pj)O9ʊd؇
-N?p:}]PWWYYWPqќc4*= b0T`
-#bCj/5x W}wf_]U.J/HdjjzJϿ.tҸpyQҍQlvMeH3y_KwrUQ;Di #Ýal5mz s,kUY_ߏ
-`n|BUX5_] Ԙ=`ϖk#d݀'!݃7KqYQSw).}+p%Ȃ+}l}Y}8Xlΰg^'yQ =Li,S
-Ajp_dfr\ -{7r
-y.t#22? a'pC㙃BdRaH7cH, v4rLĐ.D/ tgL8Gkf\`vZ\LbihSNߡ`:[:쭩y^xSDUp]J6k%Cz ~E'`Ex2Ӓ]Ԣ?Qũ
-o+\v-V+1&QilDᔃ\U}Q!+3ii9iq%`Ρ4k8 YQ|,zsxN_fw&zW= NACgX*AY1ŔlJdiAAiAI{ùUfٖOq A
-J%汧pK v#EE8e:*)INT"l26~c_;Ҳ ou9 8
-
-TeX ƴ!CdupV #a*^up~0żLDE91Te9Fxʊ˚ZCE
- #UVG<7 Ń_6ҊeU4<)|VФ>9<ocTA\ :_4Mt$43E[O7M g'>8iě<Cendstream
+xcd`ab`dd 
+rw -*(H3a!1nn#ń > ((ZT`gh Rw\~O)?jg=n&v9Z{bɉlY&񟇗
endobj
2387 0 obj
-<< /BaseEncoding /WinAnsiEncoding /Differences [ 121 /y.alt ] /Type /Encoding >>
+<< /Filter /FlateDecode /Length 170 >>
+stream
+x]A Ebn@;FWM7uӅƨ04,:JB1.>7=~PD5@cQ#ǕSO*]Tx HrWo- AiGMU 6OBa:`S@/1B^2c.|-X%޵xVZendstream
endobj
2388 0 obj
-<< /Filter /FlateDecode /Length 161 >>
-stream
-x]O10
-  ЅUqP(/ СY:ߝ|p%E cikD&Ǣ8L+go:?`3]$ʮS -A#EVO:=(UcJQ5FT*c}|) Sendstream
+<< /BaseEncoding /WinAnsiEncoding /Differences [ 0 /minus 48 /prime ] /Type /Encoding >>
endobj
2389 0 obj
-<< /BaseEncoding /WinAnsiEncoding /Differences [ 11 /u1D6FC /u1D6FD /u1D6FE 59 /comma 116 /u1D461 120 /u1D465 /u1D466 /u1D467 ] /Type /Encoding >>
+<< /Filter /FlateDecode /Length 171 >>
+stream
+x]1 EwN@*uKVU c"
endobj
2390 0 obj
-<< /Filter /FlateDecode /Length 504 >>
-stream
-x]1n@D{7)Ώaq#Hr\*L\)R gOߟ˭=ܯzk:O=חvLO:nǸjzu:׷m>/9u]9-Ki:UNX˹Ks:Fd}(E;ŢekhR,Z&; fUbюfUJ}.)d:(Edsh,E YhCc$H#)F",ˮ}&L &v( ˼ٙ2g2y6,5[i@4@0 8 A  υ``80KN0+ f9 V '
-Xn@ F v                \xnY>K_K҆~-d;{]o^c]7j/=endstream
+<< /BaseEncoding /WinAnsiEncoding /Differences [ 11 /u1D6FC /u1D6FD /u1D6FE 59 /comma 116 /u1D461 120 /u1D465 /u1D466 /u1D467 ] /Type /Encoding >>
endobj
2391 0 obj
-<< /BaseEncoding /WinAnsiEncoding /Differences [ 27 /f_i 39 /quoteright 96 /quoteleft ] /Type /Encoding >>
+<< /Filter /FlateDecode /Length 504 >>
+stream
+x]1n@D{7)Ώaq#Hr\*L\)R gOߟ˭=ܯzk:O=חvLO:nǸjzuC:׷m>/9u]9-Ki:UNX˹Ks:Fd}(E;ŢekhR,Z&; fUbюfUJ}.)d:(Edsh,E YhCc$H#)F",ˮ}&L &v( ˼ٙ2g2y6,5[i@4@0 8 A  υ``80KN0+ f9 V '
+Xn@ F v                \xnY>K_K҆~-d;{]o^c]7j/2endstream
endobj
2392 0 obj
-<< /Filter /FlateDecode /Length 171 >>
-stream
-x]A ENc4ԍ Q/@aсPjq|QtfEJ:6fD$9X qIW n'Rw84rWo-树D[U]km'l$
+<< /BaseEncoding /WinAnsiEncoding /Differences [ 27 /f_i 39 /quoteright 96 /quoteleft ] /Type /Encoding >>
endobj
2393 0 obj
-<< /BaseEncoding /WinAnsiEncoding /Differences [ 0 /minus 48 /prime ] /Type /Encoding >>
+<< /BaseEncoding /WinAnsiEncoding /Differences [ 121 /y.alt ] /Type /Encoding >>
endobj
2394 0 obj
-<< /Filter /FlateDecode /Length 695 >>
+<< /Filter /FlateDecode /Length 694 >>
stream
-x]=n@^ Drߏ؍A PPaJ"N}zy~Ynv{ӭ_>nsn;gmnOߦ?ᆶ<m^xjumZ_,uvfRjX5˱AͧA[ P5}?ّo `~3WwAթ>f8zdD#̈F#qR5@/BBAߢ΅X5R5D~AtFX+k[`-z ĉ"o
+x]=n@^ Drߏ ؍A PPa"Nzy~YϷnz[ӵ_>s;gmvo:Ж{>ыwrj4봾cet8ܟ8.^5c?UhǪY8W n>U bتqDώ|k(cjpP5:C2WhAшxbD#bc\KqPзsa2V "ET "Ūߪ+r"oA$Z-X+qb[- ΆΆΆΆΆΆΆΆΆΆΆvdܑ`"`?wd؏iG9ڑsG :p.N: :p.N: :p.иDN$s7ZYpeMH4!QPЄDAQ@EMH4!QPЄD MH4!QPЄDAQ`]WA``]WAošZYre kʛ&)oқIoš& kʛ&)oқIoš& kʛ&)o{YcBN?6ɓ8뵭7:y4.0?qzendstream
endobj
2395 0 obj
<< /BaseEncoding /WinAnsiEncoding /Differences [ 21 /endash /emdash 27 /f_i /f_f_i /f_f /f_l 39 /quoteright 42 /asteriskmath 96 /quoteleft 136 /bullet 163 /ccaron ] /Type /Encoding >>
endobj
2396 0 obj
-<< /Filter /FlateDecode /S 492 /O 665 /Length 484 >>
+<< /Filter /FlateDecode /S 492 /O 665 /Length 487 >>
stream
-xc```c0:A
-lV(KFFF& G& W0ew 7X]b97)䁻 gF :H_`obTI0cH6<^퐽\B>J,[+|W7֢b2K>Q[s,Ӝ^KWOߐtrq)UQ;t o$
-?88f^>p)@!q TJIc
-`
-*`vpf`-`jdZF X6`ta/da `gv(e a hÝ`ԩ̷@XAρ pNa0ڵ```/
+xc```c0d`g`
+z Hs
+n C
endstream
endobj
2397 0 obj
@@ -19708,30 +19698,21 @@ endobj
<< /FT /Btn /Ff 65537 /Rect [ 0.960007 837.94 3.96001 840.94 ] /Subtype /Widget /T (pbs@ARFix@1) /Type /Annot >>
endobj
2399 0 obj
-<< /Filter /FlateDecode /Length 3816 >>
-stream
-x[r3/Yw~dɡ/YfWTEh%qe}NArWK˕R4r4ezZ(S=>?O<A/Q//?G-(]tP$Bk]xo{8:?;Zto=%/A؝,Ur)sf0CJC3Hxq֙Э"NT
-/1@
-Np2z{
-}BQ1F^,MO$/>eux%2(6]' u|bel(Dw/!Zik!Z߳`fuڹnli{Ҏ'g{}.0nzcKiT'x9_)-yӡOA!@ QW\^'(S6H )9oI Sr:8v|.[
-.w|U]rtpW pppq.&M1*.zy7G
-=Ox6U88z1a3ˋ/r^uv"&jh
-5to ! Lv.8nSK*
-51E} Дݘb rJtݳb-$(
-c 1nzvȼہ
-Y^ 9Pdya@-2~Dڎ<W
- YP^7P#uWC.XV.Id8I
-wK^MzmBHN#*#eN`䆄*Dy|6k[OZdRI#_є 6$(ֺmd==Z.YłQ:hW@@74";N)lq)BEݫq !f9Εf[z6l KT-@BtjI3.~Oh^*TTpJM`bS!ve `:KCm0A%:Lȴg\z@Zg=wAh!rʕǸ,`=Ü]76SW,<y,A%g|KMխ4&3m-#]X-rwX7]-?ϋ&H\.zRv|nu
-m8$СwZ5mj#
-W\ ?;[*yd't1';]0>Tf.'y c z=MXK*gmRw $a1LgZ$&r"D^p)i8
-RfxG=*j҂Vm6җrw[$-G,sx`g7{u5gEq\ov+dr
-#\2ȭ-DE"b'Eon"{dӻ+!+JoAvn·惚knչ)杪:m h0o;dq]~oKmNymp
-;j.O9xx33Ǜ.Nupc;+>P%bUqv b/" \oȔOMQ.cx-#0O|>&QdX\w~>LΎ0/dhsZ8YHÎ~t,;r'C絮$
-D(_7.x@6|ʋƚr]TɆ)`xIHA[& T"x#-N
-s6ch'X
-)bA|P#En.yfmmBu,ٚJj)kZUד&\y.2:/ (&ON?4nn.кcCOѷfčcڎ Qн
-UfQeKt7clq91Q~rӋzہy
+<< /Filter /FlateDecode /Length 3824 >>
+stream
+x[r_-.;fɒCNdq\S%ĥLʗ}N3@JJt}9}T=-=:]{O|PKĨZrty%^E2-^٥7wj{)QbEZxK߇0#WAS<΄natNpНx!8'ɷָv:
+''1٧,MEAaT*LTfŦ]T~і(D+m-dXC[lBҬA;mlOl9mUc>c6:o+⫫<Dxؐ=mLuqu:V".4(H/0%gc/^ m}w1x.p3ɎWUE?H{gũz7MDUx>^<z6#;?LNFZgq<\T?lgy1'\N6.]
+<_!Uiid$V
+V9fc4j˦y}
+fTJ`HUıQ*g+} KG8Pws%T( ."ۭd L M.x략(CooA'&AQk6@ahqض4WC&1ގlQ#+LɚG47+FR8\p]-0pK XCb"` *e'Mޡc\{"$] lEˏ. V- Ptof
+GZ_'/  VMyF4]ً6C;틏Lf1qQ!Bg ɋ!*ő8ihG?\2D.)7 x o2Bbf P/wQ5,X~]IQnPbp]x!jeưsi?$Gaea2h4lLׇD; jK
+$
+Ϸ+^MRۄKF
+`k`
+ծD4=X8yzǫ!&gofc|ohH7TQW݆Ck _L" *~wUÚ&=g@x]"Ϋcf!7f6MR~ex(&۠WFCchm/ح7y§^۾.$C3iCg;u&8{e& eÎ"`?\ R҂Z*#!2e̛zΓ|)>QܭuR/A1ZtZf_IQ LQCdj~b._I5;U.cB%#uxNЈ91W`*w&F-4R"~IڌFBpZo fQT aYkץf]١l!7%VDJQJnIRɣ4 _IKvBs]|Eoz@h%d:-}aPkZc^][*;D2 9fLR$>(ߤTS r|s?Zya19@>1J߷rtz:9=o;={q%z8X@E,JH4Ul}%yi@`>j 2&q}mYqԊKLFrƀS|Rf|G=*j҂D=m<G/Q>HZ-YDo0bj7gEq\o͎KO?
+ r_ʇ:Q:|֢yu16̓"77{_=2-!bނݥ ߚjίwfWtwhcx~@ZcY!h4ZNyMp
+s6ch'X
+If latj|
endobj
2400 0 obj
<< /AA << /PC << /JS 740 0 R /S /JavaScript >> /PI << /JS 740 0 R /S /JavaScript >> /PO << /JS 739 0 R /S /JavaScript >> /PV << /JS 739 0 R /S /JavaScript >> >> /F 2 /Rect [ 333.72 629.38 338.76 634.54 ] /Subtype /Screen /Type /Annot >>
@@ -19854,130 +19835,129 @@ endobj
<< /OPM 1 /Type /ExtGState >>
endobj
2440 0 obj
-<< /BaseFont /ODVOEP+SFTT1200 /Encoding /WinAnsiEncoding /FirstChar 46 /FontDescriptor 2441 0 R /LastChar 116 /Subtype /Type1 /Type /Font /Widths [ 514 514 0 0 0 0 0 0 0 0 0 0 514 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 514 0 0 0 0 514 514 514 0 514 0 514 514 514 0 0 514 514 514 514 514 0 514 514 514 ] >>
+<< /BaseFont /BOKKGC+SFTT1200 /Encoding /WinAnsiEncoding /FirstChar 46 /FontDescriptor 2441 0 R /LastChar 116 /Subtype /Type1 /Type /Font /Widths [ 514 514 0 0 0 0 0 0 0 0 0 0 514 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 514 0 0 0 0 514 514 514 0 514 0 514 514 514 0 0 514 514 514 514 514 0 514 514 514 ] >>
endobj
2441 0 obj
-<< /Ascent 695 /CapHeight 695 /CharSet (/a/b/backslash/c/colon/e/g/h/i/l/m/n/o/p/period/r/s/slash/t) /Descent -228 /Flags 32 /FontBBox [ -1 -228 514 695 ] /FontFile3 2448 0 R /FontName /ODVOEP+SFTT1200 /ItalicAngle 0 /MissingWidth 514 /StemV 77 /Type /FontDescriptor /XHeight 444 >>
+<< /Ascent 695 /CapHeight 695 /CharSet (/a/b/backslash/c/colon/e/g/h/i/l/m/n/o/p/period/r/s/slash/t) /Descent -228 /Flags 32 /FontBBox [ -1 -228 514 695 ] /FontFile3 2447 0 R /FontName /BOKKGC+SFTT1200 /ItalicAngle 0 /MissingWidth 514 /StemV 77 /Type /FontDescriptor /XHeight 444 >>
endobj
2442 0 obj
-<< /BaseFont /IOUGYL+LinLibertineTB /Encoding 2451 0 R /FirstChar 27 /FontDescriptor 2443 0 R /LastChar 120 /Subtype /Type1 /ToUnicode 2450 0 R /Type /Font /Widths [ 641 0 0 0 0 0 0 0 0 0 0 0 253 0 0 0 0 244 358 244 0 514 514 514 514 514 514 514 514 514 514 0 0 0 0 0 0 0 740 654 706 0 609 0 732 0 367 0 0 0 0 0 0 614 0 716 504 652 732 700 0 0 0 0 0 0 0 0 0 253 506 542 456 561 489 391 521 619 322 0 613 325 905 616 551 581 573 428 427 358 598 529 777 561 ] >>
+<< /BaseFont /YNMGMC+LinLibertineTB /Encoding 2450 0 R /FirstChar 27 /FontDescriptor 2443 0 R /LastChar 120 /Subtype /Type1 /ToUnicode 2449 0 R /Type /Font /Widths [ 641 0 0 0 0 0 0 0 0 0 0 0 253 0 0 0 0 244 358 244 0 514 514 514 514 514 514 514 514 514 514 0 0 0 0 0 0 0 740 654 706 0 609 0 732 0 367 0 0 0 0 0 0 614 0 716 504 652 732 700 0 0 0 0 0 0 0 0 0 253 506 542 456 561 489 391 521 619 322 0 613 325 905 616 551 581 573 428 427 358 598 529 777 561 ] >>
endobj
2443 0 obj
-<< /Ascent 733 /CapHeight 733 /CharSet (/A/B/C/E/G/I/P/R/S/T/U/V/a/b/c/comma/d/e/eight/f/f_i/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/period/q/quoteleft/quoteright/r/s/seven/six/t/three/two/u/v/w/x/zero) /Descent -238 /Flags 4 /FontBBox [ 0 -238 893 733 ] /FontFile3 2447 0 R /FontName /IOUGYL+LinLibertineTB /ItalicAngle 0 /MissingWidth 500 /StemV 133 /Type /FontDescriptor >>
+<< /Ascent 733 /CapHeight 733 /CharSet (/A/B/C/E/G/I/P/R/S/T/U/V/a/b/c/comma/d/e/eight/f/f_i/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/period/q/quoteleft/quoteright/r/s/seven/six/t/three/two/u/v/w/x/zero) /Descent -238 /Flags 4 /FontBBox [ 0 -238 893 733 ] /FontFile3 2446 0 R /FontName /YNMGMC+LinLibertineTB /ItalicAngle 0 /MissingWidth 500 /StemV 133 /Type /FontDescriptor >>
endobj
2444 0 obj
-<< /BaseFont /JHHHEW+SFTT1000 /Encoding 2449 0 R /FirstChar 33 /FontDescriptor 2445 0 R /LastChar 125 /Subtype /Type1 /Type /Font /Widths [ 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] >>
+<< /BaseFont /SDFKYN+SFTT1000 /Encoding 2451 0 R /FirstChar 33 /FontDescriptor 2445 0 R /LastChar 125 /Subtype /Type1 /Type /Font /Widths [ 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] >>
endobj
2445 0 obj
-<< /Ascent 696 /CapHeight 624 /CharSet (/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/V/W/X/Y/Z/a/ampersand/asciicircum/asterisk/b/backslash/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/question/quotedbl/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /Descent -228 /Flags 6 /FontBBox [ -5 -228 538 696 ] /FontFile3 2446 0 R /FontName /JHHHEW+SFTT1000 /ItalicAngle 0 /MissingWidth 524 /StemV 123 /Type /FontDescriptor /XHeight 443 >>
+<< /Ascent 696 /CapHeight 624 /CharSet (/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/V/W/X/Y/Z/a/ampersand/asciicircum/asterisk/b/backslash/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/question/quotedbl/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /Descent -228 /Flags 6 /FontBBox [ -5 -228 538 696 ] /FontFile3 2448 0 R /FontName /SDFKYN+SFTT1000 /ItalicAngle 0 /MissingWidth 524 /StemV 123 /Type /FontDescriptor /XHeight 443 >>
endobj
2446 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 10185 >>
+<< /Filter /FlateDecode /Subtype /Type1C /Length 6153 >>
stream
-xz|TU !^-H HjA)
-"EzHKHdz̙{I2! B uU e;w ~ 9syYX.XVVVo.X#KwI)n=AϮuz!77M<~G.YYM*+)WYZ^iBFðů.XdR7*&ެR5?M0]X(Z=CfYkg~üozdQW>/{AK#_~QFO4 >l!+bX?l66`ث@l46-bbocabl" Ŗbo`ðedl8&6=MŦa/bӱ l&
-6 M^^Öc
-`c\ uzcX+ ñ'10nX_;aa㱇%h ]Ft9\/]79_p!1LAl7z8zx(|d#-.}cu\y\>aiނ{ z_o'O?+52P.|S-wqpq`ݟ2 :̨g>y.6ۆPCv}lOf km-ÿ]z~=in/1S\Ng\К˔"OYO9ə_GiNkT&~΁/uu@gց|RDsE>E-iu:͎[x||-k"huu+ Wq%+1CkbFL,8έ9͹LrprDL^2PҠ }I-9
-DT'h8
- 1WD/9pa;+)FdҪ.F%xXQeyLeKEE-Rfd8.YjDPGxMmRZˀ1P^uqw>4:  -pWpve@8)@S^o狤*͉ ('39n=c2z>9\Ư,UG ^lml]lm<bTjtFŔUk25.P) c*ȏ1hD~`(HTPұ/m;B U|:`^,x\wa䤏zϷ/F1|K2F KD@ђ_vVf]8@2O]\X
-۹8ٌl@Ftxs6dr%ds1&R6R)oҏAbN"S!nhثH wahKsjpm&Ǐ'z#y\ROG̓CS}qvC NN]]VDR3c'1`=¿<Pz+:J* jCΥp84sGfrRM~}MHqMHSK bH)x~>lohX\(V jd/i@9{_l!x
-X\(J$T*P7>
-&-Б%}$vlnjf'4X_C^p%9s!ZSWDu(Γkno:%0 OF[uCNԫ.i)sީR*,Ns=.A L#*bH;)N}T3? 'N["ϏW/w?fBgc:j^=|k|4| /A}Cp>T˜|wuO8U&2}ik; f^LH' nk~55
-DQFQ{&STU\!
-F23_`^?
- %_1v 4A9A&g 4Ӏ XFV ƹL JpiÚ`7ݚ$9"!"*'hGڟ^ o }K5e,҇B켒9ޱ(XK RQ>A@ 
-3vdr2<TCv< #J_%i9=pPZh1EDS{XDGŜ&smLуpN\ZJfAX
-hf%.QXXY92{i3!;4 8
-H n߰Y
-Y Fh+a
-tHh!i8
-8_b EHžLʽU;x*$3Mzr $Jlj8.7@F(|H6u@[q @-"H"nӧ{;K D"L 4r# HFJܭ ߢyLW.9VaTƼN P0\Y*/]]$ b;~kva&fEg4jmN.\dT,f09.<-#Ȁ>+`E%2F:i"%Q9MZJ)
-J5|͔iuŔ
-`#*f;7;(K LҚg׌4f@ؑA3\E/uwpk•g$cdJiO 'qp
-=o_uobɪmVM g1/|P$UTof}$wXC¢]e(
-dsv88b2kx
-rV&OMI΁w[N[N|4b&Pn.`E_]Kqa*5Ga2>٢h&@Big \Nf(/PǪ(HHt1Ã3iяH6"yAmb-V>ɏ56'盄xs ň
-b ;36.+€2/7M1ㇵ ?!+
-H6t\n/
-vS\ PMS߫OZxzHp0RmGmas|NiRO?#xk+
-Xu!pVh
-;hU9~N|=l2]Q!,בx
-!o]8l
-<D<RGG19Ņ =`
-V\-zBlouAno' :WMX&ȣ vVCq?Y/UVE%`ץ
-=TyWLOpt{ዓX(cvEyW\]^+MŢ'5b^˼ e[ypo_G}ːV.GpҎsе N?)&nr  }2B.YA2qL!`f*"#l;fE@ ֚‘t(+)#}|["JlK)^5v.h0vIťռ*S P5@mgy1XTՊ@#87ߘooq=7lI};` ?MX ?Qn;+
-_}>>psG7p5bY
-ddz.E\ Q AÉx> 93JBRQkpUndTAЈ85(Av/O+x i~o!WFfK+TjѮYC2SE'(t2=w/9} >
-O 5+du i@2g?# ڊE ^vN64,dyz灅:9c ट^Ki:zN2S"S
-SjkFi D!ig +>e7a {8"2´sI`!n{l$Qh啷(Xŝ ǝA_r?ɣ̠3\nf֨UzyP`MHv &=KzϞ5
-<XP`Nc^^U=OÓ\ t=׵C^{7莻 )RSRΗW
-RiڄVCeOS
-AVuDgn}O]צ.s. ,6smg6e7S){^zrChU%奀\:ٜz7{#d vZ N29يں
-d>i-ʼn;PwPzbAU@bF*3(h$?Z?T١jv轕ߕ ,:pY 7)u-Ұ,vA/&yulԕ@"Q9xI?b !)rţYI_N˹_v򹑸 )
-W3O}Sj)QȤ6/֯2Sp;rbGv<ET2_?)!L\ 8Ksa.=90CB,5dG]s5#Hz
-ŊGE`¶%J _"㉧,Xf v"F2'fz8c[㮺u}2 s&й{nA| :F
- jcz
-pK%QB$U! SI5DRZ(Iu
-_ <ȻMpSL2$mTA ~@wT
-&IlA"DrRjfZ: ҀNKE=}Em:Js|4fQ@lDc a8~qΆL/sӜƨ'Dq|T6qWpIb"% CqW
-fWOl&H<
-
-.'wȼ
-W/W|,YvY9%Q Y[3!w6N5AqZ9am|9|:3qo?GEBdoKB/
-QHrZk[WX7337zȧl%Ŷ&ܨ`
-ncz$ qk/2M7= _A|Tl0'Hendstream
+xY XS׶>IhQ U/vjC*"@H Lœ
+qDC{C<4
+}/X""b' v!ē"xK#6aFb$[׉6%b;A<BxW&M—#Hx'/ Ǵ5Ӭhgۙ+=#D3<V8١ss]?1?yo."'sW{&0F?11'
+EGa+;Vuo0'5henxp)efKe5X";(jv] 2o
+* Ӣ$ f-X@kJeG1eN^QP|<@Iw8ۓT5UO;<1xh`|NAo
+a_2Ip52P[ ȁ]<V7wG)pTwdcnXpZrG؜HPXU)"Q kwv0h}6ɾmR?@-rcNu{z>~ TDՑ c>cyP֋jt)OiZ`%yO؉du]
+'t2ga
+`v}e}^rč~\A}~UYNlZrf@"Y(\΃3!whf^XnQ():9fUh6JyfMx'sn v [ @[ugi &|Fzyp7Yo{ª /&Lm~
+< 7P, ,m}@+yQfiI{MdonM荬1Y 9LnCTf.BފuLv4#.F R<a{7^X_R=Y-vaXw|+4zd6:_0u
+mfV Ӗ^ұ#Lv/
+RQSlNj$m=S3QRW"
+C&wѿrOzH_@2߇}cPRA| %'i:PKm~ 55m=MjMfE4[aR8#C R@RyzmVd|G>ɾ1]'D]uj'SNXtzugQ6MnP_ } <׻η|y
+*B["M-dfclL&GT`4`
+K1ل1Kg?k52޽Kuu|.~Q<,yoq8f{Q6ɯ~|$
+u|~S<SbֆAtcs(j eu1xS;do?;S'eb )S1@g)HQ
+xɽM[u|ŗȾ톅P+1=b+dK_j%(jyP1{@ Uof,a6_$@O,@gv8;,}\]%jדE1d܄`ڗjL2nq&\<X_0[e^@v5iI<xOI%QRX%&Mw 3ܢSƐԿ7<`o% zXnOn/
+D+2I1)БTĔP myeŵXԃr"E֟rQ9m W:~ /=e}#g";0pV3]u >QkچUiT
+\NwݎӍnr^($ŅqL w^ 8F@6敹:h/XQ
+aB>@tf*[wZ
+\30>e%paDv <7-
+iu5*]P 2AMry& ^?b=n!{y-"Yi19r_<( p=C :;|8۰oGQ7Xߔ*3
+wlו˭BeTD9rUw8rv,c T7fTr J~Twާ~"(G/ *
+xz! SsQ?;[7 N+o*r`URw4.YҒP@3V4tZo:.uYs`%!j1+FUr"U&u3 V
+~1r2c̘YU56E>de^L-"6r jjp 2s2
+xs.dY77<(yKg=z/6i"7jtg_ϰol*
+ '0`Ewf 0qa!pC9hҗ`'좌bz\>eu[ pGp2J#7]]'^~#N]i(ˢ?1ͿVQp/s+z1d Zd)dם0`}-Djt@Ӆ˟*ۣmLbvxu H.s\gWw!1Q%b)/9t+?υSWC! h] W:;%k~+k]?rfg7wwY(8B[i׼wywRrE`pߧwDM2 !SlM6 w= ޱSh<ԉ(\d
+.|p Ds߃Bm4oFviH >ycKƷ-\՞\pU[p>aU+\ aSuW?CSJ"-~b[=n@]NUL)=mCղD/z} D
+r'
+Y"a^1/n: ruk)s?B;^ l=R&*jf x@\7yVYfAo۬G<
endobj
2447 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 6153 >>
-stream
-xY XS׶>IhQ ՖZ;X֡X[TDD $a&aN;303QPjkv|޶ڻޗ u^׆ALF0[D-hAjH"^O2
-KOO~駝;ӄ%n;Ug,yns|~r\:909.O+3K&g_&o]RBo
-xeɺ)S6glΔFɢ1aPl`񮄐ős/}a-zʗ "xN D08! v{uD(@l$M3+f9Uyb)xJ,#&Ix›!H# />m44ڥgZיLE.RFmnglY}=99g殝1cχ<c=/y 9p~ޥW}|}7W`cwc <>22FHը7,q^"?8>yzB9/5Rf- L 3 { Pl4پ+pE(<sZV7iJaQ}o`LtcX,^i1벎h'00.[{'睸n<0Hӷ___~/=W S0e` Vr=kde9w:p2͘S
->#>a Q+/2=$TjAyBe+;Hm{q0 ZMDO}ovf9D?B?-y_*4f<7<peDNfwl_- |qUm<Fu6 M,'o=HRkn%
-}=]7=:dL[%1\@D Q/bOҋ+ᷯJ`êS6OGp C6յ2XH=4?@QShGyg}
-該B0%u z|TY $Z{0,V 狊Oԍހꦥ Bj"ɦwg;+?ޤ<ΗJ3q1:4RQ]V뭵\i)+R2@fdty?0mR^ˤ1hSmx8 EcT 9bP V} w{\IJԉ!
-)2 |f(
-qX ܶ>cǻ Oa0q^Dl4U#Kb&NuW w b8ET!yzq0-vwDDKŃNEWS"JvhT*F04ݛ.;3j[WcTi䤊wCe,8.,e\x9!˵jALS*l+p34dƄ;f  $NIݬs>--6r+4\ʬ$TW}WѾ+$AC9U/3\ʵ5r._(I
-Uof,f6핟_CGm;;(y\
-;E1`\_y.0B V\k`Yt&(.rӬRqsj/ $y8|gv'BTExɬb;ʘ`ENᶩ~cH-n EN[^[)>@|b۟mkҐzC,yZ|ިe >}^\jTk| <Qkst/7ԓI)[.\6%.#:O]kBbsx Y{8_#FvZM]k^F(Ii"e2  D)3H_=>`o[H
- DBrXȌҼZhyd>@X"O>yKpZӌl8`ęS:Qp >QkچUiT3NӅnrN( L ^ 8F@2:;(}H0!kY0:B_-F0 weg.N̙?KYt8[":e 1L{LV]$7&9ЃP9^1]e|ϹM;[?y ̽kI~ݏ*1~`=7*<]A[Op.\=\7gR%5Aʋ $5$oTt(qX<;ɽmZͶdr`mIH$0J!Fz;:XFObW̡1 0Ntwujn q`)G?\/ 20 0߅^gSY[_/7aT2P/5H֠4E&߇r3 VyMmוڏ n}j]|ς`\76ld7sg
-:4Qk]Xd,d
-ˠu` M"ʪ-1Np:{Zz/L_~FbF4+_/;—A';#d\U+w^f]{ә۽-g':6Nߌ~[9Ȇ<(JprF I@vMx_y@봡e鹸_]ז{D8G0n`BTy+L&b-  +shNNLoʻL#F{1{`](5ıf++A%0[I,oy7x+&]vPl9c_Ə=o ``XӮi:?s@5
-cBS3q``cB;/@/5o)UfK@=h9PBW&
-iIRR
-n0vVsTFT/BWGTޣB(GG?#k2L/e@8sxI(2*tMi곭9 &+,P:6UR
-CRnruf!֦TaLf='ʮ2!+%;,^Ţ3u$2ˁ*;;->BQq17SZ <szN u)[pQJ8VZ
- ->_$a*ҏ>\]h5b%EyUǬ2iL\eΌ |ƪ)-X'' OK ja`)_Zc]ޔ뗞)r8/!κ=䖰XƳX:;5j8WzAuɾV+Jz+Z:27-;L|tSQt:>6M? }\pwPvZ!ו&}v.X)kl^Y<Kݢ~KNAFEiXbGPzLCi&mqnU܌DL$Yp~0`}-Djt@Ӆɟ(ݣmLbvxtO1H.s
-Y>l~s%a<rs%g .Ss*zk֋Aa;4 y6*EOOKQ*4 E Q+ʊ,Z[[GAI.L򎅹t\LS ?C񇌃gơ"[33SFMnqWg 1,l9kXU*n mTՏP/sHKø_=Vۯ.P]].ndO[P3΋S lr"Q
+<< /Filter /FlateDecode /Subtype /Type1C /Length 2169 >>
+stream
+x{pW]72HZ )R&!f'l=Vzޕ-ɲ$˒%Y6Mp
+F Oե_cG$yE;e oWlW+
+ę`Fm/ޡ(-[~C-E~
+ߛ[|$KB _>O彲ˏ&5/ؿ.dD,z=7z֒T tBc'F/7ʫMMJxGu)pZn:m8w@.Xլ$-F>]^ȫ Xx 0*oE)z˕8)n)'V49UKo] ֭e9sm!rשkTNcU0jzA ԻX<]pE! Yq>?OGGd3
+b r
+{1C=z+tCDZr4%Fx;pP:CX ^Io^\%!)|L<vt k]"Ahp~3~_uPHB
+Y^/%p4\. Z@|ˡ0#a_tf\uzೇ
+j2LU6=ʥ]I,T$7[j(* G\kΒfS-6I2dKw: 6&
+։:qapVuU^@6C{kuJ%ߚe dWW =`5 n,˞=ofPA$~Љ3Ipp+4`
+4\YgAsA?!h^chkvp:NQ]hHPN,W Ghi4זŪ#
+kvf2:=&Yj؏l<e4͚FZD[W9xpi8fO76֩<b8Ϡ~z;"XĂ@1ã0WXo88[G6qxb+ 5zZ7Gxr.CƵZZ4 lueeC,Q=
+%|%&m@UGo ssnm'`>fj`~ba(~XM?!&Qs&
+ml1P$RѶU{MͱxyYfU[Q$T**tJ%u~#w!|P0qnq_7u _oN?U>VWtjt$>sE9AÆ[Eѣ \ÑE#p:U=" 0$endstream
endobj
2448 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 2167 >>
-stream
-xUkp]YxwmhLjKȔv i@Z;N!L 6`By0e뱒ӖlI%Y,ɲ .o@x0n%.mm'+2Ӯyu&?:ٝ߷{9`0D|^VִSL%Ky{-N#`İdm
-X8v,A"I<`4W>â͹ Y\<OaTaNyI醍rn/2`GRl²9\}l
-lԓ=?.Nz)YQz!>zrp0[g~sS yX&^Ǟp[mox? ;sW3!Y>:"CrGg$YܶKE ~.E) C## H"pɞ/$fD4FH#8ȫn޼~j{25R*uOKDh>]=47B0 \V#vPf~/g;s> ⃼ptW߉s-[*᝿/<.\$p@Ir%jI)ˆ0feAr"&CpI48e^C &oNqp9ő=6LpC}wsV`ʿ .RzcOQt `BBL!^pnwq{=I@;Mh0Dau}Y%߰űBɚ~T˜b
-umjeDZo&u'Imk2´|^af̛TzʃMՍAs\* )񹲩xI^_Q96ۿ)8j\3f"{rZhu-
-IX 3`g4/.e9sWb)ݐ7S(Yy+6)'&YQ68[;B
-TWARjCtߜ4T"zF H aq/A5gNU$u[̊!m8 F@_%- t/?:"8|N_ &uI:xt=F^MIS97pVP4X<U%zQ#eXP0XTM_![޺$JCRڙXn@=8lvV0,}uMýGP"
- _IhB[p'p5zoV@)!5aGo/l8k]uk Ԡ
-`12p@X&D*UzIMϖ
-~0HogYd G1tz
-M8J݀vNEZѦa.Sm`þ@^zB cj|wXћҥ"MHD2QSONC٤
-pi8fOV֡<b0+9 ~z-,ł@Tj!#چW2o88[wA{qxb :J3xJ.}%Z}$lҧ7eVIJ_.;HkK-f[uH%GA$hZTfDT0 
-ZhHu4u@wo:}Js>x \ \S CJ"Rf@5~4/޻P8y2P z'P.ּa8<9Jq^?O Y#0߾ endstream
+<< /Filter /FlateDecode /Subtype /Type1C /Length 10185 >>
+stream
+xz|23"*ՂRDEz -^ٳdCdD\@׫b=7YH̜>`]`999:oÇ/S%pgޘz悞]~&??C<
+6[M†abñ5Yl*:6M^f`#Xlv/6{ {{
++xCX/
+*b Sz_sx}=[@3Tد6,7/Сz6jD~%ZxM'Yzr ;d;l5;FbJHGvu0?ϊױy7tu.GĵJ9\"Wa-lzN)RaHdH.N>1
+傚xM 1YWW*
+&k !kZQoҳ9liA$W\BRR4lp:XG iXJ;_2wSQJ*_]@5 l4vsMTh-|܉4+j4n*xPyDDQI])i\F#>
+w`P+'(bJ%`= omʘsNВc{'}I ags<ҏ #~b-`%<`7;>?7%^Z:Yɹ"t&(j|3ZRr#_ũuZIZi˽ MtSڗr'B !:iS80fӍJ|$J`v,5 x2TV֛P֍(Tzz!fRtmcP;5@y$tƝёyyYl1 8;H3~}2;2nރ]*_jgiQϝS<zǵߐ!qȴ.ھ1`H
+=Fx4aieM2X,W^8m Rwluvaw2 U5\")c#d,F/wْ$2AS{]N.8>tB8} 5Ύ`5PPQe%`~vcW U!͢`z}Gyl\BPd>E)/S YrZBPnY"1۝͹۶apWPvTPw>E"&L>c.k:0ܑ:CXvqZ%@EN)
+й"qfh<juGA.T%bcbF^0u@OF hĹګ[$vJ%Cf{8ufco/ɚ8_d{]t~ ; moѠ T=X
+zglzNYRI~yN.B? 昣,QO$]44UGRVO] u:`^?eFђ(gczjU>!3 B?F!r+I?IKPFk.Y!=y}!3N}jУ΄ua]~gWa7iM"i嵕ՠ[;L 1 h{/[xA 8w"JYZdŘD\@HԪ`k5 GyA_DX
+76&(3 ?O4JJUMeEsE[P GѤUag{L_vw8j\jJe-:ޢݝt&vߦ3!\
+;?XQ4qԽjkLF#\
+QlE
+J$w֟"v,jW[ G-w.С|nA- <Nr{ep[K2 Rָv HJ,BBȓD3 <ip]0[S{)MGuD-_@ ]ef
+r(G6#'(µ lǓ`$WQ<AaۑRTH%~UEnY=y$CpY kJS =j9WGmn G5l~]n%r{~om?`ZA@6ైD\G998_`0~{CK6D*i tYC6Hqe:3v䣐aZQ(JgƲ9i+s;ʚ>{DH %1C=@{/p46ٚyIU8dZ $= ư1[q<
+ԬU(Ś ႓xŸ8I M0S:I fz𢶸U0lOvr{ЯV}Ob
+11$ 'Z)eIi]C,^oC jctiw˪EbGN-Eov6E)~λ
+ {_,aY ?(9e`Ըa@6
+S&=M[w"u27"m"ıJ_ !/t[:R *t,,*ZX4psF#)yPF>D+hUra\R]ךjԀ܀ !?n 39/B^$fU^Bk͊!l7xq:EjpIrRPLwCxKA깎l/# 7Fp˞> }FN %e{$\Ud^y' YQ:z7|Jƪqh횖ѭcZ^l\`׸@T:I-Y$
+܃E2E`Β=?=.[oΈ38|g:c1[KR2Pw6jݏf@OYC}9'!ӗҐR2
+8Sv.nl&^G)H'.kE`92 >rԻ-e
+, aul%r=ۃp
+V&SJd> )8ቨDf(yf -`{: ?f};eɄ%)5Zab  ^&-x3?WO)D7ryc*vLMXȉeY, 2xĶuNWcnbw ؀6< \m!^ױhM5n`HU٦$ۃ
+PI׬p)StR)ն{Q᧙A<3^\ȑ/L\* U1b$ͨ
+Aacd0D؋B`{T&[S8`8 Y9Sˢhk?%2D̼@TuXص7=9LsYdA<vrO8u>f%⇰';p}PjATYRS.]
+;oM ZE.ٳvO^@n!O!aGN4o")YÅr ;n܇#Ay*\7◔ҏ[Y?+2QP!H ":A2 xl#qTG}ƹ86?}` {MLd34oԙr58SΆm y3j.D؛/rK# 9_V'\N&7h"' :8Oz|gY&[wW/d86"-%}$uMwwD kݾad%ѭ, p}=:-@
+o K@Z@cٷ+/9sPB싼 \##%rKvm-?H"( MYہɾɾSAaA2q1T[B…\bq!rcXj/K/oW7>P+u җg 6(
+8Ֆb s]v$ QsǾK
+ؔnY،t >K}X48
+@TXHy8bR!}QG>1'7i@>ST*c~..r]Ҙ2
+N$iInœH4u!n# 0 ;&vvϜILU
+JWW2V W=/[Vzj>׶:-Dn[][]3 V}'G< ޗ 0A'rmb7 KJnl\q@C:rN42 ##wKx*G1:UTz 3A@bҋAgم92yԠT#TҀ"B[řD}=k: rB(+2 (wڧa.<N5]7aiHtKE+JiԄ3SV5+jocrNsڷ vl.;3`ڍþv8^
+@; )dGK`p](FT$mИnBUjB!K)|ULUj-+YW:z tPKDEA"d+8˥'~?tfВQ=mGD[䍱hE+cZ0ysSfy?}C>q + g}͙GD}HA¾H>Y1'^4PbCBdy6Lk)73D-K ?r;<[^(Ieq5RĮ*]2(ɀ(h^ z[j<$?ke{Z\TJ>"9
+9aqν#p: 3'a\9;Yv&"ʽ_[Q Ä5i%cpćp$ Fƴ*=\YXV1 nwӍ.qE^#ݨͥ@cml$
+b)2t:O-?A]q|kfA
+8ɶ߰5 t 3|~ƛ &Y~=6P课{r#I}{*vf>㧆I >:N.?+`_eG<G{7ǹh-1~&Me!w,zԙnZOL~ɭt*?P<o
+х'k(mIuu}oXMQMPۏ[ُppEAwCp VtꌭZl+T^~z~,vI::wBB;`ʼn<38|&۳CTyneRUa!_,{.W8iD8á4.$=<Pc>Fe,ZF4ii|ia8~2xlc5X#lF4|Ɉl޳PIBʸYsUjΘ`bk`UT@綨kHx2C2(PŌpx^; b N!wn496Yֆ>9(2ne*ﮀO<twgՐSf&.2%ٓ]{#5yl)"\_h?l=]Ԅ[̓{Q2L byY̨)LrHòm묮+zV~˯
+P;c0Ije[-:D0_?Iyp<Zuu6tf/ѯv'>
+a]U!1L]8ȻՋeB+mP>
+T:JLPL^Y/Kiz*YB^ +xEmDc@n#k\BhJRCX;CV5[ۭ!#HPU*\Ĺ>\h ]GaeLt唊7JK`݇ ]/V(fQ?J*=BލYm:PSJSMOY#qĴ*¦u)
endobj
2449 0 obj
-<< /BaseEncoding /WinAnsiEncoding /Differences [ 39 /quoteright 96 /quoteleft ] /Type /Encoding >>
-endobj
-2450 0 obj
<< /Filter /FlateDecode /Length 483 >>
stream
-x]n@{>@ݵq#H9,L\=3S"w;힞^_Z~w˺G|SnU:]N>ǰ/_rYoz޾.s؇Vsl?qڎYZƦչ|S>NYjs`gڒ%#jm`YYiS`e h=KN)ؠ}c`BRm$Fb -$FBfRnbnBHRPbPBդʉ &^#h4A8Q¿@"G.'# rAW3
-r9B\A
+x]n@{>@ݵq#H9,L\=3S"w;힞^_Z~w˺G|SnU:]N>ǰ/_rY{޾.s؇Vsl?qڎYZƦչ|S>NYjs`gڒ%#jm`YYiS`e h=KN)ؠ}c`BRm$Fb -$FBfRnbnBHRPbPBդʉ &^#h4A8Q¿@"G.'# rAW3
+r9B\A
endobj
-2451 0 obj
+2450 0 obj
<< /BaseEncoding /WinAnsiEncoding /Differences [ 27 /f_i 39 /quoteright 96 /quoteleft ] /Type /Encoding >>
endobj
+2451 0 obj
+<< /BaseEncoding /WinAnsiEncoding /Differences [ 39 /quoteright 96 /quoteleft ] /Type /Encoding >>
+endobj
2452 0 obj
<< /Count 11 /First 2453 0 R /Last 2467 0 R >>
endobj
@@ -20033,7 +20013,7 @@ endobj
<< /FT /Btn /Ff 65537 /Rect [ 0.960007 837.94 3.96001 840.94 ] /Subtype /Widget /T (pbs@ARFix@2) /Type /Annot >>
endobj
3 0 obj
-<< /Filter /FlateDecode /Length 5308 >>
+<< /Filter /FlateDecode /Length 5305 >>
stream
x\iuB}iվA
*]
@@ -20053,8 +20033,8 @@ a
ْY:v5nftONm sfGj
c(M|b1ʫBmj=9SZX;=xK<ɼ#t@IV~mC|fȤ(\XD_HSo{Wd|Џt!KMltB*0< R jvUk]`*+d_&܅Wg%1JE qiܳ=zmh8_P \'nz"2CI[d 5YFZ1FPEOo^Y$[PRj?}ZBh{byS= $SݘҤEpt҂vZSK{z/acxgid
o](n9,F G!'>Ά"2P<(lqoP]3\沭 }YJ둥7QoE?2Gz+j;{MwP,:Q]ˊT
-W
-W mA%'gQ˙TERNQQ5UZʛJɩL'SVybW>>Q#]ekci*Gh;3#4 ^E880WǤKq45)Ateeb=C_tU_¾i؟ϯvzk{%̎i1] rǶ9?MȞV+x w=t![CSF_
+W
+WDIR a0>'VƁC.rqmD&PkcXݲ!Ӿ~B1ҼÐB:Giۃ;[)wb&*BCd^u^1}7
endobj
4 0 obj
<< /Border [ 0 0 0 ] /C [ 1 0 0 ] /Dest (section.10) /H /I /Rect [ 457.284 705.184 468.6 716.143 ] /Subtype /Link /Type /Annot >>
@@ -20376,7 +20356,7 @@ endobj
<< /FT /Btn /Ff 65537 /Rect [ 0.960007 837.94 3.96001 840.94 ] /Subtype /Widget /T (pbs@ARFix@9) /Type /Annot >>
endobj
64 0 obj
-<< /Filter /FlateDecode /Length 5845 >>
+<< /Filter /FlateDecode /Length 5846 >>
stream
x]kGq>Eo1~A&Rl
"8 2Hlvk;bc =U}g.g!wKwuuSOUffW>5O~qW*WW^uNj돞V_aWW k۫sg^_O'w\|[/~Y.^\Y7Lÿz+
@@ -20409,8 +20389,7 @@ J@Ga:͓8&!>|w58vvt7޷O{ϴ-#lj_.rt zi2RY
`mZyǤ1?GN-z%tBX@$LSc`7fm:3qc"֒-"chh4Cǩ/c) H2UEgv%{ Jxfu)@Ĺ5KC&y=EFY]Tb? 3; NjlJWZOi煶N3xnӭ\˪4<M{HscnѕTY\SLwxE
r6:ʣr =؈p|*_v=z a?vHRGCm#&xiGL劵_U7*RiF/>n%Y;rF*)x|
=Bܩ0kj;uUj A#ךmB`9iffY>9u,]7JXNkqN-)
-*@@,ߵ#3(QD>bn\frM-mW_0;yp>@ 4"t<B"iO;uՎڦf9c4|Z1h˘ႜªPku(8Ҿ-(v $ 'b/G$6
-'fQ ɥPlPD'7V#0i>ˡ/
+*@@,ߵ#3(QD>bn\frM-mW_0;yp>@ 4"t<B"iO;uՎڦf9c4|Z1h˘ႜªPku(8Ҿ-(v $ 'b/G$6
endobj
65 0 obj
<< /Border [ 0 0 0 ] /C [ 1 0 0 ] /Dest (section.7) /H /I /Rect [ 145.524 352.384 152.196 360.616 ] /Subtype /Link /Type /Annot >>
@@ -20970,24 +20949,20 @@ endobj
<< /FT /Btn /Ff 65537 /Rect [ 0.960007 837.94 3.96001 840.94 ] /Subtype /Widget /T (pbs@ARFix@21) /Type /Annot >>
endobj
184 0 obj
-<< /Filter /FlateDecode /Length 3865 >>
-stream
-x[[$ 3ӮEplWFNUuשݵ!Ss?l+_|s7p[wno~z;So_lͳLko˟[g4Cnrf{&o,ʇ!5qj{vF Tz`W{fhPN୳gmҚAAAg_RDh)z jw2 k3Wu||T˽Ƒ0s&A i4&d&gхH0J8e0%BYa6wB V;Ā4Ċ,7hC ERi"f<KJWB(V ~ڟ?KGGms,^k `|X3 Zs|w_ؗBiQY1q=iXRvnϘUgɐJ_Ca e:˃qQ>b@){?˸#tukz 犱`_*ɨ:7H2dl*;NR۝;ໜS@zaA}Y*Q:3D54 G(8He#ܞGE0vq
-0)H "Ern4m۶08x
- V-rc aM$MD]ߋ=DÆҕ]=EPuJ9{PRqwH-b8B9
-lBzM fiw+*-įl~/gYn يY(6͂<|⟃%v,2ƻleTBXR`.xr ?3>@I&W0 dOcߴ 1=f%+6M5d'-ݧd`:(X2Ҵ)1.{O/zws7WmC*
-@WkE)Sp='ZDGnsxʓU/K]ԅIFLJd8
-癝jnfNmXq⌁:J\> Wv/bPa= sAa 2Q F3$!+ʭ6 %*Dy![(з7\Gk^e <d͔l+K/BQ;4F
-C$ kժxRC\1blT)5M(c[9(a=V#q*k
-t[]yZ.cɮ
- Q r$sZƗ'^`o@S _sՈ sʢ,j.fv<`քC"@m
-kʓ`b'IyԖ(~5N`.\WT%=KF[-Z,Y)3gn
-2,jQ?c hK9.eYeYMq}i-=m+ĕ/U䱈B
-֘T%bjBZ)Jb(HӘX
-s𿮘(z|ِ[b^qRSP赪XZ" n
-W X/E_E)x.CeZ_iTI.bIQZ'e'+97+Oj`YdLU<Tm"z 5CdhӦ4t\wny-~y_& *UYy7x+8,&}
-Oy$yloG^v
-OoǬMգ_z|8DOvއ<KrH8ގ/)INiPӠ~D25y{Dv1+Fo]}wx<_<8)uOTӺ_~'ۃ&4~ÚXj)Qendstream
+<< /Filter /FlateDecode /Length 3866 >>
+stream
+x[Y$ 3@[R`6|d<AbK-D;@{"b7{fw%! x[6Y,~uW?ۊAnW>w6>)e?ol# !qN9z7[֚8mF Tz`W{fhPN୳ƶmҚAAA_RDh)z jw2 k3Wur|T˽Ƒ0s&A i4&d&gхH0J8e0o%BYa6wB V;Ā4Ċ,7hC ER/i"f<KJWB(V ~ڟ?KGG]l>X&֌<=f>6 ҢL6che 08){:Ұp}$1!,x!/ k *u}D/ R~qGZvǟ-+Ƃ}$nzxNh
+#ɨQ:IAF"nwArN}eD=QN8BA*3@I<*AUI@Jh8)sX7hhe$޶]WXjCFmk"!6o"G^!6tpI&/bSكj펻;gFh[36
+B8`ƒ " N^R~ K' . $]^9WIK}kE,9࿢GiQ]1[0ǷKah)LO'M]hv&(Vebkb0SO#^QIWl!~|56fU{I?bϔuVeB9m<.d $0e+Š*
+&*;*tw7N#3_%B'tWvwOLW׻XVg mW.A2J8㭢K$\t9FJo\ ( #ݕ6LFj< KIr %lWӉpCv D#ASG/!jͷQ z`9g/i/ȀC1Hf 2HppcUhk@-EB$S!{^Ɇh=7M$tPhct:PGN1ݱAq߳l$wA3DHpoF=:Vˬ䒮`03-xVE0̳P3 > `^QuorcLmb1`ađtJJDx$vA
+0s Ъ Fg\aj(@1e*\`mrOysKp|P8HIlg֮ %퇗u%x +Rk81h)|%fVVxYv_<o 禿n=)xl(^۹F6I
+ J
+k7) گEjDU9DeQ5q d`Q3;{|0k!6qu
+,;g@̽^oLyRK %<Y=ǟ P&ݏT5\祾6tRН+$+)+NI͋\m&*1LF !geiORv~ 4 , 2g>lpabʗ*X`!CkLfa5M! %q1rliLr!i(=9zZ_T1yYG?w*h5&O裓LU9ʧ,R8]ʓ9Oi!z.-(1L_b.I"c+(->QS?ÑycYbJߨ{ezNN$/A=u1y۲Łf)ejcޕ|97|)6șh *ORNNI=K2!rbCC2>z.V.n2/S\oNL)+v )>c6g&T#*.A"K}<.d}[~nNy~pQ!wZ-K)JiAxmyAˊH֗y WY(#4%{$k\IIm·:po'7?/5!
+kٮYN[XIIjTkGӝ:Zb
+CB<J tĉ\s6BEvq7AnŘdodM\ii#̾<Qʧ\[g9絗T^^K% ;C
+6t2 aCڑ|aKv~ͯ ׺Yk\i]FO[ڸ&i{d@ӉH3&^>R *.S$IY|A xz2+)܏[վ㎍ݦ$)楁#EL? n} R)|-cu2nY.)I2\3k'ɼVsAY;^
+9I_S}:IGw[>W?]BAF7c֦=~Z';CZ9eioǗ$NS4iR?n"pKG=D";CNۘHþ;< ^.ffQez{*L@i] /?}AY?aM,f?mendstream
endobj
185 0 obj
<< /AA << /PC << /JS 1661 0 R /S /JavaScript >> /PI << /JS 1661 0 R /S /JavaScript >> /PO << /JS 1660 0 R /S /JavaScript >> /PV << /JS 1660 0 R /S /JavaScript >> >> /F 2 /Rect [ 174.6 583.18 178.92 587.38 ] /Subtype /Screen /Type /Annot >>
@@ -22534,7 +22509,7 @@ endobj
<< /Activation << /Condition /PO /Presentation << /PassContextClick false /Style /Embedded /Transparent true >> >> /Deactivation << /Condition /PC >> >>
endobj
226 0 obj
-<< /AP << /N 217 0 R >> /BS << /S /S /W 0 >> /Contents (media embedded by media9 [1.02\(2019/07/11\)]) /F 4 /NM (click) /Rect [ 172.08 165.34 176.4 169.66 ] /RichMediaContent 224 0 R /RichMediaSettings 225 0 R /Subtype /RichMedia /Type /Annot >>
+<< /AP << /N 217 0 R >> /BS << /S /S /W 0 >> /Contents (media embedded by media9 [1.04\(2019/11/04\)]) /F 4 /NM (click) /Rect [ 172.08 165.34 176.4 169.66 ] /RichMediaContent 224 0 R /RichMediaSettings 225 0 R /Subtype /RichMedia /Type /Annot >>
endobj
227 0 obj
<< /AA << /PC << /JS 2348 0 R /S /JavaScript >> /PI << /JS 2348 0 R /S /JavaScript >> /PO << /JS 2347 0 R /S /JavaScript >> /PV << /JS 2347 0 R /S /JavaScript >> >> /F 2 /Rect [ 176.4 165.34 180.6 169.66 ] /Subtype /Screen /Type /Annot >>
@@ -22584,34 +22559,29 @@ endobj
<< /FT /Btn /Ff 65537 /Rect [ 0.960007 837.94 3.96001 840.94 ] /Subtype /Widget /T (pbs@ARFix@26) /Type /Annot >>
endobj
240 0 obj
-<< /Filter /FlateDecode /Length 4447 >>
-stream
-x\Y\}B^%LsѾ$Ol
- Ig8){NKW+ؘr*s}}tKowb;Ayx_yc{wW)?bwJww޾7I3iWydLa煝?txГ^!N x2
-{F`&);x54^pTSA}\Z7Eir?<<)kOG=ĈҀa")vPxZ1?$yPr0!3Ťt JN^ƸyFy8IY4
-0̪Fֺ1%\Y
-LwN @ `I +4 uJy`E{Ĺb>3HQy"-%{I1+R]Oʲp J
-8=9f0HϾ<1 eVGۨ$ 0[a3,Hd9 1I =7rdqg"1iB`Bo/ 
-aȎ_8J2YF0܀ -
-t*1%|l" Q z^e}s9:ҜΙFBjG2
-hR6'BIP5FsQܽ2}7{]AMD=?AO/! /#_6r#, !T28;vrAtW3]\2bW/N@M_n}މFc5'j/{2Ê~ӥ -/HI4!u1 ֨̎RK,^{|;?,pti1Ji(TOI:ȸ)~Le.H?b(A-+a )f\-'SJ kEG C}>( !
-?hL&=7ӠX} @v Ҽ){ փM*(*_:CϨ6Hd϶PJ+i
-w_݆R&b
-Ĕ(,2DXRb@VkA|Seʳ
-Kg$%j3ed#
-+Qx&{rG*z/ˏkeiYbǶT29>y y·a2Vx)s7gظqTMX7trۄmm|Bٝ wwmQ5:+5loeXmf +pkMҀXI^`]njT,"qHY"9 M6րkiKb`I7X1_<-)CDˣy,RGKP1%DYϲkN;*<Q
-+N.jIn(cEݥ-AYgBfwm osF6QzR]")tH@땉 +Gs*eq_ \5.05DsKU lfH҄؛v"X!QRC ZMx!2mrU*ĴJ[ & A0y9gbʸ!=/ &ݠu*Oa^TVvi3b+䩛 ^^㣒M >6Y\tJi+(<x~Xj.HP޹-r8䡅 zLQ8 1p jLp~F׿щ(m$'[W:e{Y';խ{]%% z)5
-ȁA(r%6 m"h(V\v UhvNkAAzwK7
-Sl
-mNoߠ3lE"Iie.٤$]D  Ŷ6
-͓.iS i+G[CܠyaD`ux+W!˭'Hz:#ߏD1oIV'_ +5ĩ4Sofy/!Fƶ"ႠW3u3pU(cVZs<sJ&02.J#7umblex Ǹ-P|y,ۦ 1F^mR!KcFw46Uyt$Գjh 13G[$m\ m򭏒/ƛlgwk&b,q%gɛ֖+Y-WjAVtAA4A؎0;)s7H+&S[ BikTC
-
-3,!jQ\tehW47OrŴ~Hlc-PCM]7DlT^2Sj[AtΖ^!qAO<;j@%>Ʒժ3Kk
-Orm!e:X>$ҧxToYn~ѽ̅曧ԛX>9Б'i)륂ݢ1!N7M Mbc}fLg݇Md~e[5e4םz,p/M@W~jZB4ĥ޿vurȼl[i-]yh9UM3ɬpob$lƯUǤ*.W?ɞj Ԗ?}u ffyP>a.7RH >hG.\'Q}ٸX7r\{eݢ ƽ"UF"W/U`
-=V 4VOf_2~\7T7g#`ZφfU3J!9UzOطGV%g
-8\~y u2pczi5C؈ F
-|=}w!
-[Xi=66KjlϺwF>jo\5jS1Y|6 3rVd<-xPʊM'ۤ%"ZZJ3[Jkk5γw2aV:-VYچ+hxUѪ;5J9U۟\k_G@x"y /h`n8h~GWzE.endstream
+<< /Filter /FlateDecode /Length 4490 >>
+stream
+x\[}B^%nFw)y[A!
+Qww\ᏫW"~` aNIi+w7J#z;7Op !L5)_l!OZo8tsГքQOx~nj't8)8/..0\Zod #n9m͢CԷi@?;Hi|P?Dy<ƟPb0&3Iaw6pp44R
+X,\z8{?>Uz2cz/&`]ۿu CI{n
+t3N?^Dܦotia/ܭwGve ͪńTɸ!Ht%ǶOhz47>A%Tzq I5z}hs=Y
+,]aeve%]{vF`w>NT׳bD1go91yY:.yKgߴPd
+XE!( @Q:j?g\D7|i#5o3@G$G<vZ;* Zta
+X5Y&0UHϾ<1yg96Tv@! Q1%aIaXyr٭g(4.,HD9 1I3fBbt^ W!ŞĨ $
+$99~(lHdRs6
+MǤ"S篙Qu'I4R<AQ0F\X&V>&`NFy&Hs)ǔ@$qG{ZD5+"FH5$t$5U;*HDCa?J1S=%@ָM9mBl"爆qjrn ix9M܂IMJ"Hs Iѹ_dt+^b393,Ձp 'VI^$ve20-,فW3\ 9i+݄h$ XjWlL&RR/J$(س= Y,{JAƝH53ɗd"IfZmQ K/(nޣQL5[7)mY!EI)&LI },#/*=P\4BFߔ^(1]&le7}y'c v(r+Pя3?TPTPt`QA-\mW5-IMeR)4Xe8/ $ŀ-R4"(ʔ
+4CJ<&N:A32łOAi{|N=VRqKyJD{$MGE?/c[2
+RcT!9Idlo$4XɉŁ%N
+ hL)4k ߈qa<Vd8S-'zBȮ8} F\(WN( ?OFxKØ"%B©%*UmN5=6uQUL\2 x٥I;#誥RC ~
+G^k $jgqx,z&`H~t 3Ǘ2ΣX{ZQFς ;M^FL ;PdjRSIЙxut
+jLp~fֿF'"hM^# ²N8n)[ϗKjg-KvARjȁA)r!6 m"(("Pfкׂ*n=n' > &
++xHA]
+3lE"I)/Ĕ]D/% ` ŶVR
+rb  x5@a%$UA; LI\t]V-o<`]km\&ڭ4fStaT䝺VۚZ%[:ᆨn<%<sVb>j988*9Bx~ZIO޼{ _כ7X>9Б' I'#}eLE
+pxQx-` $]d0ʽAےY>lzW^g3~5GUq"%xq'J,3}t=)}_:a5 1 c ވ8p#,7Z(Zu6Hˇ0iC
+ l4G~hrwһl
+H\X*@>`o)Of=Xg;BtV'$|ک2p^)qFm9WϭVEgߕslqUt4 %K,1b4GMT#k"
+پ'F[滐-yrpt!46KrjlϺw:0j Vj͵[cVg-TP9-V[WVaם n|լ^hBo-+]%mcqvXYpXWhW(U}2*#e~:xY+xQX`˾R7EE>/bI0endstream
endobj
241 0 obj
<< /Border [ 0 0 0 ] /C [ 0 1 0 ] /Dest (cite.dvisvgm) /H /I /Rect [ 322.884 683.104 329.556 691.216 ] /Subtype /Link /Type /Annot >>
@@ -22731,33 +22701,29 @@ endobj
<< /FT /Btn /Ff 65537 /Rect [ 0.960007 837.94 3.96001 840.94 ] /Subtype /Widget /T (pbs@ARFix@29) /Type /Annot >>
endobj
262 0 obj
-<< /Filter /FlateDecode /Length 5779 >>
-stream
-x]ٮGr}~2` v1EahXc 3ù 3)2ɦtI?q?;"Ȭi{ AR:׈', ы>G)=yu9L}xo]Sο=-˝qf煛e؝8bZN3\F1;?=zf/gus 3 f/az?(+fjof넉pSAh,gOfSS!4SSyjΚ~9o/n{TMGs,6wLd,ڶŬ&L,D! fz!9=dfz B=(ˬvx׸ك(1*=W3*zR4b6c8 tmtcoC|Mл?/wsB)M=- Xكf61OR'D~^/9z)^ EbY۸;sl PHk|nf-av5K'|;4o_3YTzi/rbL!y!srGF8hFn,`NE%Z"la
-oӘty3)Rl4 LhXC\C CB @jl\vFp2y13/Jcԑ18jF@KqpNnQK, AeSa$Y\2j@ݖ r\8l8􀿁e
-E6юg0 ;FV :)`cq |r ,Պ>
-eVi,Yozt'uRP4]C6XB CBQ:};Sю3^ _fTщ_v <MR*Y-g4r (g
-4ZH"cNƠO:g+M{x4F`zPD_F~0_ZڱHP=j!rEq"xyc11c^mp:U2sTxh:e"̇j@FJD8+:Fa4(h[= ūy0+; u;w}hXv -tUeT|m(x-MD̐uhɾ#Nނi%k25j0eiJ*4)WM 9Pąp9=s&Los0&+iJDCB$\(=k_gprn+rdaQ"u=#m[Iv4B?|"c~U"#0JcPKPK@-<εfeJ*z 3(%$H7B WUKX8:=42MS8lE
-"룚lΊKdʉ,L@{q
-׻.93 rנ
-|%e|
-u-YH1YF:rNAtRQhH̫3Nf)*j|iZR2!Z0@M@ht_q- QMN-| !'o R(ajпA?ɼS#$X0&ӚzЫk6'M,"
-
-XQp G.Pz;ɑ#J&{+?lQ$ NOBg-p=*ᤍp}$(1CfB#MjZOLrwJ [#RqÇroEKDu0 ;#5pFoR
-6o+~NY:j>74r5/p@sn9qlD<V\[PZ))#(L -(^¹)0
-oa6~5.@[pMW).eV |qQۖg`)q4}ҖhʘUX݈4vLWLf<qhF\\԰ٷ ^"RG
-ޔE-7Apwvst_ }46'I>YKLUXQ@;f?nCrR݀J
-co
-MR"Z2a\D-F$1x=p{ЃHb[7;
-1"5Ω= S̾I3rK꺯-Ë^[*Y8DNJk6}d\.=i@h~``cN8%oơMb š@\< 7JNe@qr6܊P5i_=VT+NP)wIT[f+ ¼c[y(kf%A.Z"[>0r})hWئۦ3S/szeu+ᷭd}ARROFUcgS2jZ1&>B^cۀA8u#K **SĘu]Cy-*ׯSY3,ٔ⟒4FE
-k43}-jA 㘋#9FUGxƝ [T4H4RktRӪ:+[ܲ[u`/Vd%[]ϻ$EZ']gr:I-*{E1.r*d5pyMp*6AC8 Pj$=NʗR7z\S'܃DUe؉8,IXZ
- q5!
-j4Ec2X>;b QbK\%}(Er"e4_FjK8,NIB:qJP8P1?t9_PC%0xX !i83te-&~֟
-=.Q?Z
-Yol~M0Vq$w,߰)QW 9%U{PJ<lYVQDؗzJ݇&-Vȁ:7ȅ=CMFg:W)RV|Vf5;rm
-.n5H -Wk1
-9<Pv2IHyF<&ky +2fև ".I!2
-26m_LC
+<< /Filter /FlateDecode /Length 5766 >>
+stream
+x]ٮGr}~207W c%s=@f$R"eM?~vD.UYwcbUu'N,Ya'I{>G=~y9L>߽o]kowߞN$酊gOn"8g$2I`0BKg^ c"EUYx Eɚ8B4[ἴ njuHkH 鍳ޗ=|7VMMygY~{qu~g7#މ 'X&c`2][,BmK 6N2XH;=AАNx^PT4oq4~z Z/:|!0a~ z)P7B*?;H\0G0q
+GOrSݯ]~C<-=+ w0`eD
+[Pr%#­.MW+!o eTRKF'`-ʼ
+b`i*i; $eׂpk@Z;R+ڮݲ7FfVz:ڈP'. b$J2xPlSQ#,nOߑ?.G?Ϟ0/]>wwGTOȶ+l]Ml/H3igD-$Jpm /oLq< JݴAi6f&4!!|YHcT1#FE =QX'C1 ~,*,Ji LRX
+e'D<ϓFme+ç;;خMWCjb136C|/ @ rrav?n~7d@_T޵Y*eD%8=ɺԁ̦BAW-y ׿VoJ ydxF
+ӡͿ@3Ts`,>$fZs
+FnX 4Xύ\GA;"8 !)c׳1|)CԮю!(L7)4s ) o/Vbxwzsq y<,_ѻLgݕӆ m:{ͿM#ID+5w.G+z
+5PE2k&k/TQmi09 7s %Nq8#@`*3N|_I]u|2էu.%,_(C?P֏ l #;g6iH1zJc @|~XcE\X`I!K>^K1lhW2Vs2@|v֡w#9`if7'x(FmCWI~|ii:#Aa#?M^uK``9,u,mƸe Xz}A.g>T0X#ędX m] 4
+sEEM
+y 뎁]c %ђPɗ6}0 וp߻}[1bwWYYjJc|M^EC3oD6cnXI[65gq@ Ks`ř{F/-^iՕ[l4,H%<Å(
+)kK]5iCMcG.2W%b0 e P=
+׻Er ig|A 2Z%W)u/?3d! cd"$
+H=XʅJ 4
+wրGjK9 R0BI)IV1aN t t|n^ij.7m0$5Jtꭸ~gX'$wm9SVFP_;P=ss`v
+ $<D9F@v`;Aמ&-j>°x~nV/6BNM< ouGh+%s *wt:)p\fwkyf|ez!}桎i [eڍqu9mWjDŽy)āo\/jSV=ln|E }@ aYDY4\ٻ7;+1H[8pnkf#)R'];wţ+
+hu-{uI[P `@+
+
+[Abq>PKlpLbRYX9c>cݕX\HyorvH<`y)+䥘ˢZԢH!҉*۴5Z~x8X! :X9Zծ; [?x5}~i{?8K8
+[#v(F_?ҫ;Y[N1ݽ?߽}xnmo޷)wKzZ]!e"LirR]8:5?E~ߡz#P/{jpO鱳JlG}1l%׭j]Y(cbCN.?]6p8)S[;9+dNFv'^wO;ڱ}VZthw94~c iA,*HW  V+d(0<X%C\]”! ]L"KQBakHF*7p)))R'Nj= afN+?\'t e
+/
+ѥm~SZi:mp*JhhDYBHw oWq_pf|sQlI6?Kx,C5+Mx.Ḵ1ZZz#cT57f>\<ե}!ܫ!LRcSH;?;^a~^?r ߓ`dЃ%k&tcU{w?tæA^'T[H``5+6o*Nt^K=s cc
endobj
263 0 obj
<< /Border [ 0 0 0 ] /C [ 1 0 0 ] /Dest (Item.2) /H /I /Rect [ 223.884 705.184 230.436 713.296 ] /Subtype /Link /Type /Annot >>
@@ -22916,26 +22882,18 @@ endobj
<< /R31 722 0 R /R58 742 0 R /R75 2444 0 R >>
endobj
314 0 obj
-<< /BaseFont /GUMVVJ+LibertinusT1Math /Encoding 321 0 R /FirstChar 42 /FontDescriptor 315 0 R /LastChar 167 /Subtype /Type1 /ToUnicode 320 0 R /Type /Font /Widths [ 550 0 0 0 310 310 465 465 465 465 465 465 0 0 465 465 220 0 0 550 0 0 0 0 0 0 0 1130 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 323 0 0 0 0 506 401 0 0 0 0 0 0 0 0 518 0 0 0 0 0 0 0 0 0 550 503 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 749 ] >>
+<< /BaseFont /OFCWSR+LibertinusT1Math /Encoding 321 0 R /FirstChar 42 /FontDescriptor 315 0 R /LastChar 167 /Subtype /Type1 /ToUnicode 320 0 R /Type /Font /Widths [ 550 0 0 0 310 310 465 465 465 465 465 465 0 0 465 465 220 0 0 550 0 0 0 0 0 0 0 1130 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 323 0 0 0 0 506 401 0 0 0 0 0 0 0 0 518 0 0 0 0 0 0 0 0 0 550 503 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 749 ] >>
endobj
315 0 obj
-<< /Ascent 708 /CapHeight 708 /CharSet (/arrowright/d/eight/ellipsis/equal/five/four/greaterequal/minus/nine/one/parenleft/parenright/period/slash/three/two/u1D452/u1D45B/u1D466/zero) /Descent -234 /Flags 4 /FontBBox [ 0 -234 1072 708 ] /FontFile3 318 0 R /FontName /GUMVVJ+LibertinusT1Math /ItalicAngle 0 /MissingWidth 500 /StemV 160 /Type /FontDescriptor >>
+<< /Ascent 708 /CapHeight 708 /CharSet (/arrowright/d/eight/ellipsis/equal/five/four/greaterequal/minus/nine/one/parenleft/parenright/period/slash/three/two/u1D452/u1D45B/u1D466/zero) /Descent -234 /Flags 4 /FontBBox [ 0 -234 1072 708 ] /FontFile3 319 0 R /FontName /OFCWSR+LibertinusT1Math /ItalicAngle 0 /MissingWidth 500 /StemV 160 /Type /FontDescriptor >>
endobj
316 0 obj
<< /BaseFont /GGXUTQ+LOGO10 /Encoding /WinAnsiEncoding /FirstChar 65 /FontDescriptor 317 0 R /LastChar 84 /Subtype /Type1 /Type /Font /Widths [ 667 0 0 0 622 0 0 0 0 0 0 0 800 0 667 622 0 0 622 578 ] >>
endobj
317 0 obj
-<< /Ascent 611 /CapHeight 611 /CharSet (/A/E/M/O/P/S/T) /Descent -11 /Flags 65568 /FontBBox [ 0 -11 722 611 ] /FontFile3 319 0 R /FontName /GGXUTQ+LOGO10 /ItalicAngle 0 /MissingWidth 333 /StemV 108 /Type /FontDescriptor >>
+<< /Ascent 611 /CapHeight 611 /CharSet (/A/E/M/O/P/S/T) /Descent -11 /Flags 65568 /FontBBox [ 0 -11 722 611 ] /FontFile3 318 0 R /FontName /GGXUTQ+LOGO10 /ItalicAngle 0 /MissingWidth 333 /StemV 108 /Type /FontDescriptor >>
endobj
318 0 obj
-<< /Filter /FlateDecode /Subtype /Type1C /Length 2286 >>
-stream
-xmV PSW@rQ*
-A'վ(PYtUZD  $$ AGCy)k`J[mԵݙCwNgs=sG4h"FJW$g ~5:=~θ[Jsq@Gg{
-Ki?17ų9uǝF!5:edNt~9zz[/<x.as X9RUoS5sUq0pC;bnsH[O/)}@+c۷c?X%G?_v_j9ۓmMOl:'yēHBMu2MڕLffvϔc Gz]wx|F$9Fg|[S<)fʒ^[4|#-]0f(AxFu+-V`0jޔCCܷzL} ]qi~kzWyPƃ)t!|86N.o)Wh8&UVgb~ E<hu9vI{
-XNCQh"  @v0s19Ram_l|/z.#1 Er"R 5Gg8tq 1g3=;/ZIDs`b }Ct}abҁ[P#~FsG&0+ְ:tB(֢u
-endobj
-319 0 obj
<< /Filter /FlateDecode /Subtype /Type1C /Length 884 >>
stream
x]R]LU3ӊ[1Nj4iŦ"m@l,ԥ(/G ukRPƂ@ Dmb/C_<8C`<ܓ}9ߡP Q%sy"[Lds ~͐xT Q7oO#ENً\;Gfn}^Z^^d_[wk1BL#GzQ *Eo7kByȃ-jilZru_<ax
@@ -22943,11 +22901,24 @@ o"f,9~d*IXq ٤0B+y$j~z}h쀲`^68xftr& wΌ5
.dN,"@lw՘B$%'t0 *{}VUr,}Xsw,[`׹.aXorCڕ>wVz33}ǁMzHӽlwrC= ->v뿖&&y)in61Ifc 6uYIjw~جp.!:Km ~y+ KuPv+]'|IoR3]Tj8_,Jj Ӓ~{ζ{ G: >L;'Ii`
d1!jpYD<%&*
endobj
+319 0 obj
+<< /Filter /FlateDecode /Subtype /Type1C /Length 2284 >>
+stream
+xmU PSg@rQ*
+A'վ(PYtUZD  $$ AGCy)k`J[mԵݙ'ݽәgߝs~G4h,NȔfe }563q.³,Y?:|yui[n!%iYVQ۴%M%$fZLتаDYL. LKI e^h\ޚm)Xpb4%xwbB. %9
+EA~B)UHӳbSB_|v͚9:}(6~!4է֮SS+JS)j+ZDSBj1RK\JDQbʇ:Iͧ D%bNzBL W5xzvx}4D-a=z|;LsC!,n$½ޭ7:|ox޳699d#ڽ6vOKY~fǬ籨'{7FTw
+ fF:^wPoia.jԢ+ ն z cb`ЖB8uX 0yr(Ro7 PG㍞eS3Nnn>}:955##ۜ Rþ 6O?Eyr疪ݞ~7} xx3BUԖ~r X^?kM.0!jt }%7,w%(`x';V\J{DIc  `4ndlzЋ*EVuZKLBV^U'~i3 @qh`l`z zl\w|)? {ֺN2p2'Z:?V<-s_N|< ][})ԪjCދy`K|Ý@gsAH[Ox/)~ +cۿ
+[YT,-SKf sۊ$ wi
+#.m
+eJ9MջW]m4CY},i7zJMDM,@cB^]5='/K*tBxmW `SA!Ts7q×܈tx*C|P=(}hp\ti9DY
+endobj
320 0 obj
<< /Filter /FlateDecode /Length 271 >>
stream
-x];n0 wB7DKdhQ"сȂ }I:d}<iLQE G d.t]R%lO5|? _yw:t}ӕxg(Gn_\UPF։kyeu:Q@UjTXVCQafBUs@ ш
-F֖Mq^3sf"
+x];n0 wB7~dТh{Eztҡ''x> 7+G .x]rcK؞&kҴ7_
+*iwn=
+k{WlZ!%h0Gf_\cRAk;&HgRG2ZJj@ 5R9Hkiڃ@ڳN rA \*25@okf~Zp(s܁sG
+a8׏ Xm׫1:«*<jżɨd<%4Z"_1endstream
endobj
321 0 obj
<< /BaseEncoding /WinAnsiEncoding /Differences [ 42 /minus 46 /parenleft /parenright 58 /period 69 /arrowright 95 /slash 101 /u1D452 110 /u1D45B 120 /greaterequal /u1D466 167 /ellipsis ] /Type /Encoding >>
@@ -22956,7 +22927,7 @@ endobj
<< /Count 30 /Kids [ 2397 0 R 1 0 R 11 0 R 21 0 R 29 0 R 42 0 R 48 0 R 56 0 R 62 0 R 72 0 R 78 0 R 88 0 R 102 0 R 116 0 R 126 0 R 136 0 R 142 0 R 152 0 R 164 0 R 172 0 R 182 0 R 196 0 R 204 0 R 214 0 R 232 0 R 238 0 R 246 0 R 252 0 R 260 0 R 296 0 R ] /Type /Pages >>
endobj
323 0 obj
-<< /Author (Alexander Grahn) /CreationDate (D:20190820141807+02'00') /Creator (LaTeX with hyperref) /Keywords (include portable PDF animation SVG animation animated PDF animated SVG dvisvgm html TeX4ht web animating embed animated graphics LaTeX pdfLaTeX LuaLaTeX PSTricks pgf TikZ LaTeX-picture MetaPost inline graphics vector graphics animated GIF LaTeX dvips ps2pdf dvipdfmx XeLaTeX JavaScript Acrobat Reader PDF-XChange Foxit Reader Firefox Chrome Chromium) /ModDate (D:20190820141807+02'00') /Producer (dvips + GPL Ghostscript 9.26) /Subject (Documentation) /Title (The animate Package) >>
+<< /Author (Alexander Grahn) /CreationDate (D:20191105133321+01'00') /Creator (LaTeX with hyperref) /Keywords (include portable PDF animation SVG animation animated PDF animated SVG dvisvgm html TeX4ht web animating embed animated graphics LaTeX pdfLaTeX LuaLaTeX PSTricks pgf TikZ LaTeX-picture MetaPost inline graphics vector graphics animated GIF LaTeX dvips ps2pdf dvipdfmx XeLaTeX JavaScript Acrobat Reader PDF-XChange Foxit Reader Firefox Chrome Chromium) /ModDate (D:20191105133321+01'00') /Producer (GPL Ghostscript 9.50) /Subject (Documentation) /Title (The animate Package) >>
endobj
324 0 obj
<< /Limits [ (Doc-Start) (table.4) ] /Names [ (Doc-Start) 326 0 R (Hfootnote.1) 338 0 R (Item.1) 698 0 R (Item.2) 699 0 R (Item.3) 700 0 R (Item.4) 701 0 R (Item.5) 703 0 R (Item.6) 704 0 R (Item.7) 705 0 R (Item.8) 706 0 R (beginend) 347 0 R (cite.chupin) 709 0 R (cite.dvisvgm) 710 0 R (cite.gilg05) 711 0 R (cite.hol) 712 0 R (cite.luque12) 713 0 R (cite.media9) 714 0 R (cite.texsx) 716 0 R (dest:mem) 697 0 R (figure.1) 428 0 R (figure.2) 444 0 R (figure.3) 516 0 R (figure.4) 527 0 R (figure.5) 610 0 R (lstlisting.-1) 360 0 R (lstlisting.-2) 370 0 R (lstlisting.-3) 389 0 R (lstlisting.-4) 429 0 R (lstlisting.-5) 475 0 R (lstlisting.-6) 518 0 R (lstlisting.-7) 585 0 R (lstlisting.-8) 661 0 R (lstlisting.-9) 689 0 R (lstnumber.-1.1) 361 0 R (lstnumber.-1.2) 362 0 R (lstnumber.-1.3) 363 0 R (lstnumber.-1.4) 364 0 R (lstnumber.-1.5) 365 0 R (lstnumber.-1.6) 366 0 R (lstnumber.-1.7) 367 0 R (lstnumber.-2.1) 371 0 R (lstnumber.-2.10) 380 0 R (lstnumber.-2.11) 381 0 R (lstnumber.-2.12) 382 0 R (lstnumber.-2.2) 372 0 R (lstnumber.-2.3) 373 0 R (lstnumber.-2.4) 374 0 R (lstnumber.-2.5) 375 0 R (lstnumber.-2.6) 376 0 R (lstnumber.-2.7) 377 0 R (lstnumber.-2.8) 378 0 R (lstnumber.-2.9) 379 0 R (lstnumber.-3.1) 390 0 R (lstnumber.-3.10) 399 0 R (lstnumber.-3.11) 400 0 R (lstnumber.-3.12) 401 0 R (lstnumber.-3.13) 402 0 R (lstnumber.-3.14) 403 0 R (lstnumber.-3.15) 404 0 R (lstnumber.-3.16) 405 0 R (lstnumber.-3.17) 406 0 R (lstnumber.-3.18) 407 0 R (lstnumber.-3.19) 408 0 R (lstnumber.-3.2) 391 0 R (lstnumber.-3.20) 409 0 R (lstnumber.-3.21) 410 0 R (lstnumber.-3.22) 411 0 R (lstnumber.-3.23) 412 0 R (lstnumber.-3.24) 413 0 R (lstnumber.-3.25) 414 0 R (lstnumber.-3.26) 415 0 R (lstnumber.-3.27) 416 0 R (lstnumber.-3.28) 417 0 R (lstnumber.-3.29) 418 0 R (lstnumber.-3.3) 392 0 R (lstnumber.-3.30) 419 0 R (lstnumber.-3.31) 420 0 R (lstnumber.-3.32) 421 0 R (lstnumber.-3.33) 422 0 R (lstnumber.-3.34) 423 0 R (lstnumber.-3.35) 424 0 R (lstnumber.-3.36) 425 0 R (lstnumber.-3.37) 426 0 R (lstnumber.-3.4) 393 0 R (lstnumber.-3.5) 394 0 R (lstnumber.-3.6) 395 0 R (lstnumber.-3.7) 396 0 R (lstnumber.-3.8) 397 0 R (lstnumber.-3.9) 398 0 R (lstnumber.-4.1) 430 0 R (lstnumber.-4.10) 439 0 R (lstnumber.-4.11) 440 0 R (lstnumber.-4.12) 441 0 R (lstnumber.-4.13) 442 0 R (lstnumber.-4.14) 445 0 R (lstnumber.-4.15) 446 0 R (lstnumber.-4.16) 447 0 R (lstnumber.-4.17) 448 0 R (lstnumber.-4.18) 449 0 R (lstnumber.-4.19) 450 0 R (lstnumber.-4.2) 431 0 R (lstnumber.-4.20) 451 0 R (lstnumber.-4.21) 452 0 R (lstnumber.-4.22) 453 0 R (lstnumber.-4.23) 454 0 R (lstnumber.-4.24) 455 0 R (lstnumber.-4.25) 456 0 R (lstnumber.-4.26) 457 0 R (lstnumber.-4.27) 458 0 R (lstnumber.-4.28) 459 0 R (lstnumber.-4.29) 460 0 R (lstnumber.-4.3) 432 0 R (lstnumber.-4.30) 461 0 R (lstnumber.-4.31) 462 0 R (lstnumber.-4.32) 463 0 R (lstnumber.-4.33) 464 0 R (lstnumber.-4.34) 465 0 R (lstnumber.-4.35) 466 0 R (lstnumber.-4.36) 467 0 R (lstnumber.-4.37) 469 0 R (lstnumber.-4.38) 470 0 R (lstnumber.-4.39) 471 0 R (lstnumber.-4.4) 433 0 R (lstnumber.-4.40) 472 0 R (lstnumber.-4.41) 473 0 R (lstnumber.-4.5) 434 0 R (lstnumber.-4.6) 435 0 R (lstnumber.-4.7) 436 0 R (lstnumber.-4.8) 437 0 R (lstnumber.-4.9) 438 0 R (lstnumber.-5.1) 476 0 R (lstnumber.-5.10) 485 0 R (lstnumber.-5.11) 486 0 R (lstnumber.-5.12) 487 0 R (lstnumber.-5.13) 488 0 R (lstnumber.-5.14) 489 0 R (lstnumber.-5.15) 490 0 R (lstnumber.-5.16) 491 0 R (lstnumber.-5.17) 492 0 R (lstnumber.-5.18) 493 0 R (lstnumber.-5.19) 494 0 R (lstnumber.-5.2) 477 0 R (lstnumber.-5.20) 495 0 R (lstnumber.-5.21) 496 0 R (lstnumber.-5.22) 497 0 R (lstnumber.-5.23) 498 0 R (lstnumber.-5.24) 499 0 R (lstnumber.-5.25) 500 0 R (lstnumber.-5.26) 501 0 R (lstnumber.-5.27) 502 0 R (lstnumber.-5.28) 503 0 R (lstnumber.-5.29) 504 0 R (lstnumber.-5.3) 478 0 R (lstnumber.-5.30) 505 0 R (lstnumber.-5.31) 506 0 R (lstnumber.-5.32) 507 0 R (lstnumber.-5.33) 508 0 R (lstnumber.-5.34) 509 0 R (lstnumber.-5.35) 510 0 R (lstnumber.-5.36) 511 0 R (lstnumber.-5.37) 512 0 R (lstnumber.-5.38) 513 0 R (lstnumber.-5.39) 514 0 R (lstnumber.-5.4) 479 0 R (lstnumber.-5.40) 517 0 R (lstnumber.-5.5) 480 0 R (lstnumber.-5.6) 481 0 R (lstnumber.-5.7) 482 0 R (lstnumber.-5.8) 483 0 R (lstnumber.-5.9) 484 0 R (lstnumber.-6.1) 519 0 R (lstnumber.-6.10) 530 0 R (lstnumber.-6.11) 531 0 R (lstnumber.-6.12) 532 0 R (lstnumber.-6.13) 533 0 R (lstnumber.-6.14) 534 0 R (lstnumber.-6.15) 535 0 R (lstnumber.-6.16) 536 0 R (lstnumber.-6.17) 537 0 R (lstnumber.-6.18) 538 0 R (lstnumber.-6.19) 539 0 R (lstnumber.-6.2) 520 0 R (lstnumber.-6.20) 540 0 R (lstnumber.-6.21) 541 0 R (lstnumber.-6.22) 542 0 R (lstnumber.-6.23) 543 0 R (lstnumber.-6.24) 544 0 R (lstnumber.-6.25) 545 0 R (lstnumber.-6.26) 547 0 R (lstnumber.-6.27) 548 0 R (lstnumber.-6.28) 549 0 R (lstnumber.-6.29) 550 0 R (lstnumber.-6.3) 521 0 R (lstnumber.-6.30) 551 0 R (lstnumber.-6.31) 552 0 R (lstnumber.-6.32) 553 0 R (lstnumber.-6.33) 554 0 R (lstnumber.-6.34) 555 0 R (lstnumber.-6.35) 556 0 R (lstnumber.-6.36) 557 0 R (lstnumber.-6.37) 558 0 R (lstnumber.-6.38) 559 0 R (lstnumber.-6.39) 560 0 R (lstnumber.-6.4) 522 0 R (lstnumber.-6.40) 561 0 R (lstnumber.-6.41) 562 0 R (lstnumber.-6.42) 563 0 R (lstnumber.-6.43) 564 0 R (lstnumber.-6.44) 565 0 R (lstnumber.-6.45) 566 0 R (lstnumber.-6.46) 567 0 R (lstnumber.-6.47) 568 0 R (lstnumber.-6.48) 569 0 R (lstnumber.-6.49) 570 0 R (lstnumber.-6.5) 523 0 R (lstnumber.-6.50) 571 0 R (lstnumber.-6.51) 572 0 R (lstnumber.-6.52) 573 0 R (lstnumber.-6.53) 574 0 R (lstnumber.-6.54) 575 0 R (lstnumber.-6.55) 576 0 R (lstnumber.-6.56) 577 0 R (lstnumber.-6.57) 578 0 R (lstnumber.-6.58) 579 0 R (lstnumber.-6.59) 580 0 R (lstnumber.-6.6) 524 0 R (lstnumber.-6.60) 581 0 R (lstnumber.-6.61) 582 0 R (lstnumber.-6.62) 583 0 R (lstnumber.-6.63) 584 0 R (lstnumber.-6.7) 525 0 R (lstnumber.-6.8) 528 0 R (lstnumber.-6.9) 529 0 R (lstnumber.-7.1) 586 0 R (lstnumber.-7.10) 596 0 R (lstnumber.-7.11) 597 0 R (lstnumber.-7.12) 598 0 R (lstnumber.-7.13) 599 0 R (lstnumber.-7.14) 600 0 R (lstnumber.-7.15) 601 0 R (lstnumber.-7.16) 602 0 R (lstnumber.-7.17) 603 0 R (lstnumber.-7.18) 604 0 R (lstnumber.-7.19) 605 0 R (lstnumber.-7.2) 588 0 R (lstnumber.-7.20) 606 0 R (lstnumber.-7.21) 607 0 R (lstnumber.-7.22) 608 0 R (lstnumber.-7.23) 609 0 R (lstnumber.-7.24) 612 0 R (lstnumber.-7.25) 613 0 R (lstnumber.-7.26) 614 0 R (lstnumber.-7.27) 615 0 R (lstnumber.-7.28) 616 0 R (lstnumber.-7.29) 617 0 R (lstnumber.-7.3) 589 0 R (lstnumber.-7.30) 618 0 R (lstnumber.-7.31) 619 0 R (lstnumber.-7.32) 620 0 R (lstnumber.-7.33) 621 0 R (lstnumber.-7.34) 622 0 R (lstnumber.-7.35) 623 0 R (lstnumber.-7.36) 624 0 R (lstnumber.-7.37) 625 0 R (lstnumber.-7.38) 626 0 R (lstnumber.-7.39) 627 0 R (lstnumber.-7.4) 590 0 R (lstnumber.-7.40) 628 0 R (lstnumber.-7.41) 629 0 R (lstnumber.-7.42) 630 0 R (lstnumber.-7.43) 631 0 R (lstnumber.-7.44) 632 0 R (lstnumber.-7.45) 633 0 R (lstnumber.-7.46) 634 0 R (lstnumber.-7.47) 635 0 R (lstnumber.-7.48) 636 0 R (lstnumber.-7.49) 637 0 R (lstnumber.-7.5) 591 0 R (lstnumber.-7.50) 638 0 R (lstnumber.-7.51) 639 0 R (lstnumber.-7.52) 640 0 R (lstnumber.-7.53) 641 0 R (lstnumber.-7.54) 642 0 R (lstnumber.-7.55) 643 0 R (lstnumber.-7.56) 644 0 R (lstnumber.-7.57) 645 0 R (lstnumber.-7.58) 646 0 R (lstnumber.-7.59) 647 0 R (lstnumber.-7.6) 592 0 R (lstnumber.-7.60) 648 0 R (lstnumber.-7.61) 649 0 R (lstnumber.-7.62) 650 0 R (lstnumber.-7.63) 651 0 R (lstnumber.-7.64) 652 0 R (lstnumber.-7.65) 653 0 R (lstnumber.-7.66) 654 0 R (lstnumber.-7.67) 655 0 R (lstnumber.-7.68) 656 0 R (lstnumber.-7.69) 657 0 R (lstnumber.-7.7) 593 0 R (lstnumber.-7.70) 658 0 R (lstnumber.-7.8) 594 0 R (lstnumber.-7.9) 595 0 R (lstnumber.-8.1) 662 0 R (lstnumber.-8.10) 671 0 R (lstnumber.-8.11) 672 0 R (lstnumber.-8.12) 673 0 R (lstnumber.-8.13) 674 0 R (lstnumber.-8.14) 675 0 R (lstnumber.-8.15) 676 0 R (lstnumber.-8.16) 677 0 R (lstnumber.-8.17) 678 0 R (lstnumber.-8.18) 679 0 R (lstnumber.-8.19) 680 0 R (lstnumber.-8.2) 663 0 R (lstnumber.-8.20) 681 0 R (lstnumber.-8.21) 682 0 R (lstnumber.-8.22) 683 0 R (lstnumber.-8.23) 684 0 R (lstnumber.-8.24) 685 0 R (lstnumber.-8.25) 686 0 R (lstnumber.-8.26) 687 0 R (lstnumber.-8.3) 664 0 R (lstnumber.-8.4) 665 0 R (lstnumber.-8.5) 666 0 R (lstnumber.-8.6) 667 0 R (lstnumber.-8.7) 668 0 R (lstnumber.-8.8) 669 0 R (lstnumber.-8.9) 670 0 R (lstnumber.-9.1) 690 0 R (lstnumber.-9.2) 691 0 R (lstnumber.-9.3) 692 0 R (lstnumber.-9.4) 693 0 R (lstnumber.-9.5) 695 0 R (page.1) 325 0 R (page.10) 346 0 R (page.11) 349 0 R (page.12) 352 0 R (page.13) 355 0 R (page.14) 358 0 R (page.15) 369 0 R (page.16) 383 0 R (page.17) 386 0 R (page.18) 427 0 R (page.19) 443 0 R (page.2) 328 0 R (page.20) 468 0 R (page.21) 515 0 R (page.22) 526 0 R (page.23) 546 0 R (page.24) 587 0 R (page.25) 611 0 R (page.26) 659 0 R (page.27) 688 0 R (page.28) 694 0 R (page.29) 702 0 R (page.3) 331 0 R (page.30) 715 0 R (page.4) 334 0 R (page.5) 336 0 R (page.6) 339 0 R (page.7) 341 0 R (page.8) 344 0 R (page.9) 345 0 R (section*.1) 327 0 R (section*.2) 337 0 R (section*.3) 340 0 R (section*.4) 350 0 R (section*.5) 351 0 R (section*.6) 354 0 R (section*.7) 357 0 R (section*.8) 359 0 R (section*.9) 708 0 R (section.1) 329 0 R (section.10) 696 0 R (section.11) 707 0 R (section.2) 330 0 R (section.3) 332 0 R (section.4) 333 0 R (section.5) 335 0 R (section.6) 342 0 R (section.7) 368 0 R (section.8) 387 0 R (section.9) 660 0 R (subsection.6.1) 343 0 R (subsection.6.2) 348 0 R (subsection.8.1) 388 0 R (subsection.8.2) 474 0 R (table.1) 353 0 R (table.2) 356 0 R (table.3) 384 0 R (table.4) 385 0 R ] >>
@@ -24144,20 +24115,20 @@ endobj
[ 2437 0 R ]
endobj
719 0 obj
-<< /Subtype /XML /Type /Metadata /Length 1953 >>
+<< /Subtype /XML /Type /Metadata /Length 1945 >>
stream
<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
<?adobe-xap-filters esc="CRLF"?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
-<rdf:Description rdf:about='uuid:1dcc693a-fb61-11f4-0000-db0ae0b5c2c7' xmlns:pdf='http://ns.adobe.com/pdf/1.3/'><pdf:Producer>dvips + GPL Ghostscript 9.26</pdf:Producer>
+<rdf:Description rdf:about='uuid:00658224-37e5-11f5-0000-eff1905d5c29' xmlns:pdf='http://ns.adobe.com/pdf/1.3/'><pdf:Producer>GPL Ghostscript 9.50</pdf:Producer>
<pdf:Keywords>include portable PDF animation SVG animation animated PDF animated SVG dvisvgm html TeX4ht web animating embed animated graphics LaTeX pdfLaTeX LuaLaTeX PSTricks pgf TikZ LaTeX-picture MetaPost inline graphics vector graphics animated GIF LaTeX dvips ps2pdf dvipdfmx XeLaTeX JavaScript Acrobat Reader PDF-XChange Foxit Reader Firefox Chrome Chromium</pdf:Keywords>
</rdf:Description>
-<rdf:Description rdf:about='uuid:1dcc693a-fb61-11f4-0000-db0ae0b5c2c7' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2019-08-20T14:18:07+02:00</xmp:ModifyDate>
-<xmp:CreateDate>2019-08-20T14:18:07+02:00</xmp:CreateDate>
+<rdf:Description rdf:about='uuid:00658224-37e5-11f5-0000-eff1905d5c29' xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2019-11-05T13:33:21+01:00</xmp:ModifyDate>
+<xmp:CreateDate>2019-11-05T13:33:21+01:00</xmp:CreateDate>
<xmp:CreatorTool>LaTeX with hyperref</xmp:CreatorTool></rdf:Description>
-<rdf:Description rdf:about='uuid:1dcc693a-fb61-11f4-0000-db0ae0b5c2c7' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:1dcc693a-fb61-11f4-0000-db0ae0b5c2c7'/>
-<rdf:Description rdf:about='uuid:1dcc693a-fb61-11f4-0000-db0ae0b5c2c7' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>The animate Package</rdf:li></rdf:Alt></dc:title><dc:creator><rdf:Seq><rdf:li>Alexander Grahn</rdf:li></rdf:Seq></dc:creator><dc:description><rdf:Alt><rdf:li xml:lang='x-default'>Documentation</rdf:li></rdf:Alt></dc:description></rdf:Description>
+<rdf:Description rdf:about='uuid:00658224-37e5-11f5-0000-eff1905d5c29' xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:00658224-37e5-11f5-0000-eff1905d5c29'/>
+<rdf:Description rdf:about='uuid:00658224-37e5-11f5-0000-eff1905d5c29' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>The animate Package</rdf:li></rdf:Alt></dc:title><dc:creator><rdf:Seq><rdf:li>Alexander Grahn</rdf:li></rdf:Seq></dc:creator><dc:description><rdf:Alt><rdf:li xml:lang='x-default'>Documentation</rdf:li></rdf:Alt></dc:description></rdf:Description>
</rdf:RDF>
</x:xmpmeta>
@@ -24167,726 +24138,726 @@ endobj
xref
0 720
0000000000 65535 f
-0003327069 00000 n
-0003327301 00000 n
-0003327429 00000 n
-0003332809 00000 n
-0003332954 00000 n
-0003333099 00000 n
-0003333244 00000 n
-0003333389 00000 n
-0003333424 00000 n
-0003333472 00000 n
-0003333549 00000 n
-0003333790 00000 n
-0003333919 00000 n
-0003336908 00000 n
-0003337130 00000 n
-0003337352 00000 n
-0003337500 00000 n
-0003337648 00000 n
-0003337684 00000 n
-0003337733 00000 n
-0003337796 00000 n
-0003338056 00000 n
-0003338185 00000 n
-0003342895 00000 n
-0003343147 00000 n
-0003343183 00000 n
-0003343261 00000 n
-0003343310 00000 n
-0003343386 00000 n
-0003343635 00000 n
-0003343764 00000 n
-0003350808 00000 n
-0003350956 00000 n
-0003351104 00000 n
-0003351256 00000 n
-0003351408 00000 n
-0003351643 00000 n
-0003351907 00000 n
-0003351943 00000 n
-0003351992 00000 n
-0003352067 00000 n
-0003353150 00000 n
-0003353371 00000 n
-0003353500 00000 n
-0003360119 00000 n
-0003360155 00000 n
-0003360204 00000 n
-0003360294 00000 n
-0003360521 00000 n
-0003360650 00000 n
-0003364895 00000 n
-0003365042 00000 n
-0003365189 00000 n
-0003365225 00000 n
-0003365274 00000 n
-0003365350 00000 n
-0003365563 00000 n
-0003365692 00000 n
-0003371183 00000 n
-0003371219 00000 n
-0003371268 00000 n
-0003371317 00000 n
-0003371558 00000 n
-0003371687 00000 n
-0003377605 00000 n
-0003377752 00000 n
-0003377899 00000 n
-0003378046 00000 n
-0003378193 00000 n
-0003378229 00000 n
-0003378278 00000 n
-0003378327 00000 n
-0003378540 00000 n
-0003378670 00000 n
-0003384938 00000 n
-0003384974 00000 n
-0003385023 00000 n
-0003385113 00000 n
-0003385354 00000 n
-0003385484 00000 n
-0003392221 00000 n
-0003392369 00000 n
-0003392517 00000 n
-0003392662 00000 n
-0003392807 00000 n
-0003392843 00000 n
-0003392892 00000 n
-0003392954 00000 n
-0003393233 00000 n
-0003393363 00000 n
-0003398799 00000 n
-0003398945 00000 n
-0003399091 00000 n
-0003399237 00000 n
-0003399383 00000 n
-0003399535 00000 n
-0003399687 00000 n
-0003399832 00000 n
-0003399977 00000 n
-0003400013 00000 n
-0003400063 00000 n
-0003400126 00000 n
-0003400417 00000 n
-0003400548 00000 n
-0003404583 00000 n
-0003404730 00000 n
-0003404877 00000 n
-0003405030 00000 n
-0003405183 00000 n
-0003405333 00000 n
-0003405483 00000 n
-0003405631 00000 n
-0003405779 00000 n
-0003405816 00000 n
-0003405866 00000 n
-0003405929 00000 n
-0003406180 00000 n
-0003406311 00000 n
-0003411117 00000 n
-0003411263 00000 n
-0003411409 00000 n
-0003411555 00000 n
-0003411701 00000 n
-0003411738 00000 n
-0003411788 00000 n
-0003411865 00000 n
-0003412116 00000 n
-0003412247 00000 n
-0003414249 00000 n
-0003414402 00000 n
-0003414555 00000 n
-0003414704 00000 n
-0003414853 00000 n
-0003414890 00000 n
-0003414940 00000 n
-0003414990 00000 n
-0003415217 00000 n
-0003415348 00000 n
-0003419010 00000 n
-0003419047 00000 n
-0003419097 00000 n
-0003419147 00000 n
-0003419398 00000 n
-0003419529 00000 n
-0003422926 00000 n
-0003423073 00000 n
-0003423220 00000 n
-0003423367 00000 n
-0003423514 00000 n
-0003423551 00000 n
-0003423601 00000 n
-0003423721 00000 n
-0003424189 00000 n
-0003424320 00000 n
-0003427850 00000 n
-0003428102 00000 n
-0003428249 00000 n
-0003428396 00000 n
-0003428546 00000 n
-0003428696 00000 n
-0003428733 00000 n
-0003429190 00000 n
-0003429240 00000 n
-0003429486 00000 n
-0003430765 00000 n
-0003430896 00000 n
-0003432146 00000 n
-0003432403 00000 n
-0003432440 00000 n
-0003441510 00000 n
-0003441560 00000 n
-0003441733 00000 n
-0003441984 00000 n
-0003442115 00000 n
-0003444796 00000 n
-0003444943 00000 n
-0003445090 00000 n
-0003445240 00000 n
-0003445390 00000 n
-0003445427 00000 n
-0003445477 00000 n
-0003445555 00000 n
-0003446210 00000 n
-0003446341 00000 n
-0003450280 00000 n
-0003450537 00000 n
-0003450684 00000 n
-0003450831 00000 n
-0003451004 00000 n
-0003451240 00000 n
-0003451277 00000 n
-0003452228 00000 n
-0003452278 00000 n
-0003452371 00000 n
-0003453036 00000 n
-0003453135 00000 n
-0003455224 00000 n
-0003455355 00000 n
-0003456488 00000 n
-0003456745 00000 n
-0003456782 00000 n
-0003462917 00000 n
-0003462967 00000 n
-0003463031 00000 n
-0003463282 00000 n
-0003463413 00000 n
-0003467979 00000 n
-0003468126 00000 n
-0003468273 00000 n
-0003468424 00000 n
-0003468575 00000 n
-0003468612 00000 n
-0003468662 00000 n
+0003327207 00000 n
+0003327439 00000 n
+0003327567 00000 n
+0003332944 00000 n
+0003333089 00000 n
+0003333234 00000 n
+0003333379 00000 n
+0003333524 00000 n
+0003333559 00000 n
+0003333607 00000 n
+0003333684 00000 n
+0003333925 00000 n
+0003334054 00000 n
+0003337043 00000 n
+0003337265 00000 n
+0003337487 00000 n
+0003337635 00000 n
+0003337783 00000 n
+0003337819 00000 n
+0003337868 00000 n
+0003337931 00000 n
+0003338191 00000 n
+0003338320 00000 n
+0003343030 00000 n
+0003343282 00000 n
+0003343318 00000 n
+0003343396 00000 n
+0003343445 00000 n
+0003343521 00000 n
+0003343770 00000 n
+0003343899 00000 n
+0003350943 00000 n
+0003351091 00000 n
+0003351239 00000 n
+0003351391 00000 n
+0003351543 00000 n
+0003351778 00000 n
+0003352042 00000 n
+0003352078 00000 n
+0003352127 00000 n
+0003352202 00000 n
+0003353285 00000 n
+0003353506 00000 n
+0003353635 00000 n
+0003360254 00000 n
+0003360290 00000 n
+0003360339 00000 n
+0003360429 00000 n
+0003360656 00000 n
+0003360785 00000 n
+0003365030 00000 n
+0003365177 00000 n
+0003365324 00000 n
+0003365360 00000 n
+0003365409 00000 n
+0003365485 00000 n
+0003365698 00000 n
+0003365827 00000 n
+0003371318 00000 n
+0003371354 00000 n
+0003371403 00000 n
+0003371452 00000 n
+0003371693 00000 n
+0003371822 00000 n
+0003377741 00000 n
+0003377888 00000 n
+0003378035 00000 n
+0003378182 00000 n
+0003378329 00000 n
+0003378365 00000 n
+0003378414 00000 n
+0003378463 00000 n
+0003378676 00000 n
+0003378806 00000 n
+0003385074 00000 n
+0003385110 00000 n
+0003385159 00000 n
+0003385249 00000 n
+0003385490 00000 n
+0003385620 00000 n
+0003392357 00000 n
+0003392505 00000 n
+0003392653 00000 n
+0003392798 00000 n
+0003392943 00000 n
+0003392979 00000 n
+0003393028 00000 n
+0003393090 00000 n
+0003393369 00000 n
+0003393499 00000 n
+0003398935 00000 n
+0003399081 00000 n
+0003399227 00000 n
+0003399373 00000 n
+0003399519 00000 n
+0003399671 00000 n
+0003399823 00000 n
+0003399968 00000 n
+0003400113 00000 n
+0003400149 00000 n
+0003400199 00000 n
+0003400262 00000 n
+0003400553 00000 n
+0003400684 00000 n
+0003404719 00000 n
+0003404866 00000 n
+0003405013 00000 n
+0003405166 00000 n
+0003405319 00000 n
+0003405469 00000 n
+0003405619 00000 n
+0003405767 00000 n
+0003405915 00000 n
+0003405952 00000 n
+0003406002 00000 n
+0003406065 00000 n
+0003406316 00000 n
+0003406447 00000 n
+0003411253 00000 n
+0003411399 00000 n
+0003411545 00000 n
+0003411691 00000 n
+0003411837 00000 n
+0003411874 00000 n
+0003411924 00000 n
+0003412001 00000 n
+0003412252 00000 n
+0003412383 00000 n
+0003414385 00000 n
+0003414538 00000 n
+0003414691 00000 n
+0003414840 00000 n
+0003414989 00000 n
+0003415026 00000 n
+0003415076 00000 n
+0003415126 00000 n
+0003415353 00000 n
+0003415484 00000 n
+0003419146 00000 n
+0003419183 00000 n
+0003419233 00000 n
+0003419283 00000 n
+0003419534 00000 n
+0003419665 00000 n
+0003423062 00000 n
+0003423209 00000 n
+0003423356 00000 n
+0003423503 00000 n
+0003423650 00000 n
+0003423687 00000 n
+0003423737 00000 n
+0003423857 00000 n
+0003424325 00000 n
+0003424456 00000 n
+0003427986 00000 n
+0003428238 00000 n
+0003428385 00000 n
+0003428532 00000 n
+0003428682 00000 n
+0003428832 00000 n
+0003428869 00000 n
+0003429326 00000 n
+0003429376 00000 n
+0003429622 00000 n
+0003430901 00000 n
+0003431032 00000 n
+0003432282 00000 n
+0003432539 00000 n
+0003432576 00000 n
+0003441646 00000 n
+0003441696 00000 n
+0003441869 00000 n
+0003442120 00000 n
+0003442251 00000 n
+0003444932 00000 n
+0003445079 00000 n
+0003445226 00000 n
+0003445376 00000 n
+0003445526 00000 n
+0003445563 00000 n
+0003445613 00000 n
+0003445691 00000 n
+0003446346 00000 n
+0003446477 00000 n
+0003450417 00000 n
+0003450674 00000 n
+0003450821 00000 n
+0003450968 00000 n
+0003451141 00000 n
+0003451377 00000 n
+0003451414 00000 n
+0003452365 00000 n
+0003452415 00000 n
+0003452508 00000 n
+0003453173 00000 n
+0003453272 00000 n
+0003455361 00000 n
+0003455492 00000 n
+0003456625 00000 n
+0003456882 00000 n
+0003456919 00000 n
+0003463054 00000 n
+0003463104 00000 n
+0003463168 00000 n
+0003463419 00000 n
+0003463550 00000 n
+0003468116 00000 n
+0003468263 00000 n
+0003468410 00000 n
+0003468561 00000 n
0003468712 00000 n
-0003469333 00000 n
-0003469464 00000 n
-0003470316 00000 n
-0003470568 00000 n
-0003825028 00000 n
-0003825105 00000 n
-0003827394 00000 n
-0003827469 00000 n
-0003827626 00000 n
-0003827718 00000 n
-0003827860 00000 n
-0003828030 00000 n
-0003828293 00000 n
-0003828549 00000 n
-0003828586 00000 n
-0003829472 00000 n
-0003829522 00000 n
-0003829601 00000 n
-0003829820 00000 n
-0003829951 00000 n
-0003831699 00000 n
-0003831736 00000 n
-0003831786 00000 n
+0003468749 00000 n
+0003468799 00000 n
+0003468849 00000 n
+0003469470 00000 n
+0003469601 00000 n
+0003470453 00000 n
+0003470705 00000 n
+0003825165 00000 n
+0003825242 00000 n
+0003827531 00000 n
+0003827606 00000 n
+0003827763 00000 n
+0003827855 00000 n
+0003827997 00000 n
+0003828167 00000 n
+0003828430 00000 n
+0003828686 00000 n
+0003828723 00000 n
+0003829609 00000 n
+0003829659 00000 n
+0003829738 00000 n
+0003829957 00000 n
+0003830088 00000 n
0003831836 00000 n
-0003832071 00000 n
-0003832202 00000 n
-0003836723 00000 n
-0003836874 00000 n
-0003837025 00000 n
-0003837062 00000 n
-0003837112 00000 n
-0003837176 00000 n
-0003837395 00000 n
-0003837526 00000 n
-0003843726 00000 n
-0003843763 00000 n
-0003843813 00000 n
-0003843877 00000 n
-0003844112 00000 n
-0003844243 00000 n
-0003850028 00000 n
-0003850175 00000 n
-0003850322 00000 n
-0003850359 00000 n
-0003850409 00000 n
-0003850500 00000 n
-0003850959 00000 n
-0003851090 00000 n
-0003856943 00000 n
-0003857088 00000 n
-0003857233 00000 n
-0003857378 00000 n
-0003857523 00000 n
-0003857716 00000 n
-0003857909 00000 n
-0003858058 00000 n
-0003858207 00000 n
-0003858355 00000 n
-0003858503 00000 n
-0003858651 00000 n
-0003858799 00000 n
-0003858977 00000 n
-0003859155 00000 n
-0003859381 00000 n
-0003859559 00000 n
-0003859737 00000 n
-0003859963 00000 n
-0003860166 00000 n
-0003860369 00000 n
-0003860595 00000 n
-0003860798 00000 n
-0003861001 00000 n
-0003861227 00000 n
-0003861399 00000 n
-0003861571 00000 n
-0003861754 00000 n
-0003861937 00000 n
-0003862122 00000 n
-0003862307 00000 n
-0003862344 00000 n
-0003862394 00000 n
-0003862471 00000 n
-0003862786 00000 n
-0003862917 00000 n
-0003863553 00000 n
-0003863737 00000 n
-0003863921 00000 n
-0003864114 00000 n
-0003864298 00000 n
-0003864482 00000 n
-0003864675 00000 n
-0003864839 00000 n
-0003865003 00000 n
-0003865196 00000 n
-0003865360 00000 n
-0003865524 00000 n
-0003865717 00000 n
-0003865754 00000 n
-0003865804 00000 n
-0003865867 00000 n
-0003866349 00000 n
-0003866726 00000 n
-0003866946 00000 n
-0003867186 00000 n
-0003869563 00000 n
-0003870537 00000 n
-0003870881 00000 n
-0003871104 00000 n
-0003871389 00000 n
-0003872001 00000 n
-0003881613 00000 n
-0003881684 00000 n
-0003881752 00000 n
-0003881820 00000 n
-0003881885 00000 n
-0003881949 00000 n
-0003882014 00000 n
-0003882083 00000 n
-0003882149 00000 n
-0003882215 00000 n
-0003882281 00000 n
-0003882347 00000 n
-0003882416 00000 n
-0003882481 00000 n
-0003882547 00000 n
-0003882613 00000 n
-0003882678 00000 n
-0003882747 00000 n
-0003882813 00000 n
-0003882879 00000 n
-0003882945 00000 n
-0003883014 00000 n
-0003883080 00000 n
-0003883146 00000 n
-0003883212 00000 n
-0003883281 00000 n
-0003883347 00000 n
-0003883413 00000 n
-0003883479 00000 n
-0003883545 00000 n
-0003883611 00000 n
-0003883681 00000 n
-0003883748 00000 n
-0003883815 00000 n
-0003883882 00000 n
-0003883949 00000 n
-0003884016 00000 n
-0003884083 00000 n
-0003884150 00000 n
-0003884217 00000 n
-0003884284 00000 n
-0003884350 00000 n
-0003884417 00000 n
-0003884484 00000 n
-0003884551 00000 n
-0003884621 00000 n
-0003884688 00000 n
-0003884754 00000 n
-0003884820 00000 n
-0003884887 00000 n
-0003884954 00000 n
-0003885021 00000 n
-0003885087 00000 n
-0003885154 00000 n
-0003885221 00000 n
-0003885288 00000 n
-0003885355 00000 n
-0003885422 00000 n
-0003885489 00000 n
-0003885556 00000 n
-0003885623 00000 n
-0003885690 00000 n
-0003885760 00000 n
-0003885827 00000 n
-0003885894 00000 n
-0003885961 00000 n
-0003886028 00000 n
-0003886095 00000 n
-0003886161 00000 n
-0003886227 00000 n
-0003886294 00000 n
-0003886361 00000 n
-0003886428 00000 n
-0003886494 00000 n
-0003886560 00000 n
-0003886627 00000 n
-0003886694 00000 n
-0003886761 00000 n
-0003886827 00000 n
-0003886894 00000 n
-0003886961 00000 n
-0003887028 00000 n
-0003887094 00000 n
-0003887160 00000 n
-0003887227 00000 n
-0003887294 00000 n
-0003887361 00000 n
-0003887428 00000 n
-0003887495 00000 n
-0003887562 00000 n
-0003887629 00000 n
-0003887696 00000 n
-0003887763 00000 n
-0003887830 00000 n
-0003887897 00000 n
-0003887964 00000 n
-0003888031 00000 n
-0003888097 00000 n
-0003888164 00000 n
-0003888231 00000 n
-0003888298 00000 n
-0003888365 00000 n
-0003888432 00000 n
-0003888499 00000 n
-0003888565 00000 n
-0003888632 00000 n
-0003888699 00000 n
-0003888766 00000 n
-0003888833 00000 n
-0003888900 00000 n
-0003888967 00000 n
-0003889034 00000 n
-0003889101 00000 n
-0003889168 00000 n
-0003889235 00000 n
-0003889302 00000 n
-0003889369 00000 n
-0003889436 00000 n
-0003889503 00000 n
-0003889573 00000 n
-0003889640 00000 n
-0003889707 00000 n
-0003889774 00000 n
-0003889841 00000 n
-0003889905 00000 n
-0003889969 00000 n
-0003890033 00000 n
-0003890099 00000 n
-0003890166 00000 n
-0003890233 00000 n
-0003890300 00000 n
-0003890367 00000 n
-0003890434 00000 n
-0003890501 00000 n
-0003890568 00000 n
-0003890635 00000 n
-0003890702 00000 n
-0003890769 00000 n
-0003890836 00000 n
-0003890903 00000 n
-0003890970 00000 n
-0003891036 00000 n
-0003891103 00000 n
-0003891170 00000 n
-0003891237 00000 n
-0003891304 00000 n
-0003891371 00000 n
-0003891437 00000 n
-0003891503 00000 n
-0003891570 00000 n
-0003891637 00000 n
-0003891704 00000 n
-0003891771 00000 n
-0003891837 00000 n
-0003891904 00000 n
-0003891971 00000 n
-0003892038 00000 n
-0003892105 00000 n
-0003892172 00000 n
-0003892239 00000 n
-0003892306 00000 n
-0003892370 00000 n
-0003892437 00000 n
-0003892504 00000 n
-0003892571 00000 n
-0003892638 00000 n
-0003892705 00000 n
-0003892771 00000 n
-0003892838 00000 n
-0003892905 00000 n
-0003892972 00000 n
-0003893039 00000 n
-0003893106 00000 n
-0003893173 00000 n
-0003893240 00000 n
-0003893307 00000 n
-0003893374 00000 n
-0003893441 00000 n
-0003893508 00000 n
-0003893575 00000 n
-0003893642 00000 n
-0003893709 00000 n
-0003893776 00000 n
-0003893843 00000 n
-0003893910 00000 n
-0003893977 00000 n
-0003894044 00000 n
-0003894111 00000 n
-0003894178 00000 n
-0003894245 00000 n
-0003894312 00000 n
-0003894382 00000 n
-0003894449 00000 n
-0003894516 00000 n
-0003894583 00000 n
-0003894650 00000 n
-0003894717 00000 n
-0003894784 00000 n
-0003894851 00000 n
-0003894918 00000 n
-0003894985 00000 n
-0003895052 00000 n
-0003895119 00000 n
-0003895186 00000 n
-0003895253 00000 n
-0003895320 00000 n
-0003895387 00000 n
-0003895454 00000 n
-0003895521 00000 n
-0003895586 00000 n
-0003895652 00000 n
-0003895719 00000 n
-0003895786 00000 n
-0003895853 00000 n
-0003895918 00000 n
-0003895985 00000 n
-0003896052 00000 n
-0003896119 00000 n
-0003896186 00000 n
-0003896252 00000 n
-0003896319 00000 n
-0003896386 00000 n
-0003896456 00000 n
-0003896523 00000 n
-0003896590 00000 n
-0003896656 00000 n
-0003896722 00000 n
-0003896789 00000 n
-0003896856 00000 n
-0003896923 00000 n
-0003896989 00000 n
-0003897055 00000 n
-0003897122 00000 n
-0003897189 00000 n
-0003897256 00000 n
-0003897322 00000 n
-0003897389 00000 n
-0003897456 00000 n
-0003897523 00000 n
-0003897590 00000 n
-0003897657 00000 n
-0003897724 00000 n
-0003897791 00000 n
-0003897855 00000 n
-0003897922 00000 n
-0003897989 00000 n
-0003898056 00000 n
-0003898123 00000 n
-0003898190 00000 n
-0003898256 00000 n
-0003898323 00000 n
-0003898390 00000 n
-0003898457 00000 n
-0003898524 00000 n
-0003898591 00000 n
-0003898658 00000 n
-0003898725 00000 n
-0003898792 00000 n
-0003898859 00000 n
-0003898926 00000 n
-0003898993 00000 n
-0003899060 00000 n
-0003899127 00000 n
-0003899194 00000 n
-0003899261 00000 n
-0003899328 00000 n
-0003899394 00000 n
-0003899460 00000 n
-0003899527 00000 n
-0003899594 00000 n
-0003899661 00000 n
-0003899727 00000 n
-0003899793 00000 n
-0003899860 00000 n
-0003899927 00000 n
-0003899994 00000 n
-0003900060 00000 n
-0003900127 00000 n
-0003900194 00000 n
-0003900261 00000 n
-0003900328 00000 n
-0003900395 00000 n
-0003900462 00000 n
-0003900529 00000 n
-0003900593 00000 n
-0003900660 00000 n
-0003900727 00000 n
-0003900797 00000 n
-0003900864 00000 n
-0003900931 00000 n
-0003900997 00000 n
-0003901063 00000 n
-0003901130 00000 n
-0003901197 00000 n
-0003901264 00000 n
-0003901330 00000 n
-0003901396 00000 n
-0003901463 00000 n
-0003901530 00000 n
-0003901597 00000 n
-0003901663 00000 n
-0003901730 00000 n
-0003901797 00000 n
-0003901864 00000 n
-0003901931 00000 n
-0003901998 00000 n
-0003902065 00000 n
-0003902132 00000 n
-0003902196 00000 n
-0003902263 00000 n
-0003902330 00000 n
-0003902397 00000 n
-0003902464 00000 n
-0003902531 00000 n
-0003902597 00000 n
-0003902664 00000 n
-0003902731 00000 n
-0003902798 00000 n
-0003902865 00000 n
-0003902932 00000 n
-0003902999 00000 n
-0003903066 00000 n
-0003903133 00000 n
-0003903200 00000 n
-0003903267 00000 n
-0003903334 00000 n
-0003903401 00000 n
-0003903468 00000 n
-0003903535 00000 n
-0003903602 00000 n
-0003903669 00000 n
-0003903736 00000 n
-0003903803 00000 n
-0003903870 00000 n
-0003903937 00000 n
-0003904004 00000 n
-0003904071 00000 n
-0003904138 00000 n
-0003904205 00000 n
-0003904272 00000 n
-0003904339 00000 n
-0003904406 00000 n
-0003904473 00000 n
-0003904540 00000 n
-0003904607 00000 n
-0003904674 00000 n
-0003904741 00000 n
-0003904805 00000 n
-0003904869 00000 n
-0003904933 00000 n
-0003905000 00000 n
-0003905067 00000 n
-0003905134 00000 n
-0003905201 00000 n
-0003905268 00000 n
-0003905335 00000 n
-0003905402 00000 n
-0003905469 00000 n
-0003905536 00000 n
-0003905603 00000 n
-0003905670 00000 n
-0003905737 00000 n
-0003905803 00000 n
-0003905869 00000 n
-0003905939 00000 n
-0003906006 00000 n
-0003906073 00000 n
-0003906140 00000 n
-0003906207 00000 n
-0003906274 00000 n
-0003906341 00000 n
-0003906408 00000 n
-0003906475 00000 n
-0003906545 00000 n
-0003906612 00000 n
-0003906679 00000 n
-0003906746 00000 n
-0003906813 00000 n
-0003906883 00000 n
-0003906950 00000 n
-0003907017 00000 n
-0003907083 00000 n
-0003907150 00000 n
-0003907217 00000 n
-0003907284 00000 n
-0003907351 00000 n
-0003907418 00000 n
-0003907485 00000 n
-0003907552 00000 n
-0003907619 00000 n
-0003907686 00000 n
-0003907753 00000 n
-0003907820 00000 n
-0003907859 00000 n
-0003907889 00000 n
-trailer << /Size 720 /ID [<ef3b060afb9703a691cade546761b679><2b66b437f6640f1fc678130bc823fb34>] >>
+0003831873 00000 n
+0003831923 00000 n
+0003831973 00000 n
+0003832208 00000 n
+0003832339 00000 n
+0003836903 00000 n
+0003837054 00000 n
+0003837205 00000 n
+0003837242 00000 n
+0003837292 00000 n
+0003837356 00000 n
+0003837575 00000 n
+0003837706 00000 n
+0003843906 00000 n
+0003843943 00000 n
+0003843993 00000 n
+0003844057 00000 n
+0003844292 00000 n
+0003844423 00000 n
+0003850208 00000 n
+0003850355 00000 n
+0003850502 00000 n
+0003850539 00000 n
+0003850589 00000 n
+0003850680 00000 n
+0003851139 00000 n
+0003851270 00000 n
+0003857110 00000 n
+0003857255 00000 n
+0003857400 00000 n
+0003857545 00000 n
+0003857690 00000 n
+0003857883 00000 n
+0003858076 00000 n
+0003858225 00000 n
+0003858374 00000 n
+0003858522 00000 n
+0003858670 00000 n
+0003858818 00000 n
+0003858966 00000 n
+0003859144 00000 n
+0003859322 00000 n
+0003859548 00000 n
+0003859726 00000 n
+0003859904 00000 n
+0003860130 00000 n
+0003860333 00000 n
+0003860536 00000 n
+0003860762 00000 n
+0003860965 00000 n
+0003861168 00000 n
+0003861394 00000 n
+0003861566 00000 n
+0003861738 00000 n
+0003861921 00000 n
+0003862104 00000 n
+0003862289 00000 n
+0003862474 00000 n
+0003862511 00000 n
+0003862561 00000 n
+0003862638 00000 n
+0003862953 00000 n
+0003863084 00000 n
+0003863720 00000 n
+0003863904 00000 n
+0003864088 00000 n
+0003864281 00000 n
+0003864465 00000 n
+0003864649 00000 n
+0003864842 00000 n
+0003865006 00000 n
+0003865170 00000 n
+0003865363 00000 n
+0003865527 00000 n
+0003865691 00000 n
+0003865884 00000 n
+0003865921 00000 n
+0003865971 00000 n
+0003866034 00000 n
+0003866516 00000 n
+0003866893 00000 n
+0003867113 00000 n
+0003867353 00000 n
+0003868327 00000 n
+0003870702 00000 n
+0003871046 00000 n
+0003871269 00000 n
+0003871554 00000 n
+0003872158 00000 n
+0003881770 00000 n
+0003881841 00000 n
+0003881909 00000 n
+0003881977 00000 n
+0003882042 00000 n
+0003882106 00000 n
+0003882171 00000 n
+0003882240 00000 n
+0003882306 00000 n
+0003882372 00000 n
+0003882438 00000 n
+0003882504 00000 n
+0003882573 00000 n
+0003882638 00000 n
+0003882704 00000 n
+0003882770 00000 n
+0003882835 00000 n
+0003882904 00000 n
+0003882970 00000 n
+0003883036 00000 n
+0003883102 00000 n
+0003883171 00000 n
+0003883237 00000 n
+0003883303 00000 n
+0003883369 00000 n
+0003883438 00000 n
+0003883504 00000 n
+0003883570 00000 n
+0003883636 00000 n
+0003883702 00000 n
+0003883768 00000 n
+0003883838 00000 n
+0003883905 00000 n
+0003883972 00000 n
+0003884039 00000 n
+0003884106 00000 n
+0003884173 00000 n
+0003884240 00000 n
+0003884307 00000 n
+0003884374 00000 n
+0003884441 00000 n
+0003884507 00000 n
+0003884574 00000 n
+0003884641 00000 n
+0003884708 00000 n
+0003884778 00000 n
+0003884845 00000 n
+0003884911 00000 n
+0003884977 00000 n
+0003885044 00000 n
+0003885111 00000 n
+0003885178 00000 n
+0003885244 00000 n
+0003885311 00000 n
+0003885378 00000 n
+0003885445 00000 n
+0003885512 00000 n
+0003885579 00000 n
+0003885646 00000 n
+0003885713 00000 n
+0003885780 00000 n
+0003885847 00000 n
+0003885917 00000 n
+0003885984 00000 n
+0003886051 00000 n
+0003886118 00000 n
+0003886185 00000 n
+0003886252 00000 n
+0003886318 00000 n
+0003886384 00000 n
+0003886451 00000 n
+0003886518 00000 n
+0003886585 00000 n
+0003886651 00000 n
+0003886717 00000 n
+0003886784 00000 n
+0003886851 00000 n
+0003886918 00000 n
+0003886984 00000 n
+0003887051 00000 n
+0003887118 00000 n
+0003887185 00000 n
+0003887251 00000 n
+0003887317 00000 n
+0003887384 00000 n
+0003887451 00000 n
+0003887518 00000 n
+0003887585 00000 n
+0003887652 00000 n
+0003887719 00000 n
+0003887786 00000 n
+0003887853 00000 n
+0003887920 00000 n
+0003887987 00000 n
+0003888054 00000 n
+0003888121 00000 n
+0003888188 00000 n
+0003888254 00000 n
+0003888321 00000 n
+0003888388 00000 n
+0003888455 00000 n
+0003888522 00000 n
+0003888589 00000 n
+0003888656 00000 n
+0003888722 00000 n
+0003888789 00000 n
+0003888856 00000 n
+0003888923 00000 n
+0003888990 00000 n
+0003889057 00000 n
+0003889124 00000 n
+0003889191 00000 n
+0003889258 00000 n
+0003889325 00000 n
+0003889392 00000 n
+0003889459 00000 n
+0003889526 00000 n
+0003889593 00000 n
+0003889660 00000 n
+0003889730 00000 n
+0003889797 00000 n
+0003889864 00000 n
+0003889931 00000 n
+0003889998 00000 n
+0003890062 00000 n
+0003890126 00000 n
+0003890190 00000 n
+0003890256 00000 n
+0003890323 00000 n
+0003890390 00000 n
+0003890457 00000 n
+0003890524 00000 n
+0003890591 00000 n
+0003890658 00000 n
+0003890725 00000 n
+0003890792 00000 n
+0003890859 00000 n
+0003890926 00000 n
+0003890993 00000 n
+0003891060 00000 n
+0003891127 00000 n
+0003891193 00000 n
+0003891260 00000 n
+0003891327 00000 n
+0003891394 00000 n
+0003891461 00000 n
+0003891528 00000 n
+0003891594 00000 n
+0003891660 00000 n
+0003891727 00000 n
+0003891794 00000 n
+0003891861 00000 n
+0003891928 00000 n
+0003891994 00000 n
+0003892061 00000 n
+0003892128 00000 n
+0003892195 00000 n
+0003892262 00000 n
+0003892329 00000 n
+0003892396 00000 n
+0003892463 00000 n
+0003892527 00000 n
+0003892594 00000 n
+0003892661 00000 n
+0003892728 00000 n
+0003892795 00000 n
+0003892862 00000 n
+0003892928 00000 n
+0003892995 00000 n
+0003893062 00000 n
+0003893129 00000 n
+0003893196 00000 n
+0003893263 00000 n
+0003893330 00000 n
+0003893397 00000 n
+0003893464 00000 n
+0003893531 00000 n
+0003893598 00000 n
+0003893665 00000 n
+0003893732 00000 n
+0003893799 00000 n
+0003893866 00000 n
+0003893933 00000 n
+0003894000 00000 n
+0003894067 00000 n
+0003894134 00000 n
+0003894201 00000 n
+0003894268 00000 n
+0003894335 00000 n
+0003894402 00000 n
+0003894469 00000 n
+0003894539 00000 n
+0003894606 00000 n
+0003894673 00000 n
+0003894740 00000 n
+0003894807 00000 n
+0003894874 00000 n
+0003894941 00000 n
+0003895008 00000 n
+0003895075 00000 n
+0003895142 00000 n
+0003895209 00000 n
+0003895276 00000 n
+0003895343 00000 n
+0003895410 00000 n
+0003895477 00000 n
+0003895544 00000 n
+0003895611 00000 n
+0003895678 00000 n
+0003895743 00000 n
+0003895809 00000 n
+0003895876 00000 n
+0003895943 00000 n
+0003896010 00000 n
+0003896075 00000 n
+0003896142 00000 n
+0003896209 00000 n
+0003896276 00000 n
+0003896343 00000 n
+0003896409 00000 n
+0003896476 00000 n
+0003896543 00000 n
+0003896613 00000 n
+0003896680 00000 n
+0003896747 00000 n
+0003896813 00000 n
+0003896879 00000 n
+0003896946 00000 n
+0003897013 00000 n
+0003897080 00000 n
+0003897146 00000 n
+0003897212 00000 n
+0003897279 00000 n
+0003897346 00000 n
+0003897413 00000 n
+0003897479 00000 n
+0003897546 00000 n
+0003897613 00000 n
+0003897680 00000 n
+0003897747 00000 n
+0003897814 00000 n
+0003897881 00000 n
+0003897948 00000 n
+0003898012 00000 n
+0003898079 00000 n
+0003898146 00000 n
+0003898213 00000 n
+0003898280 00000 n
+0003898347 00000 n
+0003898413 00000 n
+0003898480 00000 n
+0003898547 00000 n
+0003898614 00000 n
+0003898681 00000 n
+0003898748 00000 n
+0003898815 00000 n
+0003898882 00000 n
+0003898949 00000 n
+0003899016 00000 n
+0003899083 00000 n
+0003899150 00000 n
+0003899217 00000 n
+0003899284 00000 n
+0003899351 00000 n
+0003899418 00000 n
+0003899485 00000 n
+0003899551 00000 n
+0003899617 00000 n
+0003899684 00000 n
+0003899751 00000 n
+0003899818 00000 n
+0003899884 00000 n
+0003899950 00000 n
+0003900017 00000 n
+0003900084 00000 n
+0003900151 00000 n
+0003900217 00000 n
+0003900284 00000 n
+0003900351 00000 n
+0003900418 00000 n
+0003900485 00000 n
+0003900552 00000 n
+0003900619 00000 n
+0003900686 00000 n
+0003900750 00000 n
+0003900817 00000 n
+0003900884 00000 n
+0003900954 00000 n
+0003901021 00000 n
+0003901088 00000 n
+0003901154 00000 n
+0003901220 00000 n
+0003901287 00000 n
+0003901354 00000 n
+0003901421 00000 n
+0003901487 00000 n
+0003901553 00000 n
+0003901620 00000 n
+0003901687 00000 n
+0003901754 00000 n
+0003901820 00000 n
+0003901887 00000 n
+0003901954 00000 n
+0003902021 00000 n
+0003902088 00000 n
+0003902155 00000 n
+0003902222 00000 n
+0003902289 00000 n
+0003902353 00000 n
+0003902420 00000 n
+0003902487 00000 n
+0003902554 00000 n
+0003902621 00000 n
+0003902688 00000 n
+0003902754 00000 n
+0003902821 00000 n
+0003902888 00000 n
+0003902955 00000 n
+0003903022 00000 n
+0003903089 00000 n
+0003903156 00000 n
+0003903223 00000 n
+0003903290 00000 n
+0003903357 00000 n
+0003903424 00000 n
+0003903491 00000 n
+0003903558 00000 n
+0003903625 00000 n
+0003903692 00000 n
+0003903759 00000 n
+0003903826 00000 n
+0003903893 00000 n
+0003903960 00000 n
+0003904027 00000 n
+0003904094 00000 n
+0003904161 00000 n
+0003904228 00000 n
+0003904295 00000 n
+0003904362 00000 n
+0003904429 00000 n
+0003904496 00000 n
+0003904563 00000 n
+0003904630 00000 n
+0003904697 00000 n
+0003904764 00000 n
+0003904831 00000 n
+0003904898 00000 n
+0003904962 00000 n
+0003905026 00000 n
+0003905090 00000 n
+0003905157 00000 n
+0003905224 00000 n
+0003905291 00000 n
+0003905358 00000 n
+0003905425 00000 n
+0003905492 00000 n
+0003905559 00000 n
+0003905626 00000 n
+0003905693 00000 n
+0003905760 00000 n
+0003905827 00000 n
+0003905894 00000 n
+0003905960 00000 n
+0003906026 00000 n
+0003906096 00000 n
+0003906163 00000 n
+0003906230 00000 n
+0003906297 00000 n
+0003906364 00000 n
+0003906431 00000 n
+0003906498 00000 n
+0003906565 00000 n
+0003906632 00000 n
+0003906702 00000 n
+0003906769 00000 n
+0003906836 00000 n
+0003906903 00000 n
+0003906970 00000 n
+0003907040 00000 n
+0003907107 00000 n
+0003907174 00000 n
+0003907240 00000 n
+0003907307 00000 n
+0003907374 00000 n
+0003907441 00000 n
+0003907508 00000 n
+0003907575 00000 n
+0003907642 00000 n
+0003907709 00000 n
+0003907776 00000 n
+0003907843 00000 n
+0003907910 00000 n
+0003907977 00000 n
+0003908016 00000 n
+0003908046 00000 n
+trailer << /Size 720 /ID [<ac2766e5606f0ba83762ec0fe44ecf3b><5de7766056e26cbadc83bd3a2e2294c7>] >>
startxref
216
%%EOF
diff --git a/macros/latex/contrib/animate/animate.sty b/macros/latex/contrib/animate/animate.sty
index 8fa51fbe19..9eb6adb368 100644
--- a/macros/latex/contrib/animate/animate.sty
+++ b/macros/latex/contrib/animate/animate.sty
@@ -13,15 +13,13 @@
\NeedsTeXFormat{LaTeX2e}
-\def\@anim@version{2019/08/20}
+\def\@anim@version{2019/11/05}
\ProvidesPackage{animate}
[\@anim@version\space PDF & SVG animations from files and inline graphics]
\RequirePackage{xkeyval}
\RequirePackage{ifthen}
-\RequirePackage{ifpdf}
-\RequirePackage{ifluatex}
-\RequirePackage{ifxetex}
+\RequirePackage{iftex}
\RequirePackage{ifdraft}
\RequirePackage{calc}
diff --git a/macros/latex/contrib/animate/animate.tex b/macros/latex/contrib/animate/animate.tex
index 786fa567cd..532272fbd9 100644
--- a/macros/latex/contrib/animate/animate.tex
+++ b/macros/latex/contrib/animate/animate.tex
@@ -6,6 +6,7 @@
% http://mirrors.ctan.org/macros/latex/base/lppl.txt
% for the details of that license.
%
+\listfiles
\documentclass[a4paper]{article}
\frenchspacing
\usepackage[buttonbg=0.9]{animate}
@@ -1326,7 +1327,9 @@ SVG is a single-page graphics format. Therefore, it is most useful to first prod
The following code may serve as a template for generating standalone animated SVG:
\begin{lstlisting}
-\documentclass[12pt,dvisvgm]{article}
+\documentclass[dvisvgm]{article}
+
+\pagestyle{empty} % suppress page number
\usepackage{animate}
\usepackage{graphicx}
@@ -1337,8 +1340,6 @@ The following code may serve as a template for generating standalone animated SV
%\usepackage{pstricks} % enable as needed
%\usepackage{tikz}
-\pagestyle{empty}
-
\begin{document}
\begin{center}
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.dtx
index 5af0e7b515..8aefd689dd 100644
--- a/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.dtx
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.dtx
@@ -19,7 +19,7 @@
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
-% Copyright (C) 2018 Nicola Talbot, all rights reserved.
+% Copyright (C) 2015-2019 Nicola Talbot, all rights reserved.
% (New maintainer add relevant lines here.)
% \fi
% \iffalse
@@ -61,11 +61,11 @@
%
%\title{Breton Module for datetime2 Package}
%\author{Nicola L. C. Talbot (inactive)}
-%\date{2018-03-19 (v1.1)}
+%\date{2019-11-05 (v1.2)}
%\maketitle
%
%This module is currently unmaintained and may be subject to change.
-%If you want to volunteer to take over maintanance, contact me at
+%If you want to volunteer to take over maintenance, contact me at
%\url{http://www.dickimaw-books.com/contact.html}
%
%\begin{abstract}
@@ -86,8 +86,8 @@
%I don't know if these settings are correct as I can't speak Breton.
%In particular, I don't know if the "breton" time style is
%correct. Currently this just uses the "default" time style. Please
-%be aware that this may change. Whoever takes over maintanance
-%of this module may can change it as appropriate.
+%be aware that this may change. Whoever takes over maintenance
+%of this module may change it as appropriate.
%
%The new maintainer should add the line:
%\begin{verbatim}
@@ -119,7 +119,7 @@
%\changes{1.0}{2015-03-29}{Initial release}
% Identify module
% \begin{macrocode}
-\ProvidesDateTimeModule{breton-utf8}[2018/03/19 v1.1]
+\ProvidesDateTimeModule{breton-utf8}[2019/11/05 v1.2]
% \end{macrocode}
%\begin{macro}{\DTMbretonordinal}
% \begin{macrocode}
@@ -198,7 +198,7 @@
%\changes{1.0}{2015-03-29}{Initial release}
% Identify module
% \begin{macrocode}
-\ProvidesDateTimeModule{breton-ascii}[2018/03/19 v1.1]
+\ProvidesDateTimeModule{breton-ascii}[2019/11/05 v1.2]
% \end{macrocode}
%
%If abbreviated dates are supported, short month names should be
@@ -273,7 +273,7 @@
%
% Identify Module
% \begin{macrocode}
-\ProvidesDateTimeModule{breton}[2018/03/19 v1.1]
+\ProvidesDateTimeModule{breton}[2019/11/05 v1.2]
% \end{macrocode}
% Need to find out if XeTeX or LuaTeX are being used.
% \begin{macrocode}
@@ -360,9 +360,10 @@
% \end{macrocode}
%
% Define a setting to change the ordinal suffix style.
+%\changes{1.2}{2019-11-05}{renamed scratch variables to avoid conflict}
% \begin{macrocode}
-\DTMdefchoicekey{breton}{ord}[\val\nr]{level,raise,omit,sc}{%
- \ifcase\nr\relax
+\DTMdefchoicekey{breton}{ord}[\@dtm@val\@dtm@nr]{level,raise,omit,sc}{%
+ \ifcase\@dtm@nr\relax
\renewcommand*{\DTMbretonfmtordsuffix}[1]{##1}%
\or
\renewcommand*{\DTMbretonfmtordsuffix}[1]{%
@@ -439,7 +440,7 @@
\DTMifbool{breton}{mapzone}%
{\DTMusezonemapordefault{##1}{##2}}%
{%
- \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
+ \ifnum##1<0 \else+\fi\DTMtwodigits{##1}%
\ifDTMshowzoneminutes\DTMbretontimesep\DTMtwodigits{##2}\fi
}%
}%
@@ -484,7 +485,7 @@
}%
{% time style
\renewcommand*\DTMdisplaytime[3]{%
- \number##1
+ \number##1 % space intended
\DTMbretontimesep\DTMtwodigits{##2}%
\ifDTMshowseconds\DTMbretontimesep\DTMtwodigits{##3}\fi
}%
@@ -496,7 +497,7 @@
\DTMifbool{breton}{mapzone}%
{\DTMusezonemapordefault{##1}{##2}}%
{%
- \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
+ \ifnum##1<0 \else+\fi\DTMtwodigits{##1}%
\ifDTMshowzoneminutes\DTMbretontimesep\DTMtwodigits{##2}\fi
}%
}%
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.ins b/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.ins
index 93da959d28..9ca510ba20 100644
--- a/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.ins
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.ins
@@ -3,7 +3,7 @@
\preamble
datetime2-breton.dtx
- Copyright 2018 Nicola Talbot
+ Copyright 2015-2019 Nicola Talbot
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.pdf b/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.pdf
index 55340962c1..3942e3f91c 100644
--- a/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.pdf
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-breton/datetime2-breton.pdf
Binary files differ
diff --git a/macros/latex/contrib/iftex/ann.txt b/macros/latex/contrib/iftex/ann.txt
deleted file mode 100644
index 9e153b59ab..0000000000
--- a/macros/latex/contrib/iftex/ann.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-** UPLOAD: iftex
-https://ctan.org/pkg/iftex
-
-New README will be uploaded, please change catalogue to say
-maintained by LaTeX Team
-Licence LPPL 1.3
-Bug Tracker: https://github.com/latex3/iftex/issues/
-Repository: https://github.com/latex3/iftex/
-
-** UPLOAD: oberdiek
-https://ctan.org/pkg/oberdiek
-This release will not distribute ifpdf.sty ifluatex.sty ifvtex.sty
-
-
-** DELETE ifxetex
-https://ctan.org/pkg/ifxetex
-Please change the catalogue to point to the iftex distribution (which will contain ifxetex.sty)
-and change maintainer and github links as for iftex above.
-
-Will Robertson is on LaTeX Team so aware of this.
-
-** DELETE ifetex
-https://ctan.org/pkg/ifetex
-Please change the catalogue to point to the iftex distribution (which will contain ifetex.sty)
-and change maintainer and github links as for iftex above.
-
-Martin Scharrer <martin.scharrer@web.de> has agreed to his version of ifetex being deleted
-
-> Hi David,
->
-> I always hated the fact that there where so many if..tex packages and I
-> am glad that you people rationalise them now.
->
-> Feel free to withdraw my package ifetex from CTAN.
->
-> Best Regards,
->
-> Martin
-
-** CATALOGUE Change ifpdf, ifluatex, ifvtex
-https://ctan.org/pkg/ifpdf
-https://ctan.org/pkg/ifluatex
-https://ctan.org/pkg/ifvtex
-Please change the catalog entries for these three so they point to iftex as above,
-not to the oberdiek bundle.
-
-
-** NO CHANGE
-Just to confirm ifptex and ifxptex packages are _not_ affected by this re-arrangement.
-
-
-
diff --git a/macros/latex/contrib/iftex/iftex.pdf b/macros/latex/contrib/iftex/iftex.pdf
index 426b5c4622..c46ce713ae 100644
--- a/macros/latex/contrib/iftex/iftex.pdf
+++ b/macros/latex/contrib/iftex/iftex.pdf
Binary files differ
diff --git a/macros/latex/contrib/iftex/iftex.sty b/macros/latex/contrib/iftex/iftex.sty
index feb5a75f8d..4c1923c2c1 100644
--- a/macros/latex/contrib/iftex/iftex.sty
+++ b/macros/latex/contrib/iftex/iftex.sty
@@ -16,7 +16,6 @@
%% ifptex Takayuki YATO
%% ifpdf Heiko Oberdiek and LaTeX3 Project
-
% Only load once (not needed in LaTeX, but does no harm).
\csname IFTEX\string @loaded\endcsname
\expandafter\let\csname IFTEX\string @loaded\endcsname\endinput
@@ -31,7 +30,7 @@
% ProvidesPackage declaration in LaTeX
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname ProvidesPackage\endcsname\relax\else
- \ProvidesPackage{iftex}[2019/10/24 v1.0a TeX engine tests]
+ \ProvidesPackage{iftex}[2019/11/04 v1.0b TeX engine tests]
\fi
% Save @ catcode, to restore at end, not needed in LaTeX.
@@ -108,6 +107,7 @@
\IFTEX@let{eTeX}{etex}
% pdftex (including in dvi mode)
+\IFTEX@let{IFTEX@savedpdftex}{pdftex}
\ifx\pdftexversion\@undefined
\IFTEX@let{pdftex}{false}
\else
@@ -173,6 +173,7 @@
\IFTEX@let{pTeXng}{ptexng}
% vtex
+\IFTEX@let{IFTEX@savedVTeX}{VTeX}
\ifx\VTeXversion\@undefined
\IFTEX@let{vtex}{false}
\else
@@ -227,5 +228,15 @@ end
}}
\fi
+
+% special compat for scrbase
+\ifx\scr@ifpdftex\@undefined\else\ifx\ifIFTEX@savedpdftex\relax\else
+ \IFTEX@let{pdftex}{IFTEX@savedpdftex}
+ \IFTEX@protected\def\RequirePDFTeX{\IFTEX@Require\ifPDFTeX{pdfTeX}\fi}
+\fi\fi
+\ifx\scr@ifVTeX\@undefined\else\ifx\ifIFTEX@savedVTeX\relax\else
+ \IFTEX@let{VTeX}{IFTEX@savedVTeX}
+\fi\fi
+
% restore things
\catcode64 \IFTEX@atcatcode
diff --git a/macros/luatex/generic/lualibs/NEWS b/macros/luatex/generic/lualibs/NEWS
index 66ee05e8cb..73e5961b3b 100644
--- a/macros/luatex/generic/lualibs/NEWS
+++ b/macros/luatex/generic/lualibs/NEWS
@@ -1,4 +1,7 @@
History of the lualibs package
+2019/10/29 v2.68/
+ * sync with Context current as of 2019/10/29
+
2019/08/11 v2.67/
* sync with Context current as of 2019/08/11
diff --git a/macros/luatex/generic/lualibs/README.md b/macros/luatex/generic/lualibs/README.md
index b89ca40fb7..d8a1b99167 100644
--- a/macros/luatex/generic/lualibs/README.md
+++ b/macros/luatex/generic/lualibs/README.md
@@ -1,8 +1,8 @@
# The Lualibs Package
-VERSION: 2.67
+VERSION: 2.68
-DATE: 2019-08-11
+DATE: 2019-11-05
Lualibs is a collection of Lua modules useful for general programming.
diff --git a/macros/luatex/generic/lualibs/lualibs-basic-merged.lua b/macros/luatex/generic/lualibs/lualibs-basic-merged.lua
index 0cb07cea2a..bee6c7de54 100644
--- a/macros/luatex/generic/lualibs/lualibs-basic-merged.lua
+++ b/macros/luatex/generic/lualibs/lualibs-basic-merged.lua
@@ -1,6 +1,6 @@
-- merged file : lualibs-basic-merged.lua
-- parent file : lualibs-basic.lua
--- merge date : Tue Aug 13 20:13:08 2019
+-- merge date : Tue Oct 29 16:47:31 2019
do -- begin closure to overcome local limits and interference
@@ -20,6 +20,9 @@ if LUAVERSION<5.2 and jit then
MINORVERSION=2
LUAVERSION=5.2
end
+if lua and lua.openfile then
+ io.open=lua.openfile
+end
if not lpeg then
lpeg=require("lpeg")
end
@@ -613,7 +616,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -3954,43 +3957,98 @@ if not modules then modules={} end modules ['l-gzip']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
-if not gzip then
- return
-end
-local suffix,suffixes=file.suffix,file.suffixes
-function gzip.load(filename)
- local f=io.open(filename,"rb")
- if not f then
- elseif suffix(filename)=="gz" then
- f:close()
- local g=gzip.open(filename,"rb")
- if g then
- local str=g:read("*all")
- g:close()
+if gzip then
+ local suffix,suffixes=file.suffix,file.suffixes
+ function gzip.load(filename)
+ local f=io.open(filename,"rb")
+ if not f then
+ elseif suffix(filename)=="gz" then
+ f:close()
+ local g=gzip.open(filename,"rb")
+ if g then
+ local str=g:read("*all")
+ g:close()
+ return str
+ end
+ else
+ local str=f:read("*all")
+ f:close()
return str
end
- else
- local str=f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename)~="gz" then
- filename=filename..".gz"
+ function gzip.save(filename,data)
+ if suffix(filename)~="gz" then
+ filename=filename..".gz"
+ end
+ local f=io.open(filename,"wb")
+ if f then
+ local s=zlib.compress(data or "",9,nil,15+16)
+ f:write(s)
+ f:close()
+ return #s
+ end
end
- local f=io.open(filename,"wb")
- if f then
- local s=zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+ function gzip.suffix(filename)
+ local suffix,extra=suffixes(filename)
+ local gzipped=extra=="gz"
+ return suffix,gzipped
end
+else
end
-function gzip.suffix(filename)
- local suffix,extra=suffixes(filename)
- local gzipped=extra=="gz"
- return suffix,gzipped
+if flate then
+ local type=type
+ local find=string.find
+ local compress=flate.gz_compress
+ local decompress=flate.gz_decompress
+ local absmax=128*1024*1024
+ local initial=64*1024
+ local identifier="^\x1F\x8B\x08"
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then
+ if not level then
+ level=3
+ elseif level<=0 then
+ return s
+ elseif level>9 then
+ level=9
+ end
+ return compress(s,level) or s
+ end
+ end
+ function gzip.decompress(s,size,iterate)
+ if s and find(s,identifier) then
+ if type(size)~="number" then
+ size=initial
+ end
+ if size>absmax then
+ size=absmax
+ end
+ if type(iterate)=="number" then
+ max=size*iterate
+ elseif iterate==nil or iterate==true then
+ iterate=true
+ max=absmax
+ end
+ if max>absmax then
+ max=absmax
+ end
+ while true do
+ local d=decompress(s,size)
+ if d then
+ return d
+ end
+ size=2*size
+ if not iterate or size>max then
+ return false
+ end
+ end
+ else
+ return s
+ end
+ end
end
end -- closure
@@ -5097,49 +5155,52 @@ end
function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b<0x10000 then
- return char(b%256,rshift(b,8))
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+ local rshift=bit32.rshift
+ local function little(b)
+ if b<0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b<0x10000 then
- return char(rshift(b,8),b%256)
- else
- b=b-0x10000
- local b1=rshift(b,10)+0xD800
- local b2=b%1024+0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b<0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b=b-0x10000
+ local b1=rshift(b,10)+0xD800
+ local b2=b%1024+0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255)..lpegmatch(b_remap,str)
+ local l_remap=Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap=Cs((p_utf8byte/big+P(1)/"")^0)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255)..lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254)..lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254)..lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be=utf8_to_utf16_be
-utf.utf8_to_utf16_le=utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ utf.utf8_to_utf16_be=utf8_to_utf16_be
+ utf.utf8_to_utf16_le=utf8_to_utf16_le
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
end
local pattern=Cs (
diff --git a/macros/luatex/generic/lualibs/lualibs-extended-merged.lua b/macros/luatex/generic/lualibs/lualibs-extended-merged.lua
index b3fecf2c3e..c2502401af 100644
--- a/macros/luatex/generic/lualibs/lualibs-extended-merged.lua
+++ b/macros/luatex/generic/lualibs/lualibs-extended-merged.lua
@@ -1,6 +1,6 @@
-- merged file : lualibs-extended-merged.lua
-- parent file : lualibs-extended.lua
--- merge date : Tue Aug 13 20:12:59 2019
+-- merge date : Tue Oct 29 16:47:22 2019
do -- begin closure to overcome local limits and interference
@@ -366,7 +366,7 @@ local environment={
stripzero=patterns.stripzero,
stripzeros=patterns.stripzeros,
escapedquotes=string.escapedquotes,
- FORMAT=string.f9,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -574,12 +574,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -1416,7 +1429,21 @@ function table.fastserialize(t,prefix)
m=m+1
r[m]="{"
if n>0 then
- for i=0,n do
+ local v=t[0]
+ if v then
+ local tv=type(v)
+ if tv=="string" then
+ m=m+1 r[m]=f_indexed_string(0,v)
+ elseif tv=="number" then
+ m=m+1 r[m]=f_indexed_number(0,v)
+ elseif tv=="table" then
+ m=m+1 r[m]=f_indexed_table(0)
+ fastserialize(v)
+ elseif tv=="boolean" then
+ m=m+1 r[m]=f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
local v=t[i]
local tv=type(v)
if tv=="string" then
@@ -3377,6 +3404,11 @@ luautilities.nofstrippedchunks=0
luautilities.nofstrippedbytes=0
local strippedchunks={}
luautilities.strippedchunks=strippedchunks
+if not LUATEXENGINE then
+ LUATEXENGINE=status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED=LUATEXENGINE=="luajittex" or jit
+ CONTEXTLMTXMODE=CONTEXTLMTXMODE or (LUATEXENGINE=="luametatex" and 1) or 0
+end
luautilities.suffixes={
tma="tma",
tmc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tmd") or (jit and "tmb") or "tmc",
@@ -3386,7 +3418,7 @@ luautilities.suffixes={
luv="luv",
luj="luj",
tua="tua",
- tuc="tuc",
+ tuc=(CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 and "tud") or (jit and "tub") or "tuc",
}
local function register(name)
if tracestripping then
@@ -3833,6 +3865,7 @@ local report_template=logs.reporter("template")
local tostring,next=tostring,next
local format,sub,byte=string.format,string.sub,string.byte
local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns
+local formatters=string.formatters
local replacer
local function replacekey(k,t,how,recursive)
local v=t[k]
@@ -3901,6 +3934,10 @@ local function replaceoptional(l,m,r,t,how,recurse)
local v=t[l]
return v and v~="" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v=t[r]
+ return v and formatters[l](v)
+end
local single=P("%")
local double=P("%%")
local lquoted=P("%[")
@@ -3914,16 +3951,19 @@ local nolquoted=lquoted/''
local norquoted=rquoted/''
local nolquotedq=lquotedq/''
local norquotedq=rquotedq/''
+local nolformatted=P(":")/"%%"
+local norformatted=P(":")/""
local noloptional=P("%?")/''
local noroptional=P("?%")/''
local nomoptional=P(":")/''
local args=Carg(1)*Carg(2)*Carg(3)
-local key=nosingle*((C((1-nosingle )^1)*args)/replacekey )*nosingle
-local quoted=nolquotedq*((C((1-norquotedq )^1)*args)/replacekeyquoted )*norquotedq
-local unquoted=nolquoted*((C((1-norquoted )^1)*args)/replacekeyunquoted)*norquoted
+local key=nosingle*((C((1-nosingle)^1)*args)/replacekey)*nosingle
+local quoted=nolquotedq*((C((1-norquotedq)^1)*args)/replacekeyquoted)*norquotedq
+local unquoted=nolquoted*((C((1-norquoted)^1)*args)/replacekeyunquoted)*norquoted
local optional=noloptional*((C((1-nomoptional)^1)*nomoptional*C((1-noroptional)^1)*args)/replaceoptional)*noroptional
+local formatted=nosingle*((Cs(nolformatted*(1-norformatted )^1)*norformatted*C((1-nosingle)^1)*args)/replaceformatted)*nosingle
local any=P(1)
- replacer=Cs((unquoted+quoted+escape+optional+key+any)^0)
+ replacer=Cs((unquoted+quoted+formatted+escape+optional+key+any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
return lpegmatch(replacer,str,1,mapping,how or "lua",recurse or false) or str
diff --git a/macros/luatex/generic/lualibs/lualibs-gzip.lua b/macros/luatex/generic/lualibs/lualibs-gzip.lua
index 5100e47222..31466bde8f 100644
--- a/macros/luatex/generic/lualibs/lualibs-gzip.lua
+++ b/macros/luatex/generic/lualibs/lualibs-gzip.lua
@@ -5,50 +5,113 @@ if not modules then modules = { } end modules ['l-gzip'] = {
license = "see context related readme files"
}
-if not gzip then
+if gzip then
- -- no fallback yet
+ local suffix, suffixes = file.suffix, file.suffixes
- return
-
-end
-
-local suffix, suffixes = file.suffix, file.suffixes
-
-function gzip.load(filename)
- local f = io.open(filename,"rb")
- if not f then
- -- invalid file
- elseif suffix(filename) == "gz" then
- f:close()
- local g = gzip.open(filename,"rb")
- if g then
- local str = g:read("*all")
- g:close()
+ function gzip.load(filename)
+ local f = io.open(filename,"rb")
+ if not f then
+ -- invalid file
+ elseif suffix(filename) == "gz" then
+ f:close()
+ local g = gzip.open(filename,"rb")
+ if g then
+ local str = g:read("*all")
+ g:close()
+ return str
+ end
+ else
+ local str = f:read("*all")
+ f:close()
return str
end
- else
- local str = f:read("*all")
- f:close()
- return str
end
-end
-function gzip.save(filename,data)
- if suffix(filename) ~= "gz" then
- filename = filename .. ".gz"
+ function gzip.save(filename,data)
+ if suffix(filename) ~= "gz" then
+ filename = filename .. ".gz"
+ end
+ local f = io.open(filename,"wb")
+ if f then
+ local s = zlib.compress(data or "",9,nil,15+16)
+ f:write(s)
+ f:close()
+ return #s
+ end
end
- local f = io.open(filename,"wb")
- if f then
- local s = zlib.compress(data or "",9,nil,15+16)
- f:write(s)
- f:close()
- return #s
+
+ function gzip.suffix(filename)
+ local suffix, extra = suffixes(filename)
+ local gzipped = extra == "gz"
+ return suffix, gzipped
end
+
+else
+
+ -- todo: fallback on flate
+
end
-function gzip.suffix(filename)
- local suffix, extra = suffixes(filename)
- local gzipped = extra == "gz"
- return suffix, gzipped
+if flate then
+
+ local type = type
+ local find = string.find
+
+ local compress = flate.gz_compress
+ local decompress = flate.gz_decompress
+
+ local absmax = 128*1024*1024
+ local initial = 64*1024
+ local identifier = "^\x1F\x8B\x08"
+
+ function gzip.compressed(s)
+ return s and find(s,identifier)
+ end
+
+ function gzip.compress(s,level)
+ if s and not find(s,identifier) then -- the find check might go away
+ if not level then
+ level = 3
+ elseif level <= 0 then
+ return s
+ elseif level > 9 then
+ level = 9
+ end
+ return compress(s,level) or s
+ end
+ end
+
+ function gzip.decompress(s,size,iterate)
+ if s and find(s,identifier) then
+ if type(size) ~= "number" then
+ size = initial
+ end
+ if size > absmax then
+ size = absmax
+ end
+ if type(iterate) == "number" then
+ max = size * iterate
+ elseif iterate == nil or iterate == true then
+ iterate = true
+ max = absmax
+ end
+ if max > absmax then
+ max = absmax
+ end
+ while true do
+ local d = decompress(s,size)
+ if d then
+ return d
+ end
+ size = 2 * size
+ if not iterate or size > max then
+ return false
+ end
+ end
+ else
+ return s
+ end
+ end
+
end
diff --git a/macros/luatex/generic/lualibs/lualibs-lpeg.lua b/macros/luatex/generic/lualibs/lualibs-lpeg.lua
index 51bc1d3df3..7979a40fb9 100644
--- a/macros/luatex/generic/lualibs/lualibs-lpeg.lua
+++ b/macros/luatex/generic/lualibs/lualibs-lpeg.lua
@@ -295,7 +295,7 @@ patterns.longtostring = Cs(whitespace^0/"" * ((patterns.quoted + nonwhitespace^
-- return P { P(pattern) + 1 * V(1) }
-- end
-function anywhere(pattern) -- faster
+local function anywhere(pattern) -- faster
return (1-P(pattern))^0 * P(pattern)
end
diff --git a/macros/luatex/generic/lualibs/lualibs-lua.lua b/macros/luatex/generic/lualibs/lualibs-lua.lua
index 6e9606e849..51399216cc 100644
--- a/macros/luatex/generic/lualibs/lualibs-lua.lua
+++ b/macros/luatex/generic/lualibs/lualibs-lua.lua
@@ -35,6 +35,12 @@ if LUAVERSION < 5.2 and jit then
LUAVERSION = 5.2
end
+-- this is lmtx only:
+
+if lua and lua.openfile then
+ io.open = lua.openfile
+end
+
-- lpeg
if not lpeg then
diff --git a/macros/luatex/generic/lualibs/lualibs-table.lua b/macros/luatex/generic/lualibs/lualibs-table.lua
index cffdcc23e2..e828203867 100644
--- a/macros/luatex/generic/lualibs/lualibs-table.lua
+++ b/macros/luatex/generic/lualibs/lualibs-table.lua
@@ -287,6 +287,37 @@ local function sortedhash(t,cmp)
return nothing
end
+-- local function iterate(t,i)
+-- local i = i + 1
+-- if i <= t.n then
+-- local k = t[i]
+-- return i, k, t.t[k]
+-- end
+-- end
+--
+-- local function indexedhash(t,cmp)
+-- if t then
+-- local s
+-- if cmp then
+-- -- it would be nice if the sort function would accept a third argument (or nicer, an optional first)
+-- s = sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+-- else
+-- s = sortedkeys(t) -- the robust one
+-- end
+-- local m = #s
+-- if m == 1 then
+-- return next, t
+-- elseif m > 0 then
+-- s.n = m
+-- s.t = t
+-- return iterate, s, 0
+-- end
+-- end
+-- return nothing
+-- end
+--
+-- -- for i, k, v in indexedhash(t) do print(k,v,s) end
+
table.sortedhash = sortedhash
table.sortedpairs = sortedhash -- obsolete
diff --git a/macros/luatex/generic/lualibs/lualibs-unicode.lua b/macros/luatex/generic/lualibs/lualibs-unicode.lua
index 73d1eb7660..2708d14760 100644
--- a/macros/luatex/generic/lualibs/lualibs-unicode.lua
+++ b/macros/luatex/generic/lualibs/lualibs-unicode.lua
@@ -1081,56 +1081,62 @@ function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b < 0x10000 then
- return char(b%256,rshift(b,8))
- else
- b = b - 0x10000
- local b1 = rshift(b,10) + 0xD800
- local b2 = b%1024 + 0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+
+ local rshift = bit32.rshift
+
+ local function little(b)
+ if b < 0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b = b - 0x10000
+ local b1 = rshift(b,10) + 0xD800
+ local b2 = b%1024 + 0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b < 0x10000 then
- return char(rshift(b,8),b%256)
- else
- b = b - 0x10000
- local b1 = rshift(b,10) + 0xD800
- local b2 = b%1024 + 0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b < 0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b = b - 0x10000
+ local b1 = rshift(b,10) + 0xD800
+ local b2 = b%1024 + 0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap = Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap = Cs((p_utf8byte/big +P(1)/"")^0)
+ local l_remap = Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap = Cs((p_utf8byte/big +P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255) .. lpegmatch(b_remap,str)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255) .. lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254) .. lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254) .. lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be = utf8_to_utf16_be
-utf.utf8_to_utf16_le = utf8_to_utf16_le
+ utf.utf8_to_utf16_be = utf8_to_utf16_be
+ utf.utf8_to_utf16_le = utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
+
end
local pattern = Cs (
diff --git a/macros/luatex/generic/lualibs/lualibs-util-lua.lua b/macros/luatex/generic/lualibs/lualibs-util-lua.lua
index f7e6e4f313..fb4088e7b6 100644
--- a/macros/luatex/generic/lualibs/lualibs-util-lua.lua
+++ b/macros/luatex/generic/lualibs/lualibs-util-lua.lua
@@ -28,6 +28,13 @@ luautilities.nofstrippedbytes = 0
local strippedchunks = { } -- allocate()
luautilities.strippedchunks = strippedchunks
+if not LUATEXENGINE then
+ --- probably mtxrun ...
+ LUATEXENGINE = status.luatex_engine and string.lower(status.luatex_engine)
+ JITSUPPORTED = LUATEXENGINE == "luajittex" or jit
+ CONTEXTLMTXMODE = CONTEXTLMTXMODE or (LUATEXENGINE == "luametatex" and 1) or 0
+end
+
luautilities.suffixes = {
tma = "tma",
tmc = (CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 and "tmd") or (jit and "tmb") or "tmc",
@@ -37,7 +44,8 @@ luautilities.suffixes = {
luv = "luv",
luj = "luj",
tua = "tua",
- tuc = "tuc",
+ -- tuc = "tuc",
+ tuc = (CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 and "tud") or (jit and "tub") or "tuc",
}
-- environment.loadpreprocessedfile can be set to a preprocessor
diff --git a/macros/luatex/generic/lualibs/lualibs-util-str.lua b/macros/luatex/generic/lualibs/lualibs-util-str.lua
index ad22302df0..432b39ec5a 100644
--- a/macros/luatex/generic/lualibs/lualibs-util-str.lua
+++ b/macros/luatex/generic/lualibs/lualibs-util-str.lua
@@ -633,7 +633,7 @@ local environment = {
stripzeros = patterns.stripzeros,
escapedquotes = string.escapedquotes,
- FORMAT = string.f9,
+ FORMAT = string.f6,
}
-- -- --
@@ -908,7 +908,7 @@ local format_L = function()
return format("(a%s and 'TRUE' or 'FALSE')",n)
end
-local format_n = function() -- strips leading and trailing zeros and removes .0
+local format_n = function() -- strips leading and trailing zeros and removes .0, beware: can produce e notation
n = n + 1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
@@ -938,13 +938,30 @@ end
-- end
-- end
-local format_N = function(f) -- strips leading and trailing zeros
- n = n + 1
- -- stripzero (singular) as we only have a number
- if not f or f == "" then
- f = ".9"
- end -- always a leading number !
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+
+ format_N = function(f)
+ n = n + 1
+ if not f or f == "" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f == ".6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+
+else
+
+ format_N = function(f) -- strips leading and trailing zeros
+ n = n + 1
+ -- stripzero (singular) as we only have a number
+ if not f or f == "" then
+ f = ".9"
+ end -- always a leading number !
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
+
end
local format_a = function(f)
diff --git a/macros/luatex/generic/lualibs/lualibs-util-tab.lua b/macros/luatex/generic/lualibs/lualibs-util-tab.lua
index f970d8ace0..410292ca8a 100644
--- a/macros/luatex/generic/lualibs/lualibs-util-tab.lua
+++ b/macros/luatex/generic/lualibs/lualibs-util-tab.lua
@@ -341,7 +341,21 @@ function table.fastserialize(t,prefix) -- todo, move local function out
m = m + 1
r[m] = "{"
if n > 0 then
- for i=0,n do
+ local v = t[0]
+ if v then
+ local tv = type(v)
+ if tv == "string" then
+ m = m + 1 r[m] = f_indexed_string(0,v)
+ elseif tv == "number" then
+ m = m + 1 r[m] = f_indexed_number(0,v)
+ elseif tv == "table" then
+ m = m + 1 r[m] = f_indexed_table(0)
+ fastserialize(v)
+ elseif tv == "boolean" then
+ m = m + 1 r[m] = f_indexed_boolean(0,v)
+ end
+ end
+ for i=1,n do
local v = t[i]
local tv = type(v)
if tv == "string" then
@@ -355,6 +369,8 @@ function table.fastserialize(t,prefix) -- todo, move local function out
end
end
end
+ -- hm, can't we avoid this ... lua should have a way to check if there
+ -- is a hash part
for k, v in next, t do
local tk = type(k)
if tk == "number" then
@@ -411,7 +427,7 @@ function table.deserialize(str)
return code
end
--- inspect(table.fastserialize { a = 1, b = { 4, { 5, 6 } }, c = { d = 7, e = 'f"g\nh' } })
+-- inspect(table.fastserialize { a = 1, b = { [0]=4, { 5, 6 } }, c = { d = 7, e = 'f"g\nh' } })
function table.load(filename,loader)
if filename then
diff --git a/macros/luatex/generic/lualibs/lualibs-util-tpl.lua b/macros/luatex/generic/lualibs/lualibs-util-tpl.lua
index 57d7df3a91..318f2efc3b 100644
--- a/macros/luatex/generic/lualibs/lualibs-util-tpl.lua
+++ b/macros/luatex/generic/lualibs/lualibs-util-tpl.lua
@@ -20,6 +20,8 @@ local tostring, next = tostring, next
local format, sub, byte = string.format, string.sub, string.byte
local P, C, R, Cs, Cc, Carg, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.R, lpeg.Cs, lpeg.Cc, lpeg.Carg, lpeg.match, lpeg.patterns
+local formatters = string.formatters
+
-- todo: make installable template.new
local replacer
@@ -133,34 +135,42 @@ local function replaceoptional(l,m,r,t,how,recurse)
return v and v ~= "" and lpegmatch(replacer,r,1,t,how or "lua",recurse or false) or ""
end
-local single = P("%") -- test %test% test : resolves test
-local double = P("%%") -- test 10%% test : %% becomes %
-local lquoted = P("%[") -- test '%[test]%' test : resolves to test with escaped "'s
-local rquoted = P("]%") --
-local lquotedq = P("%(") -- test %(test)% test : resolves to 'test' with escaped "'s
-local rquotedq = P(")%") --
-
-local escape = double / '%%'
-local nosingle = single / ''
-local nodouble = double / ''
-local nolquoted = lquoted / ''
-local norquoted = rquoted / ''
-local nolquotedq = lquotedq / ''
-local norquotedq = rquotedq / ''
-
-local noloptional = P("%?") / ''
-local noroptional = P("?%") / ''
-local nomoptional = P(":") / ''
-
-
-local args = Carg(1) * Carg(2) * Carg(3)
-local key = nosingle * ((C((1-nosingle )^1) * args) / replacekey ) * nosingle
-local quoted = nolquotedq * ((C((1-norquotedq )^1) * args) / replacekeyquoted ) * norquotedq
-local unquoted = nolquoted * ((C((1-norquoted )^1) * args) / replacekeyunquoted) * norquoted
-local optional = noloptional * ((C((1-nomoptional)^1) * nomoptional * C((1-noroptional)^1) * args) / replaceoptional) * noroptional
-local any = P(1)
+local function replaceformatted(l,m,r,t,how,recurse)
+ local v = t[r]
+ return v and formatters[l](v)
+end
- replacer = Cs((unquoted + quoted + escape + optional + key + any)^0)
+local single = P("%") -- test %test% test : resolves test
+local double = P("%%") -- test 10%% test : %% becomes %
+local lquoted = P("%[") -- test '%[test]%' test : resolves to test with escaped "'s
+local rquoted = P("]%") --
+local lquotedq = P("%(") -- test %(test)% test : resolves to 'test' with escaped "'s
+local rquotedq = P(")%") --
+
+local escape = double / '%%'
+local nosingle = single / ''
+local nodouble = double / ''
+local nolquoted = lquoted / ''
+local norquoted = rquoted / ''
+local nolquotedq = lquotedq / ''
+local norquotedq = rquotedq / ''
+
+local nolformatted = P(":") / "%%"
+local norformatted = P(":") / ""
+
+local noloptional = P("%?") / ''
+local noroptional = P("?%") / ''
+local nomoptional = P(":") / ''
+
+local args = Carg(1) * Carg(2) * Carg(3)
+local key = nosingle * ((C((1-nosingle)^1) * args) / replacekey) * nosingle
+local quoted = nolquotedq * ((C((1-norquotedq)^1) * args) / replacekeyquoted) * norquotedq
+local unquoted = nolquoted * ((C((1-norquoted)^1) * args) / replacekeyunquoted) * norquoted
+local optional = noloptional * ((C((1-nomoptional)^1) * nomoptional * C((1-noroptional)^1) * args) / replaceoptional) * noroptional
+local formatted = nosingle * ((Cs(nolformatted * (1-norformatted )^1) * norformatted * C((1-nosingle)^1) * args) / replaceformatted) * nosingle
+local any = P(1)
+
+ replacer = Cs((unquoted + quoted + formatted + escape + optional + key + any)^0)
local function replace(str,mapping,how,recurse)
if mapping and str then
@@ -179,6 +189,8 @@ end
-- print(replace([[test %[x]% test]],{ x = [[a "x"  a]]}))
-- print(replace([[test %(x)% test]],{ x = [[a "x"  a]]}))
-- print(replace([[convert %?x: -x "%x%" ?% %?y: -y "%y%" ?%]],{ x = "yes" }))
+-- print(replace("test %:0.3N:x% test",{ x = 123.45 }))
+-- print(replace("test %:0.3N:x% test",{ x = 12345 }))
templates.replace = replace
diff --git a/macros/luatex/generic/lualibs/lualibs.dtx b/macros/luatex/generic/lualibs/lualibs.dtx
index 8c302400f1..f5ae0342ac 100644
--- a/macros/luatex/generic/lualibs/lualibs.dtx
+++ b/macros/luatex/generic/lualibs/lualibs.dtx
@@ -37,7 +37,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: lualibs 2019-08-11 v2.67 Lua additional functions.}
+\Msg{* Package: lualibs 2019-11-05 v2.68 Lua additional functions.}
\Msg{************************************************************************}
\keepsilent
@@ -107,7 +107,7 @@ and lualibs-extended.lua.
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{lualibs.drv}
- [2019/08/11 v2.67 Lua Libraries.]
+ [2019/11/05 v2.68 Lua Libraries.]
\documentclass{ltxdoc}
\usepackage{fancyvrb,xspace}
\usepackage[x11names]{xcolor}
@@ -208,7 +208,7 @@ and lualibs-extended.lua.
% \GetFileInfo{lualibs.drv}
%
% \title{The \identifier{lualibs} package}
-% \date{2019/08/11 v2.67}
+% \date{2019/11/05 v2.68}
% \author{Élie Roux · \email{elie.roux@telecom-bretagne.eu}\\
% Philipp Gesang · \email{phg@phi-gamma.net}\\
% Ulrike Fischer · \email{fischer@troubleshooting-tex.de}\\
@@ -429,8 +429,8 @@ lualibs = lualibs or { }
lualibs.module_info = {
name = "lualibs",
- version = "2.67", --TAGVERSION
- date = "2019-08-11", --TAGDATE
+ version = "2.68", --TAGVERSION
+ date = "2019-11-05", --TAGDATE
description = "ConTeXt Lua standard libraries.",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL & Elie Roux & Philipp Gesang",
copyright = "PRAGMA ADE / ConTeXt Development Team",
@@ -583,8 +583,8 @@ local loadmodule = lualibs.loadmodule
local lualibs_basic_module = {
name = "lualibs-basic",
- version = "2.67", --TAGVERSION
- date = "2019-08-11", --TAGDATE
+ version = "2.68", --TAGVERSION
+ date = "2019-11-05", --TAGDATE
description = "ConTeXt Lua libraries -- basic collection.",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL & Elie Roux & Philipp Gesang",
copyright = "PRAGMA ADE / ConTeXt Development Team",
@@ -665,8 +665,8 @@ lualibs = lualibs or { }
local lualibs_extended_module = {
name = "lualibs-extended",
- version = "2.67", --TAGVERSION
- date = "2019-08-11", --TAGDATE
+ version = "2.68", --TAGVERSION
+ date = "2019-11-05", --TAGDATE
description = "ConTeXt Lua libraries -- extended collection.",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL & Elie Roux & Philipp Gesang",
copyright = "PRAGMA ADE / ConTeXt Development Team",
diff --git a/macros/luatex/generic/lualibs/lualibs.pdf b/macros/luatex/generic/lualibs/lualibs.pdf
index ad1ee3061b..08716de05a 100644
--- a/macros/luatex/generic/lualibs/lualibs.pdf
+++ b/macros/luatex/generic/lualibs/lualibs.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/NEWS b/macros/luatex/generic/luaotfload/NEWS
index 39bfcc4cc3..86b9dd9b2d 100644
--- a/macros/luatex/generic/luaotfload/NEWS
+++ b/macros/luatex/generic/luaotfload/NEWS
@@ -1,5 +1,12 @@
Change History
--------------
+2019-11-04 luaotfload v3.1
+ * added code to use the harfbuzz library of luahbtex ("mode=harf")
+ * fonts in ttc can now be indexed by name
+ * remove a number of lua tables from the global enviroment (_G) to reduce the polution.
+ Kept there are only the tables luaotfload, fonts and nodes.
+ * sync with context files from 2019-10-29
+
2019-09-13 luaotfload v3.0
* invisible option to avoid that some glyph are shown (issue #63)
* correct small bug in xheight calculation
diff --git a/macros/luatex/generic/luaotfload/README.md b/macros/luatex/generic/luaotfload/README.md
index a6f24d4ab9..ca760b1bab 100644
--- a/macros/luatex/generic/luaotfload/README.md
+++ b/macros/luatex/generic/luaotfload/README.md
@@ -1,8 +1,8 @@
# The Luaotfload Package
-VERSION: 3.00
+VERSION: 3.1
-DATE: 2019-09-13
+DATE: 2019-11-04
## Description
diff --git a/macros/luatex/generic/luaotfload/filegraph.pdf b/macros/luatex/generic/luaotfload/filegraph.pdf
index a14afaa169..95b296c599 100644
--- a/macros/luatex/generic/luaotfload/filegraph.pdf
+++ b/macros/luatex/generic/luaotfload/filegraph.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/fontloader-2019-08-11.lua b/macros/luatex/generic/luaotfload/fontloader-2019-10-29.lua
index b4d3f3ce12..dc98bd5696 100644
--- a/macros/luatex/generic/luaotfload/fontloader-2019-08-11.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-2019-10-29.lua
@@ -1,6 +1,6 @@
--[[info-----------------------------------------------------------------------
Luaotfload fontloader package
- build 2019-08-13 18:34:34
+ build 2019-10-29 22:02:47
-------------------------------------------------------------------------------
© 2019 PRAGMA ADE / ConTeXt Development Team
@@ -62,7 +62,7 @@
--info]]-----------------------------------------------------------------------
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “data-con” 7ce546725b1550f655c78ac9d69419ca] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “data-con” 7ce546725b1550f655c78ac9d69419ca] ---
if not modules then modules={} end modules ['data-con']={
version=1.100,
@@ -174,10 +174,10 @@ function containers.cleanname(name)
return (gsub(lower(name),"[^%w\128-\255]+","-"))
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “data-con”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “data-con”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “basics-nod” 65064d03c2650a1761ee13ebd9e1400a] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “basics-nod” c05f47077c709bbf12a8758852dc4e06] ---
if not modules then modules={} end modules ['luatex-fonts-nod']={
version=1.001,
@@ -247,6 +247,7 @@ nuts.getchar=direct.getchar
nuts.getcomponents=direct.getcomponents
nuts.getdirection=direct.getdirection
nuts.getdisc=direct.getdisc
+nuts.getreplace=direct.getreplace
nuts.getfield=direct.getfield
nuts.getfont=direct.getfont
nuts.getid=direct.getid
@@ -263,6 +264,7 @@ nuts.setchar=direct.setchar
nuts.setcomponents=direct.setcomponents
nuts.setdirection=direct.setdirection
nuts.setdisc=direct.setdisc
+nuts.setreplace=direct.setreplace
nuts.setfield=setfield
nuts.setkern=direct.setkern
nuts.setlink=direct.setlink
@@ -380,11 +382,22 @@ do
node=nuts.traverse(dummy),
}
end
+if not nuts.setreplace then
+ local getdisc=nuts.getdisc
+ local setfield=nuts.setfield
+ function nuts.getreplace(n)
+ local _,_,h,_,_,t=getdisc(n,true)
+ return h,t
+ end
+ function nuts.setreplace(n,h)
+ setfield(n,"replace",h)
+ end
+end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “basics-nod”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “basics-nod”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “basics-chr” 58b7ef0c486e06090b362971b9f85e27] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “basics-chr” 58b7ef0c486e06090b362971b9f85e27] ---
characters=characters or {}
@@ -3994,10 +4007,10 @@ characters.indicgroups={
},
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “basics-chr”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “basics-chr”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ini” 4299a02110bbd7c0d27e131235c5319d] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ini” 4299a02110bbd7c0d27e131235c5319d] ---
if not modules then modules={} end modules ['font-ini']={
version=1.001,
@@ -4035,10 +4048,10 @@ fonts.privateoffsets={
keepnames=false,
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ini”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ini”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-mis” bc9eb43c27f63ce9d0fff67e104fe1c6] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-mis” bc9eb43c27f63ce9d0fff67e104fe1c6] ---
if not modules then modules={} end modules ['luatex-font-mis']={
version=1.001,
@@ -4070,10 +4083,10 @@ function font.each()
return table.sortedhash(fonts.hashes.identifiers)
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-mis”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-mis”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-con” ca733211a0555d9a93b1e2f7ebc937d3] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-con” 8b35e7c2203d5b57c61942e07cee2c0a] ---
if not modules then modules={} end modules ['font-con']={
version=1.001,
@@ -4376,7 +4389,8 @@ function constructors.scale(tfmdata,specification)
local units=parameters.units or 1000
targetproperties.language=properties.language or "dflt"
targetproperties.script=properties.script or "dflt"
- targetproperties.mode=properties.mode or "base"
+ targetproperties.mode=properties.mode or "base"
+ targetproperties.method=properties.method
local askedscaledpoints=scaledpoints
local scaledpoints,delta=constructors.calculatescale(tfmdata,scaledpoints,nil,specification)
local hdelta=delta
@@ -5416,10 +5430,10 @@ function constructors.addcoreunicodes(unicodes)
return unicodes
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-con”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-con”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-enc” 3e71a54297e8f85a1ac438bb0f20dd79] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-enc” 3e71a54297e8f85a1ac438bb0f20dd79] ---
if not modules then modules={} end modules ['luatex-font-enc']={
version=1.001,
@@ -5488,10 +5502,10 @@ function encodings.load(filename)
return containers.write(encodings.cache,name,data)
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-enc”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-enc”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-cid” 4d87988efa86020a14708ee03c23415f] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-cid” 4d87988efa86020a14708ee03c23415f] ---
if not modules then modules={} end modules ['font-cid']={
version=1.001,
@@ -5642,10 +5656,10 @@ function cid.getmap(specification)
return found
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-cid”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-cid”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-map” f486746e90fe972de4b73e208ac7cbb2] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-map” f486746e90fe972de4b73e208ac7cbb2] ---
if not modules then modules={} end modules ['font-map']={
version=1.001,
@@ -6033,10 +6047,10 @@ function mappings.addtounicode(data,filename,checklookups,forceligatures)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-map”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-map”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-vfc” 94937140f2c909e9c831ba021f1ab303] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-vfc” 94937140f2c909e9c831ba021f1ab303] ---
if not modules then modules={} end modules ['font-vfc']={
version=1.001,
@@ -6134,10 +6148,10 @@ helpers.commands=utilities.storage.allocate {
dummy=dummy,
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-vfc”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-vfc”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-otr” b1c03925c949027c86f781785fa7a208] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-otr” b1c03925c949027c86f781785fa7a208] ---
if not modules then modules={} end modules ['font-otr']={
version=1.001,
@@ -7987,10 +8001,10 @@ function readers.extend(fontdata)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-otr”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-otr”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-oti” dbae7722baae24d917a17176553825cf] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-oti” dbae7722baae24d917a17176553825cf] ---
if not modules then modules={} end modules ['font-oti']={
version=1.001,
@@ -8133,10 +8147,10 @@ function otffeatures.checkeddefaultlanguage(featuretype,autolanguage,languages)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-oti”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-oti”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ott” aba6d8335a5f38a5a62d3631492f3392] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ott” aba6d8335a5f38a5a62d3631492f3392] ---
if not modules then modules={} end modules ["font-ott"]={
version=1.001,
@@ -9255,10 +9269,10 @@ function otffeatures.normalize(features,wrap)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ott”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ott”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-cff” 98d5a660ea803b65cb883c009ecf3c0b] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-cff” 98d5a660ea803b65cb883c009ecf3c0b] ---
if not modules then modules={} end modules ['font-cff']={
version=1.001,
@@ -11282,10 +11296,10 @@ function readers.cffcheck(filename)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-cff”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-cff”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ttf” 44e61cef50dab9b1aaf48130f9367c34] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ttf” 44e61cef50dab9b1aaf48130f9367c34] ---
if not modules then modules={} end modules ['font-ttf']={
version=1.001,
@@ -12455,10 +12469,10 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ttf”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ttf”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-dsp” b5bf2f1c198e027a0d4ededcdf3947b4] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-dsp” 5d3db0184c903829b2c5bddcb8cdb14c] ---
if not modules then modules={} end modules ['font-dsp']={
version=1.001,
@@ -15092,6 +15106,8 @@ function readers.cpal(f,fontdata,specification)
fontdata.colorpalettes=palettes
end
end
+local compress=gzip and gzip.compress
+local compressed=compress and gzip.compressed
function readers.svg(f,fontdata,specification)
local tableoffset=gotodatatable(f,fontdata,"svg",specification.glyphs)
if tableoffset then
@@ -15113,10 +15129,14 @@ function readers.svg(f,fontdata,specification)
for i=1,nofentries do
local entry=entries[i]
setposition(f,entry.offset)
+ local data=readstring(f,entry.length)
+ if compressed and not compressed(data) then
+ data=compress(data)
+ end
entries[i]={
first=entry.first,
last=entry.last,
- data=readstring(f,entry.length)
+ data=data
}
end
fontdata.svgshapes=entries
@@ -15699,10 +15719,10 @@ function readers.mvar(f,fontdata,specification)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-dsp”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-dsp”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-oup” 669e479e716999edc626a1f045bd76fa] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-oup” 0cef35af01739f52fd09feb5401192ae] ---
if not modules then modules={} end modules ['font-oup']={
version=1.001,
@@ -16379,6 +16399,9 @@ local function checklookups(fontdata,missing,nofmissing)
end
end
end
+local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
+local puafirst=0xE000
+local pualast=0xF8FF
local function unifymissing(fontdata)
if not fonts.mappings then
require("font-map")
@@ -16389,18 +16412,19 @@ local function unifymissing(fontdata)
resources.unicodes=unicodes
for unicode,d in next,fontdata.descriptions do
if unicode<privateoffset then
- local name=d.name
- if name then
- unicodes[name]=unicode
+ if unicode>=puafirst and unicode<=pualast then
+ else
+ local name=d.name
+ if name then
+ unicodes[name]=unicode
+ end
end
+ else
end
end
fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups)
resources.unicodes=nil
end
-local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
-local puafirst=0xE000
-local pualast=0xF8FF
local function unifyglyphs(fontdata,usenames)
local private=fontdata.private or privateoffset
local glyphs=fontdata.glyphs
@@ -18339,10 +18363,10 @@ function readers.expand(data)
expandlookups(sublookups)
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-oup”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-oup”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-otl” 940f9c5ad84f4968a8488f4da2d15e2d] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-otl” ec0241b7465a7713e53c246e8e9fb2a8] ---
if not modules then modules={} end modules ['font-otl']={
version=1.001,
@@ -18370,11 +18394,12 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d
local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
-otf.version=3.109
+otf.version=3.110
otf.cache=containers.define("fonts","otl",otf.version,true)
otf.svgcache=containers.define("fonts","svg",otf.version,true)
otf.pngcache=containers.define("fonts","png",otf.version,true)
otf.pdfcache=containers.define("fonts","pdf",otf.version,true)
+otf.mpscache=containers.define("fonts","mps",otf.version,true)
otf.svgenabled=false
otf.pngenabled=false
local otfreaders=otf.readers
@@ -19045,10 +19070,10 @@ otf.coverup={
end
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-otl”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-otl”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-oto” 52804afd96f4be005f513a012b874668] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-oto” 52804afd96f4be005f513a012b874668] ---
if not modules then modules={} end modules ['font-oto']={
version=1.001,
@@ -19506,10 +19531,10 @@ registerotffeature {
}
otf.basemodeinitializer=featuresinitializer
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-oto”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-oto”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-otj” 66c7a910d95d4a52b81061de776898e1] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-otj” 66c7a910d95d4a52b81061de776898e1] ---
if not modules then modules={} end modules ['font-otj']={
version=1.001,
@@ -20966,10 +20991,10 @@ function injections.handler(head,where)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-otj”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-otj”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ota” d6dfb94563d6a52675e274b2e673e4a6] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ota” d6dfb94563d6a52675e274b2e673e4a6] ---
if not modules then modules={} end modules ['font-ota']={
version=1.001,
@@ -21346,10 +21371,10 @@ directives.register("otf.analyze.useunicodemarks",function(v)
analyzers.useunicodemarks=v
end)
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ota”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ota”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ots” d5504847a278385cd0d20ecf1b3d59cc] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ots” d6a0ce4b40cd4ee1895e2248dcf87d37] ---
if not modules then modules={} end modules ['font-ots']={
version=1.001,
@@ -21408,7 +21433,6 @@ registertracker("otf.actions","otf.substitutions","otf.positions")
registertracker("otf.sample","otf.steps","otf.substitutions","otf.positions","otf.analyzing")
registertracker("otf.sample.silent","otf.steps=silent","otf.substitutions","otf.positions","otf.analyzing")
local nuts=nodes.nuts
-local getfield=nuts.getfield
local getnext=nuts.getnext
local setnext=nuts.setnext
local getprev=nuts.getprev
@@ -21424,6 +21448,7 @@ local getchar=nuts.getchar
local setchar=nuts.setchar
local getdisc=nuts.getdisc
local setdisc=nuts.setdisc
+local getreplace=nuts.getreplace
local setlink=nuts.setlink
local getcomponents=nuts.getcomponents
local setcomponents=nuts.setcomponents
@@ -23002,7 +23027,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if keepdisc then
keepdisc=false
lookaheaddisc=current
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
if not replace then
sweepoverflow=true
sweepnode=current
@@ -23074,7 +23099,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if notmatchpre[current]~=notmatchreplace[current] then
lookaheaddisc=current
end
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
while replace and i<s do
if getid(replace)==glyph_code then
i=i+1
@@ -23118,7 +23143,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if notmatchpost[current]~=notmatchreplace[current] then
backtrackdisc=current
end
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
while replace and i>1 do
if getid(replace)==glyph_code then
i=i-1
@@ -24082,7 +24107,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -24109,7 +24134,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -24236,7 +24261,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -24263,7 +24288,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -24963,10 +24988,10 @@ registerotffeature {
},
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ots”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ots”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-osd” 79eb2fc4a71364fd73c8b996a109f5df] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-osd” 39e92f6e575741646d75ea79e3be87f3] ---
if not modules then modules={} end modules ['font-osd']={
version=1.001,
@@ -26046,7 +26071,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
local cp=getprev(current)
local cnsn=getnext(cns)
setlink(cp,n)
- setlink(cns,current)
+ setlink(cns,current)
setlink(c,cnsn)
if c==stop then
stop=cp
@@ -27398,10 +27423,10 @@ for i=1,nofscripts do
methods[scripts_two[i]]=method_two
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-osd”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-osd”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ocl” b720867fb19a23f0b50377efd2a3c54a] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ocl” ba40df1a92b9b42a5c70d20c28f44759] ---
if not modules then modules={} end modules ['font-ocl']={
version=1.001,
@@ -27410,9 +27435,13 @@ if not modules then modules={} end modules ['font-ocl']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 then
+ return
+end
local tostring,tonumber,next=tostring,tonumber,next
local round,max=math.round,math.round
-local sortedkeys,sortedhash=table.sortedkeys,table.sortedhash
+local gsub,find=string.gsub,string.find
+local sortedkeys,sortedhash,concat=table.sortedkeys,table.sortedhash,table.concat
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local tounicode=fonts.mappings.tounicode
@@ -27422,6 +27451,7 @@ local rightcommand=helpers.commands.right
local leftcommand=helpers.commands.left
local downcommand=helpers.commands.down
local otf=fonts.handlers.otf
+local otfregister=otf.features.register
local f_color=formatters["%.3f %.3f %.3f rg"]
local f_gray=formatters["%.3f g"]
if context then
@@ -27515,7 +27545,7 @@ end
local start={ "pdf","mode","font" }
local push={ "pdf","page","q" }
local pop={ "pdf","page","Q" }
-local function initialize(tfmdata,kind,value)
+local function initializeoverlay(tfmdata,kind,value)
if value then
local resources=tfmdata.resources
local palettes=resources.colorpalettes
@@ -27557,52 +27587,39 @@ local function initialize(tfmdata,kind,value)
local s=#colorlist
local goback=w~=0 and leftcommand[w] or nil
local t={
- start,
- not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) }
+ not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) },
+ push,
}
local n=2
local l=nil
- local f=false
for i=1,s do
local entry=colorlist[i]
local v=colorvalues[entry.class] or default
if v and l~=v then
- if f then
- n=n+1 t[n]=pop
- end
- n=n+1 t[n]=push
- f=true
n=n+1 t[n]=v
l=v
- else
- if f then
- n=n+1 t[n]=pop
- end
- f=false
- l=nil
end
n=n+1 t[n]=charcommand[entry.slot]
if s>1 and i<s and goback then
n=n+1 t[n]=goback
end
end
- if f then
- n=n+1 t[n]=pop
- end
+ n=n+1 t[n]=pop
n=n+1 t[n]=actuale
character.commands=t
end
end
end
+ return true
end
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="colr",
description="color glyphs",
manipulators={
- base=initialize,
- node=initialize,
+ base=initializeoverlay,
+ node=initializeoverlay,
}
}
do
@@ -27653,14 +27670,20 @@ local function pdftovirtual(tfmdata,pdfshapes,kind)
local data=nil
local dx=nil
local dy=nil
+ local scale=1
if typ=="table" then
data=pdf.data
- dx=pdf.dx or 0
- dy=pdf.dy or 0
+ dx=pdf.x or pdf.dx or 0
+ dy=pdf.y or pdf.dy or 0
+ scale=pdf.scale or 1
elseif typ=="string" then
data=pdf
dx=0
dy=0
+ elseif typ=="number" then
+ data=pdf
+ dx=0
+ dy=0
end
if data then
local bt=unicode and getactualtext(unicode)
@@ -27669,9 +27692,9 @@ local function pdftovirtual(tfmdata,pdfshapes,kind)
local dp=character.depth or 0
character.commands={
not unicode and actualb or { "pdf","page",(getactualtext(unicode)) },
- downcommand[dp+dy*hfactor],
- rightcommand[dx*hfactor],
- vfimage(wd,ht,dp,data,name),
+ downcommand [dp+dy*hfactor],
+ rightcommand[ dx*hfactor],
+ vfimage(scale*wd,ht,dp,data,pdfshapes.filename or ""),
actuale,
}
character[kind]=true
@@ -27705,24 +27728,27 @@ do
name="otfsvg",
program="inkscape",
method="pipeto",
- template="--shell > temp-otf-svg-shape.log",
+ template="--export-area-drawing --shell > temp-otf-svg-shape.log",
reporter=report_svg,
}
if not runner then
runner=function()
- return io.open("inkscape --shell > temp-otf-svg-shape.log","w")
+ return io.popen("inkscape --export-area-drawing --shell > temp-otf-svg-shape.log","w")
end
end
- function otfsvg.topdf(svgshapes)
+ function otfsvg.topdf(svgshapes,tfmdata)
local pdfshapes={}
local inkscape=runner()
if inkscape then
+ local indices=fonts.getindices(tfmdata)
+ local descriptions=tfmdata.descriptions
local nofshapes=#svgshapes
local f_svgfile=formatters["temp-otf-svg-shape-%i.svg"]
local f_pdffile=formatters["temp-otf-svg-shape-%i.pdf"]
local f_convert=formatters["%s --export-pdf=%s\n"]
local filterglyph=otfsvg.filterglyph
local nofdone=0
+ local processed={}
report_svg("processing %i svg containers",nofshapes)
statistics.starttiming()
for i=1,nofshapes do
@@ -27734,24 +27760,51 @@ do
local pdffile=f_pdffile(index)
savedata(svgfile,data)
inkscape:write(f_convert(svgfile,pdffile))
- pdfshapes[index]=true
+ processed[index]=true
nofdone=nofdone+1
- if nofdone%100==0 then
- report_svg("%i shapes processed",nofdone)
+ if nofdone%25==0 then
+ report_svg("%i shapes submitted",nofdone)
end
end
end
end
+ if nofdone%25~=0 then
+ report_svg("%i shapes submitted",nofdone)
+ end
+ report_svg("processing can be going on for a while")
inkscape:write("quit\n")
inkscape:close()
report_svg("processing %i pdf results",nofshapes)
- for index in next,pdfshapes do
+ for index in next,processed do
local svgfile=f_svgfile(index)
local pdffile=f_pdffile(index)
- pdfshapes[index]=loaddata(pdffile)
+ local pdfdata=loaddata(pdffile)
+ if pdfdata and pdfdata~="" then
+ pdfshapes[index]={
+ data=pdfdata,
+ }
+ end
remove(svgfile)
remove(pdffile)
end
+ local characters=tfmdata.characters
+ for k,v in next,characters do
+ local d=descriptions[k]
+ local i=d.index
+ if i then
+ local p=pdfshapes[i]
+ if p then
+ local w=d.width
+ local l=d.boundingbox[1]
+ local r=d.boundingbox[3]
+ p.scale=(r-l)/w
+ p.x=l
+ end
+ end
+ end
+ if not next(pdfshapes) then
+ report_svg("there are no converted shapes, fix your setup")
+ end
statistics.stoptiming()
if statistics.elapsedseconds then
report_svg("svg conversion time %s",statistics.elapsedseconds() or "-")
@@ -27770,19 +27823,20 @@ local function initializesvg(tfmdata,kind,value)
end
local pdffile=containers.read(otf.pdfcache,hash)
local pdfshapes=pdffile and pdffile.pdfshapes
- if not pdfshapes or pdffile.timestamp~=timestamp then
+ if not pdfshapes or pdffile.timestamp~=timestamp or not next(pdfshapes) then
local svgfile=containers.read(otf.svgcache,hash)
local svgshapes=svgfile and svgfile.svgshapes
- pdfshapes=svgshapes and otfsvg.topdf(svgshapes) or {}
+ pdfshapes=svgshapes and otfsvg.topdf(svgshapes,tfmdata,otf.pdfcache.writable,hash) or {}
containers.write(otf.pdfcache,hash,{
pdfshapes=pdfshapes,
timestamp=timestamp,
})
end
pdftovirtual(tfmdata,pdfshapes,"svg")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="svg",
description="svg glyphs",
manipulators={
@@ -27865,9 +27919,10 @@ local function initializepng(tfmdata,kind,value)
})
end
pdftovirtual(tfmdata,pdfshapes,"png")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="sbix",
description="sbix glyphs",
manipulators={
@@ -27875,7 +27930,7 @@ fonts.handlers.otf.features.register {
node=initializepng,
}
}
-fonts.handlers.otf.features.register {
+otfregister {
name="cblc",
description="cblc glyphs",
manipulators={
@@ -27883,11 +27938,36 @@ fonts.handlers.otf.features.register {
node=initializepng,
}
}
+if context then
+ local function initializecolor(tfmdata,kind,value)
+ if value=="auto" then
+ return
+ initializeoverlay(tfmdata,kind,value) or
+ initializesvg(tfmdata,kind,value) or
+ initializepng(tfmdata,kind,value)
+ elseif value=="overlay" then
+ return initializeoverlay(tfmdata,kind,value)
+ elseif value=="svg" then
+ return initializesvg(tfmdata,kind,value)
+ elseif value=="png" or value=="bitmap" then
+ return initializepng(tfmdata,kind,value)
+ else
+ end
+ end
+ otfregister {
+ name="color",
+ description="color glyphs",
+ manipulators={
+ base=initializecolor,
+ node=initializecolor,
+ }
+ }
+end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-ocl”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-ocl”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-otc” 95a4ff28ba4afb55a978a4aecfd688bf] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-otc” 1204a2fdc436e644127c0aa38ab69607] ---
if not modules then modules={} end modules ['font-otc']={
version=1.001,
@@ -27907,9 +27987,10 @@ local fonts=fonts
local otf=fonts.handlers.otf
local registerotffeature=otf.features.register
local setmetatableindex=table.setmetatableindex
-local checkmerge=fonts.helpers.checkmerge
-local checkflags=fonts.helpers.checkflags
-local checksteps=fonts.helpers.checksteps
+local fonthelpers=fonts.helpers
+local checkmerge=fonthelpers.checkmerge
+local checkflags=fonthelpers.checkflags
+local checksteps=fonthelpers.checksteps
local normalized={
substitution="substitution",
single="substitution",
@@ -28031,6 +28112,7 @@ local function addfeature(data,feature,specifications)
local done=0
local skip=0
local aglunicodes=false
+ local privateslot=fonthelpers.privateslot
local specifications=validspecification(specifications,feature)
if not specifications then
return
@@ -28053,6 +28135,12 @@ local function addfeature(data,feature,specifications)
return u
end
end
+ if privateslot then
+ u=privateslot(code)
+ if u then
+ return u
+ end
+ end
local u=lpegmatch(p,code)
if u then
return u
@@ -28082,7 +28170,7 @@ local function addfeature(data,feature,specifications)
replacement=replacement[1]
end
replacement=tounicode(replacement)
- if replacement and descriptions[replacement] then
+ if replacement and (nocheck or descriptions[replacement]) then
cover(coverage,unicode,replacement)
done=done+1
else
@@ -28452,7 +28540,6 @@ local function addfeature(data,feature,specifications)
local featuretype=normalized[specification.type or "substitution"] or "substitution"
local featureflags=specification.flags or noflags
local nocheck=specification.nocheck
- local futuresteps=specification.futuresteps
local featureorder=specification.order or { feature }
local featurechain=(featuretype=="chainsubstitution" or featuretype=="chainposition") and 1 or 0
local nofsteps=0
@@ -28637,10 +28724,10 @@ end
otf.enhancers.enhance=enhance
otf.enhancers.register("check extra features",enhance)
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-otc”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-otc”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-onr” d4d2449b4084e6afb1837ae5835082cc] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-onr” d4d2449b4084e6afb1837ae5835082cc] ---
if not modules then modules={} end modules ['font-onr']={
version=1.001,
@@ -29012,10 +29099,10 @@ function readers.getinfo(filename)
end
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-onr”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-onr”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-one” 987c5c5ed3754ad2feab80985067d59e] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-one” 987c5c5ed3754ad2feab80985067d59e] ---
if not modules then modules={} end modules ['font-one']={
version=1.001,
@@ -29726,10 +29813,10 @@ registerafmenhancer("normalize features",enhance_normalize_features)
registerafmenhancer("check extra features",otfenhancers.enhance)
registerafmenhancer("fix names",enhance_fix_names)
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-one”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-one”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-afk” 54d554530e75c57c56ee76234724e26d] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-afk” 54d554530e75c57c56ee76234724e26d] ---
if not modules then modules={} end modules ['font-afk']={
version=1.001,
@@ -29896,10 +29983,10 @@ fonts.handlers.afm.helpdata={
}
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-afk”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-afk”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-tfm” 3bbba3214fd0b8c6f35ad85592fc2917] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-tfm” 3bbba3214fd0b8c6f35ad85592fc2917] ---
if not modules then modules={} end modules ['luatex-fonts-tfm']={
version=1.001,
@@ -30414,10 +30501,10 @@ registertfmfeature {
}
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-tfm”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-tfm”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-lua” 55b281fb98f7bd848fc19928f376f647] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-lua” 55b281fb98f7bd848fc19928f376f647] ---
if not modules then modules={} end modules ['font-lua']={
version=1.001,
@@ -30457,10 +30544,10 @@ function readers.lua(specification)
return check_lua(specification,fullname)
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-lua”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-lua”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-def” f66c365dae4499f982d8bf16e5d37de3] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-def” f66c365dae4499f982d8bf16e5d37de3] ---
if not modules then modules={} end modules ['font-def']={
version=1.001,
@@ -30862,10 +30949,10 @@ function font.getfont(id)
end
callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)")
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-def”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-def”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-def” 5ad79120ebc5e60f4d322fb3ee13bffe] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-def” 5ad79120ebc5e60f4d322fb3ee13bffe] ---
if not modules then modules={} end modules ['luatex-fonts-def']={
version=1.001,
@@ -30946,10 +31033,10 @@ function fonts.definers.applypostprocessors(tfmdata)
return tfmdata
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-def”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-def”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-ext” 01015ab3758cdc2af29394e6d502a91a] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-ext” 01015ab3758cdc2af29394e6d502a91a] ---
if not modules then modules={} end modules ['luatex-fonts-ext']={
version=1.001,
@@ -31135,10 +31222,10 @@ registerotffeature {
}
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-ext”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-ext”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-imp-tex” 77c374b0ef00c2fb12188ec42beb4257] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-imp-tex” 77c374b0ef00c2fb12188ec42beb4257] ---
if not modules then modules={} end modules ['font-imp-tex']={
version=1.001,
@@ -31237,10 +31324,10 @@ registerotffeature {
description="arabic digits",
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-imp-tex”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-imp-tex”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-imp-ligatures” 043daa4fcccf2560868da359d71d3a4a] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-imp-ligatures” 043daa4fcccf2560868da359d71d3a4a] ---
if not modules then modules={} end modules ['font-imp-ligatures']={
version=1.001,
@@ -31354,10 +31441,10 @@ if context then
}
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-imp-ligatures”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-imp-ligatures”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-imp-italics” fe1ca80fb5ea4a2f8d2d5c484e7ba913] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-imp-italics” fe1ca80fb5ea4a2f8d2d5c484e7ba913] ---
if not modules then modules={} end modules ['font-imp-italics']={
version=1.001,
@@ -31463,10 +31550,10 @@ if context then
registerafmfeature(dimensions_specification)
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-imp-italics”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-imp-italics”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “font-imp-effects” 73a660359a0ec71e44cc2b7225a715ac] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “font-imp-effects” 73a660359a0ec71e44cc2b7225a715ac] ---
if not modules then modules={} end modules ['font-imp-effects']={
version=1.001,
@@ -31823,10 +31910,10 @@ local specification={
registerotffeature(specification)
registerafmfeature(specification)
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “font-imp-effects”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “font-imp-effects”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-lig” b9dbe77ce747d4c35bb2a20ffbe5aa51] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-lig” b9dbe77ce747d4c35bb2a20ffbe5aa51] ---
fonts.handlers.otf.addfeature {
@@ -33895,10 +33982,10 @@ fonts.handlers.otf.addfeature {
["type"]="ligature",
}
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-lig”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-lig”] ---
-do --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-gbn” d25472d54c4841db43a745764a63533e] ---
+do --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-gbn” d25472d54c4841db43a745764a63533e] ---
if not modules then modules={} end modules ['luatex-fonts-gbn']={
version=1.001,
@@ -34163,7 +34250,7 @@ function nodes.simple_font_handler(head,groupcode,size,packtype,direction)
return head
end
-end --- [luaotfload, fontloader-2019-08-13.lua scope for “fonts-gbn”] ---
+end --- [luaotfload, fontloader-2019-10-29.lua scope for “fonts-gbn”] ---
--- vim:ft=lua:sw=2:ts=8:et:tw=79
diff --git a/macros/luatex/generic/luaotfload/fontloader-basics-nod.lua b/macros/luatex/generic/luaotfload/fontloader-basics-nod.lua
index 418b9d69d4..172fcc7f7e 100644
--- a/macros/luatex/generic/luaotfload/fontloader-basics-nod.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-basics-nod.lua
@@ -99,6 +99,7 @@ nuts.getchar = direct.getchar
nuts.getcomponents = direct.getcomponents
nuts.getdirection = direct.getdirection
nuts.getdisc = direct.getdisc
+nuts.getreplace = direct.getreplace
nuts.getfield = direct.getfield
nuts.getfont = direct.getfont
nuts.getid = direct.getid
@@ -115,6 +116,7 @@ nuts.setchar = direct.setchar
nuts.setcomponents = direct.setcomponents
nuts.setdirection = direct.setdirection
nuts.setdisc = direct.setdisc
+nuts.setreplace = direct.setreplace
nuts.setfield = setfield
nuts.setkern = direct.setkern
nuts.setlink = direct.setlink
@@ -261,3 +263,19 @@ do
}
end
+
+if not nuts.setreplace then
+
+ local getdisc = nuts.getdisc
+ local setfield = nuts.setfield
+
+ function nuts.getreplace(n)
+ local _, _, h, _, _, t = getdisc(n,true)
+ return h, t
+ end
+
+ function nuts.setreplace(n,h)
+ setfield(n,"replace",h)
+ end
+
+end
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-con.lua b/macros/luatex/generic/luaotfload/fontloader-font-con.lua
index 9c1e825fa2..652794142b 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-con.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-con.lua
@@ -444,9 +444,10 @@ function constructors.scale(tfmdata,specification)
-- boundarychar = 65536, -- there is now a string 'right_boundary'
-- false_boundarychar = 65536, -- produces invalid tfm in luatex
--
- targetproperties.language = properties.language or "dflt" -- inherited
- targetproperties.script = properties.script or "dflt" -- inherited
- targetproperties.mode = properties.mode or "base" -- inherited
+ targetproperties.language = properties.language or "dflt" -- inherited
+ targetproperties.script = properties.script or "dflt" -- inherited
+ targetproperties.mode = properties.mode or "base" -- inherited
+ targetproperties.method = properties.method
--
local askedscaledpoints = scaledpoints
local scaledpoints, delta = constructors.calculatescale(tfmdata,scaledpoints,nil,specification) -- no shortcut, dan be redefined
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua b/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua
index 79749741c3..7777f9c6ad 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua
@@ -3159,6 +3159,14 @@ function readers.cpal(f,fontdata,specification)
end
end
+local compress = gzip and gzip.compress
+local compressed = compress and gzip.compressed
+
+-- At some point I will delay loading and only store the offsets (in context lmtx
+-- only).
+
+-- compressed = false
+
function readers.svg(f,fontdata,specification)
local tableoffset = gotodatatable(f,fontdata,"svg",specification.glyphs)
if tableoffset then
@@ -3184,10 +3192,14 @@ function readers.svg(f,fontdata,specification)
for i=1,nofentries do
local entry = entries[i]
setposition(f,entry.offset)
+ local data = readstring(f,entry.length)
+ if compressed and not compressed(data) then
+ data = compress(data)
+ end
entries[i] = {
first = entry.first,
last = entry.last,
- data = readstring(f,entry.length)
+ data = data
}
end
fontdata.svgshapes = entries
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-ocl.lua b/macros/luatex/generic/luaotfload/fontloader-font-ocl.lua
index d79ed657e0..3752203fa2 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-ocl.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-ocl.lua
@@ -8,9 +8,14 @@ if not modules then modules = { } end modules ['font-ocl'] = {
-- todo : user list of colors
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 then
+ return
+end
+
local tostring, tonumber, next = tostring, tonumber, next
local round, max = math.round, math.round
-local sortedkeys, sortedhash = table.sortedkeys, table.sortedhash
+local gsub, find = string.gsub, string.find
+local sortedkeys, sortedhash, concat = table.sortedkeys, table.sortedhash, table.concat
local setmetatableindex = table.setmetatableindex
local formatters = string.formatters
@@ -24,6 +29,7 @@ local leftcommand = helpers.commands.left
local downcommand = helpers.commands.down
local otf = fonts.handlers.otf
+local otfregister = otf.features.register
local f_color = formatters["%.3f %.3f %.3f rg"]
local f_gray = formatters["%.3f g"]
@@ -150,7 +156,7 @@ local pop = { "pdf", "page", "Q" }
-- -- only shows the first glyph in acrobat and nothing more. No problem with other
-- -- renderers.
--
--- local function initialize(tfmdata,kind,value) -- hm, always value
+-- local function initializeoverlay(tfmdata,kind,value) -- hm, always value
-- if value then
-- local resources = tfmdata.resources
-- local palettes = resources.colorpalettes
@@ -193,11 +199,11 @@ local pop = { "pdf", "page", "Q" }
-- local goback = w ~= 0 and leftcommand[w] or nil -- needs checking: are widths the same
-- local t = {
-- start,
--- not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) }
+-- not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) },
+-- push,
-- }
--- local n = 2
+-- local n = 3
-- local l = nil
--- n = n + 1 t[n] = push
-- for i=1,s do
-- local entry = colorlist[i]
-- local v = colorvalues[entry.class] or default
@@ -220,11 +226,8 @@ local pop = { "pdf", "page", "Q" }
-- end
-- end
-- end
---
--- -- Here we have no color change in BT .. ET and more q Q pairs but even then acrobat
--- -- fails displaying the overlays correctly. Other renderers do it right.
-local function initialize(tfmdata,kind,value)
+local function initializeoverlay(tfmdata,kind,value)
if value then
local resources = tfmdata.resources
local palettes = resources.colorpalettes
@@ -271,54 +274,40 @@ local function initialize(tfmdata,kind,value)
local s = #colorlist
local goback = w ~= 0 and leftcommand[w] or nil -- needs checking: are widths the same
local t = {
- start, -- really needed
- not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) }
+ not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) },
+ push,
}
local n = 2
local l = nil
- local f = false
for i=1,s do
local entry = colorlist[i]
local v = colorvalues[entry.class] or default
if v and l ~= v then
- if f then
- n = n + 1 t[n] = pop
- end
- n = n + 1 t[n] = push
- f = true
n = n + 1 t[n] = v
l = v
- else
- if f then
- n = n + 1 t[n] = pop
- end
- f = false
- l = nil
end
n = n + 1 t[n] = charcommand[entry.slot]
if s > 1 and i < s and goback then
n = n + 1 t[n] = goback
end
end
- if f then
- n = n + 1 t[n] = pop
- end
+ n = n + 1 t[n] = pop
n = n + 1 t[n] = actuale
- -- n = n + 1 t[n] = stop -- not needed
character.commands = t
end
end
end
+ return true
end
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name = "colr",
description = "color glyphs",
manipulators = {
- base = initialize,
- node = initialize,
+ base = initializeoverlay,
+ node = initializeoverlay,
}
}
@@ -382,19 +371,25 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = png|svg
for unicode, character in sortedhash(characters) do -- sort is nicer for svg
local index = character.index
if index then
- local pdf = pdfshapes[index]
- local typ = type(pdf)
- local data = nil
- local dx = nil
- local dy = nil
+ local pdf = pdfshapes[index]
+ local typ = type(pdf)
+ local data = nil
+ local dx = nil
+ local dy = nil
+ local scale = 1
if typ == "table" then
- data = pdf.data
- dx = pdf.dx or 0
- dy = pdf.dy or 0
+ data = pdf.data
+ dx = pdf.x or pdf.dx or 0
+ dy = pdf.y or pdf.dy or 0
+ scale = pdf.scale or 1
elseif typ == "string" then
data = pdf
dx = 0
dy = 0
+ elseif typ == "number" then
+ data = pdf
+ dx = 0
+ dy = 0
end
if data then
-- We can delay storage by a lua function in commands: but then we need to
@@ -404,12 +399,20 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = png|svg
local wd = character.width or 0
local ht = character.height or 0
local dp = character.depth or 0
- -- The down and right will change too (we can move that elsewhere).
+ -- The down and right will change too (we can move that elsewhere). We have
+ -- a different treatment in lmtx but the next kind of works. These images are
+ -- a mess anyway as in svg the bbox can be messed up absent). A png image
+ -- needs the x/y. I might normalize this once we moev to lmtx exlusively.
character.commands = {
not unicode and actualb or { "pdf", "page", (getactualtext(unicode)) },
- downcommand[dp + dy * hfactor],
- rightcommand[dx * hfactor],
- vfimage(wd,ht,dp,data,name),
+ -- lmtx (when we deal with depth in vfimage, currently disabled):
+ -- downcommand [dy * hfactor],
+ -- rightcommand[dx * hfactor],
+ -- vfimage(wd,ht,dp,data,name),
+ -- mkiv
+ downcommand [dp + dy * hfactor],
+ rightcommand[ dx * hfactor],
+ vfimage(scale*wd,ht,dp,data,pdfshapes.filename or ""),
actuale,
}
character[kind] = true
@@ -455,7 +458,7 @@ do
name = "otfsvg",
program = "inkscape",
method = "pipeto",
- template = "--shell > temp-otf-svg-shape.log",
+ template = "--export-area-drawing --shell > temp-otf-svg-shape.log",
reporter = report_svg,
}
@@ -464,20 +467,31 @@ do
-- poor mans variant for generic:
--
runner = function()
- return io.open("inkscape --shell > temp-otf-svg-shape.log","w")
+ return io.popen("inkscape --export-area-drawing --shell > temp-otf-svg-shape.log","w")
end
end
- function otfsvg.topdf(svgshapes)
+ -- There are svg out there with bad viewBox specifications where shapes lay outside that area,
+ -- but trying to correct that didn't work out well enough so I discarded that code. BTW, we
+ -- decouple the inskape run and the loading run because inkscape is working in the background
+ -- in the files so we need to have unique files.
+ --
+ -- Because a generic setup can be flawed we need to catch bad inkscape runs which add a bit of
+ -- ugly overhead. Bah.
+
+ function otfsvg.topdf(svgshapes,tfmdata)
local pdfshapes = { }
local inkscape = runner()
if inkscape then
- local nofshapes = #svgshapes
- local f_svgfile = formatters["temp-otf-svg-shape-%i.svg"]
- local f_pdffile = formatters["temp-otf-svg-shape-%i.pdf"]
- local f_convert = formatters["%s --export-pdf=%s\n"]
- local filterglyph = otfsvg.filterglyph
- local nofdone = 0
+ local indices = fonts.getindices(tfmdata)
+ local descriptions = tfmdata.descriptions
+ local nofshapes = #svgshapes
+ local f_svgfile = formatters["temp-otf-svg-shape-%i.svg"]
+ local f_pdffile = formatters["temp-otf-svg-shape-%i.pdf"]
+ local f_convert = formatters["%s --export-pdf=%s\n"]
+ local filterglyph = otfsvg.filterglyph
+ local nofdone = 0
+ local processed = { }
report_svg("processing %i svg containers",nofshapes)
statistics.starttiming()
for i=1,nofshapes do
@@ -489,24 +503,55 @@ do
local pdffile = f_pdffile(index)
savedata(svgfile,data)
inkscape:write(f_convert(svgfile,pdffile))
- pdfshapes[index] = true
+ processed[index] = true
nofdone = nofdone + 1
- if nofdone % 100 == 0 then
- report_svg("%i shapes processed",nofdone)
+ if nofdone % 25 == 0 then
+ report_svg("%i shapes submitted",nofdone)
end
end
end
end
+ if nofdone % 25 ~= 0 then
+ report_svg("%i shapes submitted",nofdone)
+ end
+ report_svg("processing can be going on for a while")
inkscape:write("quit\n")
inkscape:close()
report_svg("processing %i pdf results",nofshapes)
- for index in next, pdfshapes do
+ for index in next, processed do
local svgfile = f_svgfile(index)
local pdffile = f_pdffile(index)
- pdfshapes[index] = loaddata(pdffile)
+ -- local fntdata = descriptions[indices[index]]
+ -- local bounds = fntdata and fntdata.boundingbox
+ local pdfdata = loaddata(pdffile)
+ if pdfdata and pdfdata ~= "" then
+ pdfshapes[index] = {
+ data = pdfdata,
+ -- x = bounds and bounds[1] or 0,
+ -- y = bounds and bounds[2] or 0,
+ }
+ end
remove(svgfile)
remove(pdffile)
end
+ local characters = tfmdata.characters
+ for k, v in next, characters do
+ local d = descriptions[k]
+ local i = d.index
+ if i then
+ local p = pdfshapes[i]
+ if p then
+ local w = d.width
+ local l = d.boundingbox[1]
+ local r = d.boundingbox[3]
+ p.scale = (r - l) / w
+ p.x = l
+ end
+ end
+ end
+ if not next(pdfshapes) then
+ report_svg("there are no converted shapes, fix your setup")
+ end
statistics.stoptiming()
if statistics.elapsedseconds then
report_svg("svg conversion time %s",statistics.elapsedseconds() or "-")
@@ -527,20 +572,23 @@ local function initializesvg(tfmdata,kind,value) -- hm, always value
end
local pdffile = containers.read(otf.pdfcache,hash)
local pdfshapes = pdffile and pdffile.pdfshapes
- if not pdfshapes or pdffile.timestamp ~= timestamp then
+ if not pdfshapes or pdffile.timestamp ~= timestamp or not next(pdfshapes) then
+ -- the next test tries to catch errors in generic usage but of course can result
+ -- in running again and again
local svgfile = containers.read(otf.svgcache,hash)
local svgshapes = svgfile and svgfile.svgshapes
- pdfshapes = svgshapes and otfsvg.topdf(svgshapes) or { }
+ pdfshapes = svgshapes and otfsvg.topdf(svgshapes,tfmdata,otf.pdfcache.writable,hash) or { }
containers.write(otf.pdfcache, hash, {
pdfshapes = pdfshapes,
timestamp = timestamp,
})
end
pdftovirtual(tfmdata,pdfshapes,"svg")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name = "svg",
description = "svg glyphs",
manipulators = {
@@ -648,10 +696,11 @@ local function initializepng(tfmdata,kind,value) -- hm, always value
end
--
pdftovirtual(tfmdata,pdfshapes,"png")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name = "sbix",
description = "sbix glyphs",
manipulators = {
@@ -660,7 +709,7 @@ fonts.handlers.otf.features.register {
}
}
-fonts.handlers.otf.features.register {
+otfregister {
name = "cblc",
description = "cblc glyphs",
manipulators = {
@@ -668,3 +717,36 @@ fonts.handlers.otf.features.register {
node = initializepng,
}
}
+
+if context then
+
+ -- untested in generic and might clash with other color trickery
+ -- anyway so let's stick to context only
+
+ local function initializecolor(tfmdata,kind,value)
+ if value == "auto" then
+ return
+ initializeoverlay(tfmdata,kind,value) or
+ initializesvg(tfmdata,kind,value) or
+ initializepng(tfmdata,kind,value)
+ elseif value == "overlay" then
+ return initializeoverlay(tfmdata,kind,value)
+ elseif value == "svg" then
+ return initializesvg(tfmdata,kind,value)
+ elseif value == "png" or value == "bitmap" then
+ return initializepng(tfmdata,kind,value)
+ else
+ -- forget about it
+ end
+ end
+
+ otfregister {
+ name = "color",
+ description = "color glyphs",
+ manipulators = {
+ base = initializecolor,
+ node = initializecolor,
+ }
+ }
+
+end
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-osd.lua b/macros/luatex/generic/luaotfload/fontloader-font-osd.lua
index 203c1d79d4..b97ac9c6f5 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-osd.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-osd.lua
@@ -1285,7 +1285,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
local cp = getprev(current)
local cnsn = getnext(cns)
setlink(cp,n)
- setlink(cns,current)
+ setlink(cns,current) -- cns ?
setlink(c,cnsn)
if c == stop then
stop = cp
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-otc.lua b/macros/luatex/generic/luaotfload/fontloader-font-otc.lua
index a774a81c2c..2643d022a5 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-otc.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-otc.lua
@@ -22,9 +22,10 @@ local otf = fonts.handlers.otf
local registerotffeature = otf.features.register
local setmetatableindex = table.setmetatableindex
-local checkmerge = fonts.helpers.checkmerge
-local checkflags = fonts.helpers.checkflags
-local checksteps = fonts.helpers.checksteps
+local fonthelpers = fonts.helpers
+local checkmerge = fonthelpers.checkmerge
+local checkflags = fonthelpers.checkflags
+local checksteps = fonthelpers.checksteps
local normalized = {
substitution = "substitution",
@@ -167,6 +168,7 @@ local function addfeature(data,feature,specifications)
local done = 0
local skip = 0
local aglunicodes = false
+ local privateslot = fonthelpers.privateslot
local specifications = validspecification(specifications,feature)
if not specifications then
@@ -196,6 +198,13 @@ local function addfeature(data,feature,specifications)
return u
end
end
+ if privateslot then
+ u = privateslot(code) -- no creation !
+ if u then
+ -- unicodes[code] = u
+ return u
+ end
+ end
local u = lpegmatch(p,code)
if u then
-- unicodes[code] = u
@@ -229,7 +238,7 @@ local function addfeature(data,feature,specifications)
replacement = replacement[1]
end
replacement = tounicode(replacement)
- if replacement and descriptions[replacement] then
+ if replacement and (nocheck or descriptions[replacement]) then
cover(coverage,unicode,replacement)
done = done + 1
else
@@ -620,7 +629,6 @@ local function addfeature(data,feature,specifications)
local featuretype = normalized[specification.type or "substitution"] or "substitution"
local featureflags = specification.flags or noflags
local nocheck = specification.nocheck
- local futuresteps = specification.futuresteps
local featureorder = specification.order or { feature }
local featurechain = (featuretype == "chainsubstitution" or featuretype == "chainposition") and 1 or 0
local nofsteps = 0
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-otl.lua b/macros/luatex/generic/luaotfload/fontloader-font-otl.lua
index f8cd8217cd..5d3bd4230c 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-otl.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-otl.lua
@@ -52,11 +52,12 @@ local report_otf = logs.reporter("fonts","otf loading")
local fonts = fonts
local otf = fonts.handlers.otf
-otf.version = 3.109 -- beware: also sync font-mis.lua and in mtx-fonts
+otf.version = 3.110 -- beware: also sync font-mis.lua and in mtx-fonts
otf.cache = containers.define("fonts", "otl", otf.version, true)
otf.svgcache = containers.define("fonts", "svg", otf.version, true)
otf.pngcache = containers.define("fonts", "png", otf.version, true)
otf.pdfcache = containers.define("fonts", "pdf", otf.version, true)
+otf.mpscache = containers.define("fonts", "mps", otf.version, true)
otf.svgenabled = false
otf.pngenabled = false
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-ots.lua b/macros/luatex/generic/luaotfload/fontloader-font-ots.lua
index 6313022006..5091fd7657 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-ots.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-ots.lua
@@ -177,7 +177,6 @@ registertracker("otf.sample.silent", "otf.steps=silent","otf.substitutions","otf
local nuts = nodes.nuts
-local getfield = nuts.getfield
local getnext = nuts.getnext
local setnext = nuts.setnext
local getprev = nuts.getprev
@@ -193,6 +192,7 @@ local getchar = nuts.getchar
local setchar = nuts.setchar
local getdisc = nuts.getdisc
local setdisc = nuts.setdisc
+local getreplace = nuts.getreplace
local setlink = nuts.setlink
local getcomponents = nuts.getcomponents -- the original one, not yet node-aux
local setcomponents = nuts.setcomponents -- the original one, not yet node-aux
@@ -2090,7 +2090,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if keepdisc then
keepdisc = false
lookaheaddisc = current
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
if not replace then
sweepoverflow = true
sweepnode = current
@@ -2167,7 +2167,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
lookaheaddisc = current
end
-- we assume a simple text only replace (we could use nuts.count)
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
while replace and i < s do
if getid(replace) == glyph_code then
i = i + 1
@@ -2213,7 +2213,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
backtrackdisc = current
end
-- we assume a simple text only replace (we could use nuts.count)
- local replace = getfield(current,"replace")
+ local replace = getreplace(current)
while replace and i > 1 do
if getid(replace) == glyph_code then
i = i - 1
@@ -3386,7 +3386,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
-- how about post ... we can probably merge this into the while
while getid(s) == disc_code do
ss = getnext(s)
- s = getfield(s,"replace")
+ s = getreplace(s)
if not s then
s = ss
ss = nil
@@ -3413,7 +3413,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
end
while getid(s) == disc_code do
ss = getnext(s)
- s = getfield(s,"replace")
+ s = getreplace(s)
if not s then
s = ss
ss = nil
@@ -3556,7 +3556,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s) == disc_code do
ss = getnext(s)
- s = getfield(s,"replace")
+ s = getreplace(s)
if not s then
s = ss
ss = nil
@@ -3583,7 +3583,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s) == disc_code do
ss = getnext(s)
- s = getfield(s,"replace")
+ s = getreplace(s)
if not s then
s = ss
ss = nil
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-oup.lua b/macros/luatex/generic/luaotfload/fontloader-font-oup.lua
index 51b1c248f8..0e7e25808c 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-oup.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-oup.lua
@@ -720,6 +720,10 @@ local function checklookups(fontdata,missing,nofmissing)
end
end
+local firstprivate = fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
+local puafirst = 0xE000
+local pualast = 0xF8FF
+
local function unifymissing(fontdata)
if not fonts.mappings then
require("font-map")
@@ -730,20 +734,22 @@ local function unifymissing(fontdata)
resources.unicodes = unicodes
for unicode, d in next, fontdata.descriptions do
if unicode < privateoffset then
- local name = d.name
- if name then
- unicodes[name] = unicode
+ if unicode >= puafirst and unicode <= pualast then
+ -- report_unicodes("resolving private unicode %U",unicode)
+ else
+ local name = d.name
+ if name then
+ unicodes[name] = unicode
+ end
end
+ else
+ -- report_unicodes("resolving private unicode %U",unicode)
end
end
fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups)
resources.unicodes = nil
end
-local firstprivate = fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
-local puafirst = 0xE000
-local pualast = 0xF8FF
-
local function unifyglyphs(fontdata,usenames)
local private = fontdata.private or privateoffset
local glyphs = fontdata.glyphs
diff --git a/macros/luatex/generic/luaotfload/fontloader-l-lpeg.lua b/macros/luatex/generic/luaotfload/fontloader-l-lpeg.lua
index 51bc1d3df3..7979a40fb9 100644
--- a/macros/luatex/generic/luaotfload/fontloader-l-lpeg.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-l-lpeg.lua
@@ -295,7 +295,7 @@ patterns.longtostring = Cs(whitespace^0/"" * ((patterns.quoted + nonwhitespace^
-- return P { P(pattern) + 1 * V(1) }
-- end
-function anywhere(pattern) -- faster
+local function anywhere(pattern) -- faster
return (1-P(pattern))^0 * P(pattern)
end
diff --git a/macros/luatex/generic/luaotfload/fontloader-l-lua.lua b/macros/luatex/generic/luaotfload/fontloader-l-lua.lua
index 6e9606e849..51399216cc 100644
--- a/macros/luatex/generic/luaotfload/fontloader-l-lua.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-l-lua.lua
@@ -35,6 +35,12 @@ if LUAVERSION < 5.2 and jit then
LUAVERSION = 5.2
end
+-- this is lmtx only:
+
+if lua and lua.openfile then
+ io.open = lua.openfile
+end
+
-- lpeg
if not lpeg then
diff --git a/macros/luatex/generic/luaotfload/fontloader-l-table.lua b/macros/luatex/generic/luaotfload/fontloader-l-table.lua
index cffdcc23e2..e828203867 100644
--- a/macros/luatex/generic/luaotfload/fontloader-l-table.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-l-table.lua
@@ -287,6 +287,37 @@ local function sortedhash(t,cmp)
return nothing
end
+-- local function iterate(t,i)
+-- local i = i + 1
+-- if i <= t.n then
+-- local k = t[i]
+-- return i, k, t.t[k]
+-- end
+-- end
+--
+-- local function indexedhash(t,cmp)
+-- if t then
+-- local s
+-- if cmp then
+-- -- it would be nice if the sort function would accept a third argument (or nicer, an optional first)
+-- s = sortedhashkeys(t,function(a,b) return cmp(t,a,b) end)
+-- else
+-- s = sortedkeys(t) -- the robust one
+-- end
+-- local m = #s
+-- if m == 1 then
+-- return next, t
+-- elseif m > 0 then
+-- s.n = m
+-- s.t = t
+-- return iterate, s, 0
+-- end
+-- end
+-- return nothing
+-- end
+--
+-- -- for i, k, v in indexedhash(t) do print(k,v,s) end
+
table.sortedhash = sortedhash
table.sortedpairs = sortedhash -- obsolete
diff --git a/macros/luatex/generic/luaotfload/fontloader-l-unicode.lua b/macros/luatex/generic/luaotfload/fontloader-l-unicode.lua
index 13e0a3fa1c..c57aaf33eb 100644
--- a/macros/luatex/generic/luaotfload/fontloader-l-unicode.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-l-unicode.lua
@@ -1081,56 +1081,62 @@ function utf.utf32_to_utf8_t(t,endian)
return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t
end
-local function little(b)
- if b < 0x10000 then
- return char(b%256,rshift(b,8))
- else
- b = b - 0x10000
- local b1 = rshift(b,10) + 0xD800
- local b2 = b%1024 + 0xDC00
- return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+if bit32 then
+
+ local rshift = bit32.rshift
+
+ local function little(b)
+ if b < 0x10000 then
+ return char(b%256,rshift(b,8))
+ else
+ b = b - 0x10000
+ local b1 = rshift(b,10) + 0xD800
+ local b2 = b%1024 + 0xDC00
+ return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8))
+ end
end
-end
-local function big(b)
- if b < 0x10000 then
- return char(rshift(b,8),b%256)
- else
- b = b - 0x10000
- local b1 = rshift(b,10) + 0xD800
- local b2 = b%1024 + 0xDC00
- return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ local function big(b)
+ if b < 0x10000 then
+ return char(rshift(b,8),b%256)
+ else
+ b = b - 0x10000
+ local b1 = rshift(b,10) + 0xD800
+ local b2 = b%1024 + 0xDC00
+ return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256)
+ end
end
-end
-local l_remap = Cs((p_utf8byte/little+P(1)/"")^0)
-local b_remap = Cs((p_utf8byte/big +P(1)/"")^0)
+ local l_remap = Cs((p_utf8byte/little+P(1)/"")^0)
+ local b_remap = Cs((p_utf8byte/big +P(1)/"")^0)
-local function utf8_to_utf16_be(str,nobom)
- if nobom then
- return lpegmatch(b_remap,str)
- else
- return char(254,255) .. lpegmatch(b_remap,str)
+ local function utf8_to_utf16_be(str,nobom)
+ if nobom then
+ return lpegmatch(b_remap,str)
+ else
+ return char(254,255) .. lpegmatch(b_remap,str)
+ end
end
-end
-local function utf8_to_utf16_le(str,nobom)
- if nobom then
- return lpegmatch(l_remap,str)
- else
- return char(255,254) .. lpegmatch(l_remap,str)
+ local function utf8_to_utf16_le(str,nobom)
+ if nobom then
+ return lpegmatch(l_remap,str)
+ else
+ return char(255,254) .. lpegmatch(l_remap,str)
+ end
end
-end
-utf.utf8_to_utf16_be = utf8_to_utf16_be
-utf.utf8_to_utf16_le = utf8_to_utf16_le
+ utf.utf8_to_utf16_be = utf8_to_utf16_be
+ utf.utf8_to_utf16_le = utf8_to_utf16_le
-function utf.utf8_to_utf16(str,littleendian,nobom)
- if littleendian then
- return utf8_to_utf16_le(str,nobom)
- else
- return utf8_to_utf16_be(str,nobom)
+ function utf.utf8_to_utf16(str,littleendian,nobom)
+ if littleendian then
+ return utf8_to_utf16_le(str,nobom)
+ else
+ return utf8_to_utf16_be(str,nobom)
+ end
end
+
end
local pattern = Cs (
diff --git a/macros/luatex/generic/luaotfload/fontloader-reference.lua b/macros/luatex/generic/luaotfload/fontloader-reference.lua
index 3120f45135..b8a21fc937 100644
--- a/macros/luatex/generic/luaotfload/fontloader-reference.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-reference.lua
@@ -1,6 +1,6 @@
-- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua
-- parent file : c:/data/develop/context/sources/luatex-fonts.lua
--- merge date : 08/11/19 20:03:46
+-- merge date : 10/29/19 15:00:00
do -- begin closure to overcome local limits and interference
@@ -20,6 +20,9 @@ if LUAVERSION<5.2 and jit then
MINORVERSION=2
LUAVERSION=5.2
end
+if lua and lua.openfile then
+ io.open=lua.openfile
+end
if not lpeg then
lpeg=require("lpeg")
end
@@ -296,7 +299,7 @@ patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+unders
patterns.somecontent=(anything-newline-space)^1
patterns.beginline=#(1-newline)
patterns.longtostring=Cs(whitespace^0/""*((patterns.quoted+nonwhitespace^1+whitespace^1/""*(endofstring+Cc(" ")))^0))
-function anywhere(pattern)
+local function anywhere(pattern)
return (1-P(pattern))^0*P(pattern)
end
lpeg.anywhere=anywhere
@@ -3433,7 +3436,7 @@ local environment={
stripzero=patterns.stripzero,
stripzeros=patterns.stripzeros,
escapedquotes=string.escapedquotes,
- FORMAT=string.f9,
+ FORMAT=string.f6,
}
local arguments={ "a1" }
setmetatable(arguments,{ __index=function(t,k)
@@ -3641,12 +3644,25 @@ local format_n=function()
n=n+1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
-local format_N=function(f)
- n=n+1
- if not f or f=="" then
- f=".9"
- end
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f==".6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+else
+ format_N=function(f)
+ n=n+1
+ if not f or f=="" then
+ f=".9"
+ end
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
end
local format_a=function(f)
n=n+1
@@ -4865,6 +4881,7 @@ nuts.getchar=direct.getchar
nuts.getcomponents=direct.getcomponents
nuts.getdirection=direct.getdirection
nuts.getdisc=direct.getdisc
+nuts.getreplace=direct.getreplace
nuts.getfield=direct.getfield
nuts.getfont=direct.getfont
nuts.getid=direct.getid
@@ -4881,6 +4898,7 @@ nuts.setchar=direct.setchar
nuts.setcomponents=direct.setcomponents
nuts.setdirection=direct.setdirection
nuts.setdisc=direct.setdisc
+nuts.setreplace=direct.setreplace
nuts.setfield=setfield
nuts.setkern=direct.setkern
nuts.setlink=direct.setlink
@@ -4998,6 +5016,17 @@ do
node=nuts.traverse(dummy),
}
end
+if not nuts.setreplace then
+ local getdisc=nuts.getdisc
+ local setfield=nuts.setfield
+ function nuts.getreplace(n)
+ local _,_,h,_,_,t=getdisc(n,true)
+ return h,t
+ end
+ function nuts.setreplace(n,h)
+ setfield(n,"replace",h)
+ end
+end
end -- closure
@@ -8989,7 +9018,8 @@ function constructors.scale(tfmdata,specification)
local units=parameters.units or 1000
targetproperties.language=properties.language or "dflt"
targetproperties.script=properties.script or "dflt"
- targetproperties.mode=properties.mode or "base"
+ targetproperties.mode=properties.mode or "base"
+ targetproperties.method=properties.method
local askedscaledpoints=scaledpoints
local scaledpoints,delta=constructors.calculatescale(tfmdata,scaledpoints,nil,specification)
local hdelta=delta
@@ -19773,6 +19803,8 @@ function readers.cpal(f,fontdata,specification)
fontdata.colorpalettes=palettes
end
end
+local compress=gzip and gzip.compress
+local compressed=compress and gzip.compressed
function readers.svg(f,fontdata,specification)
local tableoffset=gotodatatable(f,fontdata,"svg",specification.glyphs)
if tableoffset then
@@ -19794,10 +19826,14 @@ function readers.svg(f,fontdata,specification)
for i=1,nofentries do
local entry=entries[i]
setposition(f,entry.offset)
+ local data=readstring(f,entry.length)
+ if compressed and not compressed(data) then
+ data=compress(data)
+ end
entries[i]={
first=entry.first,
last=entry.last,
- data=readstring(f,entry.length)
+ data=data
}
end
fontdata.svgshapes=entries
@@ -21059,6 +21095,9 @@ local function checklookups(fontdata,missing,nofmissing)
end
end
end
+local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
+local puafirst=0xE000
+local pualast=0xF8FF
local function unifymissing(fontdata)
if not fonts.mappings then
require("font-map")
@@ -21069,18 +21108,19 @@ local function unifymissing(fontdata)
resources.unicodes=unicodes
for unicode,d in next,fontdata.descriptions do
if unicode<privateoffset then
- local name=d.name
- if name then
- unicodes[name]=unicode
+ if unicode>=puafirst and unicode<=pualast then
+ else
+ local name=d.name
+ if name then
+ unicodes[name]=unicode
+ end
end
+ else
end
end
fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups)
resources.unicodes=nil
end
-local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000
-local puafirst=0xE000
-local pualast=0xF8FF
local function unifyglyphs(fontdata,usenames)
local private=fontdata.private or privateoffset
local glyphs=fontdata.glyphs
@@ -23049,11 +23089,12 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d
local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
-otf.version=3.109
+otf.version=3.110
otf.cache=containers.define("fonts","otl",otf.version,true)
otf.svgcache=containers.define("fonts","svg",otf.version,true)
otf.pngcache=containers.define("fonts","png",otf.version,true)
otf.pdfcache=containers.define("fonts","pdf",otf.version,true)
+otf.mpscache=containers.define("fonts","mps",otf.version,true)
otf.svgenabled=false
otf.pngenabled=false
local otfreaders=otf.readers
@@ -26076,7 +26117,6 @@ registertracker("otf.actions","otf.substitutions","otf.positions")
registertracker("otf.sample","otf.steps","otf.substitutions","otf.positions","otf.analyzing")
registertracker("otf.sample.silent","otf.steps=silent","otf.substitutions","otf.positions","otf.analyzing")
local nuts=nodes.nuts
-local getfield=nuts.getfield
local getnext=nuts.getnext
local setnext=nuts.setnext
local getprev=nuts.getprev
@@ -26092,6 +26132,7 @@ local getchar=nuts.getchar
local setchar=nuts.setchar
local getdisc=nuts.getdisc
local setdisc=nuts.setdisc
+local getreplace=nuts.getreplace
local setlink=nuts.setlink
local getcomponents=nuts.getcomponents
local setcomponents=nuts.setcomponents
@@ -27670,7 +27711,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if keepdisc then
keepdisc=false
lookaheaddisc=current
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
if not replace then
sweepoverflow=true
sweepnode=current
@@ -27742,7 +27783,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if notmatchpre[current]~=notmatchreplace[current] then
lookaheaddisc=current
end
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
while replace and i<s do
if getid(replace)==glyph_code then
i=i+1
@@ -27786,7 +27827,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck)
if notmatchpost[current]~=notmatchreplace[current] then
backtrackdisc=current
end
- local replace=getfield(current,"replace")
+ local replace=getreplace(current)
while replace and i>1 do
if getid(replace)==glyph_code then
i=i-1
@@ -28750,7 +28791,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -28777,7 +28818,7 @@ local function t_run_single(start,stop,font,attr,lookupcache)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -28904,7 +28945,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -28931,7 +28972,7 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps)
end
while getid(s)==disc_code do
ss=getnext(s)
- s=getfield(s,"replace")
+ s=getreplace(s)
if not s then
s=ss
ss=nil
@@ -30708,7 +30749,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
local cp=getprev(current)
local cnsn=getnext(cns)
setlink(cp,n)
- setlink(cns,current)
+ setlink(cns,current)
setlink(c,cnsn)
if c==stop then
stop=cp
@@ -32071,9 +32112,13 @@ if not modules then modules={} end modules ['font-ocl']={
copyright="PRAGMA ADE / ConTeXt Development Team",
license="see context related readme files"
}
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 then
+ return
+end
local tostring,tonumber,next=tostring,tonumber,next
local round,max=math.round,math.round
-local sortedkeys,sortedhash=table.sortedkeys,table.sortedhash
+local gsub,find=string.gsub,string.find
+local sortedkeys,sortedhash,concat=table.sortedkeys,table.sortedhash,table.concat
local setmetatableindex=table.setmetatableindex
local formatters=string.formatters
local tounicode=fonts.mappings.tounicode
@@ -32083,6 +32128,7 @@ local rightcommand=helpers.commands.right
local leftcommand=helpers.commands.left
local downcommand=helpers.commands.down
local otf=fonts.handlers.otf
+local otfregister=otf.features.register
local f_color=formatters["%.3f %.3f %.3f rg"]
local f_gray=formatters["%.3f g"]
if context then
@@ -32139,7 +32185,7 @@ end
local start={ "pdf","mode","font" }
local push={ "pdf","page","q" }
local pop={ "pdf","page","Q" }
-local function initialize(tfmdata,kind,value)
+local function initializeoverlay(tfmdata,kind,value)
if value then
local resources=tfmdata.resources
local palettes=resources.colorpalettes
@@ -32181,52 +32227,39 @@ local function initialize(tfmdata,kind,value)
local s=#colorlist
local goback=w~=0 and leftcommand[w] or nil
local t={
- start,
- not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) }
+ not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) },
+ push,
}
local n=2
local l=nil
- local f=false
for i=1,s do
local entry=colorlist[i]
local v=colorvalues[entry.class] or default
if v and l~=v then
- if f then
- n=n+1 t[n]=pop
- end
- n=n+1 t[n]=push
- f=true
n=n+1 t[n]=v
l=v
- else
- if f then
- n=n+1 t[n]=pop
- end
- f=false
- l=nil
end
n=n+1 t[n]=charcommand[entry.slot]
if s>1 and i<s and goback then
n=n+1 t[n]=goback
end
end
- if f then
- n=n+1 t[n]=pop
- end
+ n=n+1 t[n]=pop
n=n+1 t[n]=actuale
character.commands=t
end
end
end
+ return true
end
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="colr",
description="color glyphs",
manipulators={
- base=initialize,
- node=initialize,
+ base=initializeoverlay,
+ node=initializeoverlay,
}
}
do
@@ -32277,14 +32310,20 @@ local function pdftovirtual(tfmdata,pdfshapes,kind)
local data=nil
local dx=nil
local dy=nil
+ local scale=1
if typ=="table" then
data=pdf.data
- dx=pdf.dx or 0
- dy=pdf.dy or 0
+ dx=pdf.x or pdf.dx or 0
+ dy=pdf.y or pdf.dy or 0
+ scale=pdf.scale or 1
elseif typ=="string" then
data=pdf
dx=0
dy=0
+ elseif typ=="number" then
+ data=pdf
+ dx=0
+ dy=0
end
if data then
local bt=unicode and getactualtext(unicode)
@@ -32293,9 +32332,9 @@ local function pdftovirtual(tfmdata,pdfshapes,kind)
local dp=character.depth or 0
character.commands={
not unicode and actualb or { "pdf","page",(getactualtext(unicode)) },
- downcommand[dp+dy*hfactor],
- rightcommand[dx*hfactor],
- vfimage(wd,ht,dp,data,name),
+ downcommand [dp+dy*hfactor],
+ rightcommand[ dx*hfactor],
+ vfimage(scale*wd,ht,dp,data,pdfshapes.filename or ""),
actuale,
}
character[kind]=true
@@ -32329,24 +32368,27 @@ do
name="otfsvg",
program="inkscape",
method="pipeto",
- template="--shell > temp-otf-svg-shape.log",
+ template="--export-area-drawing --shell > temp-otf-svg-shape.log",
reporter=report_svg,
}
if not runner then
runner=function()
- return io.open("inkscape --shell > temp-otf-svg-shape.log","w")
+ return io.popen("inkscape --export-area-drawing --shell > temp-otf-svg-shape.log","w")
end
end
- function otfsvg.topdf(svgshapes)
+ function otfsvg.topdf(svgshapes,tfmdata)
local pdfshapes={}
local inkscape=runner()
if inkscape then
+ local indices=fonts.getindices(tfmdata)
+ local descriptions=tfmdata.descriptions
local nofshapes=#svgshapes
local f_svgfile=formatters["temp-otf-svg-shape-%i.svg"]
local f_pdffile=formatters["temp-otf-svg-shape-%i.pdf"]
local f_convert=formatters["%s --export-pdf=%s\n"]
local filterglyph=otfsvg.filterglyph
local nofdone=0
+ local processed={}
report_svg("processing %i svg containers",nofshapes)
statistics.starttiming()
for i=1,nofshapes do
@@ -32358,24 +32400,51 @@ do
local pdffile=f_pdffile(index)
savedata(svgfile,data)
inkscape:write(f_convert(svgfile,pdffile))
- pdfshapes[index]=true
+ processed[index]=true
nofdone=nofdone+1
- if nofdone%100==0 then
- report_svg("%i shapes processed",nofdone)
+ if nofdone%25==0 then
+ report_svg("%i shapes submitted",nofdone)
end
end
end
end
+ if nofdone%25~=0 then
+ report_svg("%i shapes submitted",nofdone)
+ end
+ report_svg("processing can be going on for a while")
inkscape:write("quit\n")
inkscape:close()
report_svg("processing %i pdf results",nofshapes)
- for index in next,pdfshapes do
+ for index in next,processed do
local svgfile=f_svgfile(index)
local pdffile=f_pdffile(index)
- pdfshapes[index]=loaddata(pdffile)
+ local pdfdata=loaddata(pdffile)
+ if pdfdata and pdfdata~="" then
+ pdfshapes[index]={
+ data=pdfdata,
+ }
+ end
remove(svgfile)
remove(pdffile)
end
+ local characters=tfmdata.characters
+ for k,v in next,characters do
+ local d=descriptions[k]
+ local i=d.index
+ if i then
+ local p=pdfshapes[i]
+ if p then
+ local w=d.width
+ local l=d.boundingbox[1]
+ local r=d.boundingbox[3]
+ p.scale=(r-l)/w
+ p.x=l
+ end
+ end
+ end
+ if not next(pdfshapes) then
+ report_svg("there are no converted shapes, fix your setup")
+ end
statistics.stoptiming()
if statistics.elapsedseconds then
report_svg("svg conversion time %s",statistics.elapsedseconds() or "-")
@@ -32394,19 +32463,20 @@ local function initializesvg(tfmdata,kind,value)
end
local pdffile=containers.read(otf.pdfcache,hash)
local pdfshapes=pdffile and pdffile.pdfshapes
- if not pdfshapes or pdffile.timestamp~=timestamp then
+ if not pdfshapes or pdffile.timestamp~=timestamp or not next(pdfshapes) then
local svgfile=containers.read(otf.svgcache,hash)
local svgshapes=svgfile and svgfile.svgshapes
- pdfshapes=svgshapes and otfsvg.topdf(svgshapes) or {}
+ pdfshapes=svgshapes and otfsvg.topdf(svgshapes,tfmdata,otf.pdfcache.writable,hash) or {}
containers.write(otf.pdfcache,hash,{
pdfshapes=pdfshapes,
timestamp=timestamp,
})
end
pdftovirtual(tfmdata,pdfshapes,"svg")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="svg",
description="svg glyphs",
manipulators={
@@ -32489,9 +32559,10 @@ local function initializepng(tfmdata,kind,value)
})
end
pdftovirtual(tfmdata,pdfshapes,"png")
+ return true
end
end
-fonts.handlers.otf.features.register {
+otfregister {
name="sbix",
description="sbix glyphs",
manipulators={
@@ -32499,7 +32570,7 @@ fonts.handlers.otf.features.register {
node=initializepng,
}
}
-fonts.handlers.otf.features.register {
+otfregister {
name="cblc",
description="cblc glyphs",
manipulators={
@@ -32507,6 +32578,11 @@ fonts.handlers.otf.features.register {
node=initializepng,
}
}
+if context then
+
+--removed
+
+end
end -- closure
@@ -32530,9 +32606,10 @@ local fonts=fonts
local otf=fonts.handlers.otf
local registerotffeature=otf.features.register
local setmetatableindex=table.setmetatableindex
-local checkmerge=fonts.helpers.checkmerge
-local checkflags=fonts.helpers.checkflags
-local checksteps=fonts.helpers.checksteps
+local fonthelpers=fonts.helpers
+local checkmerge=fonthelpers.checkmerge
+local checkflags=fonthelpers.checkflags
+local checksteps=fonthelpers.checksteps
local normalized={
substitution="substitution",
single="substitution",
@@ -32654,6 +32731,7 @@ local function addfeature(data,feature,specifications)
local done=0
local skip=0
local aglunicodes=false
+ local privateslot=fonthelpers.privateslot
local specifications=validspecification(specifications,feature)
if not specifications then
return
@@ -32676,6 +32754,12 @@ local function addfeature(data,feature,specifications)
return u
end
end
+ if privateslot then
+ u=privateslot(code)
+ if u then
+ return u
+ end
+ end
local u=lpegmatch(p,code)
if u then
return u
@@ -32705,7 +32789,7 @@ local function addfeature(data,feature,specifications)
replacement=replacement[1]
end
replacement=tounicode(replacement)
- if replacement and descriptions[replacement] then
+ if replacement and (nocheck or descriptions[replacement]) then
cover(coverage,unicode,replacement)
done=done+1
else
@@ -33075,7 +33159,6 @@ local function addfeature(data,feature,specifications)
local featuretype=normalized[specification.type or "substitution"] or "substitution"
local featureflags=specification.flags or noflags
local nocheck=specification.nocheck
- local futuresteps=specification.futuresteps
local featureorder=specification.order or { feature }
local featurechain=(featuretype=="chainsubstitution" or featuretype=="chainposition") and 1 or 0
local nofsteps=0
diff --git a/macros/luatex/generic/luaotfload/fontloader-util-str.lua b/macros/luatex/generic/luaotfload/fontloader-util-str.lua
index ad22302df0..432b39ec5a 100644
--- a/macros/luatex/generic/luaotfload/fontloader-util-str.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-util-str.lua
@@ -633,7 +633,7 @@ local environment = {
stripzeros = patterns.stripzeros,
escapedquotes = string.escapedquotes,
- FORMAT = string.f9,
+ FORMAT = string.f6,
}
-- -- --
@@ -908,7 +908,7 @@ local format_L = function()
return format("(a%s and 'TRUE' or 'FALSE')",n)
end
-local format_n = function() -- strips leading and trailing zeros and removes .0
+local format_n = function() -- strips leading and trailing zeros and removes .0, beware: can produce e notation
n = n + 1
return format("((a%s %% 1 == 0) and format('%%i',a%s) or tostring(a%s))",n,n,n)
end
@@ -938,13 +938,30 @@ end
-- end
-- end
-local format_N = function(f) -- strips leading and trailing zeros
- n = n + 1
- -- stripzero (singular) as we only have a number
- if not f or f == "" then
- f = ".9"
- end -- always a leading number !
- return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+local format_N if environment.FORMAT then
+
+ format_N = function(f)
+ n = n + 1
+ if not f or f == "" then
+ return format("FORMAT(a%s,'%%.9f')",n)
+ elseif f == ".6" then
+ return format("FORMAT(a%s)",n)
+ else
+ return format("FORMAT(a%s,'%%%sf')",n,f)
+ end
+ end
+
+else
+
+ format_N = function(f) -- strips leading and trailing zeros
+ n = n + 1
+ -- stripzero (singular) as we only have a number
+ if not f or f == "" then
+ f = ".9"
+ end -- always a leading number !
+ return format("(((a%s %% 1 == 0) and format('%%i',a%s)) or lpegmatch(stripzero,format('%%%sf',a%s)))",n,n,f,n)
+ end
+
end
local format_a = function(f)
diff --git a/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua b/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
index d3b5c73418..9538a15bb0 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
@@ -6,8 +6,8 @@
local ProvidesLuaModule = {
name = "luaotfload-auxiliary",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / auxiliary functions",
license = "GPL v2.0"
}
@@ -39,6 +39,13 @@ local stringbyte = string.byte
local stringfind = string.find
local tablecopy = table.copy
+local harf = luaotfload.harfbuzz
+local GSUBtag, GPOStag
+if harf then
+ GSUBtag = harf.Tag.new("GSUB")
+ GPOStag = harf.Tag.new("GPOS")
+end
+
local aux = { }
local luaotfload_callbacks = { }
@@ -101,6 +108,14 @@ luaotfload_callbacks [#luaotfload_callbacks + 1] = {
"patch_font", set_sscale_dimens, "set_sscale_dimens",
}
+-- Starting with LuaTeX 1.11.2, this is a more reliable way of selecting the
+-- right font than relying on psnames
+luaotfload_callbacks [#luaotfload_callbacks + 1] = {
+ "patch_font", function(fontdata)
+ fontdata.subfont = fontdata.specification.sub or 1
+ end, "set_font_index",
+}
+
local default_units = 1000
--- fontobj -> int
@@ -349,15 +364,27 @@ function aux.slot_of_name(font_id, glyphname, unsafe)
local tfmdata = identifiers [font_id]
if not tfmdata then return raw_slot_of_name (font_id, glyphname) end
- local resources = tfmdata.resources if not resources then return false end
- local unicodes = resources.unicodes if not unicodes then return false end
-
- local unicode = unicodes [glyphname]
- if unicode then
- if type (unicode) == "number" then
- return unicode
- else
- return unicode [1] --- for multiple components
+ local hbdata = tfmdata.hb
+ if hbdata then
+ local hbshared = hbdata.shared
+ local nominals = hbshared.nominals
+ local hbfont = hbshared.font
+
+ local gid = hbfont:get_glyph_from_name(glyphname)
+ if gid ~= nil then
+ return nominals[gid] or gid + hbshared.gid_offset
+ end
+ else
+ local resources = tfmdata.resources if not resources then return false end
+ local unicodes = resources.unicodes if not unicodes then return false end
+
+ local unicode = unicodes [glyphname]
+ if unicode then
+ if type (unicode) == "number" then
+ return unicode
+ else
+ return unicode [1] --- for multiple components
+ end
end
end
return false
@@ -412,6 +439,11 @@ local function get_features(tfmdata)
return features
end
+local function get_hbface(tfmdata)
+ if not tfmdata.hb then return end
+ return tfmdata.hbshared.face
+end
+
--[[doc--
This function, modeled after “check_script()” from fontspec, returns
true if in the given font, the script “asked_script” is accounted for in at
@@ -429,9 +461,22 @@ function aux.provides_script(font_id, asked_script)
return false
end
asked_script = stringlower(asked_script)
- if font_id and font_id > 0 then
- local tfmdata = identifiers[font_id]
- if not tfmdata then return false end
+ local tfmdata = identifiers[font_id]
+ if not tfmdata then
+ logreport ("log", 0, "aux", "no font with id %d", font_id)
+ return false
+ end
+ local hbface = get_hbface(tfmdata)
+ if hbface then
+ local script = harf.Tag.new(asked_script == "dflt" and "DFLT"
+ or asked_script)
+ for _, tag in next, { GSUBtag, GPOStag } do
+ if hbface:ot_layout_find_script(tag, script) then
+ return true
+ end
+ end
+ return false
+ else
local features = get_features (tfmdata)
if features == false then
logreport ("log", 1, "aux", "font no %d lacks a features table", font_id)
@@ -452,7 +497,6 @@ function aux.provides_script(font_id, asked_script)
"font no %d (%s) defines no feature for script %s",
font_id, fontname, asked_script)
end
- logreport ("log", 0, "aux", "no font with id %d", font_id)
return false
end
@@ -477,8 +521,30 @@ function aux.provides_language(font_id, asked_script, asked_language)
return false
end
asked_script = stringlower(asked_script)
- asked_language = stringlower(asked_language)
- if font_id and font_id > 0 then
+ local tfmdata = identifiers[font_id]
+ if not tfmdata then
+ logreport ("log", 0, "aux", "no font with id %d", font_id)
+ return false
+ end
+ local hbface = get_hbface(tfmdata)
+ if hbface then
+ asked_language = stringupper(asked_language)
+ if asked_language == "DFLT" then
+ return aux.provides_script(font_id, asked_script)
+ end
+ local script = harf.Tag.new(asked_script == "dflt" and "DFLT"
+ or asked_script)
+ local language = harf.Tag.new(asked_language == "DFLT" and "dflt"
+ or asked_language)
+ for _, tag in next, { GSUBtag, GPOStag } do
+ local _, script_idx = hbface:ot_layout_find_script(tag, script)
+ if hbface:ot_layout_find_language(tag, script_idx, language) then
+ return true
+ end
+ end
+ return false
+ else
+ asked_language = stringlower(asked_language)
local tfmdata = identifiers[font_id]
if not tfmdata then return false end
local features = get_features (tfmdata)
@@ -504,9 +570,8 @@ function aux.provides_language(font_id, asked_script, asked_language)
"font no %d (%s) defines no feature "
.. "for script %s with language %s",
font_id, fontname, asked_script, asked_language)
+ return false
end
- logreport ("log", 0, "aux", "no font with id %d", font_id)
- return false
end
--[[doc--
@@ -558,12 +623,32 @@ function aux.provides_feature(font_id, asked_script,
return false
end
asked_script = stringlower(asked_script)
- asked_language = stringlower(asked_language)
asked_feature = lpegmatch(strip_garbage, asked_feature)
- if font_id > 0 then
- local tfmdata = identifiers[font_id]
- if not tfmdata then return false end
+ local tfmdata = identifiers[font_id]
+ if not tfmdata then
+ logreport ("log", 0, "aux", "no font with id %d", font_id)
+ return false
+ end
+ local hbface = get_hbface(tfmdata)
+ if hbface then
+ asked_language = stringupper(asked_language)
+ local script = harf.Tag.new(asked_script == "dflt" and "DFLT"
+ or asked_script)
+ local language = harf.Tag.new(asked_language == "DFLT" and "dflt"
+ or asked_language)
+ local feature = harf.Tag.new(feature)
+
+ for _, tag in next, { GSUBtag, GPOStag } do
+ local _, script_idx = hbface:ot_layout_find_script(tag, script)
+ local _, language_idx = hbface:ot_layout_find_language(tag, script_idx, language)
+ if hbface:ot_layout_find_feature(tag, script_idx, language_idx, feature) then
+ return true
+ end
+ end
+ return false
+ else
+ asked_language = stringlower(asked_language)
local features = get_features (tfmdata)
if features == false then
logreport ("log", 1, "aux", "font no %d lacks a features table", font_id)
@@ -588,8 +673,6 @@ function aux.provides_feature(font_id, asked_script,
"font no %d (%s) does not define feature %s for script %s with language %s",
font_id, fontname, asked_feature, asked_script, asked_language)
end
- logreport ("log", 0, "aux", "no font with id %d", font_id)
- return false
end
-----------------------------------------------------------------------
diff --git a/macros/luatex/generic/luaotfload/luaotfload-colors.lua b/macros/luatex/generic/luaotfload/luaotfload-colors.lua
index fdae0c4450..ae78130b4f 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-colors.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-colors.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-colors",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang, Dohyun Kim, David Carlisle",
@@ -405,6 +405,7 @@ return function ()
initializers = {
base = setcolor,
node = setcolor,
+ plug = setcolor,
}
}
return true
diff --git a/macros/luatex/generic/luaotfload/luaotfload-conf.pdf b/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
index edea84a1d7..031fb0987a 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-configuration.lua b/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
index fc30cc8343..e9b818df2d 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
@@ -7,8 +7,8 @@
local ProvidesLuaModule = {
name = "luaotfload-configuration",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / config file reader",
license = "GPL v2.0"
}
@@ -62,7 +62,7 @@ local filejoin = file.join
local filereplacesuffix = file.replacesuffix
local logreport = print -- overloaded later
-local getwritablepath = caches.getwritablepath
+local getwritablepath = luaotfload.fontloader.caches.getwritablepath
local config_parser -- set later during init
@@ -382,7 +382,7 @@ local set_default_features = function ()
global = { },
defaults = { },
}
- current_features = luaotfload.features
+ local current_features = luaotfload.features
for var, val in next, default_features do
if var == "global" then
current_features.global = val
diff --git a/macros/luatex/generic/luaotfload/luaotfload-database.lua b/macros/luatex/generic/luaotfload/luaotfload-database.lua
index 0610618905..10a0853c89 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-database.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-database.lua
@@ -5,8 +5,8 @@
do -- block to avoid to many local variables error
local ProvidesLuaModule = {
name = "luaotfload-database",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / database",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
@@ -148,7 +148,6 @@ local gzipload = gzip.load
local gzipsave = gzip.save
local iolines = io.lines
local ioopen = io.open
-local iopopen = io.popen
local kpseexpand_path = kpse.expand_path
local kpsefind_file = kpse.find_file
local kpselookup = kpse.lookup
@@ -168,13 +167,14 @@ local stringgmatch = string.gmatch
local stringgsub = string.gsub
local stringlower = string.lower
local stringsub = string.sub
-local stringupper = string.upper
local tableconcat = table.concat
local tablesort = table.sort
local utf8len = utf8.len
local utf8offset = utf8.offset
--- these come from Lualibs/Context
+local context_environment = luaotfload.fontloader
+local caches = context_environment.caches
local filebasename = file.basename
local filecollapsepath = file.collapsepath or file.collapse_path
local filedirname = file.dirname
@@ -198,9 +198,9 @@ local tablecontains = table.contains
local tablecopy = table.copy
local tablefastcopy = table.fastcopy
local tabletofile = table.tofile
-local tabletohash = table.tohash
local tableserialize = table.serialize
local names = fonts and fonts.names or { }
+local resolversfindfile = context_environment.resolvers.findfile
--- some of our own
local unicode = require'luaotfload-unicode'
@@ -736,7 +736,7 @@ lookup_font_file = function (filename)
if not found then
local type = file.suffix(filename)
if type ~= "" then
- found = resolvers.findfile(filename, type)
+ found = resolversfindfile(filename, type)
end
end
@@ -746,7 +746,7 @@ lookup_font_file = function (filename)
for i=1, #type1_metrics do
local format = type1_metrics[i]
- if resolvers.findfile(filename, format) then
+ if resolversfindfile(filename, format) then
return file.addsuffix(filename, format), format, true
end
end
@@ -785,7 +785,7 @@ local get_font_file = function (index)
end
local basename = entry.basename
if entry.location == "texmf" then
- local fullname = resolvers.findfile(basename, entry.format)
+ local fullname = resolversfindfile(basename, entry.format)
if fullname then
return true, fullname, entry.subfont
end
@@ -809,7 +809,7 @@ local verify_font_file = function (basename)
if path and lfsisfile(path) then
return true
end
- if resolvers.findfile(basename) then
+ if resolversfindfile(basename) then
return true
end
return false
@@ -2125,9 +2125,8 @@ do
return
end
- if splitcomma == nil then
- splitcomma = luaotfload.parsers and luaotfload.parsers.splitcomma
- end
+ local splitcomma = luaotfload.parsers and luaotfload.parsers.splitcomma
+
if stringsub (formats, 1, 1) == "+" then -- add
formats = lpegmatch (splitcomma, stringsub (formats, 2))
if formats then
@@ -2281,7 +2280,14 @@ local truncate_string = function (str, restrict)
local tw = config.luaotfload.misc.termwidth
local wd = tw - restrict
local len = utf8len (str)
- if wd - len < 0 then
+ if not len then
+ -- str is not valid UTF-8... We will assume a 8-bit
+ -- encoding and forward it verbatim to the output.
+ len = #str
+ if wd - len < 0 then
+ str = ".." .. stringsub(str, len - wd + 2)
+ end
+ elseif wd - len < 0 then
--- combined length exceeds terminal,
str = ".." .. stringsub(str, utf8offset(str, - wd + 2))
end
@@ -3098,6 +3104,39 @@ end
--[[doc--
+ Get the subfont index corresponding to a given psname in a
+ font collection
+
+--doc]]--
+
+local function lookup_subfont_index(filepath, psname)
+ assert(name_index)
+ -- if not name_index then name_index = load_names () end
+ local filestatus = name_index.status[filepath]
+ local mappings = name_index.mappings
+ if filestatus then
+ for subfont, idx in next, filestatus.index do
+ if mappings[idx].psname == psname then
+ return subfont or 1
+ end
+ end
+ end
+
+ -- If that didn't work, we do a manual search
+ psname = sanitize_fontname(psname)
+ local err, info = read_font_file (filepath)
+ if #info == 0 then return 1 end
+ for i = 1, #info do
+ for _, names in next, info[i].platformnames do
+ if psname == sanitize_fontname(names.postscriptname) then
+ return i
+ end
+ end
+ end
+end
+
+--[[doc--
+
collect_font_filenames -- Scan the three search path categories for
font files. This constitutes the first pass of the update mode.
@@ -3707,8 +3746,6 @@ end
--- PHG: we need to investigate these, maybe they’re useful as early
--- hooks
-local ignoredfile = function () return false end
-
local reportmissingbase = function ()
logreport ("info", 0, "db", --> bug‽
"Font name database not found but expected by fontloader.")
@@ -3737,7 +3774,7 @@ local resolve = function (name, subfont)
end
local api = {
- ignoredfile = ignoredfile,
+ ignoredfile = function() return false end,
reportmissingbase = reportmissingbase,
reportmissingname = reportmissingname,
getfilename = getfilename,
@@ -3770,6 +3807,7 @@ local export = {
count_font_files = count_font_files,
nth_font_filename = nth_font_filename,
font_slice = font_slice,
+ lookup_subfont_index = lookup_subfont_index,
--- font cache
purge_cache = purge_cache,
erase_cache = erase_cache,
diff --git a/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua b/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
index b38c1add0d..1dc24ba6ee 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
@@ -7,8 +7,8 @@
local ProvidesLuaModule = {
name = "luaotfload-diagnostics",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload-tool submodule / diagnostics",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-embolden.lua b/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
index bd2237f086..8d51249976 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-embolden",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-features.lua b/macros/luatex/generic/luaotfload/luaotfload-features.lua
index 3901d940dd..bf56c4e3d1 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-features.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-features.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-features",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / features",
license = "GPL v2.0",
author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
@@ -26,6 +26,7 @@ local lpeg = require "lpeg"
local lpegmatch = lpeg.match
local P = lpeg.P
local R = lpeg.R
+local S = lpeg.S
local C = lpeg.C
local table = table
@@ -338,10 +339,9 @@ end
local extract_subfont
do
local eof = P(-1)
- local digit = R"09"
--- Theoretically a valid subfont address can be up to ten
- --- digits long.
- local sub_expr = P"(" * C(digit^1) * P")" * eof
+ --- digits long. Additionally we allow names
+ local sub_expr = P"(" * C((1 - S"()")^1) * P")" * eof
local full_path = C(P(1 - sub_expr)^1)
extract_subfont = full_path * sub_expr
end
@@ -371,7 +371,7 @@ local handle_request = function (specification)
local fullpath, sub = lpegmatch(extract_subfont,
specification.specification)
if fullpath and sub then
- specification.sub = tonumber(sub)
+ specification.sub = tonumber(sub) or sub
specification.name = fullpath
else
specification.name = specification.specification
@@ -428,12 +428,7 @@ local handle_request = function (specification)
--- investigated it any further (luatex-fonts-ext), so it will
--- just stay here.
features.normal = normalize (request.features)
- local subfont = tonumber (request.sub)
- if subfont and subfont >= 0 then
- specification.sub = subfont + 1
- else
- specification.sub = false
- end
+ specification.sub = request.sub or specification.sub or false
if request.features and request.features.mode
and fonts.readers[request.features.mode] then
@@ -572,8 +567,8 @@ local autofeatures = {
local add_auto_features = function ()
local nfeats = #autofeatures
- logreport ("both", 5, "features",
- "auto-installing %d feature definitions", nfeats)
+ report ("both", 5, "features",
+ "auto-installing %d feature definitions", nfeats)
for i = 1, nfeats do
local name, spec, desc = unpack (autofeatures [i])
spec.description = desc
@@ -582,12 +577,10 @@ local add_auto_features = function ()
end
return function ()
- logreport = luaotfload.log.report
-
if not fonts and fonts.handlers then
- logreport ("log", 0, "features",
- "OTF mechanisms missing -- did you forget to \z
- load a font loader?")
+ report ("log", 0, "features",
+ "OTF mechanisms missing -- did you forget to \z
+ load a font loader?")
return false
end
add_auto_features ()
diff --git a/macros/luatex/generic/luaotfload/luaotfload-filelist.lua b/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
index ade50b4316..24868eb315 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
@@ -6,8 +6,8 @@
local ProvidesLuaModule = {
name = "luaotfload-filelist",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / filelist",
license = "GPL v2.0"
}
@@ -248,11 +248,14 @@ luaotfload.filelist.data =
{ name = "letterspace" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "embolden" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "notdef" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
+ { name = "harf-define" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
+ { name = "harf-plug" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "loaders" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "multiscript" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "parsers" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "resolvers" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "unicode" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
+ { name = "tounicode" ,kind = kind_library, ext =".lua", gitdir=gitdirsrc, texdir=texdirtex, gitpref = "luaotfload-" },
{ name = "characters" ,kind = kind_generated, ext =".lua", gitdir=gitdirgen, texdir=texdirtex, gitpref = "luaotfload-", script="mkcharacter" },
{ name = "glyphlist" ,kind = kind_generated, ext =".lua", gitdir=gitdirgen, texdir=texdirtex, gitpref = "luaotfload-", script="mkglyphlist" },
diff --git a/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua b/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
index 1ba46ab0d7..fe655149ad 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
@@ -1,7 +1,7 @@
local ProvidesLuaModule = {
name = "luaotfload-glyphlist",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / autogenerated glyphlist",
copyright = "derived from https://raw.githubusercontent.com/adobe-type-tools/agl-aglfn/master/glyphlist.txt",
original = "Adobe Glyph List, version 2.0, September 20, 2002",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua
new file mode 100644
index 0000000000..e8154cb719
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua
@@ -0,0 +1,394 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-harf-define.lua
+-- DESCRIPTION: part of luaotfload / HarfBuzz / font definition
+-----------------------------------------------------------------------
+do -- block to avoid to many local variables error
+ local ProvidesLuaModule = {
+ name = "luaotfload-harf-define",
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
+ description = "luaotfload submodule / database",
+ license = "GPL v2.0",
+ author = "Khaled Hosny, Marcel Krüger",
+ copyright = "Luaotfload Development Team",
+ }
+
+ if luatexbase and luatexbase.provides_module then
+ luatexbase.provides_module (ProvidesLuaModule)
+ end
+end
+
+local stringlower = string.lower
+local stringupper = string.upper
+local gsub = string.gsub
+
+local hb = luaotfload.harfbuzz
+
+local hbfonts = {}
+
+local cfftag = hb.Tag.new("CFF ")
+local cff2tag = hb.Tag.new("CFF2")
+local os2tag = hb.Tag.new("OS/2")
+local posttag = hb.Tag.new("post")
+local glyftag = hb.Tag.new("glyf")
+
+local containers = luaotfload.fontloader.containers
+local hbcacheversion = 1.0
+local facecache = containers.define("fonts", "hb", hbcacheversion, true)
+
+local function loadfont(spec)
+ local path, sub = spec.resolved, spec.sub or 1
+
+ local key = string.format("%s:%d", gsub(path, "[/\\]", ":"), sub)
+
+ local attributes = lfs.attributes(path)
+ local size, date = attributes.size or 0, attributes.modification or 0
+
+ local cached = containers.read(facecache, key)
+ local iscached = cached and cached.date == date and cached.size == size
+
+ local hbface = iscached and cached.face or hb.Face.new(path, sub - 1)
+ local tags = hbface and hbface:get_table_tags()
+ -- If the face has no table tags then it isn’t a valid SFNT font that
+ -- HarfBuzz can handle.
+ if not tags then return end
+ local hbfont = iscached and cached.font or hb.Font.new(hbface)
+
+ if not iscached then
+ local upem = hbface:get_upem()
+
+ -- The engine seems to use the font type to tell whether there is a CFF
+ -- table or not, so we check for that here.
+ local fonttype = nil
+ local hasos2 = false
+ local haspost = false
+ for i = 1, #tags do
+ local tag = tags[i]
+ if tag == cfftag or tag == cff2tag then
+ fonttype = "opentype"
+ elseif tag == glyftag then
+ fonttype = "truetype"
+ elseif tag == os2tag then
+ hasos2 = true
+ elseif tag == posttag then
+ haspost = true
+ end
+ end
+
+ local fontextents = hbfont:get_h_extents()
+ local ascender = fontextents and fontextents.ascender or upem * .8
+ local descender = fontextents and fontextents.descender or upem * .2
+
+ local gid = hbfont:get_nominal_glyph(0x0020)
+ local space = gid and hbfont:get_glyph_h_advance(gid) or upem / 2
+
+ local slant = 0
+ if haspost then
+ local post = hbface:get_table(posttag)
+ local length = post:get_length()
+ local data = post:get_data()
+ if length >= 32 and string.unpack(">i4", data) <= 0x00030000 then
+ local italicangle = string.unpack(">i4", data, 5) / 2^16
+ if italicangle ~= 0 then
+ slant = -math.tan(italicangle * math.pi / 180) * 65536.0
+ end
+ end
+ end
+
+ -- Load glyph metrics for all glyphs in the font. We used to do this on
+ -- demand to make loading fonts faster, but hit many limitations inside
+ -- the engine (mainly with shared backend fonts, where the engine would
+ -- assume all fonts it decides to share load the same set of glyphs).
+ --
+ -- Getting glyph advances is fast enough, but glyph extents are slower
+ -- especially in CFF fonts. We might want to have an option to ignore exact
+ -- glyph extents and use font ascender and descender if this proved to be
+ -- too slow.
+ local glyphcount = hbface:get_glyph_count()
+ local glyphs = {}
+ for gid = 0, glyphcount - 1 do
+ local width = hbfont:get_glyph_h_advance(gid)
+ local height, depth, italic = nil, nil, nil
+ local extents = hbfont:get_glyph_extents(gid)
+ if extents then
+ height = extents.y_bearing
+ depth = extents.y_bearing + extents.height
+ if extents.x_bearing < 0 then
+ italic = -extents.x_bearing
+ end
+ end
+ glyphs[gid] = {
+ width = width,
+ height = height or ascender,
+ depth = -(depth or descender),
+ italic = italic or 0,
+ }
+ end
+
+ local unicodes = hbface:collect_unicodes()
+ local characters = {}
+ local nominals = {}
+ for _, uni in next, unicodes do
+ local glyph = hbfont:get_nominal_glyph(uni)
+ if glyph then
+ characters[uni] = glyph
+ nominals[glyph] = uni
+ end
+ end
+
+ local xheight, capheight = 0, 0
+ if hasos2 then
+ local os2 = hbface:get_table(os2tag)
+ local length = os2:get_length()
+ local data = os2:get_data()
+ if length >= 96 and string.unpack(">H", data) > 1 then
+ -- We don’t need much of the table, so we read from hard-coded offsets.
+ xheight = string.unpack(">H", data, 87)
+ capheight = string.unpack(">H", data, 89)
+ end
+ end
+
+ if xheight == 0 then
+ local gid = characters[120] -- x
+ if gid then
+ xheight = glyphs[gid].height
+ else
+ xheight = ascender / 2
+ end
+ end
+
+ if capheight == 0 then
+ local gid = characters[88] -- X
+ if gid then
+ capheight = glyphs[gid].height
+ else
+ capheight = ascender
+ end
+ end
+
+ cached = {
+ date = date,
+ size = size,
+ gid_offset = 0x120000,
+ upem = upem,
+ fonttype = fonttype,
+ space = space,
+ xheight = xheight,
+ capheight = capheight,
+ slant = slant,
+ glyphs = glyphs,
+ nominals = nominals,
+ unicodes = characters,
+ psname = hbface:get_name(hb.ot.NAME_ID_POSTSCRIPT_NAME),
+ fullname = hbface:get_name(hb.ot.NAME_ID_FULL_NAME),
+ haspng = hbface:ot_color_has_png(),
+ loaded = {}, -- Cached loaded glyph data.
+ }
+
+ containers.write(facecache, key, cached)
+ end
+ cached.face = hbface
+ cached.font = hbfont
+ return cached
+end
+
+-- Drop illegal characters from PS Name, per the spec
+-- https://docs.microsoft.com/en-us/typography/opentype/spec/name#nid6
+local function sanitize(psname)
+ return psname:gsub('[][\0-\32\127-\255(){}<>/%%]', '-')
+end
+
+-- Ligatures. The value is a character "ligature" table as described in the
+-- manual.
+local tlig ={
+ [0x2013] = { [0x002D] = { char = 0x2014 } }, -- [---]
+ [0x002D] = { [0x002D] = { char = 0x2013 } }, -- [--]
+ [0x0060] = { [0x0060] = { char = 0x201C } }, -- [``]
+ [0x0027] = { [0x0027] = { char = 0x201D } }, -- ['']
+ [0x0021] = { [0x0060] = { char = 0x00A1 } }, -- [!`]
+ [0x003F] = { [0x0060] = { char = 0x00BF } }, -- [?`]
+ [0x002C] = { [0x002C] = { char = 0x201E } }, -- [,,]
+ [0x003C] = { [0x003C] = { char = 0x00AB } }, -- [<<]
+ [0x003E] = { [0x003E] = { char = 0x00BB } }, -- [>>]
+}
+
+local function scalefont(data, spec)
+ local size = spec.size
+ local features = spec.features.normal
+ features.mode = 'plug'
+ features.features = 'harf'
+ fonts.constructors.checkedfeatures("otf", features)
+ local hbface = data.face
+ local hbfont = data.font
+ local upem = data.upem
+ local space = data.space
+ local gid_offset = data.gid_offset
+
+ if size < 0 then
+ size = -655.36 * size
+ end
+
+ -- We shape in font units (at UPEM) and then scale output with the desired
+ -- sfont size.
+ local scale = size / upem
+ hbfont:set_scale(upem, upem)
+
+ -- Populate font’s characters table.
+ local glyphs = data.glyphs
+ local characters = {}
+ for gid, glyph in next, glyphs do
+ characters[gid_offset + gid] = {
+ index = gid,
+ width = glyph.width * scale,
+ height = glyph.height * scale,
+ depth = glyph.depth * scale,
+ italic = glyph.italic * scale,
+ }
+ end
+
+ local unicodes = data.unicodes
+ for uni, gid in next, unicodes do
+ characters[uni] = characters[gid_offset + gid]
+ end
+
+ -- Select font palette, we support `palette=index` option, and load the first
+ -- one otherwise.
+ local paletteidx = tonumber(features.palette or features.colr) or 1
+
+ -- Load CPAL palette from the font.
+ local palette = nil
+ if hbface:ot_color_has_palettes() and hbface:ot_color_has_layers() then
+ local count = hbface:ot_color_palette_get_count()
+ if paletteidx <= count then
+ palette = hbface:ot_color_palette_get_colors(paletteidx)
+ end
+ end
+
+ local letterspace = 0
+ if features.letterspace then
+ letterspace = tonumber(features.letterspace) / 100 * upem
+ elseif features.kernfactor then
+ letterspace = tonumber(features.kernfactor) * upem
+ end
+ space = space + letterspace
+
+ local slantfactor = nil
+ if features.slant then
+ slantfactor = tonumber(features.slant) * 1000
+ end
+
+ local mode = nil
+ local width = nil
+ if features.embolden then
+ mode = 2
+ -- The multiplication by 7200.0/7227 is to undo the opposite conversion
+ -- the engine is doing and make the final number written in the PDF file
+ -- match XeTeX’s.
+ width = (size * tonumber(features.embolden) / 6553.6) * (7200.0/7227)
+ end
+
+ local hscale = upem
+ local extendfactor = nil
+ if features.extend then
+ extendfactor = tonumber(features.extend) * 1000
+ hscale = hscale * tonumber(features.extend)
+ end
+
+ local vscale = upem
+ local squeezefactor = nil
+ if features.squeeze then
+ squeezefactor = tonumber(features.squeeze) * 1000
+ vscale = vscale * tonumber(features.squeeze)
+ end
+
+ if features.tlig then
+ for char in next, characters do
+ local ligatures = tlig[char]
+ if ligatures then
+ characters[char].ligatures = ligatures
+ end
+ end
+ end
+
+ local tfmdata = {
+ name = spec.specification,
+ filename = spec.resolved,
+ subfont = spec.sub or 1,
+ designsize = size,
+ psname = sanitize(data.psname),
+ fullname = data.fullname,
+ index = spec.index,
+ size = size,
+ units_per_em = upem,
+ embedding = "subset",
+ tounicode = 1,
+ nomath = true,
+ format = data.fonttype,
+ slant = slantfactor,
+ mode = mode,
+ width = width,
+ extend = extendfactor,
+ squeeze = squeezefactor,
+ characters = characters,
+ parameters = {
+ slant = data.slant,
+ space = space * scale,
+ space_stretch = space * scale / 2,
+ space_shrink = space * scale / 3,
+ x_height = data.xheight * scale,
+ quad = size,
+ extra_space = space * scale / 3,
+ [8] = data.capheight * scale, -- for XeTeX compatibility.
+ },
+ hb = {
+ scale = scale,
+ spec = spec,
+ palette = palette,
+ shared = data,
+ letterspace = letterspace,
+ hscale = hscale,
+ vscale = vscale,
+ },
+ specification = spec,
+ shared = {},
+ properties = {},
+ }
+ tfmdata.shared.processes = fonts.handlers.otf.setfeatures(tfmdata, features)
+ return tfmdata
+end
+
+-- Register a reader for `harf` mode (`mode=harf` font option) so that we only
+-- load fonts when explicitly requested. Fonts we load will be shaped by the
+-- harf plugin in luaotfload-harf-plug.
+fonts.readers.harf = function(spec)
+ if not spec.resolved then return end
+ local rawfeatures = spec.features.raw
+ local hb_features = {}
+ spec.hb_features = hb_features
+
+ if rawfeatures.language then
+ local language = stringupper(rawfeatures.language)
+ spec.language = hb.Language.new(language == "DFLT" and "dflt"
+ or language)
+ end
+ if rawfeatures.script then
+ local script = stringlower(rawfeatures.script)
+ spec.script = hb.Script.new(script == "dflt" and "DFLT"
+ or script)
+ end
+ for key, val in next, rawfeatures do
+ if key:len() == 4 then
+ -- 4-letter options are likely font features, but not always, so we do
+ -- some checks below. Other options will be queried
+ -- from spec.features.normal.
+ if val == true or val == false then
+ val = (val and '+' or '-')..key
+ hb_features[#hb_features + 1] = hb.Feature.new(val)
+ elseif tonumber(val) then
+ val = '+'..key..'='..tonumber(val) - 1
+ hb_features[#hb_features + 1] = hb.Feature.new(val)
+ end
+ end
+ end
+ return scalefont(loadfont(spec), spec)
+end
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua
new file mode 100644
index 0000000000..123a1c4563
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua
@@ -0,0 +1,983 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-harf-plug.lua
+-- DESCRIPTION: part of luaotfload / HarfBuzz / fontloader plugin
+-----------------------------------------------------------------------
+do -- block to avoid to many local variables error
+ local ProvidesLuaModule = {
+ name = "luaotfload-harf-plug",
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
+ description = "luaotfload submodule / database",
+ license = "GPL v2.0",
+ author = "Khaled Hosny, Marcel Krüger",
+ copyright = "Luaotfload Development Team",
+ }
+
+ if luatexbase and luatexbase.provides_module then
+ luatexbase.provides_module (ProvidesLuaModule)
+ end
+end
+
+local hb = luaotfload.harfbuzz
+
+local assert = assert
+local next = next
+local tonumber = tonumber
+local type = type
+local format = string.format
+local open = io.open
+local tableinsert = table.insert
+local tableremove = table.remove
+local ostmpname = os.tmpname
+local osremove = os.remove
+
+local direct = node.direct
+local tonode = direct.tonode
+local todirect = direct.todirect
+local traverse = direct.traverse
+local insertbefore = direct.insert_before
+local insertafter = direct.insert_after
+local protectglyph = direct.protect_glyph
+local newnode = direct.new
+local freenode = direct.free
+local copynode = direct.copy
+local removenode = direct.remove
+local copynodelist = direct.copy_list
+local ischar = direct.is_char
+local uses_font = direct.uses_font
+
+local getattrs = direct.getattributelist
+local setattrs = direct.setattributelist
+local getchar = direct.getchar
+local setchar = direct.setchar
+local getdir = direct.getdir
+local setdir = direct.setdir
+local getdisc = direct.getdisc
+local setdisc = direct.setdisc
+local getfont = direct.getfont
+local getdata = direct.getdata
+local setdata = direct.setdata
+local getfont = direct.getfont
+local setfont = direct.setfont
+local getfield = direct.getfield
+local setfield = direct.setfield
+local getid = direct.getid
+local getkern = direct.getkern
+local setkern = direct.setkern
+local getnext = direct.getnext
+local setnext = direct.setnext
+local getoffsets = direct.getoffsets
+local setoffsets = direct.setoffsets
+local getproperty = direct.getproperty
+local setproperty = direct.setproperty
+local getprev = direct.getprev
+local setprev = direct.setprev
+local getsubtype = direct.getsubtype
+local setsubtype = direct.setsubtype
+local getwidth = direct.getwidth
+local setwidth = direct.setwidth
+local is_char = direct.is_char
+local tail = direct.tail
+
+local properties = direct.get_properties_table()
+
+local imgnode = img.node
+
+local disc_t = node.id("disc")
+local glue_t = node.id("glue")
+local glyph_t = node.id("glyph")
+local dir_t = node.id("dir")
+local kern_t = node.id("kern")
+local localpar_t = node.id("local_par")
+local whatsit_t = node.id("whatsit")
+local pdfliteral_t = node.subtype("pdf_literal")
+
+local explicitdisc_t = 1
+local fontkern_t = 0
+local italiccorr_t = 3
+local regulardisc_t = 3
+local spaceskip_t = 13
+
+local invalid_l = hb.Language.new()
+local invalid_s = hb.Script.new()
+
+local dir_ltr = hb.Direction.new("ltr")
+local dir_rtl = hb.Direction.new("rtl")
+local fl_unsafe = hb.Buffer.GLYPH_FLAG_UNSAFE_TO_BREAK
+
+local startactual_p = "luaotfload_startactualtext"
+local endactual_p = "luaotfload_endactualtext"
+
+-- "Copy" properties as done by LuaTeX: Make old properties metatable
+local function copytable(old)
+ local new = {}
+ for k, v in next, old do
+ if type(v) == "table" then v = copytable(v) end
+ new[k] = v
+ end
+ setmetatable(new, getmetatable(old))
+ return new
+end
+
+-- Set and get properties.
+local function setprop(n, prop, value)
+ local props = properties[n]
+ if not props then
+ props = {}
+ properties[n] = props
+ end
+ props[prop] = value
+end
+
+local function inherit(t, base, properties)
+ local n = newnode(t)
+ setattrs(n, getattrs(base))
+ if properties then
+ setproperty(n, setmetatable({}, {__index = properties}))
+ end
+ return n
+end
+-- New kern node of amount `v`, inheriting the properties/attributes of `n`.
+local function newkern(v, n)
+ local kern = inherit(kern_t, n, getproperty(n))
+ setkern(kern, v)
+ return kern
+end
+
+local function insertkern(head, current, kern, rtl)
+ if rtl then
+ head = insertbefore(head, current, kern)
+ else
+ head, current = insertafter(head, current, kern)
+ end
+ return head, current
+end
+
+-- Convert list of integers to UTF-16 hex string used in PDF.
+local function to_utf16_hex(uni)
+ if uni < 0x10000 then
+ return format("%04X", uni)
+ else
+ uni = uni - 0x10000
+ local hi = 0xD800 + (uni // 0x400)
+ local lo = 0xDC00 + (uni % 0x400)
+ return format("%04X%04X", hi, lo)
+ end
+end
+
+local process
+
+-- Legacy TeX Input Method Disguised as Font Ligatures hack.
+--
+-- Single replacements, keyed by character to replace. Handled separately
+-- because TeX ligaturing mechanism does not support one-to-one replacements.
+local trep = {
+ [0x0022] = 0x201D, -- ["]
+ [0x0027] = 0x2019, -- [']
+ [0x0060] = 0x2018, -- [`]
+}
+
+local function itemize(head, fontid, direction)
+ local fontdata = font.getfont(fontid)
+ local hbdata = fontdata and fontdata.hb
+ local spec = fontdata and fontdata.specification
+ local options = spec and spec.features.raw
+ local texlig = options and options.tlig
+
+ local runs, codes = {}, {}
+ local dirstack = {}
+ local currdir = direction or "TLT"
+ local lastskip, lastdir = true
+ local lastrun = {}
+
+ for n, id, subtype in direct.traverse(head) do
+ local code = 0xFFFC -- OBJECT REPLACEMENT CHARACTER
+ local skip = false
+
+ if id == glyph_t then
+ if is_char(n) and getfont(n) == fontid then
+ code = getchar(n)
+ else
+ skip = true
+ end
+ elseif id == glue_t and subtype == spaceskip_t then
+ code = 0x0020 -- SPACE
+ skip = lastskip
+ elseif id == disc_t then
+ if uses_font(n, fontid) then
+ code = 0x00AD -- SOFT HYPHEN
+ else
+ skip = true
+ end
+ elseif id == dir_t then
+ local dir = getdir(n)
+ if dir:sub(1, 1) == "+" then
+ -- Push the current direction to the stack.
+ tableinsert(dirstack, currdir)
+ currdir = dir:sub(2)
+ else
+ assert(currdir == dir:sub(2))
+ -- Pop the last direction from the stack.
+ currdir = tableremove(dirstack)
+ end
+ skip = lastskip
+ elseif id == localpar_t then
+ currdir = getdir(n)
+ skip = lastskip
+ end
+
+ if not skip and texlig then
+ local replacement = trep[code]
+ if replacement then
+ code = replacement
+ end
+ end
+
+ codes[#codes + 1] = code
+
+ if lastdir ~= currdir or lastskip ~= skip then
+ lastrun.after = n
+ lastrun = {
+ start = #codes,
+ len = 1,
+ font = fontid,
+ dir = currdir == "TRT" and dir_rtl or dir_ltr,
+ skip = skip,
+ codes = codes,
+ }
+ runs[#runs + 1] = lastrun
+ lastdir, lastskip = currdir, skip
+ else
+ lastrun.len = lastrun.len + 1
+ end
+ end
+
+ return runs
+end
+
+
+-- Check if it is not safe to break before this glyph.
+local function unsafetobreak(glyph)
+ return glyph
+ and glyph.flags
+ and glyph.flags & fl_unsafe
+end
+
+local shape
+
+-- Make s a sub run, used by discretionary nodes.
+local function makesub(run, codes, nodelist)
+ local subrun = {
+ start = 1,
+ len = #codes,
+ font = run.font,
+ dir = run.dir,
+ fordisc = true,
+ node = nodelist,
+ codes = codes,
+ }
+ local glyphs
+ if nodelist == 0 then -- FIXME: This shouldn't happen
+ nodelist = nil
+ end
+ nodelist, glyphs = shape(nodelist, nodelist, subrun)
+ return { glyphs = glyphs, run = subrun, head = nodelist }
+end
+
+local function printnodes(label, head, after)
+ after = tonode(after)
+ for n in node.traverse(tonode(head)) do
+ if n == after then return end
+ print(label, n, n.font or '', n.char or '')
+ local pre, post, rep = getdisc(todirect(n))
+ if pre then
+ printnodes(label .. '<', pre)
+ end
+ if post then
+ printnodes(label .. '>', post)
+ end
+ if rep then
+ printnodes(label .. '=', rep)
+ end
+ end
+end
+-- Main shaping function that calls HarfBuzz, and does some post-processing of
+-- the output.
+function shape(head, node, run)
+ local codes = run.codes
+ local offset = run.start
+ local nodeindex = offset
+ run.start = offset
+ local len = run.len
+ local fontid = run.font
+ local dir = run.dir
+ local fordisc = run.fordisc
+ local cluster = offset - 2
+
+ local fontdata = font.getfont(fontid)
+ local hbdata = fontdata.hb
+ local spec = hbdata.spec
+ local features = spec.hb_features
+ local options = spec.features.raw
+ local hbshared = hbdata.shared
+ local hbfont = hbshared.font
+
+ local lang = spec.language or invalid_l
+ local script = spec.script or invalid_s
+ local shapers = options.shaper and { options.shaper } or {}
+
+ local buf = hb.Buffer.new()
+ buf:set_direction(dir)
+ buf:set_script(script)
+ buf:set_language(lang)
+ buf:set_cluster_level(buf.CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+ buf:add_codepoints(codes, offset - 1, len)
+
+ local hscale = hbdata.hscale
+ local vscale = hbdata.vscale
+ hbfont:set_scale(hscale, vscale)
+
+ if hb.shape_full(hbfont, buf, features, shapers) then
+ -- The engine wants the glyphs in logical order, but HarfBuzz outputs them
+ -- in visual order, so we reverse RTL buffers.
+ if dir:is_backward() then buf:reverse() end
+
+ local glyphs = buf:get_glyphs()
+
+ local i = 0
+ while i < #glyphs do
+ i = i + 1
+ local glyph = glyphs[i]
+
+ -- Calculate the Unicode code points of this glyph. If cluster did not
+ -- change then this is a glyph inside a complex cluster and will be
+ -- handled with the start of its cluster.
+ if cluster ~= glyph.cluster then
+ cluster = glyph.cluster
+ for i = nodeindex, cluster do node = getnext(node) end
+ nodeindex = cluster + 1
+ local hex = ""
+ local str = ""
+ local nextcluster
+ for j = i+1, #glyphs do
+ nextcluster = glyphs[j].cluster
+ if cluster ~= nextcluster then
+ glyph.nglyphs = j - i
+ goto NEXTCLUSTERFOUND -- break
+ end
+ end -- else -- only executed if the loop reached the end without
+ -- finding another cluster
+ nextcluster = offset + len - 1
+ glyph.nglyphs = #glyphs + 1 - i
+ ::NEXTCLUSTERFOUND:: -- end
+ glyph.nextcluster = nextcluster
+ do
+ local node = node
+ for j = cluster,nextcluster-1 do
+ local id = getid(node)
+ if id == glyph_t or id == glue_t then
+ local code = codes[j + 1]
+ hex = hex..to_utf16_hex(code)
+ str = str..utf8.char(code)
+ end
+ end
+ glyph.tounicode = hex
+ glyph.string = str
+ end
+ if not fordisc then
+ local discindex = nil
+ local disc = node
+ for j = cluster + 1, nextcluster do
+ if codes[j] == 0x00AD then
+ discindex = j
+ break
+ end
+ disc = getnext(disc)
+ end
+ if discindex then
+ -- Discretionary found.
+ local startindex, stopindex = nil, nil
+ local startglyph, stopglyph = nil, nil
+
+ -- Find the previous glyph that is safe to break at.
+ local startglyph = i
+ while startglyph > 1
+ and codes[glyphs[startglyph - 1].cluster + 1] ~= 0x20
+ and codes[glyphs[startglyph - 1].cluster + 1] ~= 0xFFFC
+ and unsafetobreak(glyphs[startglyph]) do
+ startglyph = startglyph - 1
+ end
+ -- Get the corresponding character index.
+ startindex = glyphs[startglyph].cluster + 1
+
+ -- Find the next glyph that is safe to break at.
+ stopglyph = i + 1
+ local lastcluster = glyphs[i].cluster
+ while stopglyph <= #glyphs
+ and codes[glyphs[stopglyph].cluster + 1] ~= 0x20
+ and codes[glyphs[stopglyph].cluster + 1] ~= 0xFFFC
+ and (unsafetobreak(glyphs[stopglyph])
+ or lastcluster == glyphs[stopglyph].cluster) do
+ lastcluster = glyphs[stopglyph].cluster
+ stopglyph = stopglyph + 1
+ end
+
+ stopindex = stopglyph <= #glyphs and glyphs[stopglyph].cluster + 1
+ or offset + len
+
+ local startnode, stopnode = node, node
+ for j=nodeindex - 1, startindex, -1 do
+ startnode = getprev(startnode)
+ end
+ for j=nodeindex + 1, stopindex do
+ stopnode = getnext(stopnode)
+ end
+
+ glyphs[startglyph] = glyph
+ glyph.cluster = startindex - 1
+ glyph.nextcluster = startindex
+ for j = stopglyph, #glyphs do
+ local glyph = glyphs[j]
+ glyph.cluster = glyph.cluster - (stopindex - startindex) + 1
+ end
+ len = len - (stopindex - startindex) + 1
+ table.move(glyphs, stopglyph, #glyphs + stopglyph - startglyph - 1, startglyph + 1)
+
+ local subcodes, subindex = {}
+ do
+ local node = startnode
+ while node ~= stopnode do
+ if node == disc then
+ subindex = #subcodes
+ startindex = startindex + 1
+ node = getnext(node)
+ elseif getid(node) == disc_t then
+ local oldnode = node
+ startnode, node = removenode(startnode, node)
+ freenode(oldnode)
+ tableremove(codes, startindex)
+ else
+ subcodes[#subcodes + 1] = tableremove(codes, startindex)
+ node = getnext(node)
+ end
+ end
+ end
+
+ local pre, post, rep, lastpre, lastpost, lastrep = getdisc(disc, true)
+ local precodes, postcodes, repcodes = {}, {}, {}
+ table.move(subcodes, 1, subindex, 1, repcodes)
+ for n, id, subtype in traverse(rep) do
+ repcodes[#repcodes + 1] = getfont(n) == fontid and getchar(n) or 0xFFFC
+ end
+ table.move(subcodes, subindex + 1, #subcodes, #repcodes + 1, repcodes)
+ table.move(subcodes, 1, subindex, 1, precodes)
+ for n, id, subtype in traverse(pre) do
+ precodes[#precodes + 1] = getfont(n) == fontid and getchar(n) or 0xFFFC
+ end
+ for n, id, subtype in traverse(post) do
+ postcodes[#postcodes + 1] = getfont(n) == fontid and getchar(n) or 0xFFFC
+ end
+ table.move(subcodes, subindex + 1, #subcodes, #postcodes + 1, postcodes)
+ if startnode ~= disc then
+ local newpre = copynodelist(startnode, disc)
+ setnext(tail(newpre), pre)
+ pre = newpre
+ end
+ if post then
+ setnext(lastpost, copynodelist(getnext(disc), stopnode))
+ else
+ post = copynodelist(getnext(disc), stopnode)
+ end
+ if startnode ~= disc then
+ local predisc = getprev(disc)
+ setnext(predisc, rep)
+ setprev(rep, predisc)
+ if startnode == head then
+ head = disc
+ else
+ local before = getprev(startnode)
+ setnext(before, disc)
+ setprev(disc, before)
+ end
+ setprev(startnode, nil)
+ rep = startnode
+ lastrep = lastrep or predisc
+ end
+ if getnext(disc) ~= stopnode then
+ setnext(getprev(stopnode), nil)
+ setprev(stopnode, disc)
+ setprev(getnext(disc), lastrep)
+ setnext(lastrep, getnext(disc))
+ rep = rep or getnext(disc)
+ setnext(disc, stopnode)
+ end
+ glyph.replace = makesub(run, repcodes, rep)
+ glyph.pre = makesub(run, precodes, pre)
+ glyph.post = makesub(run, postcodes, post)
+ i = startglyph
+ node = disc
+ cluster = glyph.cluster
+ nodeindex = cluster + 1
+ end
+ end
+ end
+ end
+ return head, glyphs, run.len - len
+ end
+
+ return head, {}, 0
+end
+
+local function color_to_rgba(color)
+ local r = color.red / 255
+ local g = color.green / 255
+ local b = color.blue / 255
+ local a = color.alpha / 255
+ if a ~= 1 then
+ -- XXX: alpha
+ return format('%s %s %s rg', r, g, b)
+ else
+ return format('%s %s %s rg', r, g, b)
+ end
+end
+
+-- Cache of color glyph PNG data for bookkeeping, only because I couldn’t
+-- figure how to make the engine load the image from the binary data directly.
+local pngcache = {}
+local pngcachefiles = {}
+local function cachedpng(data)
+ local hash = md5.sumhexa(data)
+ local i = pngcache[hash]
+ if not i then
+ local path = ostmpname()
+ pngcachefiles[#pngcachefiles + 1] = path
+ open(path, "wb"):write(data):close()
+ -- local file = open(path, "wb"):write():close()
+ -- file:write(data)
+ -- file:close()
+ i = img.scan{filename = path}
+ pngcache[hash] = i
+ end
+ return i
+end
+
+local function get_png_glyph(gid, fontid, characters, haspng)
+ return gid
+end
+
+local push_cmd = { "push" }
+local pop_cmd = { "pop" }
+local nop_cmd = { "nop" }
+local save_cmd = { "pdf", "page", "q" }
+local restore_cmd = { "pdf", "page", "Q" }
+
+-- Convert glyphs to nodes and collect font characters.
+local function tonodes(head, node, run, glyphs)
+ local nodeindex = run.start
+ local dir = run.dir
+ local fontid = run.font
+ local fontdata = font.getfont(fontid)
+ local characters = fontdata.characters
+ local hbdata = fontdata.hb
+ local palette = hbdata.palette
+ local hbshared = hbdata.shared
+ local hbface = hbshared.face
+ local nominals = hbshared.nominals
+ local hbfont = hbshared.font
+ local fontglyphs = hbshared.glyphs
+ local gid_offset = hbshared.gid_offset
+ local rtl = dir:is_backward()
+ local lastprops
+
+ local scale = hbdata.scale
+ local letterspace = hbdata.letterspace
+
+ local haspng = hbshared.haspng
+ local fonttype = hbshared.fonttype
+
+ local nextcluster
+
+ for i, glyph in ipairs(glyphs) do
+ if glyph.cluster + 1 >= nodeindex then -- Reached a new cluster
+ nextcluster = glyph.nextcluster
+ assert(nextcluster)
+ for j = nodeindex, glyph.cluster do
+ local oldnode = node
+ head, node = removenode(head, node)
+ freenode(oldnode)
+ end
+ lastprops = getproperty(node)
+ nodeindex = glyph.cluster + 1
+ elseif nextcluster + 1 == nodeindex then -- Oops, we went too far
+ nodeindex = nodeindex - 1
+ local new = inherit(glyph_t, getprev(node), lastprops)
+ setfont(new, fontid)
+ head, node = insertbefore(head, node, new)
+ end
+ local gid = glyph.codepoint
+ local char = nominals[gid] or gid_offset + gid
+ local id = getid(node)
+
+ if glyph.replace then
+ -- For discretionary the glyph itself is skipped and a discretionary node
+ -- is output in place of it.
+ local rep, pre, post = glyph.replace, glyph.pre, glyph.post
+
+ setdisc(node, tonodes(pre.head, pre.head, pre.run, pre.glyphs),
+ tonodes(post.head, post.head, post.run, post.glyphs),
+ tonodes(rep.head, rep.head, rep.run, rep.glyphs))
+ node = getnext(node)
+ nodeindex = nodeindex + 1
+ elseif glyph.skip then
+ local oldnode = node
+ head, node = removenode(head, node)
+ freenode(oldnode)
+ nodeindex = nodeindex + 1
+ else
+ if id == glyph_t then
+ local done
+ local fontglyph = fontglyphs[gid]
+ local character = characters[char]
+
+ if not character.commands then
+ if palette then
+ local layers = fontglyph.layers
+ if layers == nil then
+ layers = hbface:ot_color_glyph_get_layers(gid) or false
+ fontglyph.layers = layers
+ end
+ if layers then
+ local cmds = {} -- Every layer will add 5 cmds
+ local prev_color = nil
+ for j = 1, #layers do
+ local layer = layers[j]
+ local layerchar = characters[gid_offset + layer.glyph]
+ if layerchar.height > character.height then
+ character.height = layerchar.height
+ end
+ if layerchar.depth > character.depth then
+ character.depth = layerchar.depth
+ end
+ -- color_index has a special value, 0x10000, that mean use text
+ -- color, we don’t check for it here explicitly since we will
+ -- get nil anyway.
+ local color = palette[layer.color_index]
+ cmds[5*j - 4] = (color and not prev_color) and save_cmd or nop_cmd
+ cmds[5*j - 3] = prev_color == color and nop_cmd or (color and {"pdf", "page", color_to_rgba(color)} or restore_cmd)
+ cmds[5*j - 2] = push_cmd
+ cmds[5*j - 1] = {"char", layer.glyph + gid_offset}
+ cmds[5*j] = pop_cmd
+ fontglyphs[layer.glyph].used = true
+ prev_color = color
+ end
+ cmds[#cmds + 1] = prev_color and restore_cmd
+ if not character.colored then
+ local coloredcharacter = {}
+ for k,v in next, character do
+ coloredcharacter[k] = v
+ end
+ coloredcharacter.commands = cmds
+ local newcharacters = {[gid + 0x130000] = coloredcharacter}
+ characters[gid + 0x130000] = coloredcharacter
+ if char ~= gid + gid_offset then
+ newcharacters[char] = coloredcharacter
+ characters[char] = coloredcharacter
+ character.colored = char
+ else
+ character.colored = gid + 0x130000
+ end
+ font.addcharacters(fontid, {characters = newcharacters})
+ end
+ char = character.colored
+ character = characters[char]
+ end
+ end
+
+ if haspng then
+ local pngglyph = character.pngglyph
+ if pngglyph == nil then
+ local pngblob = hbfont:ot_color_glyph_get_png(gid)
+ if pngblob then
+ local glyphimg = cachedpng(pngblob:get_data())
+ local pngchar = { }
+ for k,v in next, character do
+ pngchar[k] = v
+ end
+ local i = img.copy(glyphimg)
+ i.width = character.width
+ i.depth = 0
+ i.height = character.height + character.depth
+ pngchar.commands = fonttype and {
+ {"push"}, {"char", gid_offset + gid}, {"pop"},
+ {"down", character.depth}, {"image", i}
+ } or { {"down", character.depth}, {"image", i} }
+ if not nominals[gid] then
+ char = 0x130000 + gid
+ end
+ characters[char] = pngchar
+ pngglyph = char
+ font.addcharacters(fontid, {characters = {[char] = pngchar}})
+ end
+ character.pngglyph = pngglyph
+ end
+ if pngglyph then
+ char = pngglyph
+ elseif not fonttype then
+ -- Color bitmap font with no glyph outlines (like Noto
+ -- Color Emoji) but has no bitmap for current glyph (most likely
+ -- `.notdef` glyph). The engine does not know how to embed such
+ -- fonts, so we don’t want them to reach the backend as it will cause
+ -- a fatal error. We use `nullfont` instead. That is a hack, but I
+ -- think it is good enough for now. We could make the glyph virtual
+ -- with empty commands suh that LuaTeX ignores it, but we still want
+ -- a missing glyph warning.
+ -- We insert the glyph node and move on, no further work is needed.
+ setfont(node, 0)
+ done = true
+ end
+ end
+ end
+ if not done then
+ local oldcharacter = characters[getchar(node)]
+ -- If the glyph index of current font character is the same as shaped
+ -- glyph, keep the node char unchanged. Helps with primitives that
+ -- take characters as input but actually work on glyphs, like
+ -- `\rpcode`.
+ if character.commands or not oldcharacter
+ or character.index ~= oldcharacter.index then
+ setchar(node, char)
+ end
+ local xoffset = (rtl and -glyph.x_offset or glyph.x_offset) * scale
+ local yoffset = glyph.y_offset * scale
+ setoffsets(node, xoffset, yoffset)
+
+ fontglyph.used = fonttype and true
+
+ -- The engine will use this string when printing a glyph node e.g. in
+ -- overfull messages, otherwise it will be trying to print our
+ -- invalid pseudo Unicode code points.
+ -- If the string is empty it means this glyph is part of a larger
+ -- cluster and we don’t to print anything for it as the first glyph
+ -- in the cluster will have the string of the whole cluster.
+ local props = properties[node]
+ if not props then
+ props = {}
+ properties[node] = props
+ end
+ props.glyph_info = glyph.string or ""
+
+ -- Handle PDF text extraction:
+ -- * Find how many characters in this cluster and how many glyphs,
+ -- * If there is more than 0 characters
+ -- * One glyph: one to one or one to many mapping, can be
+ -- represented by font’s /ToUnicode
+ -- * More than one: many to one or many to many mapping, can be
+ -- represented by /ActualText spans.
+ -- * If there are zero characters, then this glyph is part of complex
+ -- cluster that will be covered by an /ActualText span.
+ local tounicode = glyph.tounicode
+ if tounicode then
+ if glyph.nglyphs == 1
+ and not character.commands
+ and not fontglyph.tounicode then
+ fontglyph.tounicode = tounicode
+ elseif character.commands or tounicode ~= fontglyph.tounicode then
+ setprop(node, startactual_p, tounicode)
+ glyphs[i + glyph.nglyphs - 1].endactual = true
+ end
+ end
+ if glyph.endactual then
+ setprop(node, endactual_p, true)
+ end
+ local x_advance = glyph.x_advance + letterspace
+ local width = fontglyph.width
+ if width ~= x_advance then
+ -- The engine always uses the glyph width from the font, so we need
+ -- to insert a kern node if the x advance is different.
+ local kern = newkern((x_advance - width) * scale, node)
+ head, node = insertkern(head, node, kern, rtl)
+ end
+ end
+ elseif id == glue_t and getsubtype(node) == spaceskip_t then
+ -- If the glyph advance is different from the font space, then a
+ -- substitution or positioning was applied to the space glyph changing
+ -- it from the default, so reset the glue using the new advance.
+ -- We are intentionally not comparing with the existing glue width as
+ -- spacing after the period is larger by default in TeX.
+ local width = (glyph.x_advance + letterspace) * scale
+ if fontdata.parameters.space ~= width then
+ setwidth(node, width)
+ setfield(node, "stretch", width / 2)
+ setfield(node, "shrink", width / 3)
+ end
+ elseif id == kern_t and getsubtype(node) == italiccorr_t then
+ -- If this is an italic correction node and the previous node is a
+ -- glyph, update its kern value with the glyph’s italic correction.
+ local prevchar, prevfontid = ischar(getprev(node))
+ if prevfontid == fontid and prevchar and prevchar > 0 then
+ local italic = characters[prevchar].italic
+ if italic then
+ setkern(node, italic)
+ end
+ end
+ end
+ node = getnext(node)
+ nodeindex = nodeindex + 1
+ end
+ end
+ while node ~= run.after do
+ local oldnode = node
+ head, node = removenode(head, node)
+ freenode(oldnode)
+ end
+
+ return head, node
+end
+
+local function shape_run(head, current, run)
+ if not run.skip then
+ -- Font loaded with our loader and an HarfBuzz face is present, do our
+ -- shaping.
+ local fontid = run.font
+ local fontdata = font.getfont(fontid)
+ local options = fontdata.specification.features.raw
+
+ local glyphs, offset
+ head, glyphs, offset = shape(head, current, run)
+ return offset, tonodes(head, current, run, glyphs)
+ else
+ return 0, head, run.after
+ end
+end
+
+function process(head, font, direction)
+ local newhead, current = head, head
+ local runs = itemize(head, font, direction)
+
+ local offset = 0
+ for i = 1,#runs do
+ local run = runs[i]
+ run.start = run.start - offset
+ local new_offset
+ new_offset, newhead, current = shape_run(newhead, current, run)
+ offset = offset + new_offset
+ end
+
+ return newhead or head
+end
+
+local function pageliteral(data)
+ local n = newnode(whatsit_t, pdfliteral_t)
+ setfield(n, "mode", 1) -- page
+ setdata(n, data)
+ return n
+end
+
+local function post_process(head)
+ for n in traverse(head) do
+ local props = properties[n]
+
+ local startactual, endactual
+ if props then
+ startactual = rawget(props, startactual_p)
+ endactual = rawget(props, endactual_p)
+ end
+
+ if startactual then
+ local actualtext = "/Span<</ActualText<FEFF"..startactual..">>>BDC"
+ head = insertbefore(head, n, pageliteral(actualtext))
+ end
+
+ if endactual then
+ head = insertafter(head, n, pageliteral("EMC"))
+ end
+
+ local replace = getfield(n, "replace")
+ if replace then
+ setfield(n, "replace", post_process(replace))
+ end
+
+ local subhead = getfield(n, "head")
+ if subhead then
+ setfield(n, "head", post_process(subhead))
+ end
+ end
+ return head
+end
+
+local function post_process_nodes(head, groupcode)
+ return tonode(post_process(todirect(head)))
+end
+
+local function run_cleanup()
+ -- Remove temporary PNG files that we created, if any.
+ -- FIXME: It would be nice if we wouldn't need this
+ for _, path in next, pngcachefiles do
+ osremove(path)
+ end
+end
+
+local function set_tounicode()
+ for fontid, fontdata in font.each() do
+ local hbdata = fontdata.hb
+ if hbdata and fontid == pdf.getfontname(fontid) then
+ local characters = fontdata.characters
+ local newcharacters = {}
+ local hbshared = hbdata.shared
+ local glyphs = hbshared.glyphs
+ local nominals = hbshared.nominals
+ local gid_offset = hbshared.gid_offset
+ for gid = 0, #glyphs do
+ local glyph = glyphs[gid]
+ if glyph.used then
+ local character = characters[gid + gid_offset]
+ newcharacters[gid + gid_offset] = character
+ local unicode = nominals[gid]
+ if unicode then
+ newcharacters[unicode] = character
+ end
+ character.tounicode = glyph.tounicode or "FFFD"
+ character.used = true
+ end
+ end
+ font.addcharacters(fontid, { characters = newcharacters })
+ end
+ end
+end
+
+-- FIXME: Move this into generic parts of luaotfload
+local utfchar = utf8.char
+local function get_glyph_info(n)
+ n = todirect(n)
+ local props = properties[n]
+ return props and props.glyph_info or utfchar(getchar(n)):gsub('\0', '^^@')
+end
+
+fonts.handlers.otf.registerplugin('harf', process)
+
+-- luatexbase does not know how to handle `wrapup_run` callback, teach it.
+-- TODO: Move these into ltluatex
+luatexbase.callbacktypes.wrapup_run = 1 -- simple
+luatexbase.callbacktypes.glyph_info = 1 -- simple
+
+local base_callback_descriptions = luatexbase.callback_descriptions
+local base_add_to_callback = luatexbase.add_to_callback
+local base_remove_from_callback = luatexbase.remove_from_callback
+
+-- Remove all existing functions from given callback, insert ours, then
+-- reinsert the removed ones, so ours takes a priority.
+local function add_to_callback(name, func)
+ local saved_callbacks = {}, ff, dd
+ for k, v in next, base_callback_descriptions(name) do
+ saved_callbacks[k] = { base_remove_from_callback(name, v) }
+ end
+ base_add_to_callback(name, func, "Harf "..name.." callback")
+ for _, v in next, saved_callbacks do
+ base_add_to_callback(name, v[1], v[2])
+ end
+end
+
+add_to_callback('pre_output_filter', post_process_nodes) -- FIXME: Wrong callback, but I want to get rid of the whole function anyway
+add_to_callback('wrapup_run', run_cleanup)
+add_to_callback('finish_pdffile', set_tounicode)
+add_to_callback('glyph_info', get_glyph_info)
diff --git a/macros/luatex/generic/luaotfload/luaotfload-init.lua b/macros/luatex/generic/luaotfload/luaotfload-init.lua
index 6a80546d43..5f7b710d9b 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-init.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-init.lua
@@ -7,8 +7,8 @@
local ProvidesLuaModule = {
name = "luaotfload-init",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / initialization",
license = "GPL v2.0"
}
@@ -78,122 +78,6 @@ local logreport --- filled in after loading the log module
--doc]]--
-local init_early = function ()
-
- local store = { }
- config = config or { } --- global
- config.luaotfload = config.luaotfload or { }
- config.lualibs = config.lualibs or { }
- config.lualibs.verbose = false
- config.lualibs.prefer_merged = true
- config.lualibs.load_extended = true
- fonts = fonts or { }
-
- require "lualibs"
-
- if not lualibs then error "this module requires Luaotfload" end
- if not luaotfload then error "this module requires Luaotfload" end
-
- --[[doc--
-
- The logger needs to be in place prior to loading the fontloader due
- to order of initialization being crucial for the logger functions
- that are swapped.
-
- --doc]]--
-
- luaotfload.loaders.luaotfload "log"
- log = luaotfload.log
- logreport = log.report
- log.set_loglevel (default_log_level)
-
- logreport ("log", 4, "init", "Concealing callback.register().")
- store.trapped_register = callback.register
-
- callback.register = function (id)
- logreport ("log", 4, "init",
- "Dummy callback.register() invoked on %s.",
- id)
- end
-
- --[[doc--
-
- By default, the fontloader requires a number of \emphasis{private
- attributes} for internal use.
- These must be kept consistent with the attribute handling methods
- as provided by \identifier{luatexbase}.
- Our strategy is to override the function that allocates new
- attributes before we initialize the font loader, making it a
- wrapper around \luafunction{luatexbase.new_attribute}.\footnote{%
- Many thanks, again, to Hans Hagen for making this part
- configurable!
- }
- The attribute identifiers are prefixed “\fileent{luaotfload@}” to
- avoid name clashes.
-
- --doc]]--
-
- local new_attribute = luatexbase.new_attribute
- local the_attributes = luatexbase.attributes
-
- attributes = attributes or { } --- this writes a global, sorry
-
- attributes.private = function (name)
- local attr = "luaotfload@" .. name --- used to be: “otfl@”
- local number = the_attributes[attr]
- if not number then number = new_attribute(attr) end
- return number
- end
-
- luaotfload.loaders.fontloader "basics-gen"
-
- return store
-end --- [init_early]
-
---[[doc--
-
- These next lines replicate the behavior of
- \fileent{luatex-fonts.lua}.
-
---doc]]--
-
-local push_namespaces = function ()
- logreport ("log", 4, "init", "push namespace for font loader")
- local normalglobal = { }
- for k, v in next, _G do
- normalglobal[k] = v
- end
- return normalglobal
-end
-
-local pop_namespaces = function (normalglobal,
- isolate,
- context_environment)
- if normalglobal then
- local _G = _G
- local mode = "non-destructive"
- if isolate then mode = "destructive" end
- logreport ("log", 4, "init", "pop namespace from font loader -- " .. mode)
- for k, v in next, _G do
- if not normalglobal[k] then
- context_environment[k] = v
- if isolate then
- _G[k] = nil
- end
- end
- end
- for k, v in next, normalglobal do
- _G[k] = v
- end
- -- just to be sure:
- setmetatable(context_environment, _G)
- else
- logreport ("both", 0, "init",
- "irrecoverable error during pop_namespace: no globals to restore")
- os.exit ()
- end
-end
-
--- below paths are relative to the texmf-context
local ltx = "tex/generic/context/luatex"
local ctx = { "tex/context/base/mkiv", "tex/context/base" }
@@ -308,159 +192,71 @@ local load_context_modules = function (pth)
end
-local init_adapt = function ()
+local function init_main(early_hook)
+ config = config or { } --- global
+ config.luaotfload = config.luaotfload or { }
+ config.lualibs = config.lualibs or { }
+ config.lualibs.verbose = false
+ config.lualibs.prefer_merged = true
+ config.lualibs.load_extended = true
+ fonts = fonts or { }
+
+ require "lualibs"
- local context_environment = { }
- local our_environment = push_namespaces ()
+ if not lualibs then error "this module requires Luaotfload" end
+ if not luaotfload then error "this module requires Luaotfload" end
--[[doc--
- The font loader requires that the attribute with index zero be
- zero. We happily oblige.
- (Cf. \fileent{luatex-fonts-nod.lua}.)
+ The logger needs to be in place prior to loading the fontloader due
+ to order of initialization being crucial for the logger functions
+ that are swapped.
--doc]]--
- tex.attribute[0] = 0
-
- return our_environment, context_environment
-
-end --- [init_adapt]
-
---[[doc--
+ luaotfload.loaders.luaotfload "log"
+ log = luaotfload.log
+ logreport = log.report
+ log.set_loglevel (default_log_level)
- In Context, characters.data is where the data from char-def.lua
- resides. The file is huge (>4.4 MB as of 2016) and only a stripped
- down version is part of the isolated font loader. Nevertheless, we
- include an excerpt generated by the mkcharacters script that contains
- a subset of the fields of each character defined and some extra
- metadata.
+ logreport ("log", 4, "init", "Concealing callback.register().")
+ local trapped_register = callback.register
- Currently, these are (compare the mkcharacters script!)
+ callback.register = function (id)
+ logreport ("log", 4, "init",
+ "Dummy callback.register() invoked on %s.",
+ id)
+ end
- · "direction"
- · "mirror"
- · "category"
- · "textclass"
+ --[[doc--
- The directional information is required for packages like Simurgh [0]
- to work correctly. In an early stage [1] it was necessary to load
- further files from Context directly, including the full blown version
- of char-def. Since we have no use for most of the so imported
- functionality, the required parts have been isolated and are now
- instated along with luaotfload-characters.lua. We can extend the set
- of imported features easily should it not be enough.
+ By default, the fontloader requires a number of \emphasis{private
+ attributes} for internal use.
+ These must be kept consistent with the attribute handling methods
+ as provided by \identifier{luatexbase}.
+ Our strategy is to override the function that allocates new
+ attributes before we initialize the font loader, making it a
+ wrapper around \luafunction{luatexbase.new_attribute}.\footnote{%
+ Many thanks, again, to Hans Hagen for making this part
+ configurable!
+ }
+ The attribute identifiers are prefixed “\fileent{luaotfload@}” to
+ avoid name clashes.
- [0] https://github.com/persian-tex/simurgh
- [1] http://tex.stackexchange.com/a/132301/14066
+ --doc]]--
---doc]]--
+ local new_attribute = luatexbase.new_attribute
+ local the_attributes = luatexbase.attributes
---[[--14.12.2018disable characters
---characters = characters or { } --- should be created in basics-gen
---characters.data = nil
---local chardef = "luaotfload-characters"
---
---do
--- local setmetatableindex = function (t, f)
--- local mt = getmetatable (t)
--- if mt then
--- mt.__index = f
--- else
--- setmetatable (t, { __index = f })
--- end
--- end
---
--- --- there are some special tables for each field that provide access
--- --- to fields of the character table by means of a metatable
---
--- local mkcharspecial = function (characters, tablename, field)
---
--- local chardata = characters.data
---
--- if chardata then
--- local newspecial = { }
--- characters [tablename] = newspecial --> e.g. “characters.data.mirrors”
---
--- local idx = function (t, char)
--- local c = chardata [char]
--- if c then
--- local m = c [field] --> e.g. “mirror”
--- if m then
--- t [char] = m
--- return m
--- end
--- end
--- newspecial [char] = false
--- return char
--- end
---
--- setmetatableindex (newspecial, idx)
--- end
---
--- end
---
--- local mkcategories = function (characters) -- different from the others
---
--- local chardata = characters.data
--- local categories = characters.categories or { }
--- characters.categories = categories
---
--- setmetatable (categories, { __index = function (t, char)
--- if char then
--- local c = chardata [char]
--- c = c.category or char
--- t [char] = c
--- return c
--- end
--- end})
---
--- end
---
--- local load_failed = false
--- local chardata --> characters.data; loaded on demand
---
--- local load_chardef = function ()
---
--- logreport ("both", 1, "aux", "Loading character metadata from %s.", chardef)
--- chardata = dofile (kpse.find_file (chardef, "lua"))
---
--- if chardata == nil then
--- logreport ("both", 0, "aux",
--- "Could not load %s; continuing with empty character table.",
--- chardef)
--- chardata = { }
--- load_failed = true
--- end
---
--- characters = { } --- nuke metatable
--- characters.data = chardata
--- characters.classifiers = chardata.classifiers
--- chardata.classifiers = nil
---
--- --- institute some of the functionality from char-ini.lua
---
--- mkcharspecial (characters, "mirrors", "mirror")
--- mkcharspecial (characters, "directions", "direction")
--- mkcharspecial (characters, "textclasses", "textclass")
--- mkcategories (characters)
---
--- end
---
--- local charindex = function (t, k)
--- if chardata == nil and load_failed ~= true then
--- load_chardef ()
--- end
---
--- return rawget (characters, k)
--- end
---
--- setmetatableindex (characters, charindex)
---
---end
---]] --14.12.2018disable characters
-
-local init_main = function ()
+ local context_environment = luaotfload.fontloader
+ context_environment.attributes = {
+ private = function (name)
+ local attr = "luaotfload@" .. name --- used to be: “otfl@”
+ local number = the_attributes[attr]
+ if not number then number = new_attribute(attr) end
+ return number
+ end
+ }
--[[doc--
@@ -473,6 +269,20 @@ local init_main = function ()
local load_fontloader_module = luaotfload.loaders.fontloader
local ignore_module = luaotfload.loaders.ignore
+ load_fontloader_module "basics-gen"
+
+ if early_hook then early_hook() end
+
+ --[[doc--
+
+ The font loader requires that the attribute with index zero be
+ zero. We happily oblige.
+ (Cf. \fileent{luatex-fonts-nod.lua}.)
+
+ --doc]]--
+
+ tex.attribute[0] = 0
+
--[[doc--
Now that things are sorted out we can finally load the
@@ -574,14 +384,14 @@ local init_main = function ()
logreport ("log", 0, "init",
"Loading fontloader from absolute path “%s”.",
fontloader)
- local _void = require (fontloader)
+ local _void = assert (loadfile (fontloader, nil, context_environment)) ()
elseif kpsefind_file (fontloader) then
local path = kpsefind_file (fontloader)
logreport ("log", 0, "init",
"Loading fontloader “%s” from kpse-resolved path “%s”.",
fontloader, path)
- local _void = require (path)
+ local _void = assert (loadfile (path, nil, context_environment)) ()
elseif kpsefind_file (("fontloader-%s.lua"):format(fontloader)) then
logreport ("log", 0, "init",
@@ -605,43 +415,12 @@ local init_main = function ()
logreport ("log", 0, "init",
"Context OpenType loader version “%s”",
fonts.handlers.otf.version)
+ callback.register = trapped_register
+ nodes = context_environment.nodes
+ -- setmetatable(context_environment, nil) -- Would be nice, might break the
+ -- fontloader
end --- [init_main]
-local init_cleanup = function (store)
- --- reinstate all the stuff we had to move out of the way to
- --- accomodate the loader
-
- --[[doc--
-
- Here we adjust the globals created during font loader
- initialization. If the second argument to
- \luafunction{pop_namespaces()} is \verb|true| this will restore the
- state of \luafunction{_G}, eliminating every global generated since
- the last call to \luafunction{push_namespaces()}. At the moment we
- see no reason to do this, and since the font loader is considered
- an essential part of \identifier{luatex} as well as a very well
- organized piece of code, we happily concede it the right to add to
- \luafunction{_G} if needed.
-
- --doc]]--
-
- pop_namespaces (store.our_environment,
- false,
- store.context_environment)
-
- --[[doc--
-
- \subsection{Callbacks}
- After the fontloader is ready we can restore the callback trap
- from \identifier{luatexbase}.
-
- --doc]]--
-
- logreport ("log", 4, "init",
- "Restoring original callback.register().")
- callback.register = store.trapped_register
-end --- [init_cleanup]
-
local init_post_install_callbacks = function ()
--[[doc--
@@ -654,7 +433,7 @@ local init_post_install_callbacks = function ()
--doc]]--
-- MK Pass current text direction to simple_font_handler
- local handler = nodes.simple_font_handler
+ local handler = luaotfload.fontloader.nodes.simple_font_handler
local callback = function(head, groupcode, _, _, direction)
if not direction then
direction = tex.get'textdir'
@@ -774,20 +553,14 @@ local init_post = function ()
return n
end --- [init_post]
-return {
- early = init_early,
- main = function (store)
- local starttime = os.gettimeofday ()
- store.our_environment, store.context_environment = init_adapt ()
- init_main ()
- init_cleanup (store)
- logreport ("both", 1, "init",
- "fontloader loaded in %0.3f seconds",
- os.gettimeofday() - starttime)
- local n = init_post ()
- logreport ("both", 5, "init", "post hook terminated, %d actions performed", n)
- return true
- end
-}
-
+return function (early_hook)
+ local starttime = os.gettimeofday ()
+ init_main (early_hook)
+ logreport ("both", 1, "init",
+ "fontloader loaded in %0.3f seconds",
+ os.gettimeofday() - starttime)
+ local n = init_post ()
+ logreport ("both", 5, "init", "post hook terminated, %d actions performed", n)
+ return true
+end
-- vim:tw=79:sw=2:ts=2:expandtab
diff --git a/macros/luatex/generic/luaotfload/luaotfload-latex.pdf b/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
index 8b128aed7e..28391b2e8a 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua b/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
index bbd045e4f8..a58d59ba1a 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-letterspace",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
copyright = "PRAGMA ADE / ConTeXt Development Team",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-loaders.lua b/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
index 11e63c571a..c2c2320ff8 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
@@ -8,8 +8,8 @@
local ProvidesLuaModule = {
name = "luaotfload-loaders",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / callback handling",
license = "GPL v2.0"
}
@@ -27,17 +27,8 @@ if not luaotfload then error "this module requires Luaotfload" end
local logreport = luaotfload.log and luaotfload.log.report or print
local lua_reader = function (specification)
- local fullname = specification.filename or ""
- if fullname == "" then
- local forced = specification.forced or ""
- if forced ~= "" then
- fullname = specification.name .. "." .. forced
- else
- fullname = specification.name
- end
- end
- local fullname = resolvers.findfile (fullname) or ""
- if fullname ~= "" then
+ local fullname = specification.resolved
+ if fullname then
local loader = loadfile (fullname)
loader = loader and loader ()
return loader and loader (specification)
diff --git a/macros/luatex/generic/luaotfload/luaotfload-log.lua b/macros/luatex/generic/luaotfload/luaotfload-log.lua
index 04012632fa..e6bb042b4f 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-log.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-log.lua
@@ -6,8 +6,8 @@
local ProvidesLuaModule = {
name = "luaotfload-log",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / logging",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang",
@@ -220,16 +220,16 @@ else
end
end
-stdout = function (writer, category, ...)
+local stdout = function (writer, category, ...)
local res = { module_name, "|", category, ":" }
local nargs = select("#", ...)
if nargs == 0 then
--writeln tableconcat(res, " ")
--return
elseif nargs == 1 then
- res[#res+1] = select(1, ...) -- around 30% faster than unpack()
+ res[5] = ... -- around 30% faster than unpack()
else
- res[#res+1] = stringformat(...)
+ res[5] = stringformat(...)
end
writer (tableconcat(res, " "))
end
diff --git a/macros/luatex/generic/luaotfload/luaotfload-main.lua b/macros/luatex/generic/luaotfload/luaotfload-main.lua
index 26bbfab506..d17a1d9b26 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-main.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-main.lua
@@ -20,8 +20,8 @@ local authors = "\z
-- version number is used below!
local ProvidesLuaModule = {
name = "luaotfload-main",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload entry point",
author = authors,
copyright = authors,
@@ -142,12 +142,12 @@ local timing_info = {
t_init = { },
}
-local make_loader = function (prefix)
+local make_loader = function (prefix, load_helper)
return function (name)
local t_0 = osgettimeofday ()
local modname = make_loader_name (prefix, name)
--- We don’t want the stack info from inside, so just pcall().
- local ok, data = pcall (require, modname)
+ local ok, data = pcall (load_helper or require, modname)
local t_end = osgettimeofday ()
timing_info.t_load [name] = t_end - t_0
if not ok then
@@ -190,6 +190,16 @@ local dummy_loader = function (name)
name)
end
+local context_environment = setmetatable({}, {__index = _G})
+luaotfload.fontloader = context_environment
+local function context_isolated_load(name)
+ local fullname = kpse.find_file(name, 'lua')
+ if not fullname then
+ error(string.format('Fontloader module "%s" could not be found.', name))
+ end
+ return assert(loadfile(fullname, nil, context_environment))(name)
+end
+
local context_loader = function (name, path)
luaotfload.log.report ("log", 3, "load",
"Loading module “%s” from Context.",
@@ -209,7 +219,7 @@ local context_loader = function (name, path)
path)
end
end
- local ret = require (modpath)
+ local ret = context_isolated_load (modpath)
local t_end = osgettimeofday ()
timing_info.t_load [name] = t_end - t_0
@@ -228,7 +238,7 @@ local install_loaders = function ()
local loaders = { }
local loadmodule = make_loader "luaotfload"
loaders.luaotfload = loadmodule
- loaders.fontloader = make_loader "fontloader"
+ loaders.fontloader = make_loader ("fontloader", context_isolated_load)
loaders.context = context_loader
loaders.ignore = dummy_loader
----loaders.plaintex = make_loader "luatex" --=> for Luatex-Plain
@@ -275,15 +285,13 @@ luaotfload.main = function ()
local starttime = osgettimeofday ()
local init = loadmodule "init" --- fontloader initialization
- local store = init.early () --- injects the log module too
- local logreport = luaotfload.log.report
+ init (function ()
- initialize "parsers" --- fonts.conf and syntax
- initialize "configuration" --- configuration options
+ initialize "parsers" --- fonts.conf and syntax
+ initialize "configuration" --- configuration options
+ end)
- if not init.main (store) then
- logreport ("log", 0, "load", "Main fontloader initialization failed.")
- end
+ local logreport = luaotfload.log.report
initialize "loaders" --- Font loading; callbacks
initialize "database" --- Font management.
@@ -297,11 +305,19 @@ luaotfload.main = function ()
end
initialize "features" --- font request and feature handling
+
loadmodule "letterspace" --- extra character kerning
loadmodule "embolden" --- fake bold
loadmodule "notdef" --- missing glyph handling
+ local harfstatus, harfbuzz = pcall(require, 'luaharfbuzz')
+ if harfstatus then
+ luaotfload.harfbuzz = harfbuzz
+ loadmodule "harf-define"
+ loadmodule "harf-plug"
+ end
initialize "auxiliary" --- additional high-level functionality
loadmodule "multiscript" --- ...
+ loadmodule "tounicode"
luaotfload.aux.start_rewrite_fontname () --- to be migrated to fontspec
diff --git a/macros/luatex/generic/luaotfload/luaotfload-main.tex b/macros/luatex/generic/luaotfload/luaotfload-main.tex
index 8fdb4048ad..dbc8d73e7d 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-main.tex
+++ b/macros/luatex/generic/luaotfload/luaotfload-main.tex
@@ -32,11 +32,10 @@
\beginfrontmatter
\setdocumenttitle {The \identifier{luaotfload} package}
- \setdocumentdate {2019-09-13 v3.00}
- \setdocumentauthor {Elie Roux · Khaled Hosny · Philipp Gesang · Ulrike Fischer\\
- Home: \hyperlink {https://github.com/lualatex/luaotfload}\\
- New Home: \hyperlink {https://github.com/u-fischer/luaotfload}\\
- Support: \email {lualatex-dev@tug.org}}
+ \setdocumentdate {2019-11-04 v3.1}
+ \setdocumentauthor {LaTeX3 Project\\
+ Elie Roux · Khaled Hosny · Philipp Gesang · Ulrike Fischer · Marcel Krüger\\
+ Home: \hyperlink {https://github.com/latex3/luaotfload}}
\typesetdocumenttitle
@@ -55,34 +54,56 @@
\pdfbookmark[1]{\contentsname}{table}
\typesetcontent
-\beginsection {New in version 3.00 (by Ulrike Fischer/Marcel Krüger)}
+\beginsection {Engine and version support}
+\identifier{luaotfload} is a quite large and complex package. It imports code from context which is actively developed along with the luatex binary. It is not possible
+to support a large number of engines variants or versions.
+
+Supported is the \identifier{luatex} versions of a current TeXLive 2019 (and a current MiKTeX). Beginning with version 3.1 of this package also \identifier{luahbtex} is supported.
+\endsection
+
+\beginsection{Changes}
+\beginsubsection {New in version 3.1 (by Ulrike Fischer/Marcel Krüger)}
+\begin{itemize}
+\item The package has been moved to the github of the LaTeX3 Project and is now maintained
+ officially by the LaTeX3 Project team.
+\item Code to use the harfbuzz library of luahbtex has been added. See the description of the harf mode.
+\item fonts in ttc-collections can now be indexed by name.
+\item To reduce the polution of the global lua enviroment a number of lua tables have been removed.
+ Only the tables \identifier{luaotfload}, \identifier{fonts} and \identifier{nodes} have been kept there.
+\item The fontloader has been synched with the context files from 2019-10-29.
+
+\end{itemize}
+\endsubsection
+
+
+\beginsubsection {New in version 3.00 (by Ulrike Fischer/Marcel Krüger)}
\begin{itemize}
\item Default Ignorable characters are now invisible by default (issue 63). This can be deactivated with the option \texttt{invisible}.
\end{itemize}
-\endsection
+\endsubsection
-\beginsection {New in version 2.99 (by Ulrike Fischer)}
+\beginsubsection {New in version 2.99 (by Ulrike Fischer)}
\begin{itemize}
\item Code cleanup.
\item The fontloader has been synched with the context files from 2019-08-11.
\end{itemize}
-\endsection
-\beginsection {New in version 2.98 (by Ulrike Fischer)}
+\endsubsection
+\beginsubsection {New in version 2.98 (by Ulrike Fischer)}
\begin{itemize}
\item The\marginpar{\mbox{}\hfill \textbf{breaking change!}} handling of missing chars has been changed. In This version a missing char will insert the \inlinecode{/.notdef} char of the fonts (this is sometimes a space, sometimes a rectangle with a cross) and no longer simply ignore the glyph. This behaviour can be reverted by using \inlinecode{notdef=false} as font feature.
\item The font feature \inlinecode{embolden} can now be used to fake a bold font.
\item The fontloader has been synched with the context files from 2019-07-04.
\end{itemize}
-\endsection
-\beginsection {New in version 2.97 (by Ulrike Fischer)}
+\endsubsection
+\beginsubsection {New in version 2.97 (by Ulrike Fischer)}
\begin{itemize}
\item the new generic fontloader improves the handling of large fonts (but some fonts still need a 64bit luatex version to create the font files).
\item A number of small bug (also in luaotfload-tool) have been corrected, see the NEWS file for details.
\end{itemize}
-\endsection
+\endsubsection
-\beginsection {New in version 2.96 (by Ulrike Fischer)}
+\beginsubsection {New in version 2.96 (by Ulrike Fischer)}
\begin{itemize}
\item In\marginpar{\mbox{}\hfill \textbf{Incompatible change!}}
version 2.95 letterspacing was broken due to a change in the fontloader (issue 38). This has been repaired. At the same time a number of oddities and bugs in the letterspacing has been corrected. This can change existing documents. See page~\pageref{p:letterspace} for more information.
@@ -90,11 +111,11 @@ version 2.95 letterspacing was broken due to a change in the fontloader (issue 3
\item A problem with the detection of bold fonts has been corrected (issue 41, pull request 42).
\end{itemize}
-\endsection
+\endsubsection
-\beginsection {New in version 2.95 (by Ulrike Fischer)}
+\beginsubsection {New in version 2.95 (by Ulrike Fischer)}
\begin{itemize}
\item
This version imports from context the generic fontloader in the version of 2019-01-28. Contrary to the last announcement, it still works with luatex 1.07. So updates will continue.
@@ -106,8 +127,8 @@ This version imports from context the generic fontloader in the version of 2019-
\item The resolver code has be refactorated (pull request 36).
\end{itemize}
-\endsection
-\beginsection {New in version 2.94 (by Ulrike Fischer)}
+\endsubsection
+\beginsubsection {New in version 2.94 (by Ulrike Fischer)}
\begin{itemize}
\item
This version imports from context the generic fontloader in the version of 2018-12-19. It is the last version that works with luatex 1.07 and texlive 2018. As context has moved to luatex 1.09 newer versions of the fontloader needs now this luatex version too. This means that until the texlive 2018 freeze there will be probably no update of luaotfload.
@@ -116,13 +137,13 @@ This version imports from context the generic fontloader in the version of 2018-
\end{itemize}
-\endsection
+\endsubsection
-\beginsection {New in version 2.93 (by Ulrike Fischer)}
+\beginsubsection {New in version 2.93 (by Ulrike Fischer)}
Mainly internal clean up of the version info to allow automatic versioning.
-\endsection
+\endsubsection
-\beginsection {New in version 2.92 (by Ulrike Fischer)}
+\beginsubsection {New in version 2.92 (by Ulrike Fischer)}
\begin{itemize}
@@ -131,15 +152,15 @@ Mainly internal clean up of the version info to allow automatic versioning.
\item The syntax \inlinecode{file:} for legacy font works again (issue \#11).
\item The fontloader has been synched with the newest context version from october, 18.
\end{itemize}
-\endsection
-\beginsection {New in version 2.91 (by Ulrike Fischer)}
+\endsubsection
+\beginsubsection {New in version 2.91 (by Ulrike Fischer)}
This version mostly correct two bugs found in the previous fontloader: Glyphvariants weren't copied and pasted correctly. Glyphs encoded in the PUA couldn't be accessed anymore.
-\endsection
+\endsubsection
-\beginsection {New in version 2.9 (by Ulrike Fischer)}
+\beginsubsection {New in version 2.9 (by Ulrike Fischer)}
On the one side there is not very much new in this version: The native components of \identifier{Luaotfload} are nearly unchanged. A few bugs have been corrected, the various files lists which loads the components of the font loader have been cleaned up.
@@ -154,7 +175,7 @@ On the other side there is a lot new:
\beginaltitem {Lualibs} The update of the fontloader files also required an update of the \identifier{Lualibs} package. This \identifier{Luaotfload} version needs version 2.6 of \identifier{Lualibs}.
\endaltitem
- \beginaltitem {Maintenance} As the current maintainer wasn't available and it was urgent to get a \identifier{Luaotfload} compatible with \LUATEX 1.08/1.09 maintenance has been transfered to Ulrike Fischer and Marcel Krüger. The package is currently maintained and developed at \hyperlink{https://github.com/u-fischer/luaotfload}. Issues should be reported there.
+ \beginaltitem {Maintenance} As the current maintainer wasn't available and it was urgent to get a \identifier{Luaotfload} compatible with \LUATEX 1.08/1.09 maintenance has been transfered to Ulrike Fischer and Marcel Krüger. The package was maintained and developed at \hyperlink{https://github.com/u-fischer/luaotfload}. Issues should be reported there.
\endaltitem
\beginaltitem {Documentation}
@@ -163,6 +184,7 @@ On the other side there is a lot new:
\enddescriptions
+\endsubsection
\endsection
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\beginsection {Introduction}
@@ -181,11 +203,8 @@ These fonts can contain many more characters than \TEX fonts, as well
as additional functionality like ligatures, old-style numbers, small
capitals, etc., and support more complex writing systems like Arabic
and Indic\footnote{%
- Unfortunately, \identifier{luaotfload} doesn‘t support many Indic
- scripts right now.
- Assistance in implementing the prerequisites is greatly
- appreciated.
-}
+ Unfortunately, the default fontloader of \identifier{luaotfload} doesn‘t support many Indic
+ scripts correctly. For these scripts it is recommended to use the harf mode along with the binary \identifier{luahbtex}.}
scripts.
\OpenType fonts are widely deployed and available for all modern
@@ -382,7 +401,7 @@ where \meta{prefix} is either \inlinecode{file:} or \inlinecode {name:}.\footnot
%
For a working example see the
\hyperlink [test in the luaotfload
- repo]{https://github.com/u-fischer/luaotfload/blob/master/testfiles/my-resolver.lvt}.
+ repo]{https://github.com/latex3/luaotfload/blob/master/testfiles/my-resolver.lvt}.
}
%
It determines whether the font loader should interpret the request as
@@ -563,8 +582,8 @@ non-standard directory:
\identifier{TrueType} collection files (the extension is usually
\inlinecode{.ttc}) contain more than a single font. In order to refer to these
-subfonts, the respective index may be added in parentheses after the file
-name.\footnote{%
+subfonts, the respective index or the respective PostScript font name may be
+added in parentheses after the file name.\footnote{%
Incidentally, this syntactical detail also prevents one from loading files
that end in balanced parentheses.
}
@@ -572,6 +591,8 @@ name.\footnote{%
\beginlisting
\font \cambriamain = "file:cambria.ttc(0)" at 10pt
\font \cambriamath = "file:cambria.ttc(1)" at 10pt
+ \font \Cambriamain = "file:cambria.ttc(Cambria)" at 10pt
+ \font \Cambriamath = "file:cambria.ttc(CambriaMath)" at 10pt
\endlisting
and likewise, requesting subfont inside a TTC container by path:
@@ -721,10 +742,9 @@ obviously, \inlinecode{random}.
\begindescriptions
\beginaltitem {mode}
- Until version 2.94
- \identifier{luaotfload} had two \OpenType processing
+ \identifier{luaotfload} had three \OpenType processing
\emphasis{modes}:
- \identifier{base} and \identifier{node}.
+ \identifier{base}, \identifier{node} and \identifier{harf}.
\identifier{base} mode works by mapping \OpenType
features to traditional \TEX ligature and kerning mechanisms.
@@ -744,12 +764,42 @@ obviously, \inlinecode{random}.
mode, and \identifier{base} mode has to be requested where needed,
e.~g. for math fonts.
- Since version 2.94 it is possible to call other font renderers with the mode key. A simple example with a plain reader can be found at \hyperlink{https://github.com/u-fischer/luaotfload/pull/26\#issuecomment-437716326}.
- A more useful example needs the new experimental harftex engine (windows binaries can be found at w32tex.org), and the harf renderer (\hyperlink{https://github.com/khaledhosny/harf}). With both it is possible to render a font using the harfbuzz library (used also by xetex).
+ \identifier{harf} mode is new in version 3.1 and needs the new \identifier{luahbtex} engine (the mode is ignored if \identifier{luahbtex} is not used). With it is possible to render a font using the harfbuzz library in-built in the new engine. \identifier{harf} mode improves greatly the rendering of indic and arabic scripts and is highly recommended for such scripts.
+
+ When using \identifier{harf} mode it is required to set also the script correctly:
+
+
+ \beginlisting
+ \font\burmesefont={file:NotoSerifMyanmar-Regular.ttf:mode=harf;script=mymr;}
+ \font\devafont={file:NotoSansDevanagari-Regular.ttf:mode=harf;script=deva;}
+ \font\banglafont={name:Noto Sans Bengali:mode=harf;script=beng;}
+ \font\tibetanfont={name:Noto Serif Tibetan:mode=harf;script=tibt;}
+ \endlisting
+ \includegraphics{scripts-demo}
+
+
+ It is possible to call other font renderers with the mode key. A simple example with a plain reader can be found at \url{https://github.com/latex3/luaotfload/pull/26#issuecomment-437716326}.
\endaltitem
+ \beginaltitem {shaper} \label{shaper-tag}
+ If \identifier{luahbtex} and \identifier{harf} mode are used it is possible to specify a shaper, like \identifier{graphite2} or \identifier{ot} (open type).
+
+ \beginlisting
+ \pardir TRT\textdir TRT
+ \font\test={file:AwamiNastaliq-Regular.ttf:mode=harf;shaper=ot}
+ \endlisting
+
+ \includegraphics{shaper-demo}
+
+ \beginlisting
+ \pardir TRT\textdir TRT
+ \font\test={file:AwamiNastaliq-Regular.ttf:mode=harf;shaper=graphite2}
+ \endlisting
+
+ \includegraphics{shaper-demo-graphite}
+ \endaltitem
\beginaltitem {script} \label{script-tag}
An \OpenType script tag;\footnote{%
See \hyperlink {http://www.microsoft.com/typography/otspec/scripttags.htm}
@@ -948,7 +998,7 @@ obviously, \inlinecode{random}.
\font \test = LatinModernRoman:protrusion=default
\endlisting
\endaltitem
-
+
\beginaltitem {invisible}
Default Ignorable characters are control characters that should be invisible by default even if the font has glyphs for them. Since version 3.0 luaotfload makes them invisible, this can be switch on and off with the \texttt{invisible}. By default it is on.
@@ -960,16 +1010,16 @@ obviously, \inlinecode{random}.
\endlisting
{\font\amiri={file:amiri-regular.ttf} at 20pt \amiri \char"200Dي\char"200D}
-
+
\beginlisting
\font\amiri={file:amiri-regular.ttf:-invisible;} at 20pt \amiri
\char"200Dي\char"200D
\endlisting
{\font\amiri={file:amiri-regular.ttf:-invisible;} at 20pt \amiri \char"200Dي\char"200D}
-
- \endaltitem
+
+ \endaltitem
\enddescriptions
\endsubsection
diff --git a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
index ed3aef05c3..56d381a911 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-multiscript",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / multiscript",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-notdef.lua b/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
index 0cc972a0e3..53f4af8e3a 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-notdef",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-parsers.lua b/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
index f9fd5c919e..4a2d6305e1 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
@@ -7,8 +7,8 @@
local ProvidesLuaModule = {
name = "luaotfload-parsers",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / filelist",
license = "GPL v2.0"
}
@@ -603,7 +603,9 @@ local combolist = Ct(combodef1 * (comborowsep * combodef)^1)
--- Note to self: subfonts apparently start at index 0. Tested with
--- Cambria.ttc that includes “Cambria Math” at 0 and “Cambria” at 1.
--- Other values cause luatex to segfault.
-local subfont = P"(" * Cg((1 - S"()")^1, "sub") * P")"
+local subfont = P"(" * Cg(R'09'^1 / function (s)
+ return tonumber(s) + 1
+ end + (1 - S"()")^1, "sub") * P")"
--- lookups -----------------------------------------------------------
local fontname = C((1-S":(/")^1) --- like luatex-fonts
diff --git a/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua b/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
index 5146f1d20e..97e85f0a41 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
@@ -11,8 +11,8 @@
local ProvidesLuaModule = {
name = "luaotfload-resolvers",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / resolvers",
license = "GPL v2.0"
}
@@ -148,11 +148,12 @@ end
local tex_formats = { "tfm", "ofm" }
+local resolvers_findfile = luaotfload.fontloader.resolvers.findfile
local resolve_tex_format = function (specification)
local name = specification.name
for i=1, #tex_formats do
local format = tex_formats [i]
- local resolved = resolvers.findfile(name, format)
+ local resolved = resolvers_findfile(name, format)
if resolved then
return resolved, format
end
@@ -241,6 +242,7 @@ local function resolve_kpse (specification)
end
end
+local lookup_subfont_index = fonts.names.lookup_subfont_index
local function wrap_resolver(resolver)
return function (specification)
local filename, sub, forced = resolver(specification)
@@ -253,6 +255,10 @@ local function wrap_resolver(resolver)
specification.filename = filename
specification.name = filename
specification.sub = sub or specification.sub
+ if type(specification.sub) == "string" then
+ specification.sub =
+ lookup_subfont_index(filename, specification.sub)
+ end
specification.forced = specification.forced or forced
if not specification.forced then
local suffix = stringlower (filesuffix (filename))
diff --git a/macros/luatex/generic/luaotfload/luaotfload-status.lua b/macros/luatex/generic/luaotfload/luaotfload-status.lua
index 69948c43ca..3221986ca7 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-status.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-status.lua
@@ -1,18 +1,18 @@
return {
["hashes"]={
- { "fontloader-2019-08-11.lua", "9ad89bd01fccf2f98b8777ad42851c58" },
+ { "fontloader-2019-10-29.lua", "8b7d755e08cfef0826429ffa68271eb3" },
{ "fontloader-util-fil.lua", "4bb3e4dc72e308d8ed67cd7a80027fa7" },
- { "fontloader-util-str.lua", "3c829af0b336703e62cb5a1cb7a6e503" },
- { "fontloader-l-unicode.lua", "d46cc6cf18fb3f368ef1e404dc9fcb5c" },
+ { "fontloader-util-str.lua", "fc15d89c4c35f7338d09fc7644fac181" },
+ { "fontloader-l-unicode.lua", "9bc311ce08ce498f9caacb6164ea1d9f" },
{ "fontloader-l-math.lua", "a373be3ed2db0d5f98588fa81abca48f" },
{ "fontloader-l-boolean.lua", "18ed6c4b2c40dd87224ea33229548d20" },
{ "fontloader-l-file.lua", "3d6ea476061292a0da98c3f65cdabe46" },
{ "fontloader-l-io.lua", "42608ad95eb2822fdc370d1c11f08fb5" },
- { "fontloader-l-table.lua", "63b13279139d2f94d29238b0d6242330" },
+ { "fontloader-l-table.lua", "9844897b04a01bb197427d71de71de2b" },
{ "fontloader-l-string.lua", "e1347bef0eeeff9f098df83b30b32df9" },
{ "fontloader-l-function.lua", "f771cc91839ebcdfc094083434fbe00f" },
- { "fontloader-l-lpeg.lua", "a5364ddabb490408da9276ea7f7a7ba1" },
- { "fontloader-l-lua.lua", "9e5e9d4f3b8f9e337f28aa2322192b94" },
+ { "fontloader-l-lpeg.lua", "efe630e3a9a1d269120e59cfd8fba4ba" },
+ { "fontloader-l-lua.lua", "dda8438a34886bb767dbad381f1ea70a" },
{ "fontloader-fonts-gbn.lua", "d25472d54c4841db43a745764a63533e" },
{ "fontloader-fonts-lig.lua", "b9dbe77ce747d4c35bb2a20ffbe5aa51" },
{ "fontloader-fonts-ext.lua", "01015ab3758cdc2af29394e6d502a91a" },
@@ -21,7 +21,7 @@ return {
{ "fontloader-fonts-enc.lua", "3e71a54297e8f85a1ac438bb0f20dd79" },
{ "fontloader-fonts-mis.lua", "bc9eb43c27f63ce9d0fff67e104fe1c6" },
{ "fontloader-basics-chr.lua", "58b7ef0c486e06090b362971b9f85e27" },
- { "fontloader-basics-nod.lua", "65064d03c2650a1761ee13ebd9e1400a" },
+ { "fontloader-basics-nod.lua", "c05f47077c709bbf12a8758852dc4e06" },
{ "fontloader-font-imp-effects.lua", "73a660359a0ec71e44cc2b7225a715ac" },
{ "fontloader-font-imp-italics.lua", "fe1ca80fb5ea4a2f8d2d5c484e7ba913" },
{ "fontloader-font-imp-ligatures.lua", "043daa4fcccf2560868da359d71d3a4a" },
@@ -31,16 +31,16 @@ return {
{ "fontloader-font-afk.lua", "54d554530e75c57c56ee76234724e26d" },
{ "fontloader-font-one.lua", "987c5c5ed3754ad2feab80985067d59e" },
{ "fontloader-font-onr.lua", "d4d2449b4084e6afb1837ae5835082cc" },
- { "fontloader-font-otc.lua", "95a4ff28ba4afb55a978a4aecfd688bf" },
- { "fontloader-font-ocl.lua", "b720867fb19a23f0b50377efd2a3c54a" },
- { "fontloader-font-osd.lua", "79eb2fc4a71364fd73c8b996a109f5df" },
- { "fontloader-font-ots.lua", "d5504847a278385cd0d20ecf1b3d59cc" },
+ { "fontloader-font-otc.lua", "1204a2fdc436e644127c0aa38ab69607" },
+ { "fontloader-font-ocl.lua", "ba40df1a92b9b42a5c70d20c28f44759" },
+ { "fontloader-font-osd.lua", "39e92f6e575741646d75ea79e3be87f3" },
+ { "fontloader-font-ots.lua", "d6a0ce4b40cd4ee1895e2248dcf87d37" },
{ "fontloader-font-ota.lua", "d6dfb94563d6a52675e274b2e673e4a6" },
{ "fontloader-font-otj.lua", "66c7a910d95d4a52b81061de776898e1" },
{ "fontloader-font-oto.lua", "52804afd96f4be005f513a012b874668" },
- { "fontloader-font-otl.lua", "940f9c5ad84f4968a8488f4da2d15e2d" },
- { "fontloader-font-oup.lua", "669e479e716999edc626a1f045bd76fa" },
- { "fontloader-font-dsp.lua", "b5bf2f1c198e027a0d4ededcdf3947b4" },
+ { "fontloader-font-otl.lua", "ec0241b7465a7713e53c246e8e9fb2a8" },
+ { "fontloader-font-oup.lua", "0cef35af01739f52fd09feb5401192ae" },
+ { "fontloader-font-dsp.lua", "5d3db0184c903829b2c5bddcb8cdb14c" },
{ "fontloader-font-ttf.lua", "44e61cef50dab9b1aaf48130f9367c34" },
{ "fontloader-font-cff.lua", "98d5a660ea803b65cb883c009ecf3c0b" },
{ "fontloader-font-ott.lua", "aba6d8335a5f38a5a62d3631492f3392" },
@@ -49,43 +49,46 @@ return {
{ "fontloader-font-vfc.lua", "94937140f2c909e9c831ba021f1ab303" },
{ "fontloader-font-map.lua", "f486746e90fe972de4b73e208ac7cbb2" },
{ "fontloader-font-cid.lua", "4d87988efa86020a14708ee03c23415f" },
- { "fontloader-font-con.lua", "ca733211a0555d9a93b1e2f7ebc937d3" },
+ { "fontloader-font-con.lua", "8b35e7c2203d5b57c61942e07cee2c0a" },
{ "fontloader-font-ini.lua", "4299a02110bbd7c0d27e131235c5319d" },
{ "fontloader-data-con.lua", "7ce546725b1550f655c78ac9d69419ca" },
- { "fontloader-reference.lua", "759787e7ee75437382c0a2c4f8fe3b81" },
+ { "fontloader-reference.lua", "5be3565068a1929b173bde862b48a30e" },
{ "fontloader-basics-gen.lua", "b21e91bbd534f77e368f0ec13f865aed" },
{ "mktests", "c7cff7025962922944376acc1ffa9c47" },
- { "mkstatus", "64b9a6b302168fced414830a53fdcce1" },
+ { "mkstatus", "32b8eee5316ca3100e4434db79d08230" },
{ "mkcharacters", "92c24bb582fc84c0365634f29eb89863" },
{ "mkglyphlist", "557836886d4f0e6d656eac3ded4456a2" },
{ "mkimport", "60e0b11a1a68719033e86a3e0f4d5e86" },
- { "luaotfload-glyphlist.lua", "df822678061548ce6b510a0c1c7fc103" },
+ { "luaotfload-glyphlist.lua", "6dc41351ebdb122e044bed6d3fc2ca4b" },
{ "luaotfload-characters.lua", "593ce9dccf6ddc4f7d4be0514f581102" },
- { "luaotfload-unicode.lua", "d9ce2f2a07e951be6310e85fdfcc785d" },
- { "luaotfload-resolvers.lua", "0b0d407501e68537971484ac2256af20" },
- { "luaotfload-parsers.lua", "9b199d5157d9972c415aee7f9350df5b" },
- { "luaotfload-multiscript.lua", "3a4cfa1687c9d1694cbf728183bb066e" },
- { "luaotfload-loaders.lua", "007be1e29cf23779f4d9d0097b56cc4a" },
- { "luaotfload-notdef.lua", "982810e9197d2261ffdc3acd5d8dcecf" },
- { "luaotfload-embolden.lua", "92dfba7dbf10484c85f7e3c971691f8e" },
- { "luaotfload-letterspace.lua", "bb123f78712cc0342419f3c2a5f6a940" },
- { "luaotfload-features.lua", "45ab2c6405c678f8834339fe0d9fb47a" },
- { "luaotfload-database.lua", "da3c5b55a086a2213ee825ecc2bf7e0f" },
- { "luaotfload-configuration.lua", "015022f5b9597254afafff26f9f0f98c" },
- { "luaotfload-colors.lua", "81a23496c5f5c855674b05180869b8cf" },
- { "luaotfload-auxiliary.lua", "81432ebaebfce3df73b5949e1001d13c" },
- { "luaotfload-filelist.lua", "aa3c9fa695042573d6f6c2e5d0c23558" },
- { "luaotfload-tool.lua", "1833a47868c3e5958d492bb947d39dec" },
- { "luaotfload-diagnostics.lua", "53dbf51623658f1e325d2e6279a2ee15" },
- { "luaotfload-log.lua", "30491ef5890898d5ae3af44f72e82b1f" },
- { "luaotfload-init.lua", "479854a620629b1934d16723aa4cae0c" },
- { "luaotfload-main.lua", "95c7d3ce348ac83e0659f7332e98eacc" },
+ { "luaotfload-tounicode.lua", "b87cab857631c47f5c2bbfa4dc1b5598" },
+ { "luaotfload-unicode.lua", "eaf637834d735afce54cf81721b89626" },
+ { "luaotfload-resolvers.lua", "7bcd23bf0c4079174679f61c315f54ed" },
+ { "luaotfload-parsers.lua", "23b0550fcc6bf872714d882b8d15f465" },
+ { "luaotfload-multiscript.lua", "bd0b25f9b9b21ad1e1a24fb88dc5cdbf" },
+ { "luaotfload-loaders.lua", "34d130aa4e365639baecfa0481e34d13" },
+ { "luaotfload-harf-plug.lua", "59429664d9bebfbf0e0bfa8a8bdd85e3" },
+ { "luaotfload-harf-define.lua", "f0aafaecaddbc43f665a076195ed9205" },
+ { "luaotfload-notdef.lua", "ce00644d5801c6fac2e274626a52ecf2" },
+ { "luaotfload-embolden.lua", "7ff4b7e2970f2748a4d881b23085495d" },
+ { "luaotfload-letterspace.lua", "2b24d57529363de4a004510da84bafd9" },
+ { "luaotfload-features.lua", "b8c279955bcc473f02ad77b46942eb29" },
+ { "luaotfload-database.lua", "131587572dcf49769bec7e085ab61281" },
+ { "luaotfload-configuration.lua", "a59a94e07e20998144c91d5eb44b9302" },
+ { "luaotfload-colors.lua", "c13f4c88058e2c4869205ad015765070" },
+ { "luaotfload-auxiliary.lua", "77bcb55f9d215ad8a61701dc64e9a07e" },
+ { "luaotfload-filelist.lua", "96967c2f4ad091f2a8c74a50294c25d5" },
+ { "luaotfload-tool.lua", "9a53d4aedf71012530be90303aabe0d9" },
+ { "luaotfload-diagnostics.lua", "f521a2b70b24bd23fb23d3d08d7845bf" },
+ { "luaotfload-log.lua", "28c5c63d7af789ab7ca5757870dfc595" },
+ { "luaotfload-init.lua", "ebb2e936d4c95cab76649897f6af0e25" },
+ { "luaotfload-main.lua", "e4208f459c12b57a6996b4c7e9adbb8b" },
},
["notes"]={
- ["committer"]="Marcel Fabian Krüger <tex@2krueger.de>",
- ["description"]="v3.00/2019-09-13",
- ["loader"]="fontloader-2019-08-11.lua",
- ["revision"]="e758f5d39e3d416e4bc1e2a23918abed744563ae",
- ["timestamp"]="2019-09-13 00:43:25 +0200",
+ ["committer"]="Ulrike Fischer <fischer@troubleshooting-tex.de>",
+ ["description"]="v3.1/2019-11-04",
+ ["loader"]="fontloader-2019-10-29.lua",
+ ["revision"]="cdc212ae76bc0f839d116c8f66af98445ba9f307",
+ ["timestamp"]="2019-11-03 15:29:57 +0100",
},
} \ No newline at end of file
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.1 b/macros/luatex/generic/luaotfload/luaotfload-tool.1
index 3636d2f6e6..c2d754baa3 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.1
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.1
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
-.TH LUAOTFLOAD-TOOL 1 "2019-09-13" "3.00" "text processing"
+.TH LUAOTFLOAD-TOOL 1 "2019-11-04" "3.1" "text processing"
.SH NAME
luaotfload-tool \- generate and query the Luaotfload font names database
.
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.lua b/macros/luatex/generic/luaotfload/luaotfload-tool.lua
index 06729778f4..12bf2b3a42 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.lua
@@ -9,8 +9,8 @@
local ProvidesLuaModule = {
name = "luaotfload-tool",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload-tool / database functionality",
license = "GPL v2.0"
}
@@ -25,6 +25,7 @@ local version = ProvidesLuaModule.version
luaotfload.version = ProvidesLuaModule.version
luaotfload.min_luatex_version = { 0, 95, 0 }
luaotfload.self = "luaotfload-tool"
+luaotfload.fontloader = _G -- We don't isolate the fontloader here
--[[doc--
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.pdf b/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
index 697cfefd3c..76c2bb6df8 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.rst b/macros/luatex/generic/luaotfload/luaotfload-tool.rst
index 5d61e04368..1c1ec3161e 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.rst
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.rst
@@ -6,9 +6,9 @@
generate and query the Luaotfload font names database
-----------------------------------------------------------------------
-:Date: 2019-09-13
+:Date: 2019-11-04
:Copyright: GPL v2.0
-:Version: 3.00
+:Version: 3.1
:Manual section: 1
:Manual group: text processing
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua b/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua
new file mode 100644
index 0000000000..3636f79220
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua
@@ -0,0 +1,200 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-tounicode.lua
+-- DESCRIPTION: part of luaotfload / tounicode overwrites
+-----------------------------------------------------------------------
+
+local ProvidesLuaModule = {
+ name = "luaotfload-tounicode",
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
+ description = "luaotfload submodule / tounicode",
+ license = "GPL v2.0",
+ author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+}
+
+if luatexbase and luatexbase.provides_module then
+ luatexbase.provides_module (ProvidesLuaModule)
+end
+
+local overloads = {
+ -- rougly based on texglyphlist-g2u.txt
+
+ -- ff = { unicode = {0x0066, 0x0066} },
+ -- ffi = { unicode = {0x0066, 0x0066, 0x0069} },
+ -- ffl = { unicode = {0x0066, 0x0066, 0x006C} },
+ -- fi = { unicode = {0x0066, 0x0069} },
+ -- fl = { unicode = {0x0066, 0x006C} },
+ longst = { unicode = {0x017F, 0x0074} },
+ st = { unicode = {0x0073, 0x0074} },
+ AEsmall = { unicode = 0x00E6 },
+ Aacutesmall = { unicode = 0x00E1 },
+ Acircumflexsmall = { unicode = 0x00E2 },
+ Acute = { unicode = 0x00B4 },
+ Acutesmall = { unicode = 0x00B4 },
+ Adieresissmall = { unicode = 0x00E4 },
+ Agravesmall = { unicode = 0x00E0 },
+ Aringsmall = { unicode = 0x00E5 },
+ Asmall = { unicode = 0x0061 },
+ Atildesmall = { unicode = 0x00E3 },
+ Brevesmall = { unicode = 0x02D8 },
+ Bsmall = { unicode = 0x0062 },
+ Caron = { unicode = 0x02C7 },
+ Caronsmall = { unicode = 0x02C7 },
+ Ccedillasmall = { unicode = 0x00E7 },
+ Cedillasmall = { unicode = 0x00B8 },
+ Circumflexsmall = { unicode = 0x02C6 },
+ Csmall = { unicode = 0x0063 },
+ Dieresis = { unicode = 0x00A8 },
+ DieresisAcute = { unicode = 0xF6CC },
+ DieresisGrave = { unicode = 0xF6CD },
+ Dieresissmall = { unicode = 0x00A8 },
+ Dotaccentsmall = { unicode = 0x02D9 },
+ Dsmall = { unicode = 0x0064 },
+ Eacutesmall = { unicode = 0x00E9 },
+ Ecircumflexsmall = { unicode = 0x00EA },
+ Edieresissmall = { unicode = 0x00EB },
+ Egravesmall = { unicode = 0x00E8 },
+ Esmall = { unicode = 0x0065 },
+ Ethsmall = { unicode = 0x00F0 },
+ Fsmall = { unicode = 0x0066 },
+ Grave = { unicode = 0x0060 },
+ Gravesmall = { unicode = 0x0060 },
+ Gsmall = { unicode = 0x0067 },
+ Hsmall = { unicode = 0x0068 },
+ Hungarumlaut = { unicode = 0x02DD },
+ Hungarumlautsmall = { unicode = 0x02DD },
+ Iacutesmall = { unicode = 0x00ED },
+ Icircumflexsmall = { unicode = 0x00EE },
+ Idieresissmall = { unicode = 0x00EF },
+ Igravesmall = { unicode = 0x00EC },
+ Ismall = { unicode = 0x0069 },
+ Jsmall = { unicode = 0x006A },
+ Ksmall = { unicode = 0x006B },
+ LL = { unicode = {0x004C, 0x004C} },
+ Lslashsmall = { unicode = 0x0142 },
+ Lsmall = { unicode = 0x006C },
+ Macron = { unicode = 0x00AF },
+ Macronsmall = { unicode = 0x00AF },
+ Msmall = { unicode = 0x006D },
+ Nsmall = { unicode = 0x006E },
+ Ntildesmall = { unicode = 0x00F1 },
+ OEsmall = { unicode = 0x0153 },
+ Oacutesmall = { unicode = 0x00F3 },
+ Ocircumflexsmall = { unicode = 0x00F4 },
+ Odieresissmall = { unicode = 0x00F6 },
+ Ogoneksmall = { unicode = 0x02DB },
+ Ogravesmall = { unicode = 0x00F2 },
+ Oslashsmall = { unicode = 0x00F8 },
+ Osmall = { unicode = 0x006F },
+ Otildesmall = { unicode = 0x00F5 },
+ Psmall = { unicode = 0x0070 },
+ Qsmall = { unicode = 0x0071 },
+ Ringsmall = { unicode = 0x02DA },
+ Rsmall = { unicode = 0x0072 },
+ Scaronsmall = { unicode = 0x0161 },
+ Ssmall = { unicode = 0x0073 },
+ Thornsmall = { unicode = 0x00FE },
+ Tildesmall = { unicode = 0x02DC },
+ Tsmall = { unicode = 0x0074 },
+ Uacutesmall = { unicode = 0x00FA },
+ Ucircumflexsmall = { unicode = 0x00FB },
+ Udieresissmall = { unicode = 0x00FC },
+ Ugravesmall = { unicode = 0x00F9 },
+ Usmall = { unicode = 0x0075 },
+ Vsmall = { unicode = 0x0076 },
+ Wsmall = { unicode = 0x0077 },
+ Xsmall = { unicode = 0x0078 },
+ Yacutesmall = { unicode = 0x00FD },
+ Ydieresissmall = { unicode = 0x00FF },
+ Ysmall = { unicode = 0x0079 },
+ Zcaronsmall = { unicode = 0x017E },
+ Zsmall = { unicode = 0x007A },
+ ampersandsmall = { unicode = 0x0026 },
+ asuperior = { unicode = 0x0061 },
+ bsuperior = { unicode = 0x0062 },
+ centinferior = { unicode = 0x00A2 },
+ centoldstyle = { unicode = 0x00A2 },
+ centsuperior = { unicode = 0x00A2 },
+ commainferior = { unicode = 0x002C },
+ commasuperior = { unicode = 0x002C },
+ copyrightsans = { unicode = 0x00A9 },
+ copyrightserif = { unicode = 0x00A9 },
+ cyrBreve = { unicode = 0x02D8 },
+ cyrFlex = { unicode = {0x00A0, 0x0311} },
+ cyrbreve = { unicode = 0x02D8 },
+ cyrflex = { unicode = {0x00A0, 0x0311} },
+ dblGrave = { unicode = {0x00A0, 0x030F} },
+ dblgrave = { unicode = {0x00A0, 0x030F} },
+ dieresisacute = { unicode = {0x00A0, 0x0308, 0x0301} },
+ dieresisgrave = { unicode = {0x00A0, 0x0308, 0x0300} },
+ dollarinferior = { unicode = 0x0024 },
+ dollaroldstyle = { unicode = 0x0024 },
+ dollarsuperior = { unicode = 0x0024 },
+ dotlessj = { unicode = 0x0237 },
+ dsuperior = { unicode = 0x0064 },
+ eightoldstyle = { unicode = 0x0038 },
+ esuperior = { unicode = 0x0065 },
+ exclamdownsmall = { unicode = 0x00A1 },
+ exclamsmall = { unicode = 0x0021 },
+ fiveoldstyle = { unicode = 0x0035 },
+ fouroldstyle = { unicode = 0x0034 },
+ hypheninferior = { unicode = 0x002D },
+ hyphensuperior = { unicode = 0x002D },
+ isuperior = { unicode = 0x0069 },
+ ll = { unicode = {0x006C, 0x006C} },
+ lsuperior = { unicode = 0x006C },
+ msuperior = { unicode = 0x006D },
+ nineoldstyle = { unicode = 0x0039 },
+ onefitted = { unicode = 0x0031 },
+ oneoldstyle = { unicode = 0x0031 },
+ osuperior = { unicode = 0x006F },
+ periodinferior = { unicode = 0x002E },
+ periodsuperior = { unicode = 0x002E },
+ questiondownsmall = { unicode = 0x00BF },
+ questionsmall = { unicode = 0x003F },
+ registersans = { unicode = 0x00AE },
+ registerserif = { unicode = 0x00AE },
+ rsuperior = { unicode = 0x0072 },
+ rupiah = { unicode = 0x20A8 },
+ sevenoldstyle = { unicode = 0x0037 },
+ sixoldstyle = { unicode = 0x0036 },
+ ssuperior = { unicode = 0x0073 },
+ threeoldstyle = { unicode = 0x0033 },
+ trademarksans = { unicode = 0x2122 },
+ trademarkserif = { unicode = 0x2122 },
+ tsuperior = { unicode = 0x0074 },
+ twooldstyle = { unicode = 0x0032 },
+ zerooldstyle = { unicode = 0x0030 },
+ FFsmall = { unicode = {0x0066, 0x0066} },
+ FFIsmall = { unicode = {0x0066, 0x0066, 0x0069} },
+ FFLsmall = { unicode = {0x0066, 0x0066, 0x006C} },
+ FIsmall = { unicode = {0x0066, 0x0069} },
+ FLsmall = { unicode = {0x0066, 0x006C} },
+ Germandblssmall = { unicode = {0x0073, 0x0073} },
+ SSsmall = { unicode = {0x0073, 0x0073} },
+}
+-- For values that are used multiple times
+local function registeroverload(mapped)
+ mapped = {unicode = mapped}
+ local function multiset(first, ...)
+ if first then
+ rawset(overloads, first, mapped)
+ return multiset(...)
+ end
+ end
+ return multiset
+end
+
+-- These come from ConTeXt
+registeroverload { 0x49, 0x4A } ("IJ", "I_J", 0x0132)
+registeroverload { 0x69, 0x6A } ("ij", "i_j", 0x0133)
+registeroverload { 0x66, 0x66 } ("ff", "f_f", 0xFB00)
+registeroverload { 0x66, 0x69 } ("fi", "f_i", 0xFB01)
+registeroverload { 0x66, 0x6C } ("fl", "f_l", 0xFB02)
+registeroverload { 0x66, 0x66, 0x69 } ("ffi", "f_f_i", 0xFB03)
+registeroverload { 0x66, 0x66, 0x6C } ("ffl", "f_f_l", 0xFB04)
+registeroverload { 0x66, 0x6A } ("fj", "f_j")
+registeroverload { 0x66, 0x6B } ("fk", "f_k")
+
+fonts.mappings.overloads = overloads
diff --git a/macros/luatex/generic/luaotfload/luaotfload-unicode.lua b/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
index d7cb98a338..c1bdf3cbd2 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
@@ -5,8 +5,8 @@
local ProvidesLuaModule = {
name = "luaotfload-unicode",
- version = "3.00", --TAGVERSION
- date = "2019-09-13", --TAGDATE
+ version = "3.1", --TAGVERSION
+ date = "2019-11-04", --TAGDATE
description = "luaotfload submodule / Unicode helpers",
license = "CC0 1.0 Universal",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload.conf.5 b/macros/luatex/generic/luaotfload/luaotfload.conf.5
index 1173d9a3de..9726ad7aac 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.conf.5
+++ b/macros/luatex/generic/luaotfload/luaotfload.conf.5
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
-.TH LUAOTFLOAD.CONF 5 "2019-09-13" "3.00" "text processing"
+.TH LUAOTFLOAD.CONF 5 "2019-11-04" "3.1" "text processing"
.SH NAME
luaotfload.conf \- Luaotfload configuration file
.
diff --git a/macros/luatex/generic/luaotfload/luaotfload.conf.rst b/macros/luatex/generic/luaotfload/luaotfload.conf.rst
index 7b85fd1a28..18042188b8 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.conf.rst
+++ b/macros/luatex/generic/luaotfload/luaotfload.conf.rst
@@ -6,9 +6,9 @@
Luaotfload configuration file
-----------------------------------------------------------------------
-:Date: 2019-09-13
+:Date: 2019-11-04
:Copyright: GPL v2.0
-:Version: 3.00
+:Version: 3.1
:Manual section: 5
:Manual group: text processing
diff --git a/macros/luatex/generic/luaotfload/luaotfload.sty b/macros/luatex/generic/luaotfload/luaotfload.sty
index 1dede25f2f..4dc2553d33 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.sty
+++ b/macros/luatex/generic/luaotfload/luaotfload.sty
@@ -40,7 +40,7 @@
\fi
\ifdefined\ProvidesPackage
\ProvidesPackage{luaotfload}%
- [2019/09/13 v3.00 OpenType layout system]
+ [2019/11/04 v3.1 OpenType layout system]
\fi
\directlua{
if xpcall(function ()%
diff --git a/macros/luatex/generic/luaotfload/scripts-demo.pdf b/macros/luatex/generic/luaotfload/scripts-demo.pdf
new file mode 100644
index 0000000000..f0f1bb0065
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/scripts-demo.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/scripts-demo.tex b/macros/luatex/generic/luaotfload/scripts-demo.tex
new file mode 100644
index 0000000000..4bbe06064c
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/scripts-demo.tex
@@ -0,0 +1,15 @@
+\documentclass{standalone}
+
+\font\burmesefont={file:NotoSerifMyanmar-Regular.ttf:mode=harf;script=mymr;}
+\font\devafont={file:NotoSansDevanagari-Regular.ttf:mode=harf;script=deva;}
+\font\banglafont={file:NotoSansBengali-Regular.ttf:mode=harf;script=beng;}
+\font\tibetanfont={file:NotoSerifTibetan-Regular.ttf:mode=harf;script=tibt;}
+\standaloneenv{tabular}
+\begin{document}
+\begin{tabular}{l}
+\burmesefont မ္မတီခေါင်းလောင်းကြီ\\
+\devafont क्रर्कि \\
+\banglafont কণ্যা এখন কি করিবে\\
+\tibetanfont སྐྱེས་ཙམ་ཉིད་ནས་ཆེ་མཐོངས་དང༌།
+\end{tabular}
+\end{document} \ No newline at end of file
diff --git a/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf b/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf
new file mode 100644
index 0000000000..3c97c23522
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/shaper-demo-graphite.tex b/macros/luatex/generic/luaotfload/shaper-demo-graphite.tex
new file mode 100644
index 0000000000..cf83fb2f70
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/shaper-demo-graphite.tex
@@ -0,0 +1,9 @@
+\documentclass[12pt]{standalone}
+
+\begin{document}
+
+\pardir TRT\textdir TRT
+\font\test={file:AwamiNastaliq-Regular.ttf:mode=harf;shaper=graphite2}
+\test
+اُرْشَلیمئے
+\end{document}
diff --git a/macros/luatex/generic/luaotfload/shaper-demo.pdf b/macros/luatex/generic/luaotfload/shaper-demo.pdf
new file mode 100644
index 0000000000..183b062e1f
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/shaper-demo.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/shaper-demo.tex b/macros/luatex/generic/luaotfload/shaper-demo.tex
new file mode 100644
index 0000000000..b4931dcfc2
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/shaper-demo.tex
@@ -0,0 +1,7 @@
+\documentclass[12pt]{standalone}
+\begin{document}
+\pardir TRT\textdir TRT
+\font\test={file:AwamiNastaliq-Regular.ttf:mode=harf;shaper=ot}
+\test
+اُرْشَلیمئے
+\end{document}