diff --git a/Cargo.toml b/Cargo.toml index a39bedb..b5aa19e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,3 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] + +[features] +default = ["std"] +std = [] diff --git a/docs/file.pdf b/docs/file.pdf new file mode 100644 index 0000000..7ed0a35 --- /dev/null +++ b/docs/file.pdf @@ -0,0 +1,2017 @@ +%PDF-1.7 +% + +1 0 obj +<< + /Type /Pages + /Count 4 + /Kids [127 0 R 129 0 R 131 0 R 133 0 R] +>> +endobj + +2 0 obj +<< + /Type /Outlines + /First 3 0 R + /Last 9 0 R + /Count 3 +>> +endobj + +3 0 obj +<< + /Parent 2 0 R + /Next 6 0 R + /First 4 0 R + /Last 5 0 R + /Count -2 + /Title + /Dest 122 0 R +>> +endobj + +4 0 obj +<< + /Parent 3 0 R + /Next 5 0 R + /Title + /Dest 120 0 R +>> +endobj + +5 0 obj +<< + /Parent 3 0 R + /Prev 4 0 R + /Title + /Dest 121 0 R +>> +endobj + +6 0 obj +<< + /Parent 2 0 R + /Next 9 0 R + /Prev 3 0 R + /First 7 0 R + /Last 8 0 R + /Count -2 + /Title + /Dest 125 0 R +>> +endobj + +7 0 obj +<< + /Parent 6 0 R + /Next 8 0 R + /Title + /Dest 123 0 R +>> +endobj + +8 0 obj +<< + /Parent 6 0 R + /Prev 7 0 R + /Title + /Dest 124 0 R +>> +endobj + +9 0 obj +<< + /Parent 2 0 R + /Prev 6 0 R + /Title + /Dest 126 0 R +>> +endobj + +10 0 obj +<< + /Type /StructTreeRoot + /RoleMap << + /Datetime /Span + /Terms /Part + /Title /P + /Strong /Span + /Em /Span + >> + /K [15 0 R] + /ParentTree << + /Nums [0 11 0 R 1 12 0 R 2 13 0 R 3 14 0 R] + >> + /ParentTreeNextKey 4 +>> +endobj + +11 0 obj +[91 0 R 91 0 R 90 0 R 89 0 R 89 0 R 89 0 R 88 0 R 87 0 R 84 0 R 83 0 R 80 0 R 79 0 R 79 0 R 76 0 R 75 0 R 72 0 R 71 0 R 67 0 R 66 0 R 65 0 R 62 0 R 61 0 R 61 0 R 61 0 R 58 0 R 57 0 R 57 0 R 53 0 R 52 0 R 52 0 R 51 0 R] +endobj + +12 0 obj +[50 0 R 49 0 R 49 0 R 49 0 R 48 0 R 47 0 R 47 0 R 47 0 R 46 0 R 45 0 R 44 0 R 44 0 R 43 0 R 42 0 R 42 0 R 41 0 R 41 0 R] +endobj + +13 0 obj +[40 0 R 39 0 R 38 0 R 37 0 R 37 0 R 36 0 R 35 0 R 35 0 R 34 0 R 33 0 R 31 0 R 32 0 R 32 0 R 32 0 R 32 0 R 32 0 R 32 0 R 32 0 R 31 0 R 31 0 R] +endobj + +14 0 obj +[30 0 R 29 0 R 28 0 R 27 0 R 27 0 R 26 0 R 25 0 R 25 0 R 24 0 R 23 0 R 22 0 R 21 0 R 20 0 R 20 0 R 19 0 R 18 0 R 17 0 R 16 0 R 16 0 R] +endobj + +15 0 obj +<< + /Type /StructElem + /S /Document + /P 10 0 R + /K [91 0 R 90 0 R 89 0 R 68 0 R 67 0 R 54 0 R 53 0 R 52 0 R 51 0 R 50 0 R 49 0 R 48 0 R 47 0 R 46 0 R 45 0 R 44 0 R 43 0 R 42 0 R 41 0 R 40 0 R 39 0 R 38 0 R 37 0 R 36 0 R 35 0 R 34 0 R 33 0 R 31 0 R 30 0 R 29 0 R 28 0 R 27 0 R 26 0 R 25 0 R 24 0 R 23 0 R 22 0 R 21 0 R 20 0 R 19 0 R 18 0 R 17 0 R 16 0 R] +>> +endobj + +16 0 obj +<< + /Type /StructElem + /S /P + /P 15 0 R + /K [17 18] + /Pg 133 0 R +>> +endobj + +17 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [16] + /Pg 133 0 R +>> +endobj + +18 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [15] + /Pg 133 0 R +>> +endobj + +19 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [14] + /Pg 133 0 R +>> +endobj + +20 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [12 13] + /Pg 133 0 R +>> +endobj + +21 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [11] + /Pg 133 0 R +>> +endobj + +22 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [10] + /Pg 133 0 R +>> +endobj + +23 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [9] + /Pg 133 0 R +>> +endobj + +24 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [8] + /Pg 133 0 R +>> +endobj + +25 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [6 7] + /Pg 133 0 R +>> +endobj + +26 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [5] + /Pg 133 0 R +>> +endobj + +27 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [3 4] + /Pg 133 0 R +>> +endobj + +28 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [2] + /Pg 133 0 R +>> +endobj + +29 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [1] + /Pg 133 0 R +>> +endobj + +30 0 obj +<< + /Type /StructElem + /S /Figure + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [0] + /Pg 133 0 R +>> +endobj + +31 0 obj +<< + /Type /StructElem + /S /P + /P 15 0 R + /K [10 32 0 R 18 19] + /Pg 131 0 R +>> +endobj + +32 0 obj +<< + /Type /StructElem + /S /Formula + /P 31 0 R + /K [11 12 13 14 15 16 17] + /Pg 131 0 R +>> +endobj + +33 0 obj +<< + /Type /StructElem + /S /H2 + /P 15 0 R + /T + /K [9] + /Pg 131 0 R +>> +endobj + +34 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [8] + /Pg 131 0 R +>> +endobj + +35 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [6 7] + /Pg 131 0 R +>> +endobj + +36 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [5] + /Pg 131 0 R +>> +endobj + +37 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [3 4] + /Pg 131 0 R +>> +endobj + +38 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [2] + /Pg 131 0 R +>> +endobj + +39 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [1] + /Pg 131 0 R +>> +endobj + +40 0 obj +<< + /Type /StructElem + /S /Figure + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [0] + /Pg 131 0 R +>> +endobj + +41 0 obj +<< + /Type /StructElem + /S /P + /P 15 0 R + /K [15 16] + /Pg 129 0 R +>> +endobj + +42 0 obj +<< + /Type /StructElem + /S /H3 + /P 15 0 R + /T + /K [13 14] + /Pg 129 0 R +>> +endobj + +43 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [12] + /Pg 129 0 R +>> +endobj + +44 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [10 11] + /Pg 129 0 R +>> +endobj + +45 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [9] + /Pg 129 0 R +>> +endobj + +46 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [8] + /Pg 129 0 R +>> +endobj + +47 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [5 6 7] + /Pg 129 0 R +>> +endobj + +48 0 obj +<< + /Type /StructElem + /S /Formula + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [4] + /Pg 129 0 R +>> +endobj + +49 0 obj +<< + /Type /StructElem + /S /Span + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [1 2 3] + /Pg 129 0 R +>> +endobj + +50 0 obj +<< + /Type /StructElem + /S /Figure + /P 15 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [0] + /Pg 129 0 R +>> +endobj + +51 0 obj +<< + /Type /StructElem + /S /P + /P 15 0 R + /K [30] + /Pg 127 0 R +>> +endobj + +52 0 obj +<< + /Type /StructElem + /S /H3 + /P 15 0 R + /T + /K [28 29] + /Pg 127 0 R +>> +endobj + +53 0 obj +<< + /Type /StructElem + /S /H2 + /P 15 0 R + /T + /K [27] + /Pg 127 0 R +>> +endobj + +54 0 obj +<< + /Type /StructElem + /S /L + /P 15 0 R + /A [<< + /O /List + /ListNumbering /Decimal + >>] + /K [63 0 R 59 0 R 55 0 R] +>> +endobj + +55 0 obj +<< + /Type /StructElem + /S /LI + /P 54 0 R + /K [58 0 R 56 0 R] +>> +endobj + +56 0 obj +<< + /Type /StructElem + /S /LBody + /P 55 0 R + /K [57 0 R] +>> +endobj + +57 0 obj +<< + /Type /StructElem + /S /P + /P 56 0 R + /K [25 26] + /Pg 127 0 R +>> +endobj + +58 0 obj +<< + /Type /StructElem + /S /Lbl + /P 55 0 R + /K [24] + /Pg 127 0 R +>> +endobj + +59 0 obj +<< + /Type /StructElem + /S /LI + /P 54 0 R + /K [62 0 R 60 0 R] +>> +endobj + +60 0 obj +<< + /Type /StructElem + /S /LBody + /P 59 0 R + /K [61 0 R] +>> +endobj + +61 0 obj +<< + /Type /StructElem + /S /P + /P 60 0 R + /K [21 22 23] + /Pg 127 0 R +>> +endobj + +62 0 obj +<< + /Type /StructElem + /S /Lbl + /P 59 0 R + /K [20] + /Pg 127 0 R +>> +endobj + +63 0 obj +<< + /Type /StructElem + /S /LI + /P 54 0 R + /K [66 0 R 64 0 R] +>> +endobj + +64 0 obj +<< + /Type /StructElem + /S /LBody + /P 63 0 R + /K [65 0 R] +>> +endobj + +65 0 obj +<< + /Type /StructElem + /S /P + /P 64 0 R + /K [19] + /Pg 127 0 R +>> +endobj + +66 0 obj +<< + /Type /StructElem + /S /Lbl + /P 63 0 R + /K [18] + /Pg 127 0 R +>> +endobj + +67 0 obj +<< + /Type /StructElem + /S /H3 + /P 15 0 R + /T + /K [17] + /Pg 127 0 R +>> +endobj + +68 0 obj +<< + /Type /StructElem + /S /L + /P 15 0 R + /A [<< + /O /List + /ListNumbering /Decimal + >>] + /K [85 0 R 81 0 R 77 0 R 73 0 R 69 0 R] +>> +endobj + +69 0 obj +<< + /Type /StructElem + /S /LI + /P 68 0 R + /K [72 0 R 70 0 R] +>> +endobj + +70 0 obj +<< + /Type /StructElem + /S /LBody + /P 69 0 R + /K [71 0 R] +>> +endobj + +71 0 obj +<< + /Type /StructElem + /S /P + /P 70 0 R + /K [16] + /Pg 127 0 R +>> +endobj + +72 0 obj +<< + /Type /StructElem + /S /Lbl + /P 69 0 R + /K [15] + /Pg 127 0 R +>> +endobj + +73 0 obj +<< + /Type /StructElem + /S /LI + /P 68 0 R + /K [76 0 R 74 0 R] +>> +endobj + +74 0 obj +<< + /Type /StructElem + /S /LBody + /P 73 0 R + /K [75 0 R] +>> +endobj + +75 0 obj +<< + /Type /StructElem + /S /P + /P 74 0 R + /K [14] + /Pg 127 0 R +>> +endobj + +76 0 obj +<< + /Type /StructElem + /S /Lbl + /P 73 0 R + /K [13] + /Pg 127 0 R +>> +endobj + +77 0 obj +<< + /Type /StructElem + /S /L + /P 68 0 R + /A [<< + /O /List + /ListNumbering /Decimal + >>] + /K [78 0 R] +>> +endobj + +78 0 obj +<< + /Type /StructElem + /S /LI + /P 77 0 R + /K [80 0 R 79 0 R] +>> +endobj + +79 0 obj +<< + /Type /StructElem + /S /LBody + /P 78 0 R + /K [11 12] + /Pg 127 0 R +>> +endobj + +80 0 obj +<< + /Type /StructElem + /S /Lbl + /P 78 0 R + /K [10] + /Pg 127 0 R +>> +endobj + +81 0 obj +<< + /Type /StructElem + /S /LI + /P 68 0 R + /K [84 0 R 82 0 R] +>> +endobj + +82 0 obj +<< + /Type /StructElem + /S /LBody + /P 81 0 R + /K [83 0 R] +>> +endobj + +83 0 obj +<< + /Type /StructElem + /S /P + /P 82 0 R + /K [9] + /Pg 127 0 R +>> +endobj + +84 0 obj +<< + /Type /StructElem + /S /Lbl + /P 81 0 R + /K [8] + /Pg 127 0 R +>> +endobj + +85 0 obj +<< + /Type /StructElem + /S /LI + /P 68 0 R + /K [88 0 R 86 0 R] +>> +endobj + +86 0 obj +<< + /Type /StructElem + /S /LBody + /P 85 0 R + /K [87 0 R] +>> +endobj + +87 0 obj +<< + /Type /StructElem + /S /P + /P 86 0 R + /K [7] + /Pg 127 0 R +>> +endobj + +88 0 obj +<< + /Type /StructElem + /S /Lbl + /P 85 0 R + /K [6] + /Pg 127 0 R +>> +endobj + +89 0 obj +<< + /Type /StructElem + /S /P + /P 15 0 R + /K [3 4 5] + /Pg 127 0 R +>> +endobj + +90 0 obj +<< + /Type /StructElem + /S /H3 + /P 15 0 R + /T + /K [2] + /Pg 127 0 R +>> +endobj + +91 0 obj +<< + /Type /StructElem + /S /H2 + /P 15 0 R + /T + /K [0 1] + /Pg 127 0 R +>> +endobj + +92 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /DDSULR+LibertinusSerif-Regular-Identity-H + /Encoding /Identity-H + /DescendantFonts [93 0 R] + /ToUnicode 96 0 R +>> +endobj + +93 0 obj +<< + /Type /Font + /Subtype /CIDFontType0 + /BaseFont /DDSULR+LibertinusSerif-Regular + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 95 0 R + /DW 0 + /W [0 0 500 1 1 588 2 2 250 3 3 504 4 4 428 5 5 586 6 6 479 7 7 447 8 8 481 9 9 436 10 10 724 11 11 501.99997 12 12 457 13 13 519 14 14 264 15 15 428 16 16 586 17 17 519 18 18 538 19 19 515 20 20 680 21 21 445 22 22 586 23 23 577 24 24 416 25 25 539 26 26 236 27 27 465 28 28 220 29 29 527 30 30 490 31 32 465 33 33 667 34 34 220 35 35 749 36 36 465 37 37 338 38 38 298 39 39 657 40 40 454 41 41 731 42 42 236 43 43 706 44 44 586 45 45 489 46 46 298 47 47 465 48 48 702 49 49 633 50 50 606 51 51 465 52 52 699 53 53 531 54 54 646 55 55 504 56 56 542 57 57 497 58 58 447 59 59 316 60 60 271 61 61 375 62 62 646 63 63 375 64 64 849 65 65 695 66 66 659 67 67 465 68 68 390 69 69 558] +>> +endobj + +94 0 obj +<< + /Length 13 + /Filter /FlateDecode +>> +stream +x, +endstream +endobj + +95 0 obj +<< + /Type /FontDescriptor + /FontName /DDSULR+LibertinusSerif-Regular + /Flags 131078 + /FontBBox [0 -234 821 736] + /ItalicAngle 0 + /Ascent 894 + /Descent -246 + /CapHeight 658 + /StemV 95.4 + /CIDSet 94 0 R + /FontFile3 97 0 R +>> +endobj + +96 0 obj +<< + /Length 1572 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +69 beginbfchar +<0001> <0412> +<0002> <0020> +<0003> <043E> +<0004> <0441> +<0005> <043D> +<0006> <0432> +<0007> <0435> +<0008> <044F> +<0009> <0437> +<000A> <044B> +<000B> <043A> +<000C> <0430> +<000D> <0070> +<000E> <006C> +<000F> <0063> +<0010> <043F> +<0011> <0440> +<0012> <0434> +<0013> <0443> +<0014> <043C> +<0015> <0442> +<0016> <0438> +<0017> <0446> +<0018> <0433> +<0019> <0447> +<001A> <003A> +<001B> <0031> +<001C> <002E> +<001D> <043B> +<001E> <0445> +<001F> <044C> +<0020> <0032> +<0021> <041F> +<0022> <002C> +<0023> <2026> +<0024> <0033> +<0025> <002D> +<0026> <0028> +<0027> <0444> +<0028> <044D> +<0029> <044E> +<002A> <003B> +<002B> <0436> +<002C> <0439> +<002D> <0431> +<002E> <0029> +<002F> <0034> +<0030> <041E> +<0031> <041B> +<0032> <041A> +<0033> <0035> +<0034> <004E> +<0035> <0075> +<0036> <0043> +<0037> <006F> +<0038> <006E> +<0039> <0076> +<003A> <0065> +<003B> <0074> +<003C> <0069> +<003D> <201C> +<003E> <0421> +<003F> <201D> +<0040> <0449> +<0041> <0410> +<0042> <0414> +<0043> <0030> +<0044> <0073> +<0045> <0417> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +97 0 obj +<< + /Length 6993 + /Filter /FlateDecode + /Subtype /CIDFontType0C +>> +stream +xyytSwcx>K GD@ĢGeF@X(P\Z:'wvf*[6ҁRPPRQq>}~+ {[g'y{~7d |7vSdJZ)Q/-N?<`3~0?J ?M.>H??' {?%`㻀q~OhfD[b2g'&eFǤmʤS^2iQ+c"GkҔĸQ3bSR'=`g:w[Cv>9{P]a^Knߏ7ϧ)m/n%8S9(٣~vرc =5!D~c놰75i ,ܛ<}C_[qoh=[`Y}͠k]_^Xc$0RRU8~Pj3f1mcknՋ߿?ucl߶=oɘm4щ>ḱ&J F9ClH2aܴ ALOp:.;0ȮjW3Uaq҂(2:,cٻbX{DchagcAtR(!w.NEv׸Zh,`cÈY`(]BX +?lՎ*mGXx(o=G汳pl* ՈO_jm?ް5K%Y!m=~b/#tg +,[E 6\ܙS0ҖAQ^IX4j3Mv*+J[>Z9- J#?CW zKKc겤(s3")cS/;%jXt^=u@O/o'u2@Ȓ[hwa̛u,OuWo/tZhHl77B\FW%\y拧O>PEVpGvѣ#-jC"JAY3Cr \/l ؙ8jG2Lޯvlzj L/4 $7CP&q^YNtjT)uRt}XYW2  L|otB$Nls| ++EܳaUZ~9{f\eҖDM6WIg*@vmֺo"`&VʪlF% 2 d!&GeumLr+cqySb,8mv8pSss̀CSzg,tT(.i '~itbBkm zimF3i rkBMJ>\9'8oIݾfԚ-[RS{Cc)Z{JʁB1NҤթɕR^٤V\NRc)%sbZ}5tߠs Y]_ayIr50ҋu|<:esMc +Wn"gw}j1C[| +DXbݷ˥p%*t4 ^h^G/T$'5[ntBB|Қ5Y.!,Фi*}k/<4]Gz^',Xhj"6|#e]vf : Cɀʹdt5Vԉ5JJBB= mj&5v@\>N/DO=;ZZD{f~6;z%噕 eUEZBb'Hd^9]~uKź&fz:ʹӠ4Zh?f2?=^zĎ"yӗPBK_=_/ lٍἴ 濣cv3ݴW5͗\3U;JM'S8f5D%428tIb|LCkKibI{H^aQ{O%I!u ><&"oawvygB~x'yњeoϥL28h䔤Ђ|XIFvC0itREO{ mdUzLj=q6iMU~丣xH=j w;ljBLJ YN׀ F Ҧ/qh(P"dS+),2F@b/ z@k7^9*;=c_vh"2#OL*MipRhO5,ӫį_3ҩ&|dkS'M)of"PM.>=_*RU){N( xah퐡2wrx?9 =W&T E''JxOG w8QaQf#?I, +8#*jg]Wemunj|M蠊>q?@J!%ʢ:':J*hHˢȋwgJJ 9@VNoLs8gAU&Uh <3@էK!7ڀ:+! ?RBo-f`,-!ΎN伅zr#b-c4ژ2 6gH|*SmM&2WlmSI}cU$$?uZ%0E7imK$p:mVKE/``o,y7Չk{ 6Si[`] +X܉yy}EۍfW,RVrՙW3ab9 V.ZYFG0A<^OGĭeqú`h3E'`>]Oa>a%y*rҼ"##KBۗ߀w.!aQLۚTDCAaK)\ryj7P[J8%%M] v/kY~NP电m!|Do+0ScN|?%K9WqWNwܻ#Kk1|om-2e$ ?\ͱ; JbbK',w͸^OJc6ރ'Iba|&}P/ rܽ³2zF!0Ec -fn,Xd*(%IiTΡs6G3G8n擛"S5ŗ)X_.UJw~$;KmrcU0ˈ7̏H b"L.VM;XCm3ͪ=^y ͉YJ-Y1u =ɿf~ }cPüIxcJRkuZIuL*Z͟.W/, o;ZiuYɶ*7QQlR}RMmZum`շɝvI~7ʊwɵ+/˭vc!v OmΗB#T!$0Wk#WCGUZ+Bx`٬t6BH˾m 'SX&e<y?Z9L6I]P׵ $*%(CU T΂-w'#܌&eIN1o4S7QTa39*XC)DZ_~lۊ;$ } "/C? C@6Zo!ƿ\s݄=(e1m$y77 (/} K+aIE5Yϱ^ qZz1XŬZ(E]Kݏzo%[U 9I1Ъoc\x51ufOob%a$Q$˩jYrS3hR 4[')k\t|<<.Lj8~ G Q&>ƞ8܊5cD6(V)WY6ڡ|Y$C 7J6'YjTf]^Y.榆)Tm^Nm"!NC +endstream +endobj + +98 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /AGMPVW+NewCMMath-Book-Identity-H + /Encoding /Identity-H + /DescendantFonts [99 0 R] + /ToUnicode 102 0 R +>> +endobj + +99 0 obj +<< + /Type /Font + /Subtype /CIDFontType0 + /BaseFont /AGMPVW+NewCMMath-Book + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 101 0 R + /DW 0 + /W [0 0 500 1 1 778 2 2 572 3 4 500 5 5 529 6 6 429 7 7 778] +>> +endobj + +100 0 obj +<< + /Length 9 + /Filter /FlateDecode +>> +stream +x +endstream +endobj + +101 0 obj +<< + /Type /FontDescriptor + /FontName /AGMPVW+NewCMMath-Book + /Flags 131076 + /FontBBox [29 -83 722 694] + /ItalicAngle 0 + /Ascent 806 + /Descent -194 + /CapHeight 683 + /StemV 95.4 + /CIDSet 100 0 R + /FontFile3 103 0 R +>> +endobj + +102 0 obj +<< + /Length 715 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +7 beginbfchar +<0001> <002B> +<0002> +<0003> <0033> +<0004> <2217> +<0005> +<0006> +<0007> <003D> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +103 0 obj +<< + /Length 1366 + /Filter /FlateDecode + /Subtype /CIDFontType0C +>> +stream +xmS]LSg>Yk.B9a @3nj L *[Җ@RR)-PRb?͈&[fL ]l9Dj 47+_s=,5C=ih0I\y1ĝsX .Lqy)fL-[`C V+o}I̠fa0LIh,AقzF܆%]d>=x,|@bCE8ZMũ~ӥjSmrr9f_#\|>h:5At1./\*7 ~s?2T,g:Z: L:PA\=swtB{k13uXvht4l=p|)+L vVB;>9S9ptf]IMx?B6\+V1u`΋t+7[2Z20=ֽ8|lizR4 +$XXj E\Ɔg<<AYBY.[03nBh+Eة=| > +endobj + +105 0 obj +<< + /Type /Font + /Subtype /CIDFontType0 + /BaseFont /NQXFLE+LibertinusSerif-Bold + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 107 0 R + /DW 0 + /W [0 0 500 1 1 440 2 2 662 3 3 551 4 4 581 5 5 798 6 6 633 7 7 505.99997 8 8 563 9 9 250 10 10 578 11 11 515 12 12 440 13 13 315 14 14 633 15 15 590 16 16 434 17 17 546 18 18 633 19 19 315 20 20 844 21 21 581 22 22 325 23 23 456 24 24 730 25 25 461 26 26 623 27 27 489 28 28 244 29 29 538 30 30 670 31 31 537 32 32 558 33 33 778 34 34 456 35 35 740 36 36 706 37 37 633 38 38 766] +>> +endobj + +106 0 obj +<< + /Length 13 + /Filter /FlateDecode +>> +stream +x +endstream +endobj + +107 0 obj +<< + /Type /FontDescriptor + /FontName /NQXFLE+LibertinusSerif-Bold + /Flags 131078 + /FontBBox [-2 -234 823 733] + /ItalicAngle 0 + /Ascent 894 + /Descent -246 + /CapHeight 645 + /StemV 168.6 + /CIDSet 106 0 R + /FontFile3 109 0 R +>> +endobj + +108 0 obj +<< + /Length 1138 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +38 beginbfchar +<0001> <201C> +<0002> <0414> +<0003> <043E> +<0004> <0440> +<0005> <0436> +<0006> <043D> +<0007> <0430> +<0008> <044F> +<0009> <0020> +<000A> <043A> +<000B> <0442> +<000C> <201D> +<000D> <0028> +<000E> <043F> +<000F> <043B> +<0010> <0437> +<0011> <0432> +<0012> <0438> +<0013> <0029> +<0014> <044B> +<0015> <0070> +<0016> <006C> +<0017> <0063> +<0018> <041E> +<0019> <0433> +<001A> <0447> +<001B> <0435> +<001C> <002C> +<001D> <0434> +<001E> <043C> +<001F> <0431> +<0020> <0443> +<0021> <041F> +<0022> <0441> +<0023> <0410> +<0024> <0421> +<0025> <0439> +<0026> <0444> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +109 0 obj +<< + /Length 4031 + /Filter /FlateDecode + /Subtype /CIDFontType0C +>> +stream +xXyxSeO(YN(9ˠ"F(V";6i/$mlmt%--MZ8hd^"T=܏x@cr>ohW*C IU⛊e?F=78lPS5GLWhYdS<x<'^2sd*ϋJW,dž(ސ+bIiƥ%(#|͚ҬfΚ}wMB.EhbURDlB<(75[RZR +ގB!mQcG%cLqƂl'^܋xi&&qƒrԛ7ͳ* Ѩ ёIW#\IT(~Y|i| 7mqO>cǿ1ߵ>I=yۻXބaݷL^2 w5/B(PpW=GsPxnm~yNP +8=tQ:t́] +YSܔj-I5Dc{n'e+aaĘqllbnkH?q(u&R#[;48;ΩLQ0zDcZIe׊ꌑʜTHHEيpuzn~!ːehSWf,/uDBRw2Pfvڴ0˧;ĴA*Ž_mX(T@&D^{^}7BNwJaVY]E ʇ כԨ]|&rA(&ޞąUN]qgD.;s=SH52|n$ʻ )! n˿2_p_m\FbNojr1"uM6 ӎ%wm61#"#hd1N&ϖEirZsY+9 CDvN44JjÛИWV'h)f^ =#;0KFU⺨(W:6(o568xܚ~;5JLmҲ +gEponAw@ܪK-V;T:5.b{Zz|B:-®_-/|Aٲei('֋بz1v1"(nLU$jօvķ8U59˳:Q6>G^VFW65OOkA3]^l(ou/3rC ?cF;}d0dFDs0B?~t+]`.cjDxO`?J-p3]޳} fv0AmOtf0= 0 +C +ӺɁ6EœB&[O%UGh3 oV?;߈u:7;c}dW[דX]c^%?m>Ұba!|D) idpf^eZZLM]}8ȰLX- El@jdA$uZxVvtOUv$ #KOzs9Dh,sِ~-xlw=ns?-EǤ嶧X YKe|zBrO-2nO a!ZGq^%B4T7.5軙b1M$nzb یL,RQx,L;S@` wVaI ձ:P"7.ٞCYMq]$njj8F|s=_g E((D^o!ԞA~$*1@ib[h"Eh9!\MTPn\0oɴg Mϲ,b.[:-ԕӗA Da\.G +],Lզ,kA= +³s dRK78uBb;xK@509RA`ɟtTG==R4N˺aZ7XD4&caǮԁw.W_QvlރͮRIFj#mh!kK(a~VkO-kޢmۖ3*۳蚼X26KGcnS|c+,ou@ )Lgm❐}si&G&.nkFS))}v؅ ϗ7/ ah)*l0328Ԩ\JK//$7D| @KS#mB ຏb(f&(23J yF!O) |w@R`#)h "P*DDGPMJL7R6vld߁ ; d@0lm^/W!M) =9lgwtXc算 _X-`?3N> +z(2k%aaar*οcq|k.3_`aն\ kއLzq>ŝJ5L!y$U?*GZ8KcJ R[׽$⣱ϼ]^#ɼ@hT]lם1[г C+XKmX?@%,毮ǩ"Зp)h=5^3*9˚ro~d|FPC;fMt/b3(!=I$n?!.:ia͒ `I +2X2M -JLFU^~7nf#dl߽aOl58r0"8Wh^>X HD/Pa7wW+H[ܷj# _Xg(du4nNAիie sm% +q^Z%+otZSHKi4!/ دLS7 ø 4q.*ff^B! jl&3%IJ?"aet--pDfNm؆$DŽKlujSM}VoKQ1^nH&]f*id2d젞䘜[‹_t;,`Xq]X~q$l+۶Ceΰ0VSb3L0U |'( 1Lg~%xU}^:Vd@V4ޚ_&:ha!A7IsPΤ@-|U;iG_fҪN3xeE5flEtW0[kBs(_) 4ɶ 6RRv?`6F2a@^˛;\GKuY~xz5Icb#l7C.#e0&Peԋ0e-˜@&\Man}a~JΪKҊ3YA>Q9i$9`"lKFVU䗐%{RWh+KAU}ͯ+ +W ag!Wߝ*(֤rh!?T,֫7U^S-04/%~%#WCט+%~LW.fC%~# /=>ت7EwF;̍K;qZPb[HX'ĒW18IhI=P{<Ƹ~ouևB>$[*ZAMlGCeS <UOH?Fkrwzy9HT ̋_J" 3aer/@;Ubhmh<6h<މF]^Ko;{)&9OwyfʗWփ C b7kJk**ezЁhmV%gdG^T +endstream +endobj + +110 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /TOTADH+ArialMT + /Encoding /Identity-H + /DescendantFonts [111 0 R] + /ToUnicode 114 0 R +>> +endobj + +111 0 obj +<< + /Type /Font + /Subtype /CIDFontType2 + /BaseFont /TOTADH+ArialMT + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 113 0 R + /DW 0 + /CIDToGIDMap /Identity + /W [0 0 750 1 1 708.4961] +>> +endobj + +112 0 obj +<< + /Length 9 + /Filter /FlateDecode +>> +stream +x; +endstream +endobj + +113 0 obj +<< + /Type /FontDescriptor + /FontName /TOTADH+ArialMT + /Flags 131076 + /FontBBox [-11.230469 0 719.2383 910.15625] + /ItalicAngle 0 + /Ascent 728.02734 + /Descent -210.44922 + /CapHeight 716.3086 + /StemV 95.4 + /CIDSet 112 0 R + /FontFile2 115 0 R +>> +endobj + +114 0 obj +<< + /Length 619 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +1 beginbfchar +<0001> <2534> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +115 0 obj +<< + /Length 5418 + /Filter /FlateDecode +>> +stream +xY xTյgAI CLd "LGB%C2 H*ZTⓓ ASEXHD{osj=I^ədD1nMp0W_Ӽt˗SXl铥_ycy 5Do~ uK"W-F5h]O.o c4{W5N++"sG.H}ZZ<\254睘d\$?kڏaz7C@HF#>O$kē<؋2܇a"BL(v6\ߋ<q,K?؄TЄ;jr & +D3ANn7xe[$cP#'?{JDUɯRT +N(#yp"exuM=8 + ؉lINS>[? xQ܋axoy7y G>.Fk"&da r4YcŞ&Sg׏c(&`#؋a_@J^؄nF6-1DU"0hV܃.}BGǕ#{{0Í_Wx,v3;ާRZL|% ; +܁KgSX%1k`7g^vcQ1Uӵt73JRWZ[Ln3}~[Qp~~E'MS8L, fʜl `Qciv}>c_dlrR.咋VZNQ:J%'<ěu|3ş)#n|]ݦMϛΛS,7[a}_;w{ѻwGowa8Fa cRXƲ +Ve:~veO{#P*eh\KWSnK'+n<cL~V ו$š*nţT+M5WL1'Wo5\jag\efg9n>ti.o4pz^QgS@Qui4yMEE4>UXFCLWqV9Hz?uΙSc{W<O1 VX&;Ky,=0)~OSHz;91lF5s`/&q ?,b ~ꕥ JX0jT"< +T6qP]wћXJO((=g+MU+p#nuMXo +*l!l ܧ8 +5(>da?(泱 +Yp +-؉1(XF ŕXװ\Mq,5 f|(Va[ܫ/Jnxج߀8v/؆lSOЌwr:j*׽Fo|1pDz1>SfMyQ߮ 0K#|,~{P^Λt +#%A_8-&-U4:'P#؎mb5btAuheӧN2y%}{Ǝ};o+ש:rFڳG 6!)IIĐpתVSܮYvU7PaU+T1/]L1M|5R#e.5U]vG+jg%-]BN7_UY ejՀV-P[gIH7Iɥdo>LWs;˜$@a;h#\emLd@^W e;!oJ\K4J4T̥EQE5Mm?v{܆%zW}&pH2]eZd}gzljTֶY : |k5YjMPM6DTeqH2U*q5- ڈ6 U띱#zFԶ˩eB2{PUWxmCƶNK H,.Zj +4ʛ"Dd +d;b +2hֶ +Ÿl.3huG‰s3(IQX<mXqD,YT0Cړkr58a^PcPaA7|[܏%| %1 _iy6%esKkhJ塮[Ac嚭v!CIN9)nZ"M3О6^J7UT/jkK૨J<ªS-հ +q*~G?T&keKb.5{҄%ZHO *H":OQ[X\ 0SCHVޮ=2kk*??hAS*eD)z$P$aCD_!{~KvdyΕ}Y3.䱪WkB=VN0V-:5a9VˎC^'ČF#@'pI"^{VU|] *5JZD+ΥXߨMX++owݿ: n߿_DW[,X?5}XG0_q##r[,,JqzE]|'o. >=,#2`%JWr J2SLPXi%"0.z؃roU#a +~1vk+eFߤ;Yc1 >&i:҇Ҋ\C*WU* +yl<y<{xx#*A.#=:lS4gτ3(3gb. 䉑&<]<3cwOyf6:-I3l5WIʐgWrVh&\b +1NENJ*8㹙gxƇ91ܾ]]\qK+N"!:1xoW4itip:M=zGzPD=E=zw]III,E'E'qNB'$lxu*Eޡw`mziEo菱S}x + /8:ʼn:s1yn,o#γbqzC8(OǡqqN8lt*<:Z:f:3jtw <@' qlt*JBO'G'`c1јQAKȄ2AҋRB/Hz9paz1@q2KыK(`:F;!uPD]K]XL]F]0Stb8#oer_]xϯ^ۥr߽^_}>*oU!e>*{b_=WVtF]ɢ-,f<Ţ*쏓3vDRuEFr8JNC5s[d +}Mųۨ + +ԍ 4Fuc1uuuCnqrM4E墈rrrqra#'M +IuS2INH,-sh222}_T *Dw6Jm/G:잘xr +7˃MA'nq8/f_舳;߱ 98c~WX'{8nCAb8c1~UR;SOԛq3 >Ǎk1WOsT9fٷ:KsٯvL7XĜ}:ePW\p8k[vXK->KiqXFZ-CVu5ŚdZVJVXGwjo͊6$KOY ?v%B;T%|W%U.LWD⩈[*mBq;CF[ 8Цlg'lGo#BVƚCMHwW Tq>,-P P`5A/}*x +; B $y +QQ$'SEd9eyya9m큲KQ +}2gq;S{.pR{B!Ͽ{EJ<1-TW#>@u"@vۚ,-DUBOݵKG+Rչi5?iv5HYlZ. u̜wźd,6O,v5s' Lk5YĚ)cAyv+JB5`m3Tak!4gֆ +n${BZDKuH[,\ +k 0͙Nlm-h,3~[ZZZZW 7]'e-@6v~VT(n4(I+0뇌q+B1yQMc%#TQ:9-!TT^Q8v?vCKa"վZ$aC|uu%zњL<-ZwfI!){ +endstream +endobj + +116 0 obj +[/ICCBased 118 0 R] +endobj + +117 0 obj +[/ICCBased 119 0 R] +endobj + +118 0 obj +<< + /Length 258 + /N 1 + /Range [0 1] + /Filter /FlateDecode +>> +stream +xuJPFOUvDD@`]\ +FMkIRB|&إnऋ(HrTų9` ըa&ʺ:l +3Ŭ*ުnh)&C|>b纝黓AvCƫ+ y') +̵8+/> +stream +x}Kq?UX 94%MQKSN#ԦQvBˡhFk ! +ՠZP~xx^ޗQx"^P c!H0 + 0l+ߣy7;׫;Q?V._tF3LEK)y z80eIPkT/%[p:8+%d"G `d_{ٹ֖gzm\8rSif1\CU` S] @o _ +endstream +endobj + +120 0 obj +[127 0 R /XYZ 70.86614 756.6696 0] +endobj + +121 0 obj +[127 0 R /XYZ 70.86614 601.66864 0] +endobj + +122 0 obj +[127 0 R /XYZ 70.86614 781.0236 0] +endobj + +123 0 obj +[127 0 R /XYZ 70.86614 483.62762 0] +endobj + +124 0 obj +[129 0 R /XYZ 70.86614 361.18362 0] +endobj + +125 0 obj +[127 0 R /XYZ 70.86614 507.98163 0] +endobj + +126 0 obj +[131 0 R /XYZ 70.86614 361.18362 0] +endobj + +127 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 116 0 R + >> + /Font << + /f0 104 0 R + /f1 92 0 R + >> + >> + /MediaBox [0 0 595.2756 841.8898] + /StructParents 0 + /Parent 1 0 R + /Contents 128 0 R +>> +endobj + +128 0 obj +<< + /Length 1400 + /Filter /FlateDecode +>> +stream +xZK4Wh !,a5zlXMPv)H5^In%eT맼b7B5wwCOJhl'>4'%>5J|z7FfSB[ivwz8l?4|^)^)GGGG8BC?>wEw7>':F<{(5*qg  pڼ65o=4 +f`TWBD!jҙ"ul'}ph6*jDMeGHCcyؤ$ -u~ +udb>j"I@P ybLygWvꘝjYe's* mLAjFї)A?e~ExlH_F"p$絃BhjbMf2k2I#w09c^O[5ЦhJۺEI(xxi,$9;me#I &T~ Bȕ6U)J&OB(L,V`,(K6+FłcDjQZx qyY'3[Ӿ +ҫEZGCr/A†cn^O;]#<ѭdŢ?Gi7XDp:郅[W/Mjś5M}+C'Uu&t\._ 5%?Mc_<|΃E^,cEZL48c{(Qme)IŰO]V~}KNK77n%我HUY]xL+6/R9~8Cpϗ]\azg,Hr +0 y՞kD"OHJ+Q68ZqԎ*-v3wTI[ѝ\tDzQy= b?Ѣ8L4Lȧv !CbN:`|pEԙ g~^ \ 6sd 5-U70vXL|+Sāppi(I'̨Z4S_'?s` G/T +endstream +endobj + +129 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 116 0 R + /c1 117 0 R + >> + /Font << + /f0 92 0 R + /f1 98 0 R + /f2 110 0 R + /f3 104 0 R + >> + >> + /MediaBox [0 0 595.2756 841.8898] + /StructParents 1 + /Parent 1 0 R + /Contents 130 0 R +>> +endobj + +130 0 obj +<< + /Length 1639 + /Filter /FlateDecode +>> +stream +xYn7 }Wae"uHP]]i(HY{z6FԅJJ>g @1\lPl0lw|=|_;/_޼WO =xY?sN ݻ-W7ZTS)%CELobkKR"~Ls^[gJm/mn:Cd鸶qVW;9A +].Jۗ>3r0:;'u6[.դ_a!!wsQFB,\/!q'd%@=KPBe Bm/!uC|0zTcTDc[ x%beK |Pk/BU|BHJmb\.^ z,026k,fkeB'<< ~Æ=F Y0O9I $6_^:{~A۽;HzzŽ} +R%Kb_Z/RNǢrh,*w),|4C1H(^|AWg@jFDA/DM KėşJJ>VRQ]d wY[\T&ChզHXB'S$p <cQ'+qP8`)NJkD6v3!<' Yn|ZƎv18lz\.&g[6|8ܾ̋_ӽ;tAЃ>;I{DJdh !|> + /Font << + /f0 92 0 R + /f1 98 0 R + /f2 110 0 R + /f3 104 0 R + >> + >> + /MediaBox [0 0 595.2756 841.8898] + /StructParents 2 + /Parent 1 0 R + /Contents 132 0 R +>> +endobj + +132 0 obj +<< + /Length 1390 + /Filter /FlateDecode +>> +stream +xMo6 궇(H}qh2@M`Q$AGAɲ-gffwIc|G$&zC@~V8/&_K/?_Ջ:}q>ZQ_^_/U z:gu;W +/J7@f6y.ƠC0 '1jOeG15YN:x,g[2vj!d8SuuꓺWwxǃY˻rơ@^\zŐSOʥɳv|Kfh]| >->p&H>llOp:>6a,@e8>%=muUzz噳;-qJOBi I%TLu,r|e2}LL9/3IZ-[$\H +*T2+dvBTv*d#)fcunnvWA;vqXxUGЈz8Za~B>zScՐqih55GMgzGDQ; T$6.!f2: +`1\qK qtؕ%4>l +EF{ +ZQTg 0u""./ +nWFZ1>-TQi$coj> + /Font << + /f0 92 0 R + /f1 98 0 R + /f2 110 0 R + >> + >> + /MediaBox [0 0 595.2756 841.8898] + /StructParents 3 + /Parent 1 0 R + /Contents 134 0 R +>> +endobj + +134 0 obj +<< + /Length 1914 + /Filter /FlateDecode +>> +stream +xZ]k7}_}C%NZH!Їm23\퐻̓wfF{N!S16h]K|7M"DuǛ_?˗R.~zzbtY?-FgQF ~t5̀p\eqݒ:09hS*FBVg +V%mR c y4aa cXt=,}Iry˳hխ8uTY=1>/F}>m1Wv3w%_LuttI CI ,ɖHG2ljtySqM:cYlLF;@tb;-4G +óS9/m9ly98Oh"8'o1T9+sH0r^*ݏsY6ꖍD/JGD/PC6?=Fq930U8Kg@9xKQRͷQ;!Ly\ %Y,!]\KruGT56=$ &s zSˁdt4RJTi.%@Bmq|wTz0kc@0 L0U ,z|~dyOY.NE`fA[n~)ɾU m`ʅTڕfNV/6p `v`)œaw d +d d`082 QX~t']]!^K* $FSR27ı+M&8RzTf龛$(V/VQ,h"M=L{NHa( 6EZyZmݨ-d5qRc-2w+}Ӧԁ֛x0T##__-F]0 +@]}#vkcWM4Vd`@GO0kc9xc&'Q(N9{1"]ϛ[q QyUlrGO[(&99a' iy^Bˇ{fNa~< +>[bJ'n*3تy lQKjg[5Ղ 'Z8joQJj%ޓtQ*W?+]b^S\܈~a4k:rU{?gvʟڀ;(_bec0,,Z6f'Ya6?Pbo[?ңYoQC_*1 WսhqwZp]׆V}>ho?.ۢt6͙Pv +endstream +endobj + +135 0 obj +<< + /Creator (Typst 0.14.0) + /ModDate (D:19800101000000Z) + /CreationDate (D:19800101000000Z) +>> +endobj + +136 0 obj +<< + /Length 996 + /Type /Metadata + /Subtype /XML +>> +stream +Typst 0.14.0en1980-01-01T00:00:00+00:001980-01-01T00:00:00+00:004application/pdfRzxRQc6NU+ZCNSVfsLoklw==RzxRQc6NU+ZCNSVfsLoklw==proof1.7 +endstream +endobj + +137 0 obj +<< + /Type /Catalog + /Pages 1 0 R + /Metadata 136 0 R + /Lang (en) + /StructTreeRoot 10 0 R + /MarkInfo << + /Marked true + /Suspects false + >> + /ViewerPreferences << + /Direction /L2R + >> + /Outlines 2 0 R +>> +endobj + +xref +0 138 +0000000000 65535 f +0000000016 00000 n +0000000106 00000 n +0000000186 00000 n +0000000483 00000 n +0000000751 00000 n +0000000879 00000 n +0000001058 00000 n +0000001322 00000 n +0000001590 00000 n +0000001754 00000 n +0000002010 00000 n +0000002246 00000 n +0000002384 00000 n +0000002543 00000 n +0000002695 00000 n +0000003073 00000 n +0000003163 00000 n +0000003308 00000 n +0000003450 00000 n +0000003595 00000 n +0000003743 00000 n +0000003885 00000 n +0000004030 00000 n +0000004171 00000 n +0000004315 00000 n +0000004461 00000 n +0000004605 00000 n +0000004748 00000 n +0000004892 00000 n +0000005033 00000 n +0000005176 00000 n +0000005276 00000 n +0000005387 00000 n +0000005566 00000 n +0000005710 00000 n +0000005856 00000 n +0000006000 00000 n +0000006143 00000 n +0000006287 00000 n +0000006428 00000 n +0000006571 00000 n +0000006661 00000 n +0000006948 00000 n +0000007093 00000 n +0000007241 00000 n +0000007382 00000 n +0000007526 00000 n +0000007671 00000 n +0000007815 00000 n +0000007960 00000 n +0000008103 00000 n +0000008190 00000 n +0000008473 00000 n +0000008613 00000 n +0000008760 00000 n +0000008845 00000 n +0000008926 00000 n +0000009016 00000 n +0000009105 00000 n +0000009190 00000 n +0000009271 00000 n +0000009364 00000 n +0000009453 00000 n +0000009538 00000 n +0000009619 00000 n +0000009706 00000 n +0000009795 00000 n +0000009939 00000 n +0000010100 00000 n +0000010185 00000 n +0000010266 00000 n +0000010353 00000 n +0000010442 00000 n +0000010527 00000 n +0000010608 00000 n +0000010695 00000 n +0000010784 00000 n +0000010917 00000 n +0000011002 00000 n +0000011096 00000 n +0000011185 00000 n +0000011270 00000 n +0000011351 00000 n +0000011437 00000 n +0000011525 00000 n +0000011610 00000 n +0000011691 00000 n +0000011777 00000 n +0000011865 00000 n +0000011955 00000 n +0000012238 00000 n +0000012511 00000 n +0000012693 00000 n +0000013605 00000 n +0000013695 00000 n +0000013946 00000 n +0000015599 00000 n +0000022697 00000 n +0000022871 00000 n +0000023155 00000 n +0000023241 00000 n +0000023486 00000 n +0000024282 00000 n +0000025754 00000 n +0000025936 00000 n +0000026547 00000 n +0000026638 00000 n +0000026891 00000 n +0000028111 00000 n +0000032248 00000 n +0000032406 00000 n +0000032674 00000 n +0000032760 00000 n +0000033032 00000 n +0000033732 00000 n +0000039230 00000 n +0000039268 00000 n +0000039306 00000 n +0000039665 00000 n +0000040088 00000 n +0000040141 00000 n +0000040195 00000 n +0000040248 00000 n +0000040302 00000 n +0000040356 00000 n +0000040410 00000 n +0000040464 00000 n +0000040755 00000 n +0000042235 00000 n +0000042579 00000 n +0000044298 00000 n +0000044642 00000 n +0000046112 00000 n +0000046438 00000 n +0000048432 00000 n +0000048549 00000 n +0000049635 00000 n +trailer +<< + /Size 138 + /Root 137 0 R + /Info 135 0 R + /ID [(RzxRQc6NU+ZCNSVfsLoklw==) (RzxRQc6NU+ZCNSVfsLoklw==)] +>> +startxref +49873 +%%EOF \ No newline at end of file diff --git a/docs/file.typ b/docs/file.typ new file mode 100644 index 0000000..0d241fe --- /dev/null +++ b/docs/file.typ @@ -0,0 +1,112 @@ +#import "@preview/diagraph:0.3.6": render, raw-render + +== "Дорожная карта" (план развития) языка plcc + +=== Ограничения, накладываемые на разработку языка + +В основе языка plcc предусмотрены принципы и ограничения: + +1. Выполнения в условиях реального времени. + +2. Принципах продвинутого статического анализа кода, в частности... + + 3. контент-адресуемости (если формулы эквивалентны, то считаются равными; возможно отслеживание изменений на уровне абстрактного синтаксического дерева) + +4. Ориентации на исполнение на ПЛК. + +5. Ориентации на возможность распределенного исполнения программ. + +=== Перспективы + +1. Поддержка распределенного исполнения + +2. Поддержка трехзначной и Null Convention логики + +3. "Стимулирование" использования чистых функций вместо функциональных блоков, сокращение количества внутренних переменных + +== Пример АСД + +=== Пример построения полной формы АСД языка plcc + +Полная форма АСД включает в себя управляющие узлы и примитивные функции: + + +#render(" + digraph { + none -> C0 + C0 -> sin + C0 -> C1 + C1 -> \"+\"; + C1 -> ┴; + ┴ -> C2 + C2 -> cos; + C2 -> x1; + ┴ -> C3 + C3 -> \"3*\"; + C3 -> x2; + none [label=\"\", shape=none] + x1 [label=x, shape=block]; + x2 [label=x, shape=block]; + sin [shape=block] + \"+\" [shape=block] + cos [shape=block] + \"3*\" [shape=block] + } +") + +=== Пример построения краткой формы АСД языка plcc + +Краткая форма АСД состоит в сокрытии композиционного управляющего узла с под одноместными функциями: + +#render(" + digraph { + none -> sin + sin -> \"+\"; + \"+\" -> ┴; + ┴ -> cos; + cos -> x1; + ┴ -> \"3*\"; + \"3*\" -> x2; + x1 [label=x]; + x2 [label=x]; + none [label=\"\", shape=none] + } +") + +== Пример равенства АСД + +За счет свойства коммутативности операции сложения для чисел $a + b = b + a$, одно поддерево плюс другое равно те же самые деревья, но сложенные в обратном порядке: + +#render(" + digraph { + none -> sin + sin -> \"+\"; + \"+\" -> ┴; + ┴ -> cos; + cos -> x1; + ┴ -> \"3*\"; + \"3*\" -> x2; + x1 [label=x]; + x2 [label=x]; + + + nonen -> sinn + sinn -> plusn; + plusn -> ┴n [color=red]; + ┴n -> triple [color=red]; + triple -> x2n; + ┴n -> cosn [color=red]; + cosn -> x1n; + + x1n [label=x]; + x2n [label=x]; + + + none, nonen [label=\"\", shape=none] + sinn [label=sin] + plusn [label=\"+\", color=red] + cosn [label=cos] + ┴n [label=┴, color=red] + triple [label=\"3*\"] + } +") diff --git a/shell.nix b/shell.nix index 9b5db5e..4f4eaf3 100644 --- a/shell.nix +++ b/shell.nix @@ -1,9 +1,11 @@ { pkgs ? import {} }: pkgs.mkShell { - buildInputs = [ - pkgs.rustc - pkgs.cargo + buildInputs = with pkgs; [ + rustc + cargo + typst + typstPackages.diagraph ]; } diff --git a/src/ast.rs b/src/ast.rs index b2e0692..7ee8a82 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -10,7 +10,13 @@ pub enum Prim { Input, // переменная x } -#[derive(Debug, Clone, PartialEq, Eq, Hash)] +impl Prim { + pub const fn is_commutative(&self) -> bool { + matches!(self, Prim::AddPair) + } +} + +#[derive(Debug, Clone)] pub enum ExprAst { Atom(Prim), Composition(Box, Box), // g ∘ f @@ -26,3 +32,77 @@ pub fn hash_ast(e: &ExprAst) -> u64 { e.hash(&mut h); h.finish() } + +impl ExprAst { + fn fingerprint(&self) -> u64 { + let mut h = DefaultHasher::new(); + self.hash(&mut h); + h.finish() + } +} + +impl PartialEq for ExprAst { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (ExprAst::Atom(p1), ExprAst::Atom(p2)) => p1 == p2, + (ExprAst::Composition(a1, b1), ExprAst::Composition(a2, b2)) => { + match (b1.as_ref(), b2.as_ref()) { + (ExprAst::Atom(p1), ExprAst::Atom(p2)) + if p1.is_commutative() && p2.is_commutative() => + { + if p1 != p2 { + return false; + } + match (a1.as_ref(), a2.as_ref()) { + (ExprAst::Junction(l1, r1), ExprAst::Junction(l2, r2)) => { + (l1 == l2 && r1 == r2) || (l1 == r2 && r1 == l2) + } + _ => a1 == a2, + } + } + _ => a1 == a2 && b1 == b2, + } + } + (ExprAst::Junction(l1, r1), ExprAst::Junction(l2, r2)) => l1 == l2 && r1 == r2, + _ => false, + } + } +} + +impl Eq for ExprAst {} + +impl Hash for ExprAst { + fn hash(&self, state: &mut H) { + match self { + ExprAst::Atom(p) => { + 0u8.hash(state); + p.hash(state); + } + ExprAst::Composition(a, b) => { + if let ExprAst::Atom(p) = b.as_ref() { + if p.is_commutative() { + // Canonicalize inputs for commutative operations. + 1u8.hash(state); + p.hash(state); + if let ExprAst::Junction(l, r) = a.as_ref() { + let hl = l.fingerprint(); + let hr = r.fingerprint(); + let (lo, hi) = if hl <= hr { (hl, hr) } else { (hr, hl) }; + lo.hash(state); + hi.hash(state); + return; + } + } + } + 1u8.hash(state); + a.hash(state); + b.hash(state); + } + ExprAst::Junction(l, r) => { + 2u8.hash(state); + l.hash(state); + r.hash(state); + } + } + } +} diff --git a/src/compiler.rs b/src/compiler.rs new file mode 100644 index 0000000..589931b --- /dev/null +++ b/src/compiler.rs @@ -0,0 +1,83 @@ +use crate::ast::{ExprAst, Prim}; +use crate::dsl::{Composition, Expr, Function, Junction}; +use crate::primitives::{add_pair, cos_f, id, sin_f, triple}; +use crate::support::Arc; + +/// Runtime type for a compiled AST node. +#[derive(Clone)] +pub enum CompiledExpr { + /// f64 -> f64 + F64(Arc + Send + Sync + 'static>), + /// f64 -> (f64, f64) + Pair(Arc + Send + Sync + 'static>), + /// (f64, f64) -> f64 + PairToF64(Arc + Send + Sync + 'static>), +} + +impl CompiledExpr { +} + +pub fn compile_ast(ast: &ExprAst) -> Result { + match ast { + ExprAst::Atom(prim) => compile_atom(prim), + ExprAst::Composition(first, second) => compile_composition(first, second), + ExprAst::Junction(left, right) => compile_junction(left, right), + } +} + +pub fn compile_to_scalar( + ast: &ExprAst, +) -> Result + Send + Sync + 'static>, String> { + match compile_ast(ast)? { + CompiledExpr::F64(expr) => Ok(expr), + _ => Err("expected AST that evaluates to f64".to_string()), + } +} + +fn compile_atom(prim: &Prim) -> Result { + let compiled = match prim { + Prim::Sin => CompiledExpr::F64(Arc::new(Function { f: sin_f })), + Prim::Cos => CompiledExpr::F64(Arc::new(Function { f: cos_f })), + Prim::Triple => CompiledExpr::F64(Arc::new(Function { f: triple })), + Prim::AddPair => CompiledExpr::PairToF64(Arc::new(Function { f: add_pair })), + Prim::Input => CompiledExpr::F64(Arc::new(Function { f: id })), + }; + + Ok(compiled) +} + +fn compile_composition( + first: &ExprAst, + second: &ExprAst, +) -> Result { + let compiled_first = compile_ast(first)?; + let compiled_second = compile_ast(second)?; + + match (compiled_first, compiled_second) { + // f64 -> f64 -> f64 + (CompiledExpr::F64(f1), CompiledExpr::F64(f2)) => Ok(CompiledExpr::F64(Arc::new( + Composition { first: f1, second: f2 }, + ))), + // f64 -> f64 -> (f64,f64) + (CompiledExpr::F64(f1), CompiledExpr::Pair(f2)) => Ok(CompiledExpr::Pair(Arc::new( + Composition { first: f1, second: f2 }, + ))), + // f64 -> (f64,f64) -> f64 + (CompiledExpr::Pair(f1), CompiledExpr::PairToF64(f2)) => Ok(CompiledExpr::F64( + Arc::new(Composition { first: f1, second: f2 }), + )), + _ => Err("type mismatch in composition".to_string()), + } +} + +fn compile_junction(left: &ExprAst, right: &ExprAst) -> Result { + let compiled_left = compile_ast(left)?; + let compiled_right = compile_ast(right)?; + + match (compiled_left, compiled_right) { + (CompiledExpr::F64(l), CompiledExpr::F64(r)) => Ok(CompiledExpr::Pair(Arc::new( + Junction { left: l, right: r }, + ))), + _ => Err("junction requires two f64-returning branches".to_string()), + } +} diff --git a/src/dsl.rs b/src/dsl.rs index accd2d8..1208218 100644 --- a/src/dsl.rs +++ b/src/dsl.rs @@ -1,5 +1,4 @@ -use std::sync::Arc; -use std::thread; +use crate::support::{run_parallel, Arc}; // Обобщённое выражение: I -> Out pub trait Expr { @@ -7,6 +6,18 @@ pub trait Expr { fn eval(&self, x: I) -> Self::Out; } +// Позволяет использовать Arc там, где требуется Expr. +impl Expr for Arc +where + T: Expr + ?Sized, +{ + type Out = T::Out; + + fn eval(&self, x: I) -> Self::Out { + (**self).eval(x) + } +} + // атомарная функция pub struct Function { pub f: fn(I) -> O, @@ -39,7 +50,7 @@ where } // junction — две ветки параллельно -pub struct Junction { +pub struct Junction { pub left: Arc, pub right: Arc, } @@ -47,8 +58,8 @@ pub struct Junction { impl Expr for Junction where I: Copy + Send + 'static, - F1: Expr + Send + Sync + 'static, - F2: Expr + Send + Sync + 'static, + F1: Expr + Send + Sync + 'static + ?Sized, + F2: Expr + Send + Sync + 'static + ?Sized, F1::Out: Send + 'static, F2::Out: Send + 'static, { @@ -61,9 +72,6 @@ where let x1 = x; let x2 = x; - let h1 = thread::spawn(move || l.eval(x1)); - let h2 = thread::spawn(move || r.eval(x2)); - - (h1.join().unwrap(), h2.join().unwrap()) + run_parallel(move || l.eval(x1), move || r.eval(x2)) } } diff --git a/src/main.rs b/src/main.rs index 7a4c95c..222f4a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,33 +1,23 @@ mod ast; +mod compiler; mod dsl; +mod primitives; +mod store; +mod support; use std::sync::Arc; use ast::{ ExprAst, ExprAst::{Atom, Composition as C, Junction as J}, - Prim::{AddPair, Cos, Input, Sin, Triple}, + Prim::{AddPair, Cos, Sin, Triple}, ast_input, hash_ast, }; +use compiler::compile_to_scalar; use dsl::{Composition, Expr, Function, Junction}; - -// ========= тестовые функции ========= - -fn sin_f(x: f64) -> f64 { - x.sin() -} -fn cos_f(x: f64) -> f64 { - x.cos() -} -fn triple(x: f64) -> f64 { - 3.0 * x -} - -/// (a,b) -> a + b -fn add_pair(p: (f64, f64)) -> f64 { - p.0 + p.1 -} +use primitives::{add_pair, cos_f, sin_f, triple}; +use store::ExprStore; // AST для sin(cos(x) + 3*x) fn pupa() -> ExprAst { @@ -95,4 +85,45 @@ fn main() { println!("equal? {}", ast1 == ast2); println!("hash1 = {:016x}", hash_ast(&ast1)); println!("hash2 = {:016x}", hash_ast(&ast2)); + + // --- компиляция AST -> DSL и вычисление --- + + let compiled = compile_to_scalar(&ast).expect("AST should compile to f64 -> f64"); + let compiled_y = compiled.eval(x); + + println!( + "compiled eval: sin(cos({}) + 3*{}) = {}", + x, x, compiled_y + ); + + // --- контент-адресуемое хранилище выражений --- + + let mut store = ExprStore::new(); + let (stored_hash, stored_expr) = store + .insert_scalar(ast.clone()) + .expect("store insert should compile"); + let store_eval = stored_expr.eval(x); + let stored_ast = store + .get_ast(stored_hash) + .expect("AST should be retrievable by hash"); + let store_eval_via_lookup = store + .eval_scalar(stored_hash, x) + .expect("store should return scalar result"); + let compiled_from_store = store + .get(stored_hash) + .expect("compiled expression should be cached"); + + println!( + "store eval (hash {:016x}): sin(cos({}) + 3*{}) = {}", + stored_hash, x, x, store_eval + ); + println!( + "store eval via lookup (hash {:016x}): sin(cos({}) + 3*{}) = {}", + stored_hash, x, x, store_eval_via_lookup + ); + println!( + "compiled cached? {}", + matches!(compiled_from_store.as_ref(), compiler::CompiledExpr::F64(_)) + ); + println!("store keeps AST equal to original? {}", stored_ast == &ast); } diff --git a/src/primitives.rs b/src/primitives.rs new file mode 100644 index 0000000..9b7652a --- /dev/null +++ b/src/primitives.rs @@ -0,0 +1,22 @@ +// Reusable primitive functions used by both the DSL and the AST compiler. +pub fn sin_f(x: f64) -> f64 { + x.sin() +} + +pub fn cos_f(x: f64) -> f64 { + x.cos() +} + +pub fn triple(x: f64) -> f64 { + 3.0 * x +} + +/// (a,b) -> a + b +pub fn add_pair(p: (f64, f64)) -> f64 { + p.0 + p.1 +} + +/// Identity for the AST `Input` primitive. +pub fn id(x: f64) -> f64 { + x +} diff --git a/src/store.rs b/src/store.rs new file mode 100644 index 0000000..f14e0f5 --- /dev/null +++ b/src/store.rs @@ -0,0 +1,69 @@ +use std::collections::HashMap; + +use crate::ast::{hash_ast, ExprAst}; +use crate::compiler::{compile_ast, compile_to_scalar, CompiledExpr}; +use crate::support::Arc; + +/// In-memory content-addressed store keyed by AST hash. +#[derive(Default)] +pub struct ExprStore { + compiled: HashMap>, + asts: HashMap, +} + +impl ExprStore { + pub fn new() -> Self { + Self::default() + } + + /// Insert an AST, compile it once, and return its hash. + /// If the hash already exists, the cached entry is reused. + pub fn insert(&mut self, ast: ExprAst) -> Result { + let hash = hash_ast(&ast); + if !self.compiled.contains_key(&hash) { + let compiled = compile_ast(&ast)?; + self.compiled.insert(hash, Arc::new(compiled)); + self.asts.insert(hash, ast); + } + Ok(hash) + } + + /// Fetch a compiled expression by hash. + pub fn get(&self, hash: u64) -> Option> { + self.compiled.get(&hash).cloned() + } + + /// Fetch the original AST by hash. + pub fn get_ast(&self, hash: u64) -> Option<&ExprAst> { + self.asts.get(&hash) + } + + /// Evaluate a stored scalar expression for the provided input. + pub fn eval_scalar(&self, hash: u64, input: f64) -> Result { + let compiled = self + .get(hash) + .ok_or_else(|| format!("hash {:016x} not found", hash))?; + + match compiled.as_ref() { + CompiledExpr::F64(expr) => Ok(expr.eval(input)), + CompiledExpr::Pair(_) => Err("expression returns a pair, not f64".into()), + CompiledExpr::PairToF64(_) => Err("expression expects a pair input, not f64".into()), + } + } + + /// Insert an AST that must evaluate to f64 -> f64, returning its hash and compiled form. + pub fn insert_scalar( + &mut self, + ast: ExprAst, + ) -> Result< + ( + u64, + Arc + Send + Sync + 'static>, + ), + String, + > { + let hash = self.insert(ast.clone())?; + let expr = compile_to_scalar(&ast)?; + Ok((hash, expr)) + } +} diff --git a/src/support.rs b/src/support.rs new file mode 100644 index 0000000..ccec14b --- /dev/null +++ b/src/support.rs @@ -0,0 +1,39 @@ +// Platform helpers to ease future no_std portability. +// The crate currently depends on `std`, but concentrating platform-specific +// pieces here makes migration simpler. + +#[cfg(feature = "std")] +pub use std::sync::Arc; + +#[cfg(feature = "std")] +pub fn run_parallel(left: L, right: R) -> (OutL, OutR) +where + L: FnOnce() -> OutL + Send + 'static, + R: FnOnce() -> OutR + Send + 'static, + OutL: Send + 'static, + OutR: Send + 'static, +{ + let h1 = std::thread::spawn(left); + let h2 = std::thread::spawn(right); + (h1.join().unwrap(), h2.join().unwrap()) +} + +#[cfg(not(feature = "std"))] +mod no_std_support { + extern crate alloc; + pub use alloc::sync::Arc; + + pub fn run_parallel(left: L, right: R) -> (OutL, OutR) + where + L: FnOnce() -> OutL + Send + 'static, + R: FnOnce() -> OutR + Send + 'static, + OutL: Send + 'static, + OutR: Send + 'static, + { + // No threads available: fall back to sequential execution. + (left(), right()) + } +} + +#[cfg(not(feature = "std"))] +pub use no_std_support::*;