From 85af020ca86c3ece84583b5e31ef58ada8daf2bc Mon Sep 17 00:00:00 2001 From: Tobias Eidelpes Date: Sat, 3 Dec 2022 17:44:17 +0100 Subject: [PATCH] Add solution for day 3 --- day03/day03.lisp | 28 +++++ day03/input | 300 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 328 insertions(+) create mode 100644 day03/day03.lisp create mode 100644 day03/input diff --git a/day03/day03.lisp b/day03/day03.lisp new file mode 100644 index 0000000..1094647 --- /dev/null +++ b/day03/day03.lisp @@ -0,0 +1,28 @@ +(ql:quickload :cl-ppcre) + +(defun parse-input (input) + (cl-ppcre:split "\\n" (uiop:read-file-string input))) + +(defun get-score (c) + (cond ((lower-case-p c) (- (char-code c) 96)) + ((upper-case-p c) (- (char-code c) 38)))) + +(defun calc-score-one (rucksack) + (let* ((c1 (subseq rucksack 0 (/ (length rucksack) 2))) + (c2 (subseq rucksack (/ (length rucksack) 2) (length rucksack)))) + (loop :for c :across c1 :if (find c c2) :return (get-score c)))) + +(defun part-one (input) + (reduce '+ (mapcar #'calc-score-one (parse-input input)))) + +(defun calc-score-two (rucksacks) + (let* ((r1 (first rucksacks)) + (r2 (second rucksacks)) + (r3 (third rucksacks))) + (loop :for c :across r1 :if (and (find c r2) (find c r3)) :return (get-score c)))) + +(defun part-two (input) + (reduce '+ (loop :for (r1 r2 r3) + :on (parse-input input) + :by 'cdddr + :collect (calc-score-two (list r1 r2 r3))))) diff --git a/day03/input b/day03/input new file mode 100644 index 0000000..5282006 --- /dev/null +++ b/day03/input @@ -0,0 +1,300 @@ +NLBLfrNNLvqwbMfDqSjSzzSJjjggcdVs +lTRGPPZnRRHszcsZdSsccZ +CFTTFtFHTtCtDDzrmBtrBD +BJldgBWnRgWNWtllSlWShMcLcVSvVjbVVVvDVVVL +HFGFwqQPQGwHrTFpwmThMbDDVcVmLvvshj +HrpHrGPZZCQrfqlNdtMlzfMltlgn +hQLhBtBtQNQjBjNLvtLjzLJpWbjJdppSwjpCCplllJdj +FGFsmccSPTVPfVVHpJJgwlJwwWJWpCmR +sFPfPFHZTHScnzBttqzvQzqZ +MNTGMTnGWvTwwwnZhNZnWDPPdSjqsSPWjmBCSBWS +RJrtVfRlLrfHgblHJVBjqqFmjCdBJjDmJdSD +tgRftftRcRLftrpHpflHlctVwNNvZNcTwZnznQzwTzmhQwQh +sQPpQpQhnlNsJpJSQphHcZffLfgLHSfHVHHFZZ +zBCvrrWzTwqzcbtbqCbrCCwWLMfVVmmHVfqHFHFgGHLZGmVG +rvvjBzTjrwQRcpjNsRss +RrnNWJJNrplbLJBBWWZstVpmtZftptfmfsMM +GHjnwndzGcqjGgqtfMsvfsMmMvZZ +cQgwHTPjPwGwjdHHTjwccQBDLlWNrLJLNrnWrBRBlS +BBBQJGQslJtcGqfgHpPnfftwqw +RDMLDWLNTLTTNjNgvdqbqRnwqbfwPRzbVHHV +mgdNgdTSMWmSQsQsBQcFSQJr +RqQhRpsdqnvdlPBfzdVlVJPM +SSZsDmSmssGZbJVwPBSzBBMfCf +LFFNGLgLHFWrWHFmLWrLWLrsQshqQnspNcRTjnpTtjRRjh +DshNcgmDVClpCfRs +TnZjTWrtrqtWnGTrbqqTTZZwMpSVRSflRMflMjRCSfpJMSJl +wHbGHrWHWrbnbFtTZcLzLgHzzgcmpNzzzz +hfWQdhQHmPWhqdhQqpdQqWtzvwtCMCRvNCwNzMtNsHsz +lBLnJZLlFBlZjGFbVjjlJRSMzzSszzpGpstSpvMNtN +rVZVgZVgLnjFVlVQDDfhcfmWrQdTfp +zqTrVZvDLGdMMLtcpR +bClsCmQbjFtjljllntsGjGWPdcRWhMppPcpddR +mbggmBtQtlVqVzgrzDzv +LtpnGnGNFtbGntbbQPhTlRpRTzDlcClPCl +mSZHgZMhZVmWPHccllzPzcCP +sZhWvSsBqmBSqmgMqWZjQjfjrLbvGbtNFjvLtb +TvMZMTTzWHNNFPsNbvDG +dhVmwfhcnhRnRfdlGsDNNGqNLFNNTGdq +JTcVVTlThmfmrrWQZHMrpZtJ +zGMBMzPNDNcNZLBzcmLvbHltDbWjbthhqvvHtg +rdJSQSTfQrRnsRfJJQHhWgbhtQblgHWgWH +nTrlpVfSpswsrsTSdnRsfnJJPBZmMBcBZZGmZBmBMmcCNzpC +nfzcnSlRJJScTZTzJZnsNjNrHQqrWBjsBRdWBr +LgHwDLwmMDCphttsqDjNNssBGNsGQB +hvwgwvghPbpggLtmmbCmSfzFfVSlZnncJTPZHSnF +DbsnzDCsBPHDQHFD +GGcWWnrGSjBMrMlhfr +GNpqddqWLqdScWqcVnCswmzJRVzVVbJp +NzPpPBppzjbpCrrQhggqvwwqRwrwQl +SDddnLcDLncghQBWvvgR +tfSLLBmmmDJGFDLJmMMsZZssZzPTzjTpzZzP +RRCrJbSfNrRQjvvHppmpbZvv +llhVGGGMPVTMlTdVzcPVHZmvqpvqZFhHFqmjFrHF +ccGlzPMVwBGfBrLCDJrDLf +VcVGZZVMlncjTqcjsWWf +hzJRtRphQJtBRhzFpdrfrqrFsqswWrmsTmFr +LJHzBQJRhPHpzQWBRzphHRQSMZlnbGMVMVnLMGbDvvbMVl +sVdHFFmhPGVTdFmVFsgPdBBtBZjSpGSvtpBztpGjzt +HCHwlncHfpnjSSpBzz +wWQwlWWlfWcQMfCrfwTRDrHsDmPDgFVTRVsV +qllqNlmglNNdzLDddGGNSHScMHMWPcPSqptQSSHJ +bhhbChVsRjwGRCbZCcSZPpPMMWJSPMtPpW +BhTVBsbrhCTrhfbrCTTTRRfngzrnnLvdzgGvNzdzLNvrLm +nNwNPnjzPsNRHpFDHLLsLVHF +MSBMgMZmWqScCFGWWDFGVvwW +JBghBwTrgchrTbQRjztQPQbfhQ +PPBpBHGfBHGpRRPDLMmnscRLdnzmdw +bMFVTNVTVjbbrCWCsndsDwjDzwmwsnms +QQbJrCCMWCVCVMShHGPQlHhghGlt +dBQMdJQHbWMWHZLRRsmPVJmppJqG +FSrzFnPnGNrlsGps +FvwTnCzDznTwzhtHjZvbdbjQfZgPMv +gJjVQzLgLvPJdMrsDsQtdQrw +hBpmWfSfHCWNfmSppMrDDMwwMbDMlMcbcB +fhphGpfNCpNSNRhGhqPVvjvjjjTzVRPzLr +TsnznnrZsNwGNrbWbSvVgWzVSbgv +mBBFBFQFBhSHggVnmvfW +BJFcRLFFBhLpMNcdNCscZNnqld +vqwQGZNSwNQHQQZNSwvpwMdlnMfBClZBTzBnTfTJCB +sbcrjscccmPmrtFRrtcsPssmVJBfTCldnJJdVzMlBnBJTBlR +tbDmhtdDrPjbDcrDWSHGqQqvHpWSgNHh +VVWSwCpWTVWWwVbbvPJDwvDtwtMttLtH +nfNLcNsfZNnGggZNNqGlMPPDDrlvGHHrtPJMHP +fhgqfznczcjpVRjFLSLz +pvcBCrPrcPBpTccGjrQhQdwMsqdGQddswqhS +FggLnnFzzNFNmstlShMVwQtsgq +RnbzHmNfRHmmnLzRnLDRZHRrCPJBvCWWpcjvJpwWfjwvrc +HfdzzrGfRrQqrGVnznQvgjcjhhlMTlFjchFMVL +swwWWBPNwPwZbvPMFTLjTlgP +BJBJJDZtSrJqnFFfFJ +lqqMSMBMttLMjtHjqjrdBnSfcpfwCTGbCffwCcwbSfTcJf +gVFhVRZgVzJshFZVTbbFfvpcwCTCfbcG +hRWZzRVVZmsWJVRQsQmqqndQrnqnQLqnQqtBlr +SgPhCGGzczlCDVDWrlTL +jvdvFvjqwfdrNfNDlzLzRW +jzjFHnvdtdnmHZttqmbFdFqFsSBJspcgcSPQpsQPBPgpgmSG +qqmQFmrbbWWrtqTVVrgLJTzzNzrJ +nCjMGncHMJvzmmHmVV +DpjPDGwnmDhbwQqZtqqW +JlTTLLMRqlMlJMJgBLLnnCZCFrrrdTGrjPjGFr +vwVpHVHVwvHmQVsFFPZQrjrrrZPNdn +wtvmtwvpmbwVvssPflSBlRBqLMlLJBzSLb +rtrTtBwTsfjZrnqJQplNTcqqlvQT +sHzdWFzSzmGDDRVGVDGHWVhvcLLpNpqJCQqLhClhlcvqpC +VRbmRmRHGdsnggbPMMftZB +LMhtCSSftfTzdCdMhSCdMsQGQbGnbGQQMQggDNgR +FjFHWJwJjRNvQggwnDsm +plBVRRqWRHVHWFTdTthTLCfzflzh +VjVdrHFWPmTjRGSRGq +DMWMZDncQDcfpQzmTQTSQRGTGqNz +WMnsCZJCffDnfCfvnZCPhwVrHBVrBlVHrhswLh +TCZltglCZWQsMhqRHhsrHC +vbbNBbGBmNLzczNmNjrRVbhqHMsVqwHVRwqH +mzBSmzDLvPDPzcLPvGzWWSnsJstWlSsSlddWZJ +nlFJZTlBbFBVZldFnlZlCQvQrsMQzzsCdCLszvLD +hPwgVqSwmRcgSRmWgSwmsfrLPssLvQQfDPDvfMfD +htSwtWHWVRNtWmwgtnJplnbFpBbNTnBTFN +vnhBfSSvRttPJnlctl +frHVDHFwfDLVzVlJMNTHllJHMNlZ +bGGFFbqVLVVbzrFwGfdgFdwvhpCqmBpRqWpBpQpSSpSQSm +RMBMMZBBmmmhZmPjTZhZRPnNQvwWfcSvDfQWBSfdQSNdDc +LHzlVGHqVGzHGzsbCbqglbJddCcvJNDDvdDCJSQvWfwf +HlzrHHgsqbHsVGHqbsGsbbsqFmmjnTTFmnjmRQRPFTFPZtrj +LSLWRMLrLHqqwCBJqCstsG +vbQfPjndQnbcQfmndRwttBNZRsGdsCBJ +bmcnTfbvvPRRRFcmfhjHgzMrSrSMSLzSWgVhML +cqWNtsdsWdlsnBsDJwZJSzFFBZ +RhfvggPfffbVbfPmpMvRRFrZDFFbzDDZZrHwJDbwzb +QhRgvpTVpPgJVGTWWNcTtqNLtG +nppPsSPtPZtFdSWdvFvSnnPscRjjHRTLLjCmRLTmCCscrRcc +wwGqDqfMrGqlhllqhhNwzGNTjCRTmRLTHzJjzBmmRmjCLc +qrblfrVwGwbhwqghfqVhNMhtWSvFdPdQtQdgtWpvWPQWQv +cLJvcccHNcLDwCdRDvjdDR +ttPChbqhZmtWGCtZQwBdsQPQdwwsddQF +WnqbbgGVZCZnnlWhCVtbtVgMMrJLLJNrNcHMJNJTJNMp +vLvWghFhBWqGsVTV +JdpdmbrBmsQGGlVqdw +CJZMHPMZJHmzCnZHHrMjSvcDLDccNSBCDDFDjj +mDgnmRVmqgCSScsVllCj +HLTTMTHZQjZzTzprTGPwtcdlLcllWllWtCSwld +QMHHPzNrQBQGNHzQqbjnBbBbmbfjbqjb +tgPNgzzsSPhjSgbPztSbpDJZRJDTRLTTpRHpNRHZ +crlfGGFlBGBrBcrnFlrFFFCrLpHHJTcLRJJVJvDHtHZRDDRR +tFFtrdmGffnndmzhbWPgzPdsWQPW +JHhvgvzJhBGSLHhgBBSBHzdBflDfllTqLlwLqflfMcctCcfl +RjWQWrnjpjjdNQmmNNWZWpCZtqtDtMwwwcwtcDqcTDqC +PpNPjQspmWpPWRWnVQQpQsWVvvggJBvBSGGdJVhJSJBFdb +FrPTcrCGbcTCChrwNMRDMRvWRdHvzVRVTR +LJmQSmQfJnssmjsHSRFHSHzdVzSFHV +nQtgssgfstjLnmplttgFLLPPpGBrcrchBhCbhhqwPPCC +qFtZtFzstvvPvqttNrCJFWJRFCJFRRWR +ffBBfjQdmdQBfQfmLVQRPRpNNCgPNNRThdWPrr +fQVQlHnBQjBLjlvDqsvPqHMsctSb +rqhJnTTJqTchnTdhncmmgMVqtSBsBspgBtHLLWsBBWpWBHSH +bPldNljGZjNCbFCbwwGDWtBDDtsDtLwt +NjvlvvzQFFQhQqdQnMTM +DJHGghhFhHgsGgThrtrQWBPPJWWCzzzP +lTpffNTdZfrcwlCwCrWz +dmvdvffSSpjTLjFhFMRRbnRbjj +LfSqfmvfWPBPdljNNFVFzVJLNjJz +QZQnQcpMhwhZchQnwbvCCDNDCNpzpFsJpsRsRj +rchgQnvHHhQgvnwHGTffdmdTddTGfWHW +SzZGtmTjgzQCpJwpVqrVzz +NWddPllPDvdbccgcHJLCpClFLLVpFLLVLV +bbdRRWDNdPfgfWPWhdccNddRmBQTSGTTTZnmBQZjmsmnhGst +LgvFffmfVFczCWWmWCSh +MbwbTBDwbZtwBDMhSCGhscWSwVCsSw +QMtdQbqtbZTjVbMtZDMgffnFnJpFvrvFprgvgq +pztdqqzCrpvFqpJQwCvWBRGRWLWcWNBsNNQcNR +HdbjSbVhfhcRscRmNm +MDPffbjbjgFgzCZdFdgt +BmDQZbmmfbmbvhvhbgCsCl +GqVqMHwpGTLHLzwqJlCgsgShhvGvJgGS +LTpzpLFprpfmNrBBlfQP +RjRhBqZbwBbjcwgjPmRtZjZfWFfFznWQNVzQFQQnFzWmMN +vpTPDCdpPSpTSSMzNHzMvFQNNWNM +PDCpLGlGPdrlqRqbqbBhRLqR +PmHZWmJzzzppHfHdHfddDMDLhRbMRgRMNNnPgNMM +TCwBCSSjwqwVqQldTSQTtjVhtbbhbgLLbLLbMggMbDRttc +QBrwFlqCfdzHdvzF +GvgGvgfvlzlHGQWRjGMpjZLjZpGW +DVsqJtnDsJTsTqjpLTdcmWWLpTMp +NNqVhsPrrhqnJNnJNzgBvvjHCCPSjCvQQQ +pqnswpqrrtqrnMsMPMqzVfgGzHBVGVftfBGzGG +QWFQhhmDhJDmJJhhJLcTcfHVvTlTFTfVvgzG +ZDZLddWWSgDCggChRSMPspMjpnqjMPjj +MGwMFLFfssfffcGcDrnCllZtnHQCnDCZWD +dbTvTThtvVVVNWVHClWQzzlQ +TjbgBqTBvBvjRvbqvRmPGMcwSPJPfstSsfMBMf +VtCjjqgwvhCCQdSPJJdGnwwLTT +brrBsmNWlzBpSDcpSWLcWD +SSFsrrrBrCqHVVQFjj +LQQNLgvNDnNPHPDQjtGjnmjttBjVhSmJ +sbWfsMFwdCpdCdwWJVVSltVJlLSlLSft +TFcdMTbpdbwdwgTDQLgDNNrTNz +gfgSsnmnWnhhctcJ +ljjMfwwRTNbRqNlzVzjbtDvPvchvPCccChtJtPVW +GjwpwMpbjMbRMNwqzwpQgQQBfdHfSFrBmQBg +FmcmmTTMdPTGHjtGGnctcN +DgqzTqCgDgpZTrqhSbSpzZfpnHjHlnbtbHBGnGjtQHnlNGWt +zppLhfZTfDqsLMPdMVRwwM +RtsMZJSFRWbRsJbFnFzVBpBqgdRdGzGBpDDj +cTmvrlMQLHLllrhwlmfdQqBpdVpDqGdVpjVzBq +wvTfcHhhmHlhTNLFCnFnNnFnFnMFZJ +grjsjJhhNscgJFgPBnbHwLsRHzHfRLbH +ldMMSSvqtSMGmSSMqLRnlRwbrLlRLRRWwL +VtvDdTGGGCvMDMDTvdjhQjZppPNrJVpZPVFg +wctlscwwBTDnJcLNLHDN +bhhMnhqjzFRjjjPdNDDSvLdJ +MWzMzbrZZZmWQzhWbMhwlspstmnswswllBCgpG +rzmddBcmgFjRzSHHDR +vqpgbnGpqwgbpHtbtRjHTjTfFH +WWqCwvCqCJvCJvwpqvMvnvJMdPgZQQdZcWhBBBrPlLlmdQdm +ZdHTtNPNPSRBbFjjTTsr +WmDhGggmgWWJcZmMhVllzjJCrbjFzbsFFRCj +MMGDmMGGgDGgnWGWpNnvSHStLnwffZtHnw +ddZqRdqjvjZdndlfjwZQQCzmqcHLzzTTHTHzchHTmT +BPVPBBWVLbFFrWgJLpNHcPSHCPSCSCChcCPHTH +VFNbBJrGGJVZGGLwQGnjQL +NllFnzNNnNnNzmrHmDFGLGcccRGjGwHChGwwGh +StMZgPdBgbbBLLvCwCvgGwwj +PsfPtBJMtPZMJPbZVVPPMMDnjDlNlmrnmWnmqzpqmVFm +mGGCppgGWWgmGBzMVzBBBbBS +HnrRdvZvTMtSBtbZ +rHwRrjlrRwrnJrCsCDlLWCqcmCMM +zHhDNmDMNNJHfMNJzjsdvvsvbvjGdCGW +tVwttwwVVFBSFSZqSLjsqLdLCWCvGWcdLs +ZwZgwgpBFGlHgNQmGM +TNqhqvqFNWFrlqFqtDTrhTSTbLfjmjzbwMmMbjzLPDwGLPPP +scVRRQHVQVVHcRHpVgJJCRHMMZGMzCwwLZPZGMMCzLGwZw +dHsnQdHHdnBHspJRsVppFlNTSGGNBWBtTShNTFvG +hdZthMghfbbHCgQgBp +mLjTTjWrTrSCbZsLSbCS +VVPJrjqcWVmrjcmWRWTZTPcWldMNqvhnhMFdvdMhfNdldGNM +sFlsgtZFLFZzSZzpnQrJ +DjRbcjRdBrpRQpMJMJ +jNcfDqqfcDBbmqDFggpFCTpgCNhWWG +LMGGbbpLcpVVbfcpcpdvPVQPmZzJZjqSjSjgZgzqZgzTmm +BrRnBWrtRlhBjmqZCnqJgCSM +FDWWrBHHBBDHhFHttrWFttNpfLppbfcGGsfcGsFfccpcMd +jzHqjHLVqQQlHfzqlbbzqHQscvNsVrvnNZTtvNvvvcrGtv +gJCSRwRpJRtNNSTstnTT +wCMnFgnpCMPnJgpDQbqdQdQQLbzqDHfH +MpqJWmqlNNHmmwwBLLvL +QzFDFfdfQTtSGzTDVMdSFQDwHLBhHLjHjbTbHvLggccwHb +VQfsSDfGftfsdGSDSSQSFssZJCCMlMWWZPWPJMZlRp +lcqqhSsgTMgcqBBZnqZTBJJpdGpGVdRNMJHNGjRJdd +VbfCmPbtttfwwWHdGGrjHPdrRrHN +CffFFmwmDWmtCtvQbSVnTlBSDsqZhVBBSc +gPZTgmwvcnqPzhnW +GJVbDhpjsbWzjfNNNNMj +DFCbrBJsFJpBhbVFJCtvTgmtRTtQQltmwm +BLZgTJPqZzFgCGgCFlFF +ljfcDvNDtHcftNdMCQnCRnhnGjCChG +mVvSdDNDHlmHfNVlSWcSDmtpbpTzppwLPPLPPJLwTwBLPS +FHRzMqvQHvndJnFlNdhZ +fcjWWsjsSmmrgsGgjGcGWsPsnhZddffRdTtNDnZlnDnDThhT +WSPcPsGPSRGCmLcGgpHCzBVqzbQBVpqwwQ +PJzwjrVHzLPrZJHgSsNWbNbmNQtnLSSs +hGhqpTBRRGFFpMpBqGpSNlQQmWlntDbmTQSsml +MpcvMqBRhpFRNCcjwZwPZwJfwjHz +QWJsVCQDbVWbprrWSZWFcmrS +wMwvjRftMLhHfjhdMhRhjtMZrmrmZqBSpBSprvSpTzBTSF +dLNNjhhhVDlNDspN +MNmmtzlQPQmlttlQlHBGFFsHsPnGnFGWgs +CwhhwVZcRVRcCRDWLDFHWWFGss +hwdwdCwCZVSwZcrvhVwCJtbtQtpzmzQHvtpzQmmmpp +CccMdVLJcnCVhCfmjGjlfwwwMwWG +HDSbggDTNbRDHtTgrDpwmnGFfpGgfWfBFmlm +HbDzvQNzHbQLnQddZCcn +jWlqRjWwsqjHHqRDDPMPgpMLpgSMnggC +VQvFfFbdTcfhbcvCpvPrnZgLLpSgLp +PNQVbNTTcbdbfQdbmdVVGfbhBJlHWqGljJqBlqJJlsJJwqqR +WFGnWBTrvtgnjBWsFWggTPlhSfmRSRhZMcSfhZZpRmtZ +CdswHJHNsCbHLVVcZclphwcchfphZZ +LdDCLHsHzbNNNQDsJLNGgPPBvFzjggPrPTrrFB +pGFwwLTPjDcSCPpSdsqtMRMDdVQdVVQz +JBJjZgWgJHvHJgJJbBhNJvgZzsQVRqzdfQQQMMBszRzRzRfV +nlNZWZlJngbvNjgZhNvHhJvprcTclFCcTPSlTCcSpFcLrG +PdHJVCbSJmSVHdLdHbsbsqRwnlDWhZnZccWqDwqDVw +NvMFlGrQTvgpggFNwZhwWWhhqRWRhTqz +gMjvtMpNMrfFrvlffgmdjLLjCmmLHBddLJBS +zNrlzhJGdlHGHplCJQQVbLhRFRbccDSbVDLqRb +WwmwnWjvjmjZPPFFFRDZqVbqqJBS +tmjMJstnWnjvnsTnQMfrQMldrGlCrGfl +MqWfZlpjMPBgffgPNNQnVnnqRsNVLVmR +TcwGCTSvthpzCCTNVnsQVSnRnRQnNn +TbrpDvvCvCwTGDzvzhpzDzljHBZbHWZgHPZJZjJJHfPf +DWNNQQHRpsRWDQPQqHqqgJBCsjjsFFFngBzgjJzl +tMhMwTrTDLMdmMLtMMrbmVbZhJJnnFCCjnlJjjjjBzFBgZ +ttTtDmbfqWcWfqPp +QhvTQqggFsmvjsFTmqZrzzwZrHnwpnplpZ +WCJVGCSLtDPPtHDbHDbdpnrMnMrrpwlZrwpznLpl +VVJbbVfStVHJJVtGmvsfjvssFFTvvsQj +pBCqCqhWjpnWCnffJDjfWzJBZdcvwcPdvJvJcgcrdGdvggrv +tlhbHbmNTbQgbGRvbZGrcg +tVFLQNVlmTmQLQhpzMCBzCpzjjFMnz +qhWHwNqLHrLJjqgHddFchMdnnGnRhMcR +pTzTPVfZQPffNVtVVZfptRGsRbbbbcDsMMZsMZMdRn +CfzPVzCfPBzPBqvWqgBwjNLjjS