diff --git a/scala_project_2025/bank_system/report.md b/scala_project_2025/bank_system/report.md new file mode 100644 index 0000000..1742f26 --- /dev/null +++ b/scala_project_2025/bank_system/report.md @@ -0,0 +1,200 @@ +--- +title: "scala project part 2" +date: 2025-11-07 +author: fredrik robertsen +margin: + x: 3.5cm + y: 4cm +fontsize: 14pt +mainfont: libertinus serif +lineheight: 1.5 +pagesize: a4 +--- + +# task 3 + +## how does it all work? + +we essentially implement a queue that we can put our transactions in. these +transactions are then processed in turn by the bank using threads. to ensure +thread safety we are writing the core functionality purely, i.e. returning +new instances of accounts rather than modifying them, which could incur race +conditions. immutable state makes things easy to work with. + +all we need are some accounts with a balance and a unique id, some registry to +track these accounts and some checks to make sure that a transaction is +processed correctly, i.e. that there are enough available funds. + +then we can model the transaction as a finite state automaton using a state enum, +making it succeed if enough money is available, otherwise fail. + +## what was easy + +implementing the `Account`s, `TransactionPool`s, `Transaction`s and the simpler +parts of `Bank`, such as `createAccount` and `getAccount` were all easy tasks, +only requiring some lookups for what is available in scala/java. + +these didn't require a lot of work or many lines of code per implementation, +since most of it is just setters and getters. + +## what was hard + +transaction processing in `Bank`. + +proper case handling to ensure correct state often becomes unwieldy, and this +was no exception. it was a case of running the tests, seeing what failed, then +reasoning about why it failed, then attempting to patch it by inserting some +if/else statements that hopefully fail certain transactions that should have +been failed. + +even then, it wasn't very hard, as this is only a toy program with very few +moving parts. we are doing ourselves a great service by using immtutable state, +making it much easier to figure out what part of the code must be wrong when +tests fail. + +## implementation + +i will be going three the three main pain-points that had the most impact on +making the tests pass. + +the first is enqueuing a `Transaction`: + +```scala + def transfer(from: String, to: String, amount: Double): Unit = { + if (amount <= 0) { + val t = new Transaction(from, to, amount) + t.fail() + completedTransactions.add(t) + return + } + + val f = getAccount(from) + val t = getAccount(to) + + if (f.isEmpty || t.isEmpty) { + val t = new Transaction(from, to, amount) + t.fail() + completedTransactions.add(t) + return + } + + if (f.get.balance < amount) { + val t = new Transaction(from, to, amount) + t.fail() + completedTransactions.add(t) + return + } + + transactionsPool.add(new Transaction(from, to, amount)) + } +``` + +the initial TODO-comment only mentioned to ad the transaction to the pool. but +upon running the tests it quickly became apparent that we need some case +handling for when transactions are illegal. though i'm sure i could've put this +in `Transaction` and that would've probably been better, i just did it here. in +short: i'm ensuring that amount is positive, accounts exist in our registry and +there is enough money in the account who is transfered from. + +then processesing the transactions wasn't so bad using the comments that were +already in place. we also get to use some neat scala syntax, like +`filter(_.isPending)`: + +```scala + def processTransactions: Unit = { + + val workers: List[Thread] = transactionsPool.iterator.toList + .filter(_.isPending) + .map(processSingleTransaction) + + workers.map(element => element.start()) + workers.map(element => element.join()) + + val succeded: List[Transaction] = + transactionsPool.iterator.toList.filter(_.succeeded) + + val failed: List[Transaction] = + transactionsPool.iterator.toList.filter(_.failed) + + succeded.map(transactionsPool.remove(_)) + succeded.map(completedTransactions.add(_)) + + failed.map(t => { + t.setPending() + t.incrementAttempt() + if (t.exceeded) { + transactionsPool.remove(t) + completedTransactions.add(t) + } + }) + + if (!transactionsPool.isEmpty) { + processTransactions + } + } +``` + +then lastly we have to actually process the transactions, one at a time. i first +did this: + +```scala + private def processSingleTransaction(t: Transaction): Thread = + new Thread(() => { + accountsRegistry.synchronized { + val fromOpt = getAccount(t.from) + val toOpt = getAccount(t.to) + + (fromOpt, toOpt) match { + case (Some(from), Some(to)) => + from.withdraw(t.amount) match { + case Right(updatedFrom) => + to.deposit(t.amount) match { + case Right(updatedTo) => + accountsRegistry(t.from) = updatedFrom + accountsRegistry(t.to) = updatedTo + t.succeed() + case Left(_) => t.fail() + } + case Left(_) => t.fail() + } + case _ => t.fail() + } + } + }) +``` + +here we are getting the accounts as Options, then pattern matching to obtain the +accounts, otherwise failing the transaction. then performing a withdrawal of the +amount, followed by a deposit, then updating the registry with new accounts with +updated balances. only then will the transaction succeed. + +but my time with haskell has taught me that this exact pattern is a monadic +pattern. in haskell, we could use `do`-notation to remove all this fluff where +we are failing, and instead focus on the parts that don't lead to a failure. +i already know `Option` and `Either` are monads, so this pattern is fair to +expect. so i looked at how to emulate this syntax in scala, and lo and behold; +we have `do`-notation in scala in the form of `for`/`yield`: + +```scala + private def processSingleTransaction(t: Transaction): Thread = + new Thread(() => { + accountsRegistry.synchronized { + for { + from <- getAccount(t.from) + to <- getAccount(t.to) + updatedFrom <- from.withdraw(t.amount).toOption + updatedTo <- to.deposit(t.amount).toOption + } yield { + accountsRegistry(t.from) = updatedFrom + accountsRegistry(t.to) = updatedTo + t.succeed() + } + } + }) +``` + +with this refactor, we still pass the tests and obtain much more readable code. +it's easy to read that we are getting the accounts, getting new accounts from +some updates (wrapped as options, failing if the we obtain a `Left`), then we do +some work with these values if we succeed with all steps, i.e. updating the +registry. very beautiful! diff --git a/scala_project_2025/bank_system/report.pdf b/scala_project_2025/bank_system/report.pdf new file mode 100644 index 0000000..32ec8e9 --- /dev/null +++ b/scala_project_2025/bank_system/report.pdf @@ -0,0 +1,2693 @@ +%PDF-1.7 +% + +1 0 obj +<< + /Type /Pages + /Count 6 + /Kids [193 0 R 195 0 R 197 0 R 199 0 R 201 0 R 203 0 R] +>> +endobj + +2 0 obj +<< + /Type /Outlines + /First 3 0 R + /Last 3 0 R + /Count 1 +>> +endobj + +3 0 obj +<< + /Parent 2 0 R + /First 4 0 R + /Last 7 0 R + /Count -4 + /Title (task 3) + /Dest 192 0 R +>> +endobj + +4 0 obj +<< + /Parent 3 0 R + /Next 5 0 R + /Title (how does it all work?) + /Dest 188 0 R +>> +endobj + +5 0 obj +<< + /Parent 3 0 R + /Next 6 0 R + /Prev 4 0 R + /Title (what was easy) + /Dest 189 0 R +>> +endobj + +6 0 obj +<< + /Parent 3 0 R + /Next 7 0 R + /Prev 5 0 R + /Title (what was hard) + /Dest 190 0 R +>> +endobj + +7 0 obj +<< + /Parent 3 0 R + /Prev 6 0 R + /Title (implementation) + /Dest 191 0 R +>> +endobj + +8 0 obj +<< + /Nums [0 160 0 R 1 161 0 R 2 162 0 R 3 163 0 R 4 164 0 R 5 165 0 R] +>> +endobj + +9 0 obj +<< + /Type /StructTreeRoot + /RoleMap << + /Datetime /Span + /Terms /Part + /Title /P + /Strong /Span + /Em /Span + >> + /K [16 0 R] + /ParentTree << + /Nums [0 10 0 R 1 11 0 R 2 12 0 R 3 13 0 R 4 14 0 R 5 15 0 R] + >> + /ParentTreeNextKey 6 +>> +endobj + +10 0 obj +[159 0 R 158 0 R 155 0 R 154 0 R 153 0 R 152 0 R 152 0 R 152 0 R 152 0 R 152 0 R 152 0 R 151 0 R 151 0 R 151 0 R 151 0 R 150 0 R 150 0 R 149 0 R 142 0 R 148 0 R 142 0 R 147 0 R 142 0 R 146 0 R 142 0 R 142 0 R 145 0 R 142 0 R 144 0 R 142 0 R 143 0 R 142 0 R 142 0 R] +endobj + +11 0 obj +[141 0 R 141 0 R 141 0 R 140 0 R 138 0 R 139 0 R 138 0 R 137 0 R 137 0 R 137 0 R 137 0 R 137 0 R 136 0 R 136 0 R 136 0 R 136 0 R 135 0 R 134 0 R 134 0 R 132 0 R 133 0 R 132 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 131 0 R 130 0 R 130 0 R 130 0 R 130 0 R 130 0 R 130 0 R 130 0 R 130 0 R 130 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 129 0 R 128 0 R 128 0 R 128 0 R 128 0 R 128 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 127 0 R 126 0 R 126 0 R 125 0 R 125 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 123 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R 122 0 R] +endobj + +12 0 obj +[120 0 R 120 0 R 120 0 R 120 0 R 120 0 R 120 0 R 120 0 R 120 0 R 120 0 R 120 0 R 120 0 R 120 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 119 0 R 118 0 R 118 0 R 118 0 R 118 0 R 118 0 R 117 0 R 117 0 R 117 0 R 117 0 R 117 0 R 117 0 R 116 0 R 116 0 R 115 0 R 115 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 113 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 112 0 R 111 0 R 111 0 R 111 0 R 111 0 R 111 0 R 110 0 R 110 0 R 110 0 R 110 0 R 110 0 R 110 0 R 109 0 R 109 0 R 108 0 R 108 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 106 0 R 105 0 R 105 0 R 102 0 R 102 0 R 102 0 R 102 0 R 103 0 R 102 0 R 102 0 R 102 0 R 102 0 R 100 0 R 100 0 R 100 0 R 101 0 R 100 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 99 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 97 0 R 96 0 R 96 0 R 96 0 R 96 0 R 96 0 R 96 0 R 96 0 R 96 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R 95 0 R] +endobj + +13 0 obj +[93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 93 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 90 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 89 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 87 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 86 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 83 0 R 83 0 R 83 0 R 83 0 R 83 0 R 83 0 R 83 0 R 83 0 R 83 0 R 83 0 R 83 0 R 81 0 R 81 0 R 81 0 R 81 0 R 81 0 R 81 0 R 81 0 R 81 0 R 81 0 R 80 0 R 80 0 R 80 0 R 80 0 R 80 0 R 79 0 R 79 0 R 79 0 R 79 0 R 79 0 R 78 0 R 78 0 R 78 0 R 78 0 R 78 0 R 78 0 R 78 0 R 78 0 R 78 0 R 78 0 R 77 0 R 77 0 R 77 0 R 77 0 R 77 0 R 77 0 R 76 0 R 76 0 R 76 0 R 76 0 R 76 0 R 76 0 R 75 0 R 75 0 R 74 0 R 74 0 R 74 0 R 72 0 R 72 0 R 72 0 R 72 0 R 72 0 R 72 0 R 72 0 R 72 0 R 72 0 R 72 0 R 71 0 R 70 0 R 70 0 R 69 0 R 69 0 R 67 0 R 67 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 65 0 R 65 0 R 65 0 R 65 0 R 65 0 R 65 0 R 65 0 R 65 0 R 65 0 R 65 0 R 65 0 R 64 0 R 64 0 R 64 0 R 64 0 R 63 0 R 63 0 R 63 0 R 63 0 R 63 0 R 63 0 R 63 0 R 63 0 R 63 0 R 63 0 R 63 0 R 63 0 R 62 0 R 62 0 R 62 0 R 62 0 R 62 0 R 62 0 R 62 0 R 62 0 R 62 0 R 62 0 R 62 0 R 62 0 R] +endobj + +14 0 obj +[60 0 R 60 0 R 60 0 R 60 0 R 60 0 R 60 0 R 60 0 R 60 0 R 60 0 R 60 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 59 0 R 58 0 R 58 0 R 58 0 R 58 0 R 58 0 R 58 0 R 58 0 R 58 0 R 58 0 R 58 0 R 58 0 R 58 0 R 57 0 R 57 0 R 57 0 R 57 0 R 57 0 R 57 0 R 57 0 R 57 0 R 57 0 R 56 0 R 56 0 R 56 0 R 56 0 R 56 0 R 56 0 R 56 0 R 56 0 R 56 0 R 56 0 R 56 0 R 56 0 R 55 0 R 55 0 R 55 0 R 55 0 R 55 0 R 55 0 R 55 0 R 55 0 R 55 0 R 54 0 R 54 0 R 54 0 R 54 0 R 54 0 R 54 0 R 54 0 R 54 0 R 54 0 R 53 0 R 53 0 R 53 0 R 53 0 R 53 0 R 53 0 R 53 0 R 53 0 R 53 0 R 52 0 R 52 0 R 52 0 R 52 0 R 52 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 51 0 R 50 0 R 50 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 49 0 R 48 0 R 48 0 R 47 0 R 47 0 R 47 0 R 47 0 R 47 0 R 47 0 R 47 0 R 47 0 R 47 0 R 47 0 R 47 0 R 46 0 R 46 0 R 45 0 R 45 0 R 44 0 R 44 0 R 44 0 R 42 0 R 42 0 R 42 0 R 42 0 R 42 0 R 35 0 R 35 0 R 41 0 R 35 0 R 35 0 R 35 0 R 40 0 R 35 0 R 39 0 R 35 0 R 35 0 R 35 0 R 38 0 R 35 0 R 37 0 R 35 0 R 36 0 R 35 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 34 0 R 33 0 R 33 0 R 33 0 R 33 0 R 33 0 R 33 0 R 33 0 R 33 0 R 33 0 R 33 0 R 33 0 R 32 0 R 32 0 R 32 0 R 32 0 R] +endobj + +15 0 obj +[31 0 R 31 0 R 31 0 R 31 0 R 30 0 R 30 0 R 30 0 R 30 0 R 30 0 R 30 0 R 30 0 R 30 0 R 30 0 R 30 0 R 29 0 R 29 0 R 29 0 R 29 0 R 29 0 R 29 0 R 29 0 R 29 0 R 29 0 R 29 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 28 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 27 0 R 26 0 R 26 0 R 26 0 R 26 0 R 26 0 R 26 0 R 25 0 R 25 0 R 25 0 R 25 0 R 25 0 R 25 0 R 25 0 R 25 0 R 25 0 R 24 0 R 24 0 R 24 0 R 24 0 R 24 0 R 24 0 R 24 0 R 24 0 R 24 0 R 23 0 R 23 0 R 23 0 R 23 0 R 23 0 R 22 0 R 22 0 R 21 0 R 21 0 R 20 0 R 20 0 R 20 0 R 17 0 R 17 0 R 17 0 R 17 0 R 18 0 R 17 0 R 17 0 R] +endobj + +16 0 obj +<< + /Type /StructElem + /S /Document + /P 9 0 R + /K [159 0 R 156 0 R 155 0 R 154 0 R 153 0 R 152 0 R 151 0 R 150 0 R 149 0 R 142 0 R 141 0 R 140 0 R 138 0 R 137 0 R 136 0 R 135 0 R 134 0 R 132 0 R 104 0 R 102 0 R 100 0 R 68 0 R 67 0 R 43 0 R 42 0 R 35 0 R 19 0 R 17 0 R] +>> +endobj + +17 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [88 89 90 91 18 0 R 93 94] + /Pg 203 0 R +>> +endobj + +18 0 obj +<< + /Type /StructElem + /S /Code + /P 17 0 R + /K [92] + /Pg 203 0 R +>> +endobj + +19 0 obj +<< + /Type /StructElem + /S /Code + /P 16 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [34 0 R 33 0 R 32 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] +>> +endobj + +20 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [85 86 87] + /Pg 203 0 R +>> +endobj + +21 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [83 84] + /Pg 203 0 R +>> +endobj + +22 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [81 82] + /Pg 203 0 R +>> +endobj + +23 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [76 77 78 79 80] + /Pg 203 0 R +>> +endobj + +24 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [67 68 69 70 71 72 73 74 75] + /Pg 203 0 R +>> +endobj + +25 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [58 59 60 61 62 63 64 65 66] + /Pg 203 0 R +>> +endobj + +26 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [52 53 54 55 56 57] + /Pg 203 0 R +>> +endobj + +27 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [38 39 40 41 42 43 44 45 46 47 48 49 50 51] + /Pg 203 0 R +>> +endobj + +28 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [24 25 26 27 28 29 30 31 32 33 34 35 36 37] + /Pg 203 0 R +>> +endobj + +29 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [14 15 16 17 18 19 20 21 22 23] + /Pg 203 0 R +>> +endobj + +30 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [4 5 6 7 8 9 10 11 12 13] + /Pg 203 0 R +>> +endobj + +31 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [0 1 2 3] + /Pg 203 0 R +>> +endobj + +32 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [193 194 195 196] + /Pg 201 0 R +>> +endobj + +33 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [182 183 184 185 186 187 188 189 190 191 192] + /Pg 201 0 R +>> +endobj + +34 0 obj +<< + /Type /StructElem + /S /P + /P 19 0 R + /K [165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181] + /Pg 201 0 R +>> +endobj + +35 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [147 148 41 0 R 150 151 152 40 0 R 154 39 0 R 156 157 158 38 0 R 160 37 0 R 162 36 0 R 164] + /Pg 201 0 R +>> +endobj + +36 0 obj +<< + /Type /StructElem + /S /Code + /P 35 0 R + /K [163] + /Pg 201 0 R +>> +endobj + +37 0 obj +<< + /Type /StructElem + /S /Code + /P 35 0 R + /K [161] + /Pg 201 0 R +>> +endobj + +38 0 obj +<< + /Type /StructElem + /S /Code + /P 35 0 R + /K [159] + /Pg 201 0 R +>> +endobj + +39 0 obj +<< + /Type /StructElem + /S /Code + /P 35 0 R + /K [155] + /Pg 201 0 R +>> +endobj + +40 0 obj +<< + /Type /StructElem + /S /Code + /P 35 0 R + /K [153] + /Pg 201 0 R +>> +endobj + +41 0 obj +<< + /Type /StructElem + /S /Code + /P 35 0 R + /K [149] + /Pg 201 0 R +>> +endobj + +42 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [142 143 144 145 146] + /Pg 201 0 R +>> +endobj + +43 0 obj +<< + /Type /StructElem + /S /Code + /P 16 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [66 0 R 65 0 R 64 0 R 63 0 R 62 0 R 61 0 R 60 0 R 59 0 R 58 0 R 57 0 R 56 0 R 55 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] +>> +endobj + +44 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [139 140 141] + /Pg 201 0 R +>> +endobj + +45 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [137 138] + /Pg 201 0 R +>> +endobj + +46 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [135 136] + /Pg 201 0 R +>> +endobj + +47 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [124 125 126 127 128 129 130 131 132 133 134] + /Pg 201 0 R +>> +endobj + +48 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [122 123] + /Pg 201 0 R +>> +endobj + +49 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [108 109 110 111 112 113 114 115 116 117 118 119 120 121] + /Pg 201 0 R +>> +endobj + +50 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [106 107] + /Pg 201 0 R +>> +endobj + +51 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [92 93 94 95 96 97 98 99 100 101 102 103 104 105] + /Pg 201 0 R +>> +endobj + +52 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [87 88 89 90 91] + /Pg 201 0 R +>> +endobj + +53 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [78 79 80 81 82 83 84 85 86] + /Pg 201 0 R +>> +endobj + +54 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [69 70 71 72 73 74 75 76 77] + /Pg 201 0 R +>> +endobj + +55 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [60 61 62 63 64 65 66 67 68] + /Pg 201 0 R +>> +endobj + +56 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [48 49 50 51 52 53 54 55 56 57 58 59] + /Pg 201 0 R +>> +endobj + +57 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [39 40 41 42 43 44 45 46 47] + /Pg 201 0 R +>> +endobj + +58 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [27 28 29 30 31 32 33 34 35 36 37 38] + /Pg 201 0 R +>> +endobj + +59 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26] + /Pg 201 0 R +>> +endobj + +60 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [0 1 2 3 4 5 6 7 8 9] + /Pg 201 0 R +>> +endobj + +61 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [] +>> +endobj + +62 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [201 202 203 204 205 206 207 208 209 210 211 212] + /Pg 199 0 R +>> +endobj + +63 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [189 190 191 192 193 194 195 196 197 198 199 200] + /Pg 199 0 R +>> +endobj + +64 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [185 186 187 188] + /Pg 199 0 R +>> +endobj + +65 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [174 175 176 177 178 179 180 181 182 183 184] + /Pg 199 0 R +>> +endobj + +66 0 obj +<< + /Type /StructElem + /S /P + /P 43 0 R + /K [157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173] + /Pg 199 0 R +>> +endobj + +67 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [155 156] + /Pg 199 0 R +>> +endobj + +68 0 obj +<< + /Type /StructElem + /S /Code + /P 16 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [99 0 R 98 0 R 97 0 R 96 0 R 95 0 R 94 0 R 93 0 R 92 0 R 91 0 R 90 0 R 89 0 R 88 0 R 87 0 R 86 0 R 85 0 R 84 0 R 83 0 R 82 0 R 81 0 R 80 0 R 79 0 R 78 0 R 77 0 R 76 0 R 75 0 R 74 0 R 73 0 R 72 0 R 71 0 R 70 0 R 69 0 R] +>> +endobj + +69 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [153 154] + /Pg 199 0 R +>> +endobj + +70 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [151 152] + /Pg 199 0 R +>> +endobj + +71 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [150] + /Pg 199 0 R +>> +endobj + +72 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [140 141 142 143 144 145 146 147 148 149] + /Pg 199 0 R +>> +endobj + +73 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [] +>> +endobj + +74 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [137 138 139] + /Pg 199 0 R +>> +endobj + +75 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [135 136] + /Pg 199 0 R +>> +endobj + +76 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [129 130 131 132 133 134] + /Pg 199 0 R +>> +endobj + +77 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [123 124 125 126 127 128] + /Pg 199 0 R +>> +endobj + +78 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [113 114 115 116 117 118 119 120 121 122] + /Pg 199 0 R +>> +endobj + +79 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [108 109 110 111 112] + /Pg 199 0 R +>> +endobj + +80 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [103 104 105 106 107] + /Pg 199 0 R +>> +endobj + +81 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [94 95 96 97 98 99 100 101 102] + /Pg 199 0 R +>> +endobj + +82 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [] +>> +endobj + +83 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [83 84 85 86 87 88 89 90 91 92 93] + /Pg 199 0 R +>> +endobj + +84 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [72 73 74 75 76 77 78 79 80 81 82] + /Pg 199 0 R +>> +endobj + +85 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [] +>> +endobj + +86 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [60 61 62 63 64 65 66 67 68 69 70 71] + /Pg 199 0 R +>> +endobj + +87 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [49 50 51 52 53 54 55 56 57 58 59] + /Pg 199 0 R +>> +endobj + +88 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [] +>> +endobj + +89 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [37 38 39 40 41 42 43 44 45 46 47 48] + /Pg 199 0 R +>> +endobj + +90 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [26 27 28 29 30 31 32 33 34 35 36] + /Pg 199 0 R +>> +endobj + +91 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [] +>> +endobj + +92 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [13 14 15 16 17 18 19 20 21 22 23 24 25] + /Pg 199 0 R +>> +endobj + +93 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [0 1 2 3 4 5 6 7 8 9 10 11 12] + /Pg 199 0 R +>> +endobj + +94 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [] +>> +endobj + +95 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [156 157 158 159 160 161] + /Pg 197 0 R +>> +endobj + +96 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [148 149 150 151 152 153 154 155] + /Pg 197 0 R +>> +endobj + +97 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147] + /Pg 197 0 R +>> +endobj + +98 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [] +>> +endobj + +99 0 obj +<< + /Type /StructElem + /S /P + /P 68 0 R + /K [119 120 121 122 123 124 125 126 127 128 129] + /Pg 197 0 R +>> +endobj + +100 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [114 115 116 101 0 R 118] + /Pg 197 0 R +>> +endobj + +101 0 obj +<< + /Type /StructElem + /S /Code + /P 100 0 R + /K [117] + /Pg 197 0 R +>> +endobj + +102 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [105 106 107 108 103 0 R 110 111 112 113] + /Pg 197 0 R +>> +endobj + +103 0 obj +<< + /Type /StructElem + /S /Code + /P 102 0 R + /K [109] + /Pg 197 0 R +>> +endobj + +104 0 obj +<< + /Type /StructElem + /S /Code + /P 16 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [131 0 R 130 0 R 129 0 R 128 0 R 127 0 R 126 0 R 125 0 R 124 0 R 123 0 R 122 0 R 121 0 R 120 0 R 119 0 R 118 0 R 117 0 R 116 0 R 115 0 R 114 0 R 113 0 R 112 0 R 111 0 R 110 0 R 109 0 R 108 0 R 107 0 R 106 0 R 105 0 R] +>> +endobj + +105 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [103 104] + /Pg 197 0 R +>> +endobj + +106 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [88 89 90 91 92 93 94 95 96 97 98 99 100 101 102] + /Pg 197 0 R +>> +endobj + +107 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [] +>> +endobj + +108 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [86 87] + /Pg 197 0 R +>> +endobj + +109 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [84 85] + /Pg 197 0 R +>> +endobj + +110 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [78 79 80 81 82 83] + /Pg 197 0 R +>> +endobj + +111 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [73 74 75 76 77] + /Pg 197 0 R +>> +endobj + +112 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72] + /Pg 197 0 R +>> +endobj + +113 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [44 45 46 47 48 49 50 51 52 53 54 55] + /Pg 197 0 R +>> +endobj + +114 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [] +>> +endobj + +115 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [42 43] + /Pg 197 0 R +>> +endobj + +116 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [40 41] + /Pg 197 0 R +>> +endobj + +117 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [34 35 36 37 38 39] + /Pg 197 0 R +>> +endobj + +118 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [29 30 31 32 33] + /Pg 197 0 R +>> +endobj + +119 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28] + /Pg 197 0 R +>> +endobj + +120 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [0 1 2 3 4 5 6 7 8 9 10 11] + /Pg 197 0 R +>> +endobj + +121 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [] +>> +endobj + +122 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [102 103 104 105 106 107 108 109 110 111] + /Pg 195 0 R +>> +endobj + +123 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [92 93 94 95 96 97 98 99 100 101] + /Pg 195 0 R +>> +endobj + +124 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [] +>> +endobj + +125 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [90 91] + /Pg 195 0 R +>> +endobj + +126 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [88 89] + /Pg 195 0 R +>> +endobj + +127 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [82 83 84 85 86 87] + /Pg 195 0 R +>> +endobj + +128 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [77 78 79 80 81] + /Pg 195 0 R +>> +endobj + +129 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76] + /Pg 195 0 R +>> +endobj + +130 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [51 52 53 54 55 56 57 58 59] + /Pg 195 0 R +>> +endobj + +131 0 obj +<< + /Type /StructElem + /S /P + /P 104 0 R + /K [22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50] + /Pg 195 0 R +>> +endobj + +132 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [19 133 0 R 21] + /Pg 195 0 R +>> +endobj + +133 0 obj +<< + /Type /StructElem + /S /Code + /P 132 0 R + /K [20] + /Pg 195 0 R +>> +endobj + +134 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [17 18] + /Pg 195 0 R +>> +endobj + +135 0 obj +<< + /Type /StructElem + /S /H2 + /P 16 0 R + /T (implementation) + /K [16] + /Pg 195 0 R +>> +endobj + +136 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [12 13 14 15] + /Pg 195 0 R +>> +endobj + +137 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [7 8 9 10 11] + /Pg 195 0 R +>> +endobj + +138 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [4 139 0 R 6] + /Pg 195 0 R +>> +endobj + +139 0 obj +<< + /Type /StructElem + /S /Code + /P 138 0 R + /K [5] + /Pg 195 0 R +>> +endobj + +140 0 obj +<< + /Type /StructElem + /S /H2 + /P 16 0 R + /T (what was hard) + /K [3] + /Pg 195 0 R +>> +endobj + +141 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [0 1 2] + /Pg 195 0 R +>> +endobj + +142 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [18 148 0 R 20 147 0 R 22 146 0 R 24 25 145 0 R 27 144 0 R 29 143 0 R 31 32] + /Pg 193 0 R +>> +endobj + +143 0 obj +<< + /Type /StructElem + /S /Code + /P 142 0 R + /K [30] + /Pg 193 0 R +>> +endobj + +144 0 obj +<< + /Type /StructElem + /S /Code + /P 142 0 R + /K [28] + /Pg 193 0 R +>> +endobj + +145 0 obj +<< + /Type /StructElem + /S /Code + /P 142 0 R + /K [26] + /Pg 193 0 R +>> +endobj + +146 0 obj +<< + /Type /StructElem + /S /Code + /P 142 0 R + /K [23] + /Pg 193 0 R +>> +endobj + +147 0 obj +<< + /Type /StructElem + /S /Code + /P 142 0 R + /K [21] + /Pg 193 0 R +>> +endobj + +148 0 obj +<< + /Type /StructElem + /S /Code + /P 142 0 R + /K [19] + /Pg 193 0 R +>> +endobj + +149 0 obj +<< + /Type /StructElem + /S /H2 + /P 16 0 R + /T (what was easy) + /K [17] + /Pg 193 0 R +>> +endobj + +150 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [15 16] + /Pg 193 0 R +>> +endobj + +151 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [11 12 13 14] + /Pg 193 0 R +>> +endobj + +152 0 obj +<< + /Type /StructElem + /S /P + /P 16 0 R + /K [5 6 7 8 9 10] + /Pg 193 0 R +>> +endobj + +153 0 obj +<< + /Type /StructElem + /S /H2 + /P 16 0 R + /T (how does it all work?) + /K [4] + /Pg 193 0 R +>> +endobj + +154 0 obj +<< + /Type /StructElem + /S /H1 + /P 16 0 R + /T (task 3) + /K [3] + /Pg 193 0 R +>> +endobj + +155 0 obj +<< + /Type /StructElem + /S /Span + /P 16 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [2] + /Pg 193 0 R +>> +endobj + +156 0 obj +<< + /Type /StructElem + /S /Div + /P 16 0 R + /K [157 0 R] +>> +endobj + +157 0 obj +<< + /Type /StructElem + /S /Div + /P 156 0 R + /K [158 0 R] +>> +endobj + +158 0 obj +<< + /Type /StructElem + /S /Span + /P 157 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [1] + /Pg 193 0 R +>> +endobj + +159 0 obj +<< + /Type /StructElem + /S /Span + /P 16 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [0] + /Pg 193 0 R +>> +endobj + +160 0 obj +<< + /Type /PageLabel + /S /D + /St 1 +>> +endobj + +161 0 obj +<< + /Type /PageLabel + /S /D + /St 2 +>> +endobj + +162 0 obj +<< + /Type /PageLabel + /S /D + /St 3 +>> +endobj + +163 0 obj +<< + /Type /PageLabel + /S /D + /St 4 +>> +endobj + +164 0 obj +<< + /Type /PageLabel + /S /D + /St 5 +>> +endobj + +165 0 obj +<< + /Type /PageLabel + /S /D + /St 6 +>> +endobj + +166 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /PTMVYF+LibertinusSerif-Bold-Identity-H + /Encoding /Identity-H + /DescendantFonts [167 0 R] + /ToUnicode 170 0 R +>> +endobj + +167 0 obj +<< + /Type /Font + /Subtype /CIDFontType0 + /BaseFont /PTMVYF+LibertinusSerif-Bold + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 169 0 R + /DW 0 + /W [0 0 500 1 1 427 2 2 456 3 3 505.99997 4 4 325 5 5 250 6 6 581 7 7 428 8 8 551 9 9 312 10 10 489 11 11 358 12 12 514 13 13 613 14 14 514 15 15 619 16 16 777 17 17 561 18 18 322 19 19 430 20 20 558 21 21 905 22 22 616] +>> +endobj + +168 0 obj +<< + /Length 11 + /Filter /FlateDecode +>> +stream +x +endstream +endobj + +169 0 obj +<< + /Type /FontDescriptor + /FontName /PTMVYF+LibertinusSerif-Bold + /Flags 131078 + /FontBBox [-87 -234 893 700] + /ItalicAngle 0 + /Ascent 894 + /Descent -246 + /CapHeight 645 + /StemV 168.6 + /CIDSet 168 0 R + /FontFile3 171 0 R +>> +endobj + +170 0 obj +<< + /Length 914 + /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 +22 beginbfchar +<0001> <0073> +<0002> <0063> +<0003> <0061> +<0004> <006C> +<0005> <0020> +<0006> <0070> +<0007> <0072> +<0008> <006F> +<0009> <006A> +<000A> <0065> +<000B> <0074> +<000C> <0032> +<000D> <006B> +<000E> <0033> +<000F> <0068> +<0010> <0077> +<0011> <0064> +<0012> <0069> +<0013> <003F> +<0014> <0079> +<0015> <006D> +<0016> <006E> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +171 0 obj +<< + /Length 2730 + /Filter /FlateDecode + /Subtype /CIDFontType0C +>> +stream +xV{TWN<4n&a[{ui]Z.֢>EB!BxC@yL$yRhZֳֵsZۣ_=ݓZݵ;=͏͚5f}i2Ҫ$Trʦ៨!v#i AD~7V UwLubUY.ShIX5X8]^0IKlAfnKZ[ +7)4ЬOU*!=Nىo]yh<-X*ޕC ѣMp"WA +EЂ45P.th]Ft:3zSw:j! +L*߮\_iКn$he)4}njѐѡ^Hˀ8s{z4sc_x%sw +%~xfra~jl%Igd0gh!ҢSB$~38w'ҋS2U5*CJ仧{o -iؕ\Z <=}H`goޤUoP41X®TQJ.Vj]*B5Pv(/! b!;s2{zZlj.36g㦗t{'R_~‹Ǭ2N@ĭ=]^/gf&kwu=v̆މs艸ůc,ĆŐa >:jl k7^wEI%:ESJd1{MOXG686TmgǏ6ْ$DsۺFMfr~F~n*UA%ރ%E Ep"'q_Kns-9Zs~R$@s$)2AU*!+ jJ[Ubplp GI'ihqb4wQOM˔Qڬ2Bi;8Zo,,hov5a)B$$i +x= +R@^^`rģH*;{N"HJ!Y`@XTh>ŋGBa,b̋;J_3\ &h1Ox)qմW^ܻWANGUHWA/nב.Ax}=4m{ +lɞ{Q`.ڹFʵ&/t?|B7(/͹b(79IXinh6lwvv>.Sn$a3\[&pA斸 1-PN]gG[hxqr21e&cM}tЧȫ`4 +JJ + wDJAkN dGa5`D'‚ǁ}X`NؒX(IOa'm`|{ygA>tu7S~#.]ߥɠ4B|>[g  zJhC^_Qp iG"a+ +k{?mY=}^m`1*4]~}UIj *22HL-1hbL&B1\Sm:GeFDʪ5Ze֨e +9TJR]Xf)qh]YGZ4^h]쎸 +"Xv뉜[jcl6}r#?Gß7RcE5 m$G·$I'˶PK{6kŲ;}{Ū'~<, qi>\.$uRzC_Gk +endstream +endobj + +172 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /FLIIBV+DejaVuSansMono + /Encoding /Identity-H + /DescendantFonts [173 0 R] + /ToUnicode 176 0 R +>> +endobj + +173 0 obj +<< + /Type /Font + /Subtype /CIDFontType2 + /BaseFont /FLIIBV+DejaVuSansMono + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 175 0 R + /DW 0 + /CIDToGIDMap /Identity + /W [0 55 602.0508] +>> +endobj + +174 0 obj +<< + /Length 11 + /Filter /FlateDecode +>> +stream +x  +endstream +endobj + +175 0 obj +<< + /Type /FontDescriptor + /FontName /FLIIBV+DejaVuSansMono + /Flags 131077 + /FontBBox [0 -235.83984 602.0508 765.1367] + /ItalicAngle 0 + /Ascent 759.7656 + /Descent -240.23438 + /CapHeight 759.7656 + /StemV 95.4 + /CIDSet 174 0 R + /FontFile2 177 0 R +>> +endobj + +176 0 obj +<< + /Length 1376 + /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 +55 beginbfchar +<0001> <0041> +<0002> <0063> +<0003> <006F> +<0004> <0075> +<0005> <006E> +<0006> <0074> +<0007> <0054> +<0008> <0072> +<0009> <0061> +<000A> <0073> +<000B> <0069> +<000C> <0050> +<000D> <006C> +<000E> <0042> +<000F> <006B> +<0010> <0065> +<0011> <0067> +<0012> <0020> +<0013> <0064> +<0014> <0066> +<0015> <0028> +<0016> <006D> +<0017> <003A> +<0018> <0053> +<0019> <002C> +<001A> <0044> +<001B> <0062> +<001C> <0029> +<001D> <0055> +<001E> <003D> +<001F> <007B> +<0020> <003C> +<0021> <0030> +<0022> <0076> +<0023> <0077> +<0024> <002E> +<0025> <0070> +<0026> <007D> +<0027> <0045> +<0028> <0079> +<0029> <007C> +<002A> <005F> +<002B> <004C> +<002C> <005B> +<002D> <0068> +<002E> <005D> +<002F> <003E> +<0030> <006A> +<0031> <0078> +<0032> <0021> +<0033> <0052> +<0034> <007A> +<0035> <004F> +<0036> <0046> +<0037> <002D> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +177 0 obj +<< + /Length 9851 + /Filter /FlateDecode +>> +stream +x{ xT=Ζd&+ @@  ka A D AZRj؀,D[-Z b#\Hs, >}<_̽s0v!mK.UJޣ,P Jw<l qo +i^=cඏz*ciGj.J| Uz"l:)ՙ.i^}6} +%xA1Yn6ޫwͅ[ã`ա*T82e(Cb oJP`2mFr o"_zU( /WIa:$U)=naܡqu7n+PC!JR?'9 ͛9$ $iȔyC{!t'<7$aÉvKC-O# @cZf'5\ƴw;)_?;t_.Ѻ$@}7@ !A媒U=Z5l$$ِȖ ҫ!hVYyKcXVOf_lndP,.npf|Js:1V菴!UJ̮PfymR,(d2X"SR\e]ruYآҳvgEp5I@RA\q,\zq@j:.1M]W/%9Yb.ħRXbf&x,>`ILkטm~33ս;˼A3(qt:\aHhT:=;í! w556p9rչKRˣT>HGrk]v>z݆>hxm7x%XRZR#=V'VicAV>B0kNԋMwdp'f:YbBu Ç{>}3~eD֗~w0(~6h!yҥ;ݫ؝ dj\WsZɰe:s9!:@!=Nn ZqKb**4u>ٜ}2=KzbcSt4gĄΙx2ӧ/;u?ǫZj~4{۾*6 7@G'SSQe(u0bjSczZOUEiѝ7w7pbuZ7C4NpSz\i,׹EϽrg\p1;q,Ν4Jsg]~8c\ܞBfj;a?S{puCM+Sӛ-3?X:3߸& wtD9ƒuԆ땞qG+Ms S5;]M'%=zbS_e)'JGŦťŧ%Ԡ(5К𚈚Hgalzg*zF S,|Yvp{hc=RԀqJ}rQ-kxuݫKӷ>pオe~Cqbc,VEFDŽ11ջw,ҭV&ջwvctҜMj:xʒ 0C}#9?we֖MdZbB.1̈T%eꝑJobK#6mi|{B{_CW-y{~SY/5aDgU$&gfΙݶ >C4/B?R I8)*3Ht˾؜-}1be|dƻY/JR1Sg6VUQ2s +PXpVBue(*xzP_7b^W|Qd=bn3%&ŧ>ڝYg?ݽEb/|qgoԖ3ׯ߶ֲߴc ڴX? +:NQ-'Mfeu`|ӌF#oue=S޻şGlǏ}8}>C70jڳU~GĆXgL(OӊOZ9#edG y5]Z^}__'n#˟|nݶ5rbO6)sū+ڋ~ =Ss 9 ;NY¬q=LӸ5Kn!i\!E #Rr-\!:'lY Aؘn$bXc͂[>UH٢<^S,P%[2^e2WYVX"(L ZnJ]xW?W,eS)+i_;0$2,zvbٛ5os;+ Ur׊(qA-P+C';#muZ˴ jDeH}hR:;y\ã:wRer5]|,kLAjA+wq]⮼UϸS~7Y a!9T'WD8bXɳ9$ZZLwz.4'~fRIOb^;pGjuΜ|hUc!˪X?3 7if}x{4/\4$7魴tֳ'(L s{䩍F'c&" kmm4ZW(%7_y2-&ܬdak>Ez#9,NM aZP1]tȗE@ΌWrvhV5λS՜Jg1 _2̓ x<m2ߤ<4)>',Ӈ_n}M՚'ߧى~N6P +$.`#:J}8:ƸG>:2/4cCFc}4g7\19bStYY445iiz%͚fKDDDtʉΉYCk5|F_cYc]c[c + + +T] +Q#XMy2aވ e3?kD~SOUL,W~^^IjeΜ3P,(]y&3^h׹l/jljLc;]jnnnV"K1k +?(I1FgOWxJN5,𝣲=zVBZWWlpn*ү]v(AHEH + +-%_X;2Y5iUJ1us *y`٣ + hR=V)I MN~/ȦE?mcK +p~, 8gCصS3b-[m&@}]>ں:;z141Iqݮ#mvcnn ,b8 Άׯ/bX#~,㶂We.7ꘑ[V VvG=gXC"ܒnrK\h9+uKtgЎzol㉹o额)uuJp/++ [6cėԥ5u:[zN׹fcxh1*zboOf/M3fuQdn{Em7.xLZ6Ǹ{*1H1^fNbA,>Ǽn]Rضӎต&v54yS͎ˆ#-k%ӿ_Ov.`3Օ7cFSj` m2E ɗxF=`y5i^܁̈`]KF|vOZQ^WbjwF C/"؂yR{zv25 #D4.{W,SV;&3 U+n7w߳lݕl?EҪ%;V5y?uU ] +E].x +g_LAW.;)XScXVULl~KPUqLxdRsg6$꩎qTy/&JGTBpL|s˭siwSRTJUSyZRT{rXC9jrK5ǖcl26>3 em}=ڣ{=AdtP=jփ8ʎ*GzՎG-GGmGCO+3 d}(d̘ḱ'$ p.wج#oټy͛~q_45)קQnGxCެK+Zcmdla"@-UgBC}0py E-W!'q5yac[l[MIxPwo!r%IQ +YaHUnKeylQsufDzz 9ԳL8۟gWHYmDnSj\tTnR>, \WB-j1w&:R4[쓭fIu]wY/mRJU"E+IQH{3:nJgM'Zz81WGsy|~_au=9RcmJw>PȳmmSlyVj#j[x!+tgD1%Yb퉚=Q+=sԙ˕ܖztF۲U +;fK hԋID[3zNvG=aFڡ.^l+/ImMTo>,[׿㍹;ٕ fٰuV5axM|&OfW>IQ`K8BDmj_]pŤN`#}.U#s7gNs\0gZX aIam4T& ڝeԲEL2d7l,-__o)vʎ%UK8GcxqZ*w,ol[{ 1<6:ELT,Q6/ -dCUgƒ^P3H]:D + vAܮ gPp + Zp;]AX<μaeLfjݣNm1Ҫ~bq[<}|ϔ 4]ѝ̬M}$ASSIHyxһ cOQl Vߘ1T4o'%J %Uخ7R-kXrSDzV" +%UwrW*JǍ3׾ :-^@25dHcwZ9\m8 ck^KJ-^pFdl4 +F3/._<;_" +4o7U{Ƭvnힰ_ kޖ'MaƦ/IijK\ʌZ\̍~Sfw|LIWhޯ?Ԫ:ϲ_UL&EjOL $ri^hfZrt>A-'`-S-T-&2,ڄ3"S7d*|2zb+ ML[V)뚏(ZSgoˎde7.Za:};w#[KdM=w_`F'9mڰk ;wmx竖k_5|\b,R|*^uSb {mdƈKZ`@}Rc(NlL;KT2M)ny⴬J1"*@pעFQ?N2o/)֖uO}2n}3"L[&i=^x 㶑R-}^^ov~z%H 8uHe xP}hDq@)l6U6 P(z#KyB;l* +2F)*pp|;c+fN6=J89)~DY}@O^h>S߯DZ-{-VZ߶m/_7;<8FlAk9qGu?Xrc4(pa|2sC}T+`}y > Sjsp|8 "pnA яe΃B:Nxwc0ʰ+p/Jq98# i@fc%␋yXr,cJq"A +0 qFTrc G11 q"k,~a0 1s"{ҙ`PF P\ 0_yuY +2[n}fsFKK b1!( +ːra`gڥ`C;Pkն,I(Ba9ARv[&rw' P6W%fKq()lAԠ&^q@{ .e)3׸[ʹMR.2_sCfciuo@9[i.5ga[)զ'QczpB/I0,'-2R2< +g,CAEʺ ?&c;RXsɱye1 EXf.M<2Cv.qXfP11Yn@KH{߬Q+v/ova֑v[o9J+ӣGFމ3(`Ҟ@f֭șҚ~fjx׵k s(#&5)R2Cr(/ dV IͥQ~FtN <5 QfdvtE|7z!J/+imk,mJƶi)o5 3{Jf/5߱R4kdI;&~Y6%w֌&e~)ĴUKiώ^Z$eXh|jH>+7bMIڒ9TjgJRV|Ns\M&5?,nv2(.28IM?VRқ^)oָ򝔸rC"ń6o}Bo ͌QYZeް%Gb0p6wcqզ7eሑv< Cbjw..3V݌p+ 74fe]Vۣ5daƞKf}|f`FR6/2kevZ&.mCj8 >c1 >c110޸ 8XLB> C 2 F4NFAq,6h4cA{ + ڲSc||<<0: ڣ1o4{1QCaF7jQmbJ:c;pY*IyBdၻ|_jish@AF9wcI^1c1SRvPgH`Z”h0b+a8&RHN+牆>2 #dcVT yrH'q`? + l ymt[}gAAmq/PҐ$Qm+w nRrD"2ᶚR:VDjz! J ]5i~o֔Igaٻpw`IV-kaZ`P}pڭ/)J[,컨U VI+bhl1Gaj}%'SB3蚹++8PʿS;v]iG\۱00cm-گ٬Y3OvuJqK}ۜ:vEFnm]Y?:C"AY_n f&2KV~4B:!JY$Fr\%,c\+?pTl۠UZnTQً3dJUz۽OR>Tbpo|gFVQX$a cÐ;!.ȃ}E`*ܘi\b Fx=PB\ae =|b>1s] 4΃0>(a9bv͠g5VY18׌58Wd\Q+?EԲ]m:}s^E_]_ z~Q6uWUԙT_җ".{aQPcݍ?gg;RC?i}" oGFFG;CA||ςVѻa7sy +3NPzKЛ;$~Z^_E;A :+tBqA +:Ώy騃{ +GkW$W +z$^txU / kw=_DotC=+-kAzz?N>7+s/L\EO&/sA5{"xM6-]A Ah)|SjA;;wzl{!=FH^H6A?#I#HUmNUh;-vܜ+hn9v&Amz7Hz7u~?@kYA\W zp p _в,1W:h1C~u-Th/AJE+- N%ҽGhbAE̎s͆ώYf +!hT;"{g㥩v"KMtwT;& + hV8Ac4FhG uFv|D4z'{yoA#WZ$52"ytw.O3{FRZ$&{yj8XCyJ“\H=\n#zHqwLi w&Q7&.:SRh.Oʣ;)QPBp0OWQ\2Ŏw.-ST$( +.A" + aC)ԗCsuq_2y]ǝ=,s]nr;<8MA6t.aA6 +cTҷvA6k( E %sM)8}K +KJ?bpqLpcE뷰[O4L 9 +endstream +endobj + +178 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /OZJLHW+LibertinusSerif-Regular-Identity-H + /Encoding /Identity-H + /DescendantFonts [179 0 R] + /ToUnicode 182 0 R +>> +endobj + +179 0 obj +<< + /Type /Font + /Subtype /CIDFontType0 + /BaseFont /OZJLHW+LibertinusSerif-Regular + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 181 0 R + /DW 0 + /W [0 0 500 1 1 310 2 2 372 3 3 447 4 4 505.99997 5 5 271 6 6 512 7 7 250 8 8 504 9 9 493 10 10 316 11 11 390 12 12 542 13 15 465 16 16 338 17 18 465 19 19 747 20 20 457 21 21 264 22 22 515 23 23 790 24 24 519 25 25 503.00003 26 26 531 27 27 538 28 28 428 29 29 220 30 30 500 31 31 220 32 32 250 33 33 497 34 34 560 35 35 323 36 36 272 37 37 268 38 38 596 39 39 490 40 40 236 41 41 597 42 42 702 43 43 701 44 45 465 46 46 540 47 47 582 48 48 236 49 50 298 51 51 288 52 52 465] +>> +endobj + +180 0 obj +<< + /Length 13 + /Filter /FlateDecode +>> +stream +x~ +endstream +endobj + +181 0 obj +<< + /Type /FontDescriptor + /FontName /OZJLHW+LibertinusSerif-Regular + /Flags 131078 + /FontBBox [-48 -238 782 708] + /ItalicAngle 0 + /Ascent 894 + /Descent -246 + /CapHeight 658 + /StemV 95.4 + /CIDSet 180 0 R + /FontFile3 183 0 R +>> +endobj + +182 0 obj +<< + /Length 1350 + /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 +52 beginbfchar +<0001> <0066> +<0002> <0072> +<0003> <0065> +<0004> <0064> +<0005> <0069> +<0006> <006B> +<0007> <0020> +<0008> <006F> +<0009> <0062> +<000A> <0074> +<000B> <0073> +<000C> <006E> +<000D> <0032> +<000E> <0030> +<000F> <0035> +<0010> <002D> +<0011> <0031> +<0012> <0037> +<0013> <0077> +<0014> <0061> +<0015> <006C> +<0016> <0079> +<0017> <006D> +<0018> <0070> +<0019> <0071> +<001A> <0075> +<001B> <0068> +<001C> <0063> +<001D> <002E> +<001E> <0067> +<001F> <002C> +<0020> <00A0> +<0021> <0076> +<0022> <00660069> +<0023> <002F> +<0024> <006A> +<0025> <2019> +<0026> <00660074> +<0027> <0078> +<0028> <003A> +<0029> <0054> +<002A> <004F> +<002B> <0044> +<002C> <0033> +<002D> <0034> +<002E> <0066006C> +<002F> <00660066> +<0030> <003B> +<0031> <0028> +<0032> <0029> +<0033> <0021> +<0034> <0036> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +183 0 obj +<< + /Length 5667 + /Filter /FlateDecode + /Subtype /CIDFontType0C +>> +stream +xY tSN M`\ܫ"sF(QF)c':M:7I3܌9@۴i&:P2AEE8+ʺgw1cL&3Ĩ̬lĸg'Gf[}Ok&g&0q RypyBh~:w7?9gsTnLxb2ټUbҢbWĦf%f.IKLOȚ2z4cfkA3ޘ1!vʨYSf%FgMY)`<`2f|ʪm)iaCCcY9afqMCY &`{~ V3N1Sg&9&x/1wrr깁wU{cw|҄g>~W2qꉽOzLW"l}/Ԥԁ[&Nn|{cWB415i,n}>CS}A'LC7pCp̓i(ncd%u\o&J Lw9+ʉRkwثJ:#C9}1AFrr%dGASzt+C\\7>=aѨqȍwr%W͟V>`){KTX٠VJ4qtT-k +b7s+W?z{YaXw $iiU: 7R9(1يim j{LŊRƛ" =`5:tK&E➏1P֯S0`|uCy+np%U +5xgMR!&y^Y# 9,s"MJ?jЛ&hR6jȎjwŧ&QS!7rW5{1_ޫ!LJ@*u6(tGeռ82ZF(۳cɈ08񳙀A Mw/i=K +q;3 'O{+do.oo(ʲ:Y2ƃ5B +FY#AS8_XC"M=E~(bUb8 vR "-zteMzaS:iɋT0A0LG xrH6vQu#꣆_PEe-1Km^ +l\vPaD}> ހ5Zz.'?TEQqtքiH)Hg&'fd稸#"ǃyaou.@$Q[j#?u=x"$="Y>@8zy;pLD?ww$/XҦ=y H4y>˕Z3 X'#pb\U!4 Jn4Z̥fͨJ9uN;gވKK&MhNːu tRf%xP*?y43An"P91w[zzkxEn\QFJI.w~Fˣh6rƨ)RBJE[d:da<8GR }/4"@} Y$~HLki15j)klTvnutwy4j?.[aiXuE EZJ>X# %&*!{ \$In̡r.FNĿyv DN=j3F5=~tXΕ(׌3'^'9"p#Lttvzp(FZD WYA(zJ FCan0J^ (Zڼd[ڲhZ93^Ztf*rS_*uT9kKF@NMrs)ְTWVem^X8b}V,a5d~)7i%jyy8\;v` ~1=g1-9Y!yA\WX GcŷltgD:C_)6iMm\ﻈVU6%qİUsHs +>&yAb78~io$XtMlQ*ʫ99yo'~?wrI;hU6DU!Mx\V@&®N};~d_d< ^`ez @ʛlEB4vqQV(5 wZX?sџjZ$6&nʜ%f9XW$IW,U '^>WOVY] +#}H:kEr;pprj,8;sr-@-a;Qk*J"pV\$|Ԋ@YbyƱvT )TNg Cm*qlBc܂K&@݆tȣ +# &]UMtø-H:eX$0M(TjJAZ`Nֲ_?|44*ѫVo3.KTQy *M,q/:ft>4hM;۫IV۔f+ITC8`; Y/5W;LI'(eb-my0@R(b0zElrlGҶ=2@ V0S$ aFbVmv!ypw251t): F oJj!Ƌ|. 8u@+ʚl `}Wyeq"ѭ"[Uan,_*]GEShXȫ( 2,*I+N*N+HąBN ovÈ =4PʩnWX +E#Iw^oov%p MH3D؆wQ #.b`\SNو}e6=˙+QlY74"lۂBWlLTrƴnmN D*re`dzt"y_F 6 3p~'yIw`pEIHV*O qgOo MM rRCYȵ8ug?<M}M0T撢j+9VNBߓ[D|e= C^I痾N*K%r(W*.wĘ#qț 9|Lkt-U$LbԞ/`ɥE28+׽ Id8e8 DAy0,M9FSJCT: +tș٫*+^!03c3oIOEY|:Ô Df khsp˿f9-k(BTm 3kHGW[u#5|^M*%z)ݞ/> Ƃ҄=+:pGSYz+/>Bd_s+;̃wXwfA}j@JB4Y~&E#h?rz9MBk펜 9(-NŃy=>)D"X=mg#mks= DkR:GNDfU*P +<5|UM2~ONb&Jj$s}Ċ#g#EUJuYKE7l[aؙo6m64 Ľ)=qxCm[2}Hg>84!)E"|I~AzZVI SRdhttw88 +ZZoݘEFnlͬKDȬnGh^JXi)0̟5Mn1_Cʃw1@] bCty {|F[?w8 +EzH+qP^XPAv60>QPX1o"&an$Ci m` R0lb#+”udZR`ltRRbpAvvQ*n}imyTj#L6)pTJDd(n! SK6~g:NwSޑ.Ujr.~C> ^j?Qނ7 Df өTJJ(#nS55E]HAQ)\yᛐJPO~ht6Q;G/}mKmz(x^;<_C5o\t{g#U?,MW>8 J#3+}zCF ?KII|CiU WIt˃'Lw;wX;}clw]RT9-D-Lo*ZN$!Q죺ZK1U"d)gpAKjTnlseÑc=;;,}3'O1hH4A^3;nVdݝ. >xp9t D0}5@x֞WA +S! 0Fw[$n}Ƽs^;DCs<~ciY|P ^w7c?F}Y|/H>p|< >J Bud&…œw΁@Yk!)mEO]~)4 UqB+IQ[9|̶spԟe4tfk> +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 + +188 0 obj +[193 0 R /XYZ 99.2126 476.5926 0] +endobj + +189 0 obj +[193 0 R /XYZ 99.2126 209.05261 0] +endobj + +190 0 obj +[195 0 R /XYZ 99.2126 640.9302 0] +endobj + +191 0 obj +[195 0 R /XYZ 99.2126 410.01416 0] +endobj + +192 0 obj +[193 0 R /XYZ 99.2126 509.3946 0] +endobj + +193 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 184 0 R + >> + /Font << + /f0 166 0 R + /f1 178 0 R + /f2 172 0 R + >> + >> + /MediaBox [0 0 612 792] + /StructParents 0 + /Parent 1 0 R + /Contents 194 0 R +>> +endobj + +194 0 obj +<< + /Length 1909 + /Filter /FlateDecode +>> +stream +x[Io[7Wˡ:& +hQOI)9uC}!pIÙo!s=z`3qOwկǏ.$Ld -נ qa'iŕ`W}-o[@X\22\N`"X:8FԈ -R{P墜 Zaӷp)6c!Qp-]XՂ9 J  gBL'AgRPVsg[ QƗl*IsBϤ|{<5GïA[oOSӶ/=[2RIgf+04)"JߧQ /VExK%{j2E8s-{@F%ub_ҝe[|P]9lپ?^^탓=/~{}z6?c__Z~ +ӆ9!fK#qe4 +endstream +endobj + +195 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 184 0 R + /c1 185 0 R + >> + /Font << + /f0 178 0 R + /f1 166 0 R + /f2 172 0 R + >> + >> + /MediaBox [0 0 612 792] + /StructParents 1 + /Parent 1 0 R + /Contents 196 0 R +>> +endobj + +196 0 obj +<< + /Length 2834 + /Filter /FlateDecode +>> +stream +x\ێ}WKK_A.x$?nr4}0$gj\.gzOU>~]7ϞW~Wؤd7'c7W +4h'0^a{W&aNuǃ7Usx;+緌MVl7]žs;}u`R4xIuH=;+ޤOn3}_̿wC1K?߿ꇛV?ju]f +wQϤ^o~ngo~xWͿ6KZ;4fg>º48N} qq(b)4A桻>ϯ#79]) m]Se>|}wO]-XY?d5cD%Yy맂/ی>iy4?;sGv3Ww9 +HebtIE:5,%Yol&52jyɲzk?w80ssT:%et)5cÛX#+C8puF[PU閝 *)lNty`jسd6(oUR?FP0Vjlrހ[ ~ ;z;|Y#^P0bȽ$>(f/OamJA P@#R"-"[`z﭂S+iͨU 0='B`XBw=(wɼ`8"=eV)=>TH5쳈,XtO7 /x碼x& hd,je &"h THk!wHp~YiաXF#Q8B=k*Ë,=¿ %AZR.[p@J\LKrEU 5 gaN} +Eb7zԜjU(nWV(Kg+."Rr<^k 1ԋmq+AH ^$Cq `aKCVYQHMΛ&)[UtI1]E!:hǛ^2RL!}~ݝ: T'CDW3ka/xMWgz;s.7&䓶3`9= W =%4h}'!P|}T!jƞO^/ Fӎ!["+䓬j'(5}EGg>͢Lqe nW#j'gӲ`s:C #bŞ|$8Щ{%`*JkuNKOw^2R2Wq{tm$@pث(wyS5ه[ )o,`|J{B(yz d!Dҝ NAqC]ICL$4 DL$g$j]pb6 4H_Qu4`T>I%C4Yʱ$Eg kpk ;J_ww;y]5ZZ"Ia`͉R`QE +obC&OO_I +԰bb㱭"Z;ER7IQ0ʎ\RqHՖ( >THX,6 ~*gmj)K" + xR1 t!JE5ř0l.BjN#噬|,cI1 D"c&4$=^($fMb ,7g|<3:?|#ZDA&IA+q%218ˬD͖!\7.WvncU=*1 ``>Jv Nm&btF6c S,[>kT^g̑hm(?Q_^٘Ercds11ѐ x;O6Ue=f99TQ 86|-V۩kruB߂#0.z m9״XO 54Atc W{u2tc$jtcgSգNX'GX5W.RF("{o%Jŋ$pt.H RF>ϋy&t).ܟ? u5DBGn)ܒ^{EܖĹخgU]W4e;A"hlv't JeȟZ :U$r8UF^t  pLU[砝#w:1X5hI__.[v~5͆fGԛluT]p\b@͕B4μj4> I';BR-x{ae^݄^†:0}z #ꩮr%pw#Vܳd)IW#҄1nŷ/$'TymI+@ But2뾸YXN 5K^/CPsFT-EU\6pK/~sL 9k qayA?BNA%}&qb⼏P!YxNe< +/aEF9#h*#T +ix +E"ZRw"L~!_6~cvZ]cfBo +endstream +endobj + +197 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 184 0 R + /c1 185 0 R + >> + /Font << + /f0 172 0 R + /f1 178 0 R + >> + >> + /MediaBox [0 0 612 792] + /StructParents 2 + /Parent 1 0 R + /Contents 198 0 R +>> +endobj + +198 0 obj +<< + /Length 3095 + /Filter /FlateDecode +>> +stream +x][o~?bĵTgW 8)ZDoq,j]r9ݳ)-Z~9ǹq;77Wӻo?;tsbT:mBw~wqwvNww7P]޿]F\z?w?jwCS88SGiHpljJXJQ9 #r8)D [`8XG S`YQ @}3FRy}×שM^GԮ$מq6(:m,1AY 6}*>pƜtPhmpVkC/A@ɧ9O{#q$hOp@zwxXDkd뺆jmA{R,ڍxL3I%gP"MTq#8 ~{?/$ghKmXCΊ#jeij ۳v`|߿kpjboLF݇-.Hre #=X 3AO4ᇠgvdrH Zefp.*4nOˤ@%m[1L(ŇEFb-q*U{1yw߆83ޚRB9ZON' MFmDmEss\FG;|Gj _S'`_GcqCP&8XaU\XMJ1BqGlAyҶ 1iVZ^r#{oftw +F+ +Hw@ǒTJڨ߇x+ӓ$DYGfmx1lXQ +bDF1D) ZLz6.dIN-!ĠkC 4IDc9FiVN5щb bnc6DMInϐ!C_I~j ]mE6Pr8-V6a9VhHvG'WWM۰fjgZmrN65aR;/M\#M.զ*.JզTmڄR%/"eb m@ٓbPZN#UfU:omUjNVSSa#b$Tu4(VXwV&+ZS9 +- (&Z`(nզ& ľNENJ) S.7)dV>Q9%x +]U)Hǘ%{Z׵8dV֏QC + ##F&6K`?c6l Z*Hd:|py9HbLІRR()S&"[pAE2[){[弡6/9c4*g4o (]muSCr߈М79ħq~4 L ej]=6M"m| 2D +iv~2l + +PY*m%BWhcv@mr(;7QEmR~øw:{qBF(o]MF(TYwGoKr q7Sc` L3eEՓ6F^,YwT1K(zD)B?8fo$W _}`]G#OOJ-R 1!hjYwza֤%˴qhRf!0ء!7;@ij83$sJ i#@-YyIVO3Off`H/l__R=𔻦EQCbP;2eiljdyiFfUyZͥI4]e6e$ +e8g_DRJ,*'ƋEFd0#_,L +1D;|hD\fwb +," +ޡ)U퇂)mB&2۾e'8Udj9&.i?lj-SQ\@2 d6${d~N_k~LÈg1|,FM Yz*̅1=̘+$NW{/ʿ9Dw,C +;N/QoW0Y/Xd4 xߘj҃vV*riOsJTlu<$I: ǣ½M<.nKXmT@gXw&4U.WQ^;)˳@ o+9.*5ٜS[+ܮ9t6*"A zPš8zE9baMęXB''Kiot;& kS8_+܄GbrZR:tMmg~}V.͗8q[2b6fLf.FʕT͖jZ#Vnx+5<-|u/n_H~?YS?ɒ{O4Wa>1OƤrN"ޡ8xaey7>N> vD abݳ-WE:*C&VEw9YFlJ < $'yX{ vx2C +QcLVc({)|V$zr8FWEA|c+Xml ׁ*X'"N-G2|9=/g4Y-Y|AemgȲbc֊jDZYX믽asb^+_aP4iޟE99sCvltL(>рGUc9>ⱑ)0Nj1ڊ*vI +~BhWM_dF wl̝zp祍^SqiyKc\zeBXnivط eU "] x +}23'r/Iͷ+7uYdbKL L=+4\RlPYeVjVe b6 evǝc&+F͛wwwo/_~{]Ç<|ۛ}s-}6ehD +endstream +endobj + +199 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 184 0 R + /c1 185 0 R + >> + /Font << + /f0 172 0 R + /f1 178 0 R + >> + >> + /MediaBox [0 0 612 792] + /StructParents 3 + /Parent 1 0 R + /Contents 200 0 R +>> +endobj + +200 0 obj +<< + /Length 2978 + /Filter /FlateDecode +>> +stream +x]o bm֣!b'Z @-΃ڭ *Şn?p=}:G ɽ}嗻_i߼gml &DkRjms6?w/nvy] rn,tu+_wW?67}{^w̝@t%~ٽoWͿG5 Q ppSE_XkA Gyp_[hؓq֦@ %v GL".bhAt3Ac:.a9A#9)e-'FrPt6p~ B*;$92:q dys BoY9diLSw[o vtғCƼU&~lҳG 5LNz\I@ynv:e.Mz4Dg2E ymNeTetRGCkБUSI'- +R:TtRt2$1 qt2d1IUZ7GSp9̨cQŤ1˜vͺx[%uL)E9AY HAۜ=-5.nLC2gÉ.Oje &$OxمDB\,oێV՞}^l#STCEgۻc!*YyaM~4yۥ=i="`Ro; a-%k|yC1iPcls&ǘ54 l/h-:/bM)6;{/1&8$ +]mvQKFU +'(nnѪ:P3.igQOJ acotxuqی CVe%@rLJ8D7@1Ig-Ԛ;:WsM!Bhz2"}AI݋~ ډu~x!N7hŴlsݖ ]5σ9}]75זf(O(|ZO߼QxZ:UGK?eO ;D +&9gSe`[=UEy;yv!)o'XjmG7: v&;`؃N +G,rzˋǷf Y~RN[e\iPHv^s] -Am;`7/MU,ְSzd'i<|=\ +C;ف6r|&~(BW O~$B?PEI̷ ONNүc~>1rxT >: CFDO|v^*jD%tTNy<5ȍ0#3W|0Tե |=L`e\]E07%-B7"\Ѳ\"geUQ~54T~;RRvҦvcg1t*ٱ #2]w-3 ?a`SO0GNi$WXպj) f@!FOhe4 o*Rir!&?D.\c*jqs$ׇ^wߟ^7~}o|=}g- +M$ߴ>Y}R??do +endstream +endobj + +201 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 184 0 R + /c1 185 0 R + >> + /Font << + /f0 172 0 R + /f1 178 0 R + >> + >> + /MediaBox [0 0 612 792] + /StructParents 4 + /Parent 1 0 R + /Contents 202 0 R +>> +endobj + +202 0 obj +<< + /Length 3584 + /Filter /FlateDecode +>> +stream +x]ݏ_ڗx? @ +@8>7צ@Ω>/VҮ OK/^ߝD =S駛?}gu_|_t[RR| +ݻ6wt~y~G(??|67_o/7w%@8v'C!IH*~v|[?]_h MB*ZԍM)`Qd:P eTVaA۳԰JpG˹''ja! cc㓻5tb0\{u,nJq6ye _ 2މ\= 2VUCxQb> {jD +`Un6vZΧ ؏vF"57`=cy#D΋c`)4l㏨k~Ȍ=DDcm.#GxUњt-x:vO +ȹs+]98օ|Z0Y;ySptx.Հ맛x#Dstw6o]'GdǪ<ȌeveQoWE%Fv|[ wOBP6\lĭ݋oh` yuMF%m@AU aeH,V(tbMwJ`?~xa{g_t>ewW<"G#UN4,{c}rXZ{nqXsA sGa1X"dzmrzwQTWtebQ,an[pG}u]l $(85H>ЖPF=*u˙3^\YU/11褢ALD6,6~v܇<G"lZcr8<npgfB\6:Eg$DzWYIP.ey:_DgLnth /ih|RX,LjADѱb-mr2l|Hrmu9fVhdi9USAʀ]-]p~d B8B +:aQF/Iڶ&A9kbyU1Av +-3usdh٭^(2l*,Y\ + +kTYM21ٯXe;/SQE$*}edsyXW0M7e +ڧs!\rgN>rGe2'JQN5bT#S., ͐R4MSO KMc_VSɣAMFZ1EOˆOdp9‚WM5} R|J g& s}vvƌ]\t^d;:bgJ%E =1f{%/5Wrv>4+7mVY(=2qsժHY@߳SO'"CStkT1*H2BG .SJDx8͖H07"Xv WWWM̓L'=&̨ANj˜QgB=~IMjUzVn$r-@TD,Xrěf|Y*ZLө!-<a6Dpg^r,3͙e_eS,V!NabYqwɯd=V|̝f_\k/[кnxgFs,'O::/~H3rؓr"\T|kl-JiyVLjNÉWw*-3a+9Obk12iؑBR*J`]XJAsq9Fo^ qCpZ(z Rs/ݻwZ.-|YBQrIN=Z^Y@'\y<)mGvW|D&'Bn*W69w%KcHܮO&HQ{W"mnA"#}\'~)k* eșǶ2Øw~u~h2z󅙱MǦ<233?qLw!ȹǹ> }3W?l||n{/o~?Cyn|Dl2*Xų. ٜ!e. +endstream +endobj + +203 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 184 0 R + /c1 185 0 R + >> + /Font << + /f0 172 0 R + /f1 178 0 R + >> + >> + /MediaBox [0 0 612 792] + /StructParents 5 + /Parent 1 0 R + /Contents 204 0 R +>> +endobj + +204 0 obj +<< + /Length 1978 + /Filter /FlateDecode +>> +stream +x\[oF~ׯD(<>E&m.P`ƻY v7>/(Hc+yi37}g.^ߙoYs󫟾7[WЀs&gKH%snuynV/V`ޯ.o Z2W5=\c?Z]Ρ=[ <9R0`Svv{ﮛbG @%D07E ɒsK(I6]<pOD M32]U$S)"|Il* Dg=(J2@ $)6 B@r%% RɁXץN)?Od#?ȿh)l(qIAlBݲ +sqnЂ#<*,vf|>02 Ily`,NF_L ,BQ1YTlfVמ>n$umInIai; Êjk;"؎ `!8/.iU]O ᬗ!MukX[:q@2e#>8]`g!b7q8_HoIA!ژ‘񞂊Sm‡>×wh1I?Fj' S.rWQ,;\T%!v$9`6biVw89uNJu-gq mfxÓRz}Z.gu}J~h})g*J/@<1kNԵg2W-` s ^ -?/W'X$pRL_HlXd&{ -0+o5,Pà4ǞIambZ6USm%cR1Z7eQw?!"V3|"G)~9GT9I,/DSy=ڂwGy=z].ǠcS>uZ^щQ="hTu̒cc-z7S1FhY3Xn +aJnPZBPpSؤ/'-A_X3%g;Zن­3Wr0<ϾR ՙGq&):A h Z.uy4j6 HO<*\tŌϥ>6i04:'G!CĦYT?] SCVvh3Ū۹t;hp~rI+&cguJMGny;%ZylmY`s9d?i|qmX;]ioR3 ti2w[wSu:Zim p;kYS1s&k}^J?Ȑ6qoDKɎJڇDmn4l>Z6ST4%S_ ;gzxT#Y Af3y46$)_̴h'CN~6JƨRiA[Q ,"N [rtӬxSV_o﮷o%y%>c"l7"mj +endstream +endobj + +205 0 obj +<< + /Title (scala project part 2) + /Author (fredrik robertsen) + /Creator (Typst 0.14.0) + /ModDate (D:19800101000000Z) + /CreationDate (D:19800101000000Z) +>> +endobj + +206 0 obj +<< + /Length 1175 + /Type /Metadata + /Subtype /XML +>> +stream +scala project part 2fredrik robertsenTypst 0.14.0en-US1980-01-01T00:00:00+00:001980-01-01T00:00:00+00:006application/pdfHbDaPrpIu9dfmLyx4HtXzQ==Isw+UKPemF/7b6XnLr0DbA==proof1.7 +endstream +endobj + +207 0 obj +<< + /Type /Catalog + /Pages 1 0 R + /Metadata 206 0 R + /PageLabels 8 0 R + /Lang (en-US) + /StructTreeRoot 9 0 R + /MarkInfo << + /Marked true + /Suspects false + >> + /ViewerPreferences << + /Direction /L2R + >> + /Outlines 2 0 R +>> +endobj + +xref +0 208 +0000000000 65535 f +0000000016 00000 n +0000000122 00000 n +0000000202 00000 n +0000000315 00000 n +0000000416 00000 n +0000000523 00000 n +0000000630 00000 n +0000000724 00000 n +0000000816 00000 n +0000001089 00000 n +0000001372 00000 n +0000002287 00000 n +0000003559 00000 n +0000005069 00000 n +0000006467 00000 n +0000007151 00000 n +0000007444 00000 n +0000007553 00000 n +0000007643 00000 n +0000007873 00000 n +0000007966 00000 n +0000008056 00000 n +0000008146 00000 n +0000008245 00000 n +0000008356 00000 n +0000008467 00000 n +0000008569 00000 n +0000008695 00000 n +0000008821 00000 n +0000008935 00000 n +0000009043 00000 n +0000009135 00000 n +0000009235 00000 n +0000009363 00000 n +0000009515 00000 n +0000009689 00000 n +0000009780 00000 n +0000009871 00000 n +0000009962 00000 n +0000010053 00000 n +0000010144 00000 n +0000010235 00000 n +0000010339 00000 n +0000010625 00000 n +0000010721 00000 n +0000010813 00000 n +0000010905 00000 n +0000011033 00000 n +0000011125 00000 n +0000011265 00000 n +0000011357 00000 n +0000011489 00000 n +0000011588 00000 n +0000011699 00000 n +0000011810 00000 n +0000011921 00000 n +0000012041 00000 n +0000012152 00000 n +0000012272 00000 n +0000012407 00000 n +0000012511 00000 n +0000012582 00000 n +0000012714 00000 n +0000012846 00000 n +0000012946 00000 n +0000013074 00000 n +0000013226 00000 n +0000013318 00000 n +0000013660 00000 n +0000013752 00000 n +0000013844 00000 n +0000013932 00000 n +0000014056 00000 n +0000014127 00000 n +0000014223 00000 n +0000014315 00000 n +0000014423 00000 n +0000014531 00000 n +0000014655 00000 n +0000014759 00000 n +0000014863 00000 n +0000014977 00000 n +0000015048 00000 n +0000015165 00000 n +0000015282 00000 n +0000015353 00000 n +0000015473 00000 n +0000015590 00000 n +0000015661 00000 n +0000015781 00000 n +0000015898 00000 n +0000015969 00000 n +0000016092 00000 n +0000016205 00000 n +0000016276 00000 n +0000016384 00000 n +0000016500 00000 n +0000016656 00000 n +0000016727 00000 n +0000016855 00000 n +0000016964 00000 n +0000017057 00000 n +0000017182 00000 n +0000017275 00000 n +0000017617 00000 n +0000017711 00000 n +0000017845 00000 n +0000017918 00000 n +0000018010 00000 n +0000018102 00000 n +0000018206 00000 n +0000018307 00000 n +0000018444 00000 n +0000018566 00000 n +0000018639 00000 n +0000018731 00000 n +0000018823 00000 n +0000018927 00000 n +0000019028 00000 n +0000019165 00000 n +0000019277 00000 n +0000019350 00000 n +0000019476 00000 n +0000019594 00000 n +0000019667 00000 n +0000019759 00000 n +0000019851 00000 n +0000019955 00000 n +0000020056 00000 n +0000020193 00000 n +0000020306 00000 n +0000020479 00000 n +0000020578 00000 n +0000020670 00000 n +0000020761 00000 n +0000020872 00000 n +0000020969 00000 n +0000021066 00000 n +0000021163 00000 n +0000021254 00000 n +0000021363 00000 n +0000021454 00000 n +0000021614 00000 n +0000021706 00000 n +0000021798 00000 n +0000021890 00000 n +0000021982 00000 n +0000022074 00000 n +0000022166 00000 n +0000022276 00000 n +0000022367 00000 n +0000022464 00000 n +0000022562 00000 n +0000022679 00000 n +0000022781 00000 n +0000022923 00000 n +0000023004 00000 n +0000023086 00000 n +0000023229 00000 n +0000023371 00000 n +0000023430 00000 n +0000023489 00000 n +0000023548 00000 n +0000023607 00000 n +0000023666 00000 n +0000023725 00000 n +0000023907 00000 n +0000024358 00000 n +0000024447 00000 n +0000024701 00000 n +0000025696 00000 n +0000028532 00000 n +0000028697 00000 n +0000028965 00000 n +0000029054 00000 n +0000029331 00000 n +0000030789 00000 n +0000040720 00000 n +0000040905 00000 n +0000041615 00000 n +0000041706 00000 n +0000041962 00000 n +0000043394 00000 n +0000049167 00000 n +0000049205 00000 n +0000049243 00000 n +0000049602 00000 n +0000050025 00000 n +0000050077 00000 n +0000050130 00000 n +0000050182 00000 n +0000050235 00000 n +0000050287 00000 n +0000050587 00000 n +0000052576 00000 n +0000052894 00000 n +0000055808 00000 n +0000056108 00000 n +0000059283 00000 n +0000059583 00000 n +0000062641 00000 n +0000062941 00000 n +0000066605 00000 n +0000066905 00000 n +0000068963 00000 n +0000069142 00000 n +0000070408 00000 n +trailer +<< + /Size 208 + /Root 207 0 R + /Info 205 0 R + /ID [(Isw+UKPemF/7b6XnLr0DbA==) (HbDaPrpIu9dfmLyx4HtXzQ==)] +>> +startxref +70668 +%%EOF \ No newline at end of file