From 2f979df0002d06694e2ec9e6c649fa85dc85cacf Mon Sep 17 00:00:00 2001 From: cow Date: Wed, 7 Dec 2022 00:40:35 -0500 Subject: [PATCH] day 3 part 1 in elisp --- elisp/day-3/solution.el | 63 ++++++++ elisp/solution-template.el | 29 ++++ input/day-3-example.txt | 6 + input/day-3.txt | 300 +++++++++++++++++++++++++++++++++++++ 4 files changed, 398 insertions(+) create mode 100755 elisp/day-3/solution.el create mode 100644 elisp/solution-template.el create mode 100644 input/day-3-example.txt create mode 100644 input/day-3.txt diff --git a/elisp/day-3/solution.el b/elisp/day-3/solution.el new file mode 100755 index 0000000..826ada1 --- /dev/null +++ b/elisp/day-3/solution.el @@ -0,0 +1,63 @@ +#!/usr/bin/env -S emacs --script + +;; -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 notroot + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +(add-to-list 'load-path "../") + +(require 'ert) +(require 'advent-of-code) + +(defvar solution-input + "../../input/day-3.txt") + +(defvar solution-example-input + "../../input/day-3-example.txt") + +(defun solution-letter-priority (char) + (if (char-uppercase-p char) + (+ (- char ?A) 26 1) + (+ (- char ?a) 1))) + +(defun solution-part-1 (input) + (let* ((char-lists (seq-map 'string-to-list input)) + (split-into-halves (seq-map (lambda (char-list) + (seq-split char-list (/ (length char-list) 2))) + char-lists)) + (common-items (seq-map (lambda (halves) + (if-let ((intersection (seq-intersection (car halves) (cadr halves)))) + (car intersection) + nil)) + split-into-halves)) + (filter-nils (seq-filter (lambda (item) + (not (null item))) + common-items)) + (item-priorities (seq-map 'solution-letter-priority common-items))) + (apply '+ item-priorities))) + +(ert-deftest solution-part-1-example () + (should (equal (solution-part-1 (aoc-read-file-lines solution-example-input)) 157))) + +(ert-deftest solution-part-1 () + (should (equal (solution-part-1 (aoc-read-file-lines solution-input)) 7878))) + +(when noninteractive + (ert-run-tests-batch)) + +;; Local Variables: +;; read-symbol-shorthands: (("solution-" . "advent-of-code-day-3-") ("aoc-" . "advent-of-code-")) +;; End: diff --git a/elisp/solution-template.el b/elisp/solution-template.el new file mode 100644 index 0000000..d6a3c25 --- /dev/null +++ b/elisp/solution-template.el @@ -0,0 +1,29 @@ +#!/usr/bin/env -S emacs --script + +;; -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 notroot + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +(add-to-list 'load-path "../") + +(require 'ert) +(require 'advent-of-code) + +;; Code + +;; Local Variables: +;; read-symbol-shorthands: (("solution-" . "advent-of-code-day-n-") ("aoc-" . "advent-of-code-")) +;; End: diff --git a/input/day-3-example.txt b/input/day-3-example.txt new file mode 100644 index 0000000..f17e726 --- /dev/null +++ b/input/day-3-example.txt @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw diff --git a/input/day-3.txt b/input/day-3.txt new file mode 100644 index 0000000..46aefe5 --- /dev/null +++ b/input/day-3.txt @@ -0,0 +1,300 @@ +ZNNvFWHqLNPZHHqPTHHnTGBhrrpjvmwfMmpfpjBjwpmw +sbdzQgzgssgbglRtmjlwhjBlfrSrMt +zgsCRzJbsdRVQCDbcgLGWWLnZNGVLLZMNZnq +tvHhRtZGMvMHvfsrBBCTRbwbccRc +qznnlpzzDppWlDpQpCrcrwnBNwTZnBTZrn +PdVZJJqVZdllDPFtMjMgLjGMHvSgMF +csbhhVDDvzlVDcbccGGvfRjDHCjNLRHRCLfmnZfR +dFrStSTTmrrrHVfV +MMgQMMTMVTdgWtwTPwSgWSgGbbppJzlplvhBlPbzhlhbzG +FDJSTtSGhpPFDmFTZDpTFPmCBBrHqsCBhgBlqqrqrlRrHH +dQwMtfdzVwWfwctwnfnQCHllzRrsNzrrgNlCgqsr +fLfQnVjfwQfMdfvfnVvWDvtJPFGDpvZGbZpmbSPP +TzzCrJcDrTDdLDCJDvGNPCFqlZWlvNvWpq +RRHfjsQBFsjgjBQsWqGpNvZQqQlPPQPN +VnHBnRVssnnjsSfBwbMSrrbTwJTcwSDF +HJCgHCCFFFVGJWTlbqDdlqTDDpgl +cZccSmLrfZcrmmzSQftdpDtTHdbQTDMQ +NZZccrrBwZRPNNzmcLSSjJhGhVWCnsFnHBjGChsJ +qwwwJHTHqdFDtZBFPfFBZFzM +gVRcLnnWVgggnnnQgVWWNZtZrBfLBzZzBrMPPrZvPv +GQgQSVRtsVnNRGSCdpmwspmbmDpHmhwd +bhNgNfgwpbLMhCZMGQBmDm +FrcHrSllcqcFFMGLBDQlMDTGlT +FVSddRSJRjLwbjJPJw +wzhhrTwwTrSsdHQjjSHnBjQj +gRDCmVgRgMvtMfVMRBBBhWCHQQHGJHZJQZ +NtgVgttVbMNmvsNlpcrLhLTNPw +MCgjsfnscgjjgnGgJHHqHDgdHbGr +QSSmRFPpRtPFQLQRmPzvBzzzDWqrqWWHJGGNrJJbdtVWHJDV +BdSFdLQzRFlSLmQplffwncfscChhcsMj +GfVmfnmJVnNVFhnhGmbmhpHvqjrzHZBjfvrtBHHZrwBt +ddWQldlMdWMlQsLWTLQgMNwBrvjrZjNrwzZjswHqrv +QQdTRcgTRPDlMQlQPQdhcNNnbJmbGpVnGchFmm +CjjZCCZfvWZRHHhRtwhvPN +mrnqlqMqBlSSLnBTLBwmHPPWhPPHtFRPWzwt +rBVTrrMMSMLQBrndGcddWQbbdZfCZJ +LFtdjHjLjLqHqstLTjFLFqNMnMhhZdDDNMVbWdDDbhnZ +CrBpBGnzrzmczcllrphCZZWJMDWRbbZNMDMR +GwgvzpzvrcmBrnfHjTgqTsgHjF +rMPPZcplCZlZPwtSwhtBwCQQzB +FvDGffLqqmQFwmmhzt +TjJjJfHHVDVnHVgZZlQppcVscP +hVcqHwhgwwwjHjjGWbvrbBGrsWVWGn +CttPRpMmPDTWbWltlLBnGl +pZmDFMmPMfnZwqqwfcqJdHgz +bSJWhWJCbGGWJPStWTgRQwzDjgQQjsDW +nFBBVQVrVBrNFMFZVpBBZFZrDgdTldgsRsslsljsRzTRjzns +rMcZcHcBQPvbbHGP +mSfmwqfmzrfHwFfmrwvPHqPmMFRlMDDZBCVVRCVZVlZpMRRR +TWjdTWhTsssLTGsJNWhTQddjRMDMtNNBSCDBllMMBVtDMVRZ +QhWTQcdhjThsdGbTLGjWHmffnmHwnwHrwqmmfcwS +LmrsMQnnpfmMLllvTvqvFFzvFHNN +WGRFVWdwZWZvCbJzcvJNzw +VjGhDtWGSFRGjVVSFdjjDPBfspPnnMBLPLrrpMMm +qqqCCJjtqtqCtqLZspHWBdSrWWSzzbzHFWBldb +GhwwcwPFVDcNFRRGwwzmlBrBWvllrvSzlrcd +DGGhQNNDhTpZZqqLQFQQ +QfZmgQQZCCMLfNrgprdNvvdrTg +hhttsBmBDcFRBlJshJcRrnjnTvNqpddNNqvndp +JtsGJGtGGJJJHDbctllhZHmMwMQSPVPzHSLMPZmV +DScSjZcNBZqjDDcLLfFtPfCfjfPvfv +pTmRlWhdMwTLGwCf +mRdWCVVglWrCmVHVrVCmdrbSzNcBDBqBZDNHqssscNzqNc +sPMHGFMsrPNCPnNS +ffJzllbzpZBllttBtfglgBTbSCVCmmrNFmmbFNvCFLLb +cpZqpfgZZJtJqJJJfWHWhHdHWHjcdRdFHD +ZZPfppvzMrlNBFcvFB +shJgstJwWLVJwcrFFVFrBVNNqFFB +HwWJdLHWWLcQgssHwwSQSQtQzCnZZMpZCmdzZCzpPzpCPRCj +QCpLRbsCCQQLbQzCBQDQBBfTTffWtTctJVRNVtnfwtWV +GvlqqlGlmMrdsvrhmlcTvwJtwNwTvfJfcWTW +lMhgqGhddjqFFCzBBpbsSQpD +JJwGJwVQQwVSsSMhQMQgHfgfTtrrfVTNgNNfrt +dFDWCDdFppvDFmWWWnJTPllHmHlgrqrgggtH +DzFbWjdRpbdFCjjRbnFbQBGhhQBBJZwMhScwZwJz +HttvHpHmpJWtHmFNvlvdMSVdPMtLVCCMMMfcfL +GjgzhGSGSSdCcRMVjMdc +QshbnghgnGDnqsFrNSJFrsNs +wJpjMwzjzdVbzPPVpbCHnqGnBqnsBrNCwgrC +ftTLLDTQtLTGTGtFrgHrvqgQnrvQsCHH +fTcFFfLSfFFcGFllcFhPJPjWWJSjSWzMWPdS +ZjNdmjVQVZmvNNZNNZHWZmWtsJnwTpJJswpWwGqJhJqGpp +FcRRcDblDMLRcRMLFFMDGsJnqhwpqTTJGwnsfnlp +LRBrcLbbgLFgBbFqDvdHQvCCjNzzzVrZdV +BdbLWrgdvgWvVJgWnDfNhVnqhCCpDpcq +tSQPSTSGPMmlMPtQQPJGtGQRCcnqqfnRhCcChDqnCfRScf +jTssPsjMQMmszPjlTtsJdFBFrJzrbJdHZFHdWH +vCccctvvTTtZcgLGcZTbssbMWnpMpmLWqnNjpfPPfPjMPp +wwBBlRBBwDDVFRhFlRhdRRVWPnnpMpffmmffrpWqVNPm +ddhddRzHlQHFJcGsCztTgbNzST +fJctfpVWcnfRLfrRwP +vmmnvDQDZTNTmGGTqTMTvMqwBdLjBvRzBRrRBRLjjBPzBB +GMnmqSTFFQqttcbcJWgsSt +rHNfmfRsmfRGfDNcRmcmMQlLCGSnQwwPPCSnzQlSCl +bsJTBsVhFsVpqFWFgPCwnQwBZzwQzZLlzn +qggTTqvqgqbbTTFqVqgWqvNmmMMRdffftNfMDMmscR +rFWQFszrwjsjFWvshPTCmLZLSTLwSLlgSP +BQbcqVHNVqVpVpmClJgJJHSmZLJm +qBNNNVdDMGBpDcDWsvdQsFrFnjttfj +qGhmttmzhtMvhbrLdSHbdSHRzb +WCBgQJJpjCQlgdHZrfPRPSRbNg +jBTTDjlnjnJDJTQCVntcwtwMSvqcGFDhcvsh +ZTrnTqMWWWnfrddMGJPgPLlPbw +VvmGRVpBpNNmvNvjVjtpNpCNLLLJHHBdgLPdwsdsbLlwwlwb +GmCVSCRVGmpCRVvttmpDrQZfhnzhzqnDWnrZZTQq +DQBZHHtWHzSvZvDQWchgqsqqhrrhhcqrcZ +jdMfwlFfFlTfndwpjjwGnNrqhPTmPSPTPPhmgrPSrh +jlGbwGMdlnJpGFGjpnFCSJzzDDtWHCBBQBvtVC +RrbBWBRRWSRsBBVvsPHZDwSjjPdnHwtPtH +fTgfzMmNJpmJgfllgpjVQtDDndVQpdnHVtPp +gGmlNclTGmGFhLVcVrvLqrvc +QcpCTVCZVcCwLcCVvHvvVsCcNzNNSbPRzsDRDSBlsNNzDRtb +fggMfJqgrWFpmjWMggmrfMWNSbRSPBDbNtJRtPJzlStBbN +gdnmpWGnZvdQCvdv +tqqcLqqDDqNtDrqHrrPWlTlTWZTMzTFzQlMPSZ +pfnpmmppmppRGjwbjmnjwspWbQQQTMWZbCTSZCSQlCllZF +gmpVnGmmmpjDvVLBFqqvrH +LqBvJHZvbHGBHrBtGGQTmSVprVzhpVPDPQzQ +CRdRgwCfhTVDzSdQ +fRCcjgSMjfNgMMLGbGZtvBbGHv +HgvtDDzDpvwgvvqdHPZWdMssTTddSs +rJFrGNFVQmNFVmRnWhhsrTbhwhZTrdTd +VQGBBBVNQClpcBvBwD +PWlSzZGmdmGmlGmhggBpvMjvMjFgPJ +TtLRDtQQfTVcQQQRtBsJFFccFjWhJJFMBs +HqVCNtWHCDwdnlGwGqSr +RwdRJgCJRGGmdMbcGbdnTnTtttLLnptMtMtMqZ +DWsWPFrPqVPPLVCB +zQWWsslsQHFhDSszDSFQzJJJmvcgblRgmNvCJmvNgw +tpmFrWTtRpRTtggsSlnQpsnnlSHPsn +bZwZjNNZGLSrVsGndPPV +NvrcjCfbvvLBDBWfWFgRRm +WWFMgWmMhhwDcMMMDcmLWLtQwwsjbsQHvZHbRjZfsZzH +PTCplTCdSJJCpvPGNSvsbsfHtbQZzdHjQtjjsj +vNGJPpqJvJvqghgFgWFmLD +RlRpLTZCjWRjRWwpRsjHjbSbqMqMvvnbnGMnGGqQCq +gddfDNczmgPthNcDdgPVnbbzbnJrJJGSSVJJQS +BmDmcDmcmhffdBHlRwjRLpwlWQ +prQlfzlWRPzgQWzlMPMRppssHHsDsHjwnHHbWDwwbwjL +vFBJJtZNShJvZFtdSqtmqjTDVHVGDHbwVHDVsDnThH +vcjBZZdZqvCfpzRfcgRp +cggpqgRlSpNsgNggbjjj +ZZSSJVLVLFDZWNGjCWWbCjsF +vZLvfZQQfQtJVJDQShLrLfMmnldmwqwTqqMcMTMTndrm +bQBMtBPddtMFbJFhRGzMfzvnRGRSvWnW +TmHTqlVHwVpQqjmwGvSgSpnLpzfWGWSn +TTrDQCDrrTmDCCCVHHQZBdZFPdsNdFBtFDhtFB +fjpQvNZcGhGGTtQS +DVJzvbVmHbbtSTSTRStzTM +VDvmqllmJfjWlnplNs +ZmdHZJjvQLdRjpmLJrqqZBhhtCschPfBPcrDfPffCD +MWWSMMwnwlSgzWFFgSwzVwzqcfDCfChCbbtssbfDChcD +NMqFTwGqMwgwwgjHRdHRjdmQmQTm +TTqWPCWRhTWqPNjPJMNtrlbJFttQwwrBrlbwlc +GfpSDGZvpQffSHDgggDZrHctFmrHncnnwwbBtBrt +SQGfLsSLZsqMTRNMPT +HdBdnBZJTZBBmsfwwBlh +MjCVjzwqWrfzplzW +vVbqCjjRgjwMbnbGHJScScZHLL +dwwwtCdznvDDFrMrrw +GmWLQmgQmHgcdGcsTgTDqDbSfFWfMDMfbSNqvr +QhTLmVQHLmdLTjGGVptRnZpZBZVRpPpP +CzjFpzRHdtBFBCqNqSbJZWcQJTSbQjMTWZ +wGwVLlGrdVGwDnwsgfMSZvJMbWJcWlvbbMSc +rDfsgggrGnGngsPwdVLfDnmDtzzFNCPHtzCtFHpBRqhPztzR +mrgWzBcDtVCcQcCCdscf +LRJhjRjPZvqSRGhGjLgMCdHpMNwQCpMHpHMS +GRvGJRJjqPZbvGGhRjnqLJWtgFgtzTzDrFnTWrlTlllW +cbmcddlffvbTfvFflpZzsMVNznNVlnqnzqHMNM +StWJBQRWLRWNPNMCswRVHC +BJQBhSWhjSthJQGGWWggJDDDfbdbbfHbddbrFrddvFvv +jFqvqvWZWDtBJrrlrq +TzGcbHcrmVzMGNSmTcGDtBthJCNtsJDlBCghgP +bTrnTccnLSrrTHbnwfLjfdvRRwZFdwfR +drHVrdVDfsDbVsdVDbVqRwbZZwCRCCCJlJThwRgT +jFPcFpBSvtNPzSFcjcQpcQjpThZCRltGRRRJhwCwGhwgwhRm +SQSzPBjjPPSvLqqssdnqLZLMsM +bQTWlWlvQclNwwWlCCLStCRSSjStpj +zVZZDdBnBmgzVsjsLthSpshdCL +DfBnrmBmgzHBfDHmnGrNFCwQvTPvqCTwqTFGbF +srSWJnrbmlWlbhzsWszSvPGwvgDhcjdjjfvhjvGv +BRRQFLtNfQNMpqpQHDjdDjDcZZcvwZZHPH +NLCNCtRQfRttRFRCTqMBqQQrzrbzrlJmVVbsSWmVrTbSzJ +RHLfLcSRTFSghLRHGbwZmMZddgJswZsbMm +ptqjtCzzQztqCjDlBGpDpbMZdwmMbZsdwNmdJpbs +tttzCVllDCtDQnQBVHGHWvWTLWcLSLHf +FVlNnPqbGTHftghggJqf +zLcZWZpWWrcrZLLZDWrwMcrhBFBttChBmBgptChhtFftmf +LZZLrDrrDDMrcwrDwsWFzdTlnGQPQQVbdbnsvnvsVQ +BbPNMJNbQvDbvPLwHflczlwwzf +pZjWZGZjFGdgpnVgZhghdmcflrlswzzcstlrLwhtwc +WZSdqFjqSqSWdGFjZpdMTTDNTvLCRRLLqRQMCN +FqgFGtbgTvRwrLqhvw +JCCWJWCdJMQNNsSWsMPQRDDLDSDLwTrrvnwfDvnD +HdPJlBBHCCQdBMWdTtVbgHczGVGjmtzG +PLlZDLZDsFCvbDQv +HVcTmVmJqVzqczfzbjvvCFMRfCsWjMvR +cqHzTqJTTTTzzmnmrctrBlLlvSlgLdZvSwSlpw +SbMMNJjmgMnJdSSbjVFZVSQrlQfWVQVWZh +PtqDqPGcLHzHpqLcRzRsfQFfZlfRfZfRFVsl +cTDLcqGCzDTqzzDLDzqPTtJvbBJMnmvjbdlmJNvmdgNC +tDJDlZVqJGbvHNQbNFFsFPmLns +ppczpzpffGwfBNLGmn +WShzgTTpWzhWztJJGJSvtvvtjq +TbZFTFScnCZFQRTCqQdBjdJqjBqjjQDB +rmmLpLLfzrlmslMBHvdRddNDDJDrqD +MWwLPzmWfpsMmmlMPMWLwRTZTZnnTcVCcZFCwSnZ +SqmClqHssNWCqPTcWcGhBTchVV +ZnnnDflRpBVTTVhPBZ +DpgfvnvMfCsqlMtSll +ZzLMRZpLMwwppZqnQGvQgBSvlNVlBFFNFVrg +HcqhTmhmdDTPFTJgTTFBSgJN +mccPdDDHbssbtwZMqpbzCRGM +TgqnTltgWqLRSRnlqddngFfrvHvrBTfCCFrFVTvVCf +cwNJmPzQwNzczzNsJGhhHfhrfvVHGvtvVVfC +jjtbtDswcmPWlbgRnRdMZL +TmpTBBwvspTptRmsmTGLQDGRHGgVGLSQSMHQ +ZlPWqjWrzjPqdrlzbrbrwfrWLHVMLnHDMVDQnLQfQfVngQLS +zNwbrrFWbFJpmpmvvt +RMQQMwHMMzcFsWsDrWfcpJpS +LLhZmGVLhVlTZfWWfWpCrDsGSp +VLVTnqjjZngtQRFjvzDM +gmRBpjrpRvCfRCrBgvjHShnbnngbgSJnNsHMHS +ZDPTwGWtqwHhSnbcMNJw +DWGGqtVVqldWZzMzWmvjrjprLRFjRVvvff +tCzVzsVtDFzssnSsgdqJdCNqJhmgmpqq +PZccPGvQfRLMQwNdhpwhNh +jLrcbRjPZBrcPdjRHFlWnVtBFslSWznW +vvvbJbWrLvFWHzZzZRhB +chtwTmCNlRRZzRPT +hmcCssCswrMDGMSrsr +LStGBsQLlllhzMzs +dzVZDNWRDdZNDTZTPvWVhhphpMlfMccRmfnlMlRn +VFvgTrNPdFWNNFNFTzTFFSjSQBCqrtQwSBGLLBGwGL +qGJSJhWStdSfWvSvtGRRnzRDDggrgvnzsmRP +lTTLpcljjGlLlLNBpjwFQDQmRnrRDPrPscRrDDng +NCNjFlHNCTVjpwGqGSVbJddqZZJM +MbWdgvHFlMvmzTzShvmm +tqjqpLsNsrrsjstNLpQrGVhVBzrhVcfmchDcTPVVmc +RqwjqjqsGjjGGQNjGpQZpqRFJgmMHwdbFWgnHMFdwmmCFW +HHHLcCcVHjTHglsB +wDSRwzzRpMSdNSPSwSpRbqvgBsdqlgTvBFBjgFvvgB +RpbzPssDMWwNRbRNRPDsDhJthLQVGLJcctQCJQfQJCLm +WsZgbNgZVCCWbVVVmgZbCCRPccGnzPBqJjzWJBJPzvBvGz +SpfThHtrHFBPPzJvPntj +QHDhhrhpTQpHhQHnfwnTCNlbZCCDLNllZlVsNCNl +QtzJFRQLMRnZcZsfcphlPQ +qSBbjmWSCNmVldSqqSqmjCSZshfwfrPPZZfcPVZfhgsgPg +HqBbHqBGSlNBbltnLLHFJMtRvRTD +tcGtDdMcttttHNBlMctldlwjwwqqCLCwDwZjFCZhmnwC +VrJgvWWsPvRgVgrJQvfQfzgVzZwCbLZmnmwCwZqmnhjZbnLj +sJpffsRWWRJVWWpHltSpnMHGcMTl +zNqRbqSbfdcTLLfS +ZVPzPnVvdLwLDPfF +VWnzQCVWZVMzQRHgqgqrHGtGMp +PbHpWfWPvRfbzWPFfRpPDtBwSHMwCBgDwBjDtMMM +hTTdZQlcnTcmqVTdcddrDgBSwsjjBgqBtsCgMD +hlldTmdJJmJdZvzfFfNJFJgRzR +PJWvJBbWsfLQWsLvmCqHCcNLHqHLLcwDqV +dQztrZrdwHhptqDH +ZrMGjgMSrdzQGQRJPvGGbm +RmjljZChlDZBCRRvlmNSLSqMNLzwLvppwQSQ +sTnVnPrVGsGTPddJrfgQgqLgGpMNQtgNtNzg +sbbTfTdcJPnHbsJfHsdcmDDmmqBZlClmjBRDCZ +CJmHLmHFFCFbHsbJsJqvqhQqLDhQZvnQDZnn +wGwppTjdWPdgFpGcScBqNnNqNhQlDqnDlZZW +pGcgGgTpGjFdwpSFVgSdpPjrMCMffzJzRzztRfHCRsVmtbsz +CgBClZfCflPflNZRvfQswwmwmwQsQhgppdhm +qbzDGrjLLNLDHDqtJmmhhmQdhwpQhhbp +NLGqVqjDjjGrMFrvFWPBRBZnCvfFnT +tbrrHsgsVmmmbtgwVsQRqjJMmqMjQfJfLFLD +ZvlBGzdvjGfRFJQJ +dBppnnBBhdzZncBPlznpnNdWHSsbWthbSCgHrVfgSSwVgr +VRvMtRVFHQLvMRQFQtBctrthshTTgCmhTrgWhWZsZZ +lzJlGBSPPhzjgZsTCr +wJlpJPfDSpwBnddqJDdpPpcvMFHFMvNbvnNMFHHRVVbR +CPShbbdlGCdQqlRPGPdlDWDFzjtFjggCDJgWczfF +mrHrTrrBMBsmNsrwsBpnfpggDDcjjDDpjzFJzzjtJz +BvsNvBLHrrrNvwBTNNsNGbdQhlPGGfqhhRGqLGdl +PSSlPtlStGhPNMtwPMPJzDddnbnDNTDDnJqjbz +FFVHRwVLvFvVrVHrZcLmRHggjDmdDnDnznnznzQjzdmJddbn +WrvgRgcRcRrrcRvgcVrHVrwCCSfsCsGsllhMSSSSMttlSCpG +hBPJqVZTqqPSlGlfddfddZvl +JWWMJCpnMrmztzdjnzld +RbWsrwMrpbRspbWgpwhLJPccNVqLLPSVgVPV +hcTrWqcfhwGfWrWMjHjGvDHPmJMDzF +ZtlsnZZtLBSbSssnbndjDJJFHFHJPHPsHMTHHM +ntRZtSbtZgZStTqchwQfRwNpcq +GfLqrsqQGgPgjjQGVcNvTpTpNFcWPvPPpT +bRnRLnMZFdCMcpvT +RnRhzRlmlhhHhhmhRsqLrfzrGVSrGBSGrL +fbMffwdZsncrGcfG +qDBjSSLqhLBSmDbjqNhqTLjCGrCHGrvcGWcpWcrGWnCrpm +STLDqbhTLqNTNSRhlwZlJlRQFFRwMdPQ +TVVGNFggcjPPJzwvQlRRwRvSlcSc +frsBbWhtSRzSLfRf +qDCqddbsWrqzhsdNmdJNJHjTggFFVV +NTWTDrSdFTLtPTGf +lZqjHlVRvRltLtRWFMtFLL +qvjWzzvVbZpjqllggscdchwDrCphwsdhrD