Skip to content

Instantly share code, notes, and snippets.

@enrique-ramirez
Last active December 6, 2018 12:19
Show Gist options
  • Save enrique-ramirez/337f6d26cc5d68783f1164b071ca2da6 to your computer and use it in GitHub Desktop.
Save enrique-ramirez/337f6d26cc5d68783f1164b071ca2da6 to your computer and use it in GitHub Desktop.
Advent of Code y(2018) solutions in JavaScript
/**
* --- Day 1: Chronal Calibration ---
* "We've detected some temporal anomalies," one of Santa's Elves at the Temporal Anomaly Research and Detection Instrument Station tells you. She sounded pretty worried when she called you down here. "At 500-year intervals into the past, someone has been changing Santa's history!"
*
* "The good news is that the changes won't propagate to our time stream for another 25 days, and we have a device" - she attaches something to your wrist - "that will let you fix the changes with no such propagation delay. It's configured to send you 500 years further into the past every few days; that was the best we could do on such short notice."
*
* "The bad news is that we are detecting roughly fifty anomalies throughout time; the device will indicate fixed anomalies with stars. The other bad news is that we only have one device and you're the best person for the job! Good lu--" She taps a button on the device and you suddenly feel like you're falling. To save Christmas, you need to get all fifty stars by December 25th.
*
* Collect stars by solving puzzles. Two puzzles will be made available on each day in the advent calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one star. Good luck!
*
* After feeling like you've been falling for a few minutes, you look at the device's tiny screen. "Error: Device must be calibrated before first use. Frequency drift detected. Cannot maintain destination lock." Below the message, the device shows a sequence of changes in frequency (your puzzle input). A value like +6 means the current frequency increases by 6; a value like -3 means the current frequency decreases by 3.
*
* For example, if the device displays frequency changes of +1, -2, +3, +1, then starting from a frequency of zero, the following changes would occur:
*
* Current frequency 0, change of +1; resulting frequency 1.
* Current frequency 1, change of -2; resulting frequency -1.
* Current frequency -1, change of +3; resulting frequency 2.
* Current frequency 2, change of +1; resulting frequency 3.
*
* In this example, the resulting frequency is 3.
*
* Here are other example situations:
*
* +1, +1, +1 results in 3
* +1, +1, -2 results in 0
* -1, -2, -3 results in -6
*
* Starting with a frequency of zero, what is the resulting frequency after all of the changes in frequency have been applied?
*/
const input = `-16
+12
-6
-16
+4
+19
-10
+20
-16
-6
+3
-12
-7
+6
-12
-7
-15
-2
+11
+5
+5
-9
-14
-3
-4
+16
+11
+7
+17
-4
+17
+1
-9
-6
-14
-8
+3
-13
+14
-8
-5
+16
+18
-4
+10
+16
-4
+9
+14
+8
-19
-11
+19
-13
+8
-4
-6
-7
+4
+6
+6
+7
+6
-3
+10
+13
-19
+5
+8
+16
+3
+11
+7
+2
+8
+5
-8
+10
+6
-2
-16
-9
-1
-11
-12
-8
+17
-16
-5
+16
-9
+13
+3
+6
-16
+4
-6
-19
+5
-6
+7
+8
+20
-1
+6
-3
+16
-17
+10
+1
+20
-15
+13
+10
+15
-9
+6
+11
+14
+8
-3
+5
-14
+2
-14
-19
+1
-5
+1
+18
+1
-13
+11
+10
-19
-13
+7
-16
-5
+13
+16
+18
-2
+6
-11
+9
+11
+6
-7
-17
-18
+6
+3
+19
+20
+4
+15
+11
-13
+12
-7
+10
-5
-14
-16
+11
+10
+2
+13
+7
+9
-18
-5
-17
+14
+16
-3
+9
+6
-17
+16
+6
+14
+12
+11
+7
+17
+11
-15
+8
+17
+17
+2
-15
-16
+15
+15
-2
+16
-10
+2
+5
-16
+8
-19
+5
-2
+7
-16
+10
-9
-11
+13
+11
+4
-3
+15
-1
+10
+18
-4
-1
-12
+6
+15
-3
-17
+3
+21
+2
-18
-15
-21
-16
+5
-20
+7
-5
-16
+18
-19
+14
+10
-19
-15
-14
+13
-15
+6
-13
+17
+4
+15
-7
-13
+21
+17
-8
-4
+9
-11
+4
-1
-15
-20
-14
-9
-11
-17
-11
-12
-4
+3
-10
-13
+18
-14
+10
+18
+6
-13
+9
-1
-4
+8
+6
+25
-11
-11
+19
+15
+15
-2
-16
+11
+8
-13
-4
-5
+2
+5
+20
-14
-18
+17
-4
+12
+8
-11
+17
+13
+8
-19
-1
+11
+29
+5
+26
+14
-1
+10
-16
+11
+12
-4
-15
-16
+32
-8
+5
+12
-4
+21
-7
-7
-31
-5
-15
-16
+9
-36
-11
-25
+16
+12
+14
-72
+7
+4
+15
+15
+16
+39
+73
+20
-14
+6
+13
-2
+1
-28
+75
-14
+15
+8
-10
-3
-16
-6
-19
-5
-24
-24
+106
+14
-2
+19
-8
-16
-13
+33
+20
-2
-2
+24
-2
-11
+8
+4
+9
+32
-9
+19
-2
-22
-6
+50
-17
+10
+6
+23
+10
+3
+88
+112
+11
+18
+12
+55
+9
+29
+13
-88
+6
+423
+55676
+1
-8
-16
-16
+19
+7
-5
+4
-3
-16
+9
+3
-7
-10
-8
-3
-4
+8
-7
-15
+2
-1
+8
+3
+4
-3
+13
-19
-15
-11
+10
+3
-9
-19
-1
-4
+19
+13
-10
+14
+9
+14
+15
-8
-24
-15
+11
-1
-16
-15
-4
-18
-5
+10
-8
-3
+2
+13
+14
+7
+12
-9
+17
-9
-9
-21
+6
+17
-24
-6
+10
+13
-20
-15
-14
-11
-3
-8
-1
+15
+9
-17
-18
+4
+6
-11
-19
-7
+18
-4
-12
-5
-18
-3
+10
-4
-10
-11
+6
+11
+6
+8
+12
+8
-1
+19
+14
-1
-3
+19
-5
+15
+3
+1
+22
-19
-8
-2
-9
+13
+1
-7
+18
+16
+4
+6
+19
-18
+2
+3
+34
-14
+8
+7
+12
+9
-15
+24
+7
+11
-4
-13
+16
+7
-13
-15
-12
+20
+21
-4
+21
+19
+19
+10
-7
-9
+11
-6
+5
+5
-13
-17
+8
+4
-13
-8
+14
+11
+7
-9
-17
-3
-5
-16
+9
-2
-8
-3
+10
+16
+18
+5
+15
+14
+2
+15
-8
+1
+15
+11
+18
-5
+3
-13
-9
-19
+15
-7
-14
-18
+12
-1
+16
-8
+9
+16
+20
-16
+11
+1
+14
-16
-4
+3
+14
+10
+12
-16
-4
+14
-19
-12
-20
+17
-16
-6
+15
-20
-16
-17
+10
+13
-14
+18
-6
+3
-10
-3
+4
+13
-16
-7
+31
+11
+1
+1
+13
-5
-5
+21
+18
+20
-9
-3
-9
-11
+8
-1
-4
+14
+14
-15
-6
+14
+1
+2
+14
+21
+8
-15
+20
-10
-20
-5
-10
-17
-15
+16
-8
+16
+15
+12
+11
-3
+21
-17
+6
-15
+1
-19
+8
+21
-16
-19
+8
+7
-8
+3
-20
-39
-18
+14
-12
-29
+3
-14
-10
-9
-3
-22
-8
+1
+3
-5
-1
-19
-25
+9
-7
-14
+19
+19
-27
-6
+27
+10
+29
+19
-23
+17
-10
+5
+13
-15
-25
+13
+3
+14
-37
+6
+18
+18
+89
+57
-17
+39
-2
+27
+13
-18
-17
+9
+1
+14
-4
+10
-19
+18
+7
+13
+8
+7
+11
-7
-9
-3
-4
+9
+24
-3
-16
-23
+7
-16
-1
-15
-12
+19
-2
+14
-21
-2
-12
-14
-62
+22
+7
+66
+26
-21
+61
+5
-6
+11
-7
+18
+67
+38
+18
+30
-18
-120
+24
-18
-16
+31
-102
+11
+149
+96
+9
-40
+69
+13
+757
+55505
+6
+11
+13
-16
+14
-13
-2
-14
-19
+18
-14
-18
+1
+11
+19
-6
-2
-13
+3
-14
-2
+6
+4
+4
-18
+16
-13
-16
+8
+10
-9
+1
-19
+14
-15
-10
+8
-10
-18
-3
-7
+3
+2
+10
-18
-2
-18
+17
-13
-9
+16
-3
-19
-7
-6
-10
+6
-12
+17
-18
+11
+5
-2
-4
-15
-2
-19
-9
+15
-4
-17
+16
+17
+13
-7
-9
+10
-5
-11
+4
-16
-19
-13
-8
-8
+18
-6
+19
+2
+16
-11
+18
+3
-14
+2
+7
+19
-8
+24
-9
+17
+9
+10
-8
-4
-8
+24
+19
-6
+4
+13
+4
+18
-8
+12
-17
-17
-2
-17
-11
-2
+5
-6
+2
+8
-5
-16
-17
+5
-1
-6
-12
-9
-14
-17
+5
-2
-17
-11
+9
-12
+4
-8
+2
+9
+18
+19
+20
-23
-5
+6
+21
+12
+28
+23
-4
+10
+16
+15
+6
+9
-10
-1
+18
-21
-10
+20
-15
-9
+21
+5
-15
-15
+12
+29
-12
+21
-2
-8
+4
+5
-11
+19
-14
-113326`
// Create a proper array with the challenge's input
const formattedInput = input.split('\n')
// Answer 1 is a simple reduce scenario
const answer1 = formattedInput.reduce((acc, number) => {
return acc + parseInt(number, 10)
}, 0)
/**
* --- Part Two ---
* You notice that the device repeats the same frequency change list over and over. To calibrate the device, you need to find the first frequency it reaches twice.
*
* For example, using the same list of changes above, the device would loop as follows:
*
* Current frequency 0, change of +1; resulting frequency 1.
* Current frequency 1, change of -2; resulting frequency -1.
* Current frequency -1, change of +3; resulting frequency 2.
* Current frequency 2, change of +1; resulting frequency 3.
* (At this point, the device continues from the start of the list.)
* Current frequency 3, change of +1; resulting frequency 4.
* Current frequency 4, change of -2; resulting frequency 2, which has already been seen.
* In this example, the first frequency reached twice is 2. Note that your device might need to repeat its list of frequency changes many times before a duplicate frequency is found, and that duplicates might be found while in the middle of processing the list.
*
* Here are other examples:
*
* +1, -1 first reaches 0 twice.
* +3, +3, +4, -2, -4 first reaches 10 twice.
* -6, +3, +8, +5, -6 first reaches 5 twice.
* +7, +7, -2, -7, -4 first reaches 14 twice.
*
* What is the first frequency your device reaches twice?
*/
// FindFrequency returns the sum of the numbers in sequence.
// Takes an array, a map of results and a start number.
const findFrequency = (array, map, start) => array.reduce((acc, number) => {
const sum = acc + parseInt(number, 10)
if (map[sum] && map.result === null) {
map.result = sum
} else {
map[sum] = true
}
return sum
}, start)
// For answer two, we simply iterate through the list
// until one frequency repeats
const answer2 = ((array) => {
const map = { result: null }
let start = 0
while (map.result === null) {
start = findFrequency(array, map, start)
}
return map.result
})(formattedInput)
// We log our answer
console.log({
answer1, // 416
answer2, // 56752
})
/**
* --- Day 2: Inventory Management System ---
* You stop falling through time, catch your breath, and check the screen on the device. "Destination reached. Current Year: 1518. Current Location: North Pole Utility Closet 83N10." You made it! Now, to find those anomalies.
*
* Outside the utility closet, you hear footsteps and a voice. "...I'm not sure either. But now that so many people have chimneys, maybe he could sneak in that way?" Another voice responds, "Actually, we've been working on a new kind of suit that would let him fit through tight spaces like that. But, I heard that a few days ago, they lost the prototype fabric, the design plans, everything! Nobody on the team can even seem to remember important details of the project!"
*
* "Wouldn't they have had enough fabric to fill several boxes in the warehouse? They'd be stored together, so the box IDs should be similar. Too bad it would take forever to search the warehouse for two similar box IDs..." They walk too far away to hear any more.
*
* Late at night, you sneak to the warehouse - who knows what kinds of paradoxes you could cause if you were discovered - and use your fancy wrist device to quickly scan every box and produce a list of the likely candidates (your puzzle input).
*
* To make sure you didn't miss any, you scan the likely candidate boxes again, counting the number that have an ID containing exactly two of any letter and then separately counting those with exactly three of any letter. You can multiply those two counts together to get a rudimentary checksum and compare it to what your device predicts.
*
* For example, if you see the following box IDs:
*
* abcdef contains no letters that appear exactly two or three times.
* bababc contains two a and three b, so it counts for both.
* abbcde contains two b, but no letter appears exactly three times.
* abcccd contains three c, but no letter appears exactly two times.
* aabcdd contains two a and two d, but it only counts once.
* abcdee contains two e.
* ababab contains three a and three b, but it only counts once.
* Of these box IDs, four of them contain a letter which appears exactly twice, and three of them contain a letter which appears exactly three times. Multiplying these together produces a checksum of 4 * 3 = 12.
*
* What is the checksum for your list of box IDs?
*/
const input = `fonbsmjyqugrapsczckghtvdxl
fonpsmjyquwrnpeczikghtvdxw
fonbsmdymuwrapexzikghtvdxl
fonwsmjyquwrapeczikghttdpl
fonbsmjkquwrapeczjkghtvdxx
yonbsmjyquwrapecgikghtvdxc
donbsmjyquqrapeczikghtadxl
monbsmjyquprgpeczikghtvdxl
fonbsmjyquwvapecqgkghtvdxl
fonbsmjyquwrkphczikghsvdxl
fonbomjyeuwvapeczikghtvdxl
fonwsmjyjuwrapoczikghtvdxl
foybsmjyquwcapeczikghsvdxl
fonbsmjyquwrtaeczikgptvdxl
ponbsmpyquwjapeczikghtvdxl
flnbcmjyquwrqpeczikghtvdxl
fonbsmjyquwrapegzikvbtvdxl
fonbjmjyqgwrazeczikghtvdxl
zoabsmjyquwkapeczikghtvdxl
fonbsmjyquwrapecziktxkvdxl
fonbsxjyrpwrapeczikghtvdxl
fonbsmjbquwqapeciikghtvdxl
lonbsmjyquwraphczikghtvdul
ftnbsmjyquwrapcczikghtxdxl
fonbsmjyqgwrapeczikghtldxc
fonbsmjsquwmapeyzikghtvdxl
fonbsmjyqfwrapecziqghtgdxl
yonbsmjyquwraveczikgftvdxl
fovbsmjyquwrapeczikggkvdxl
fonbsmjyquwrapezzikghbvdvl
fonzsmxyquwrapeczukghtvdxl
fonbemjyquwrapevzikghtvrxl
conbsxjxquwrapeczikghtvdxl
fonbsmjsmewrapeczikghtvdxl
folbsmjyqhwrapqczikghtvdxl
fonbsmjyquwrzneczikghtvdxn
fonbsmjyquirapeczikjhtvdll
fontsmgyquwrgpeczikghtvdxl
fonbsmjyauwrapeczbfghtvdxl
ftnbsmjyquwrapecpifghtvdxl
fonvsmjyqewrapeczikghlvdxl
fonbsljyquwrapecziklhtvdxw
fonbbmjyquwrapeczikghvadxl
ponbsmjyquwrspeczikghivdxl
fonbsmjcquwrapeccikghtvuxl
fonbsmjnquwrapetzikghtvlxl
fonbsmjymuwrapeczieghtvdxr
ffnbsxnyquwrapeczikghtvdxl
fonbsmjytuwrajeczzkghtvdxl
fonssmjyquwhapeczikghkvdxl
fonbsajyuuwrapeczikghlvdxl
fonbsmjyquwrapeczihghtcixl
fohbsmjyquwrapzczirghtvdxl
fonbsmjyquwrapecjqnghtvdxl
fonbsmjytuhrapeczihghtvdxl
foabumjyquwrapeczikghtvdxz
conbsmjyqtwrapeczikggtvdxl
fonbsmjyiqwrapeczokghtvdxl
fondsmjypuwrapeczikghtvjxl
fonbswjyquwrapeczikgvtydxl
fonbsmjyqqwrapeczikkhtvdbl
fonbsmjyquwrapemzitghtvdsl
fonbsmjyquwrspecziegxtvdxl
fonbsmpyquwrgpeczikghtwdxl
fodbsmjqquwrapeczmkghtvdxl
fonbsmjkquwrapeczikghpvdxr
fonbsmjyquwrapeczikshzvmxl
fznbsmjyqulrapeczikghkvdxl
fonbsmjyquwripeczikghtbdjl
fcnbsmjyquzrapecyikghtvdxl
ronbxmjyquwrapeczikghgvdxl
fonbsmuyvuwrgpeczikghtvdxl
fonbsmjyyuwraplczikghtudxl
poxbsmjyqewrapeczikghtvdxl
foabsmjyquwrapecziqghtvpxl
ponbsmjrquwrapeczikchtvdxl
fonzzmjyquwrapeczikghtvdxs
wonbsmjyquwghpeczikghtvdxl
fofbsejyquwrapeczikgctvdxl
ponbsmjyquwrayegzikghtvdxl
fonbumjyquwripeczikghtvdxf
fonbsmqyquwrapeczikgftvdxv
qonbsmjyquwraplczitghtvdxl
fmnbsajdquwrapeczikghtvdxl
fonbsrjyquwrapempikghtvdxl
fonbsmjyquwrapeczikgotudxw
fonbsmtyquwrapeflikghtvdxl
fzqbsmjyquwrapecjikghtvdxl
fdnbsmjyquwraqeclikghtvdxl
fvnbsijyquwrapechikghtvdxl
fovbsmjyquwsapeczikghqvdxl
ffjbsmjyqgwrapeczikghtvdxl
fonbsmjyquwrapeczvkhhivdxl
forbamjjquwrapeczikghtvdxl
fonbwmjyquwtapeyzikghtvdxl
fonvsmjyquwrapeczikglnvdxl
fonnsmjyguwrapeczikghtvxxl
fopbsmjyquwrapeczikghtvaxz
fonbsmjyquwiapeczikrhavdxl
fonbsujyquwrapeczikthtvdjl
fonpsmkyeuwrapeczikghtvdxl
fonbsmjyquwrapeczqkgttvdxk
fonbsmjyqzwrapeczikgrtddxl
fokbsmjiquwrapeczikgltvdxl
fonbsmjyqbwrapeczikghttdxo
fonbsejyquwrapeczikghbvdal
fonblmjyquwyaveczikghtvdxl
fonbsmjyquwlzpepzikghtvdxl
fonbsmjyqulrapbczigghtvdxl
fonbsmjyxuwrapecziyghtvsxl
fonbyjjyquwrapeczikghtvdxn
fonbhmjyquwrapeczikghtjhxl
fonbspjykuwraieczikghtvdxl
aonbsmjyquwwapeczikchtvdxl
fombsmjyquwyapeczikghtvdll
fonbsmjynuwrapeczivgbtvdxl
xonbsmjfquwrapeczikghqvdxl
fonbyzjyquwzapeczikghtvdxl
fbnbsmjyquwrapeczimgvtvdxl
qonbsmjyquwraoeczikgftvdxl
fonbsrjyquwrapeczikghtvjxm
fonbsmjyquwrapxjzykghtvdxl
fonbwgjyquwrapecziklhtvdxl
fonjcmjyouwrapeczikghtvdxl
fonbsmjyquwrapefzisuhtvdxl
fonbsmjyqywrspeczikghtvnxl
qonbsmjyquwrapeczlkuhtvdxl
fonbsmjyqlprapeczikghtvdbl
fonbsmjzquwrapedzikfhtvdxl
fonbsmjyquwrapeczizghtvjxq
fonbsmxyquwrrpeczikghtvcxl
fonpsmjyquwoapeczikghjvdxl
fonbshkyauwrapeczikghtvdxl
fonbsmjysuwrapeczilghpvdxl
fovwsxjyquwrapeczikghtvdxl
fonbsmjyquwrppecnikghmvdxl
fonbkmjyiuwrrpeczikghtvdxl
gonbsmjyquwrapeczikphtudxl
foncsmjyqlwrapeczimghtvdxl
fonbsmjhquwrtpeczikghtvdxg
fogbsmjyquarapeczikghtvdil
fonbsmjyquwraperzekghwvdxl
fonbstjyquwrapeczicghtedxl
fonbsmjoquhrapeczikgotvdxl
fonbsmjykuwrareczikgdtvdxl
fonbsmjyvuwrayeczivghtvdxl
fonbzmgyquwraptczikghtvdxl
fonbsmjyqubrapeczikgftvdxb
fonbgmjyjuwrapeczikghtvdul
fonbsmjzqurrapeczikghtvfxl
fonbsmjyiuwrapeczikgstvtxl
fpnbstjyquwrapeczikghtvdcl
fonbpmjyquwrapeczivghtndxl
fonbsmjyquwrapeczilgptvvxl
fonbsmjyqdwripecbikghtvdxl
fonbsmjytuwgapnczikghtvdxl
fonbsejyquwrapedzikghtvdml
fonbsojyqdwrapeczikghtgdxl
fonbsmjykuwrayeczicghtvdxl
foubsmtyquwrapeczikchtvdxl
fonbqmjyqukrapeyzikghtvdxl
fonbsmjyquwaapenzikghtvdwl
fonbsmeyquwrapeyzixghtvdxl
fonusmjyquhrapeczikgytvdxl
fonbsmjyquwrapwazikqhtvdxl
fonwsmeyquwrapeczikghhvdxl
fonmsmjyquxrspeczikghtvdxl
fonqsmjyqxwrapeczikghtvdml
fonfsmjyquwrapeuzikgatvdxl
fonvsmjyquwrapeczikgrtvdul
fonbsmayquwrapeczikihtvdxm
fonbsmnyquwrapecdifghtvdxl
fonbsmjyeuwraseczikghtvdxo
fonbvvjyquwrapeczikghtvdxi
fonbsmjyquwrapeczbkghtorxl
tonbsmjyqvwrapeczikghtvdcl
fonbsmjyquwrapeczhkgbtvdkl
fonqsmjyquwrapenzibghtvdxl
fontsmeyqudrapeczikghtvdxl
qonbsmjyauwrapeczikghtvdbl
fynbsmjyluwrapeczekghtvdxl
fonbsmjhquwrappczikghtvdxt
conbsmjyquwrapeczikahtvdxz
fonbsmjyquorapeczikvftvdxl
fonbsriyquwrapeczikchtvdxl
yonfsmjyquwrapeczikghtvdxq
fonaomjyquwrapecziwghtvdxl
fonbsxsyqdwrapeczikghtvdxl
fonbsqjyouwrapeczikgltvdxl
fonbstsyquwraleczikghtvdxl
fonbsmjyquwraoecztkghtvdsl
fonbsmjyquwrapezzjkghmvdxl
fonbwmjyqnwrapecpikghtvdxl
fonbsmvyqbwrapeczikghtvdsl
fonbsijyquwrazeczikghtvdwl
fonbsmjyouwrapewzikghtldxl
xonbsmjyqcwrapeczikghtvdul
fonbgmjxquwrajeczikghtvdxl
fokbsmjyquwrapechikghtrdxl
fonbqmjyqawrapeczikghtrdxl
fonbwmjzquwtapeyzikghtvdxl
fonbsmjyquwrapecdikgatvdnl
fonbsmjyqowrkpeczikghtvdxj
fonbsmjyquwkapejzikuhtvdxl
fonbsmjyquwrabeozikghtmdxl
fonbsijyeuwrapeczikghtvdxh
fonbsmjhquprapeczizghtvdxl
fonesmjyquwrapcczikghtvdxh
fonbamjyquwrapeczifrhtvdxl
foabsmjyquwpapeczikghtvdxs
fonbsmjyquwrapeczukghivdxh
fonbsejyoulrapeczikghtvdxl
fonbsmjyquwraceczikgdmvdxl
eonbsmjyquerppeczikghtvdxl
ffnzsmjyquwgapeczikghtvdxl
donbsmyyquwrapeczirghtvdxl
fjnbsmjyqufrapeczikghtwdxl
fonfsmjyquwrareczigghtvdxl
fonusmjyquwrapeczikgetvexl
tonbsmjyqpwrapeczikghtjdxl
fonbsmjhqukkapeczikghtvdxl
fonbsmjyqusraseczikghtvzxl
fonbsmjyquygapeczxkghtvdxl
folbsmjyquwraqeczikghjvdxl
fonbsmjyquwrppecjinghtvdxl
fonbsmjyquwraepczhkghtvdxl
fonbfmjyquwrapeczisghtrdxl
fsnbsmjwqubrapeczikghtvdxl
fonbspjyquwrapjczikghtedxl
fowbsmjyquwrapeczikghtbdbl
fonbymjyquwrapeczikghlvdrl
fonbsmjyruwrapecbikghtvixl
fonyqmjyqufrapeczikghtvdxl
focbscjyquwrapeczmkghtvdxl
fonbsmjyqtwnkpeczikghtvdxl
eonbsmjyquwrameczizghtvdxl
zonbsmjyqcwrapeczikghtvhxl
foubsmjyquwrapehzikghtvnxl
ffnbsmjyquwrapetzikghtjdxl
fonbjgjyquwrapkczikghtvdxl
fonbwmjyquwqapeczdkghtvdxl
forbsmjyquwrapeczikkhtvdml
fonbsmjyiuwrapeczivghevdxl
fonbsmjyquwrapeglikghwvdxl
fopgsmjyquwrapegzikghtvdxl
fonbsmjyqzwrajeczikghtldxl
fonbsmjyruwrapexzmkghtvdxl
fonbsmjyquwrdpeczikxstvdxl
fonbsmjyquwrapeezivghtvdql
fonbdmjyqujsapeczikghtvdxl`
// Create a proper array with the challenge's input
const formattedInput = input.split('\n')
// Small function to count occurrencies of an element in an array.
const countOccurrencies = (array, element) => {
return array.filter(el => el === element).length
}
// How many elements in our input have letters that repeat
// exactly 2, and how many exactly 3?
const frequencies = formattedInput.reduce((acc, value) => {
const array = value.split('')
const map = array.reduce((accumulator, letter) => {
if (accumulator[letter]) {
accumulator[letter] += 1
} else {
accumulator[letter] = 1
}
return accumulator
}, {})
const letterFrequencies = Object.values(map)
const twoOccurrencies = countOccurrencies(letterFrequencies, 2)
const threeOccurrencies = countOccurrencies(letterFrequencies, 3)
acc.two = twoOccurrencies ? acc.two + 1 : acc.two
acc.three = threeOccurrencies ? acc.three + 1 : acc.three
return acc
}, { two: 0, three: 0 })
// Answer 1
const answer1 = Object.values(frequencies).reduce((acc, val) => acc * val)
/**
* --- Part Two ---
* Confident that your list of box IDs is complete, you're ready to find the boxes full of prototype fabric.
*
* The boxes will have IDs which differ by exactly one character at the same position in both strings. For example, given the following box IDs:
*
* abcde
* fghij
* klmno
* pqrst
* fguij
* axcye
* wvxyz
*
* The IDs abcde and axcye are close, but they differ by two characters (the second and fourth). However, the IDs fghij and fguij differ by exactly one character, the third (h and u). Those must be the correct boxes.
*
* What letters are common between the two correct box IDs? (In the example above, this is found by removing the differing character from either ID, producing fgij.)
*/
// This function takes a string and an array.
// It will return the shared letters
const findSimilar = (string, array) => {
const stringArray = string.split('')
let similarities = ''
array.some((element) => {
const elementArray = element.split('')
let answer = ''
if (element === string || elementArray.length !== stringArray.length) {
return
}
const hits = elementArray.filter((letter, index) => {
return letter === stringArray[index]
})
answer = hits.length === (elementArray.length - 1) ? hits.join('') : ''
if (answer) {
similarities = answer
}
return answer
})
return similarities
}
// Answer 2
const answer2 = formattedInput.reduce((acc, element, index, array) => {
const hasSimilar = findSimilar(element, array.slice(index))
return hasSimilar.length ? hasSimilar : acc
}, '')
// We log our answers
console.log({
answer1, // 4920
answer2, // fonbwmjquwtapeyzikghtvdxl
})
/**
*--- Day 3: No Matter How You Slice It ---
* The Elves managed to locate the chimney-squeeze prototype fabric for Santa's suit (thanks to someone who helpfully wrote its box IDs on the wall of the warehouse in the middle of the night). Unfortunately, anomalies are still affecting them - nobody can even agree on how to cut the fabric.
*
* The whole piece of fabric they're working on is a very large square - at least 1000 inches on each side.
*
* Each Elf has made a claim about which area of fabric would be ideal for Santa's suit. All claims have an ID and consist of a single rectangle with edges parallel to the edges of the fabric. Each claim's rectangle is defined as follows:
*
* The number of inches between the left edge of the fabric and the left edge of the rectangle.
* The number of inches between the top edge of the fabric and the top edge of the rectangle.
* The width of the rectangle in inches.
* The height of the rectangle in inches.
* A claim like #123 @ 3,2: 5x4 means that claim ID 123 specifies a rectangle 3 inches from the left edge, 2 inches from the top edge, 5 inches wide, and 4 inches tall. Visually, it claims the square inches of fabric represented by # (and ignores the square inches of fabric represented by .) in the diagram below:
*
* ...........
* ...........
* ...#####...
* ...#####...
* ...#####...
* ...#####...
* ...........
* ...........
* ...........
*
* The problem is that many of the claims overlap, causing two or more claims to cover part of the same areas. For example, consider the following claims:
*
* #1 @ 1,3: 4x4
* #2 @ 3,1: 4x4
* #3 @ 5,5: 2x2
* Visually, these claim the following areas:
*
* ........
* ...2222.
* ...2222.
* .11XX22.
* .11XX22.
* .111133.
* .111133.
* ........
*
* The four square inches marked with X are claimed by both 1 and 2. (Claim 3, while adjacent to the others, does not overlap either of them.)
*
* If the Elves all proceed with their own plans, none of them will have enough fabric. How many square inches of fabric are within two or more claims?
*/
const input = `#1 @ 872,519: 18x18
#2 @ 309,394: 15x21
#3 @ 655,494: 12x23
#4 @ 298,689: 12x25
#5 @ 88,316: 20x10
#6 @ 461,76: 10x17
#7 @ 413,502: 19x29
#8 @ 440,834: 19x24
#9 @ 964,907: 21x23
#10 @ 398,72: 12x19
#11 @ 260,39: 17x12
#12 @ 410,568: 27x24
#13 @ 220,304: 28x21
#14 @ 921,334: 17x24
#15 @ 203,366: 13x14
#16 @ 123,904: 24x28
#17 @ 361,924: 15x25
#18 @ 63,475: 16x23
#19 @ 856,389: 27x22
#20 @ 805,35: 15x27
#21 @ 544,395: 29x18
#22 @ 597,522: 17x18
#23 @ 202,885: 16x12
#24 @ 546,636: 28x21
#25 @ 872,224: 28x24
#26 @ 5,649: 25x10
#27 @ 446,895: 20x28
#28 @ 447,764: 22x17
#29 @ 797,721: 22x22
#30 @ 262,528: 27x16
#31 @ 381,531: 11x23
#32 @ 672,580: 11x25
#33 @ 885,889: 29x24
#34 @ 830,749: 28x23
#35 @ 484,635: 16x14
#36 @ 693,619: 18x21
#37 @ 246,652: 12x27
#38 @ 760,346: 12x4
#39 @ 667,154: 23x16
#40 @ 58,695: 24x11
#41 @ 662,250: 19x17
#42 @ 401,950: 3x4
#43 @ 529,596: 29x23
#44 @ 71,768: 18x27
#45 @ 474,562: 11x26
#46 @ 328,100: 15x24
#47 @ 825,386: 24x21
#48 @ 564,706: 13x18
#49 @ 347,152: 17x26
#50 @ 827,921: 29x14
#51 @ 580,230: 10x15
#52 @ 929,459: 12x28
#53 @ 48,841: 18x29
#54 @ 383,356: 29x26
#55 @ 921,38: 27x24
#56 @ 895,382: 20x23
#57 @ 676,91: 12x24
#58 @ 687,10: 14x22
#59 @ 352,189: 25x26
#60 @ 578,500: 29x21
#61 @ 248,32: 16x15
#62 @ 158,950: 17x19
#63 @ 193,726: 17x20
#64 @ 213,673: 23x18
#65 @ 633,739: 14x10
#66 @ 482,741: 11x27
#67 @ 143,670: 17x22
#68 @ 397,889: 22x28
#69 @ 855,733: 14x27
#70 @ 12,537: 12x4
#71 @ 32,65: 12x25
#72 @ 527,755: 14x29
#73 @ 560,69: 20x22
#74 @ 550,257: 11x29
#75 @ 65,46: 25x11
#76 @ 661,767: 25x23
#77 @ 236,252: 17x28
#78 @ 950,964: 17x17
#79 @ 304,746: 11x13
#80 @ 818,320: 29x23
#81 @ 509,370: 24x29
#82 @ 344,949: 10x28
#83 @ 22,636: 24x25
#84 @ 237,50: 26x27
#85 @ 353,950: 23x24
#86 @ 177,425: 20x22
#87 @ 374,122: 29x19
#88 @ 606,383: 20x13
#89 @ 162,935: 21x19
#90 @ 129,460: 23x12
#91 @ 169,207: 20x10
#92 @ 209,883: 12x27
#93 @ 718,379: 12x15
#94 @ 79,656: 17x25
#95 @ 933,492: 25x24
#96 @ 387,891: 21x22
#97 @ 360,312: 29x23
#98 @ 737,879: 29x28
#99 @ 969,337: 24x17
#100 @ 737,135: 22x20
#101 @ 278,798: 26x24
#102 @ 71,837: 29x14
#103 @ 34,620: 20x26
#104 @ 509,787: 20x23
#105 @ 586,245: 21x27
#106 @ 779,126: 24x27
#107 @ 571,197: 15x22
#108 @ 592,431: 13x22
#109 @ 834,30: 18x19
#110 @ 745,618: 16x28
#111 @ 89,31: 14x16
#112 @ 54,529: 22x29
#113 @ 900,906: 28x15
#114 @ 119,818: 15x13
#115 @ 200,865: 18x15
#116 @ 953,158: 12x15
#117 @ 606,65: 13x14
#118 @ 481,505: 14x22
#119 @ 317,201: 14x25
#120 @ 246,771: 15x15
#121 @ 277,269: 23x16
#122 @ 686,1: 19x17
#123 @ 388,162: 24x17
#124 @ 945,671: 27x14
#125 @ 599,504: 23x22
#126 @ 927,725: 13x25
#127 @ 468,513: 15x20
#128 @ 556,325: 13x19
#129 @ 526,273: 13x15
#130 @ 123,245: 18x13
#131 @ 191,869: 11x21
#132 @ 954,648: 11x27
#133 @ 962,963: 19x15
#134 @ 768,127: 11x23
#135 @ 814,365: 10x22
#136 @ 349,748: 24x29
#137 @ 345,553: 21x18
#138 @ 401,888: 14x20
#139 @ 342,879: 19x16
#140 @ 248,707: 23x25
#141 @ 559,707: 11x15
#142 @ 778,93: 12x26
#143 @ 690,904: 21x25
#144 @ 358,92: 28x12
#145 @ 618,591: 19x22
#146 @ 727,834: 27x29
#147 @ 401,219: 14x13
#148 @ 791,443: 10x25
#149 @ 633,248: 26x17
#150 @ 231,660: 25x24
#151 @ 935,121: 12x24
#152 @ 177,935: 23x23
#153 @ 822,778: 20x21
#154 @ 972,929: 26x13
#155 @ 87,957: 23x18
#156 @ 663,595: 19x27
#157 @ 523,819: 19x19
#158 @ 209,714: 22x19
#159 @ 644,216: 14x8
#160 @ 459,794: 12x14
#161 @ 560,926: 26x21
#162 @ 200,860: 11x13
#163 @ 535,250: 18x28
#164 @ 246,436: 19x12
#165 @ 100,7: 19x13
#166 @ 927,325: 27x29
#167 @ 512,160: 21x28
#168 @ 647,858: 14x19
#169 @ 45,646: 26x16
#170 @ 48,55: 10x21
#171 @ 520,608: 17x20
#172 @ 676,64: 26x26
#173 @ 668,51: 22x22
#174 @ 268,323: 20x26
#175 @ 626,798: 11x14
#176 @ 595,47: 25x28
#177 @ 703,655: 18x25
#178 @ 701,900: 15x28
#179 @ 907,336: 26x10
#180 @ 801,327: 19x23
#181 @ 378,444: 28x16
#182 @ 205,123: 5x17
#183 @ 903,595: 21x25
#184 @ 767,138: 23x21
#185 @ 963,370: 14x23
#186 @ 685,508: 28x24
#187 @ 425,609: 14x19
#188 @ 643,312: 19x29
#189 @ 263,409: 28x24
#190 @ 194,604: 12x26
#191 @ 956,812: 27x11
#192 @ 346,777: 18x16
#193 @ 417,0: 26x11
#194 @ 537,213: 27x24
#195 @ 257,523: 24x16
#196 @ 240,448: 23x16
#197 @ 440,761: 10x24
#198 @ 76,20: 26x11
#199 @ 778,205: 24x24
#200 @ 107,752: 22x19
#201 @ 366,626: 14x10
#202 @ 342,695: 24x19
#203 @ 67,925: 29x13
#204 @ 267,615: 13x24
#205 @ 530,595: 10x20
#206 @ 219,967: 15x21
#207 @ 351,76: 10x20
#208 @ 585,236: 27x13
#209 @ 323,548: 25x20
#210 @ 270,337: 29x22
#211 @ 257,425: 27x18
#212 @ 670,304: 18x11
#213 @ 252,652: 27x12
#214 @ 567,413: 25x10
#215 @ 117,696: 19x17
#216 @ 925,914: 27x23
#217 @ 394,343: 14x10
#218 @ 661,166: 10x21
#219 @ 469,920: 29x12
#220 @ 54,400: 17x24
#221 @ 814,184: 18x3
#222 @ 205,260: 16x28
#223 @ 810,181: 26x12
#224 @ 265,342: 14x15
#225 @ 785,674: 16x24
#226 @ 810,515: 13x28
#227 @ 767,861: 11x26
#228 @ 277,296: 24x16
#229 @ 20,555: 14x10
#230 @ 591,806: 14x11
#231 @ 96,568: 11x27
#232 @ 387,447: 16x24
#233 @ 333,696: 22x23
#234 @ 890,598: 25x17
#235 @ 427,698: 18x11
#236 @ 421,322: 17x18
#237 @ 179,188: 10x27
#238 @ 894,915: 10x27
#239 @ 110,838: 15x24
#240 @ 640,831: 26x29
#241 @ 107,209: 28x20
#242 @ 68,910: 15x17
#243 @ 227,318: 16x16
#244 @ 576,552: 14x28
#245 @ 854,527: 22x23
#246 @ 676,89: 11x14
#247 @ 280,16: 22x22
#248 @ 871,406: 23x25
#249 @ 389,396: 24x21
#250 @ 299,615: 26x24
#251 @ 215,516: 24x22
#252 @ 512,602: 27x23
#253 @ 520,737: 25x21
#254 @ 199,198: 16x21
#255 @ 897,450: 20x28
#256 @ 602,173: 28x16
#257 @ 635,22: 17x10
#258 @ 913,765: 27x24
#259 @ 194,319: 19x18
#260 @ 566,550: 13x9
#261 @ 394,433: 22x26
#262 @ 620,354: 10x24
#263 @ 87,44: 17x27
#264 @ 655,585: 28x16
#265 @ 140,666: 11x20
#266 @ 395,47: 10x28
#267 @ 10,878: 24x23
#268 @ 775,820: 24x13
#269 @ 613,875: 21x23
#270 @ 717,465: 12x19
#271 @ 957,607: 23x24
#272 @ 509,845: 19x15
#273 @ 324,798: 12x24
#274 @ 526,406: 18x11
#275 @ 500,525: 29x26
#276 @ 141,386: 21x18
#277 @ 899,780: 17x16
#278 @ 266,412: 10x16
#279 @ 501,298: 22x23
#280 @ 86,392: 27x11
#281 @ 366,878: 21x27
#282 @ 582,114: 16x14
#283 @ 633,282: 24x21
#284 @ 581,769: 28x20
#285 @ 176,696: 21x26
#286 @ 761,902: 19x24
#287 @ 199,764: 13x14
#288 @ 685,909: 19x29
#289 @ 291,364: 15x17
#290 @ 541,903: 21x27
#291 @ 286,478: 20x13
#292 @ 752,925: 13x20
#293 @ 300,655: 18x28
#294 @ 548,234: 19x18
#295 @ 300,553: 27x24
#296 @ 838,49: 15x24
#297 @ 953,623: 26x17
#298 @ 642,212: 28x18
#299 @ 85,684: 13x5
#300 @ 732,83: 12x13
#301 @ 589,678: 23x20
#302 @ 591,235: 19x18
#303 @ 487,579: 15x13
#304 @ 430,608: 20x24
#305 @ 685,163: 15x17
#306 @ 225,324: 11x14
#307 @ 584,51: 29x13
#308 @ 725,382: 13x14
#309 @ 301,804: 21x13
#310 @ 966,68: 21x16
#311 @ 351,125: 28x19
#312 @ 75,384: 21x10
#313 @ 558,77: 27x18
#314 @ 601,617: 20x13
#315 @ 699,884: 15x28
#316 @ 138,237: 28x26
#317 @ 234,663: 21x10
#318 @ 650,556: 27x24
#319 @ 130,970: 24x21
#320 @ 884,348: 12x25
#321 @ 368,145: 24x25
#322 @ 52,38: 17x25
#323 @ 118,843: 27x22
#324 @ 641,812: 25x28
#325 @ 176,617: 15x11
#326 @ 609,592: 10x20
#327 @ 647,336: 29x19
#328 @ 173,286: 19x13
#329 @ 542,684: 17x10
#330 @ 102,621: 21x20
#331 @ 235,956: 15x24
#332 @ 59,910: 22x24
#333 @ 398,65: 16x27
#334 @ 912,870: 28x15
#335 @ 80,311: 24x13
#336 @ 91,1: 11x19
#337 @ 265,17: 16x27
#338 @ 524,816: 16x14
#339 @ 553,687: 26x24
#340 @ 456,639: 29x11
#341 @ 603,539: 27x14
#342 @ 524,8: 20x29
#343 @ 212,377: 26x13
#344 @ 161,914: 27x25
#345 @ 467,571: 13x22
#346 @ 433,148: 13x12
#347 @ 287,779: 25x10
#348 @ 82,762: 21x25
#349 @ 255,300: 29x23
#350 @ 671,716: 13x28
#351 @ 261,892: 10x18
#352 @ 501,373: 12x19
#353 @ 962,215: 18x20
#354 @ 596,110: 13x20
#355 @ 57,830: 27x12
#356 @ 903,215: 17x19
#357 @ 609,943: 16x28
#358 @ 81,959: 25x23
#359 @ 843,405: 23x22
#360 @ 579,304: 11x21
#361 @ 765,718: 22x17
#362 @ 386,833: 19x20
#363 @ 569,433: 19x23
#364 @ 352,186: 25x13
#365 @ 657,491: 24x22
#366 @ 487,669: 22x17
#367 @ 825,15: 24x25
#368 @ 350,129: 11x28
#369 @ 300,28: 15x17
#370 @ 263,645: 29x10
#371 @ 79,857: 17x17
#372 @ 514,13: 28x20
#373 @ 431,459: 11x25
#374 @ 85,221: 11x28
#375 @ 757,645: 22x14
#376 @ 151,326: 24x12
#377 @ 98,10: 21x11
#378 @ 904,873: 18x11
#379 @ 756,605: 25x13
#380 @ 599,422: 24x19
#381 @ 420,146: 21x11
#382 @ 64,264: 27x20
#383 @ 870,832: 13x26
#384 @ 604,45: 21x17
#385 @ 854,893: 19x22
#386 @ 109,749: 18x25
#387 @ 843,24: 25x26
#388 @ 198,504: 10x14
#389 @ 282,332: 25x28
#390 @ 611,584: 14x14
#391 @ 811,607: 15x12
#392 @ 125,671: 16x23
#393 @ 387,396: 13x29
#394 @ 190,248: 19x12
#395 @ 200,431: 27x17
#396 @ 674,168: 21x14
#397 @ 572,378: 11x29
#398 @ 900,186: 21x15
#399 @ 653,903: 16x24
#400 @ 964,207: 20x24
#401 @ 916,325: 14x16
#402 @ 894,330: 11x19
#403 @ 583,294: 26x22
#404 @ 893,616: 26x29
#405 @ 626,329: 11x19
#406 @ 816,895: 18x20
#407 @ 888,389: 15x13
#408 @ 617,291: 25x29
#409 @ 435,697: 10x21
#410 @ 104,91: 17x11
#411 @ 370,931: 10x10
#412 @ 163,187: 14x10
#413 @ 453,714: 11x16
#414 @ 408,669: 20x15
#415 @ 563,572: 17x17
#416 @ 299,519: 20x20
#417 @ 969,966: 13x22
#418 @ 728,76: 19x13
#419 @ 976,894: 24x28
#420 @ 492,640: 19x17
#421 @ 258,325: 27x11
#422 @ 742,152: 16x29
#423 @ 588,499: 24x18
#424 @ 685,47: 12x20
#425 @ 295,380: 21x21
#426 @ 829,447: 14x19
#427 @ 66,20: 25x22
#428 @ 824,901: 27x27
#429 @ 238,260: 28x24
#430 @ 357,629: 26x24
#431 @ 700,530: 20x20
#432 @ 738,351: 19x25
#433 @ 541,902: 17x21
#434 @ 118,129: 27x14
#435 @ 886,854: 25x28
#436 @ 14,209: 24x11
#437 @ 846,404: 26x21
#438 @ 939,150: 20x16
#439 @ 938,702: 26x17
#440 @ 4,207: 19x14
#441 @ 595,900: 21x10
#442 @ 463,477: 23x13
#443 @ 433,463: 23x11
#444 @ 773,407: 27x20
#445 @ 894,772: 11x22
#446 @ 918,766: 19x15
#447 @ 886,771: 13x10
#448 @ 664,140: 16x17
#449 @ 259,599: 16x7
#450 @ 82,855: 16x29
#451 @ 213,358: 19x29
#452 @ 555,899: 23x22
#453 @ 487,369: 24x13
#454 @ 41,524: 17x13
#455 @ 694,431: 29x14
#456 @ 707,680: 17x10
#457 @ 216,126: 28x24
#458 @ 888,242: 10x12
#459 @ 653,254: 14x22
#460 @ 587,252: 24x11
#461 @ 593,939: 18x29
#462 @ 432,511: 21x24
#463 @ 167,75: 28x20
#464 @ 599,874: 18x10
#465 @ 857,596: 11x26
#466 @ 673,153: 14x19
#467 @ 175,87: 26x24
#468 @ 921,560: 25x21
#469 @ 717,160: 11x13
#470 @ 201,306: 17x17
#471 @ 229,449: 14x15
#472 @ 698,288: 16x11
#473 @ 644,122: 12x15
#474 @ 611,609: 15x24
#475 @ 125,399: 24x15
#476 @ 498,546: 17x19
#477 @ 351,618: 12x23
#478 @ 752,902: 12x10
#479 @ 342,632: 15x12
#480 @ 342,142: 15x14
#481 @ 346,966: 24x14
#482 @ 579,125: 11x24
#483 @ 440,511: 25x29
#484 @ 930,919: 25x11
#485 @ 489,573: 14x25
#486 @ 543,888: 22x25
#487 @ 975,915: 18x15
#488 @ 32,678: 27x24
#489 @ 759,944: 21x11
#490 @ 39,722: 16x20
#491 @ 62,925: 23x10
#492 @ 507,311: 22x17
#493 @ 710,424: 14x22
#494 @ 614,493: 12x24
#495 @ 397,943: 20x11
#496 @ 855,21: 29x27
#497 @ 518,532: 19x21
#498 @ 179,73: 17x28
#499 @ 896,126: 11x13
#500 @ 424,253: 18x26
#501 @ 122,203: 19x17
#502 @ 67,750: 21x25
#503 @ 733,372: 15x12
#504 @ 929,576: 25x29
#505 @ 43,909: 28x20
#506 @ 115,509: 17x25
#507 @ 205,94: 13x13
#508 @ 380,75: 21x12
#509 @ 272,753: 17x13
#510 @ 114,285: 24x13
#511 @ 762,794: 24x15
#512 @ 966,207: 25x19
#513 @ 847,653: 7x14
#514 @ 518,131: 16x12
#515 @ 661,940: 19x27
#516 @ 166,919: 27x12
#517 @ 171,327: 23x12
#518 @ 204,111: 22x29
#519 @ 235,339: 15x17
#520 @ 245,5: 27x20
#521 @ 638,295: 24x28
#522 @ 494,288: 26x18
#523 @ 887,92: 29x10
#524 @ 574,65: 11x20
#525 @ 677,583: 11x21
#526 @ 722,661: 23x11
#527 @ 74,386: 22x26
#528 @ 939,727: 19x10
#529 @ 375,422: 21x17
#530 @ 658,559: 21x25
#531 @ 803,585: 19x28
#532 @ 465,706: 18x23
#533 @ 920,314: 19x28
#534 @ 915,574: 17x29
#535 @ 459,676: 21x12
#536 @ 199,953: 11x16
#537 @ 280,432: 22x18
#538 @ 691,671: 15x20
#539 @ 843,743: 17x25
#540 @ 140,194: 27x20
#541 @ 633,807: 22x18
#542 @ 187,300: 23x20
#543 @ 858,156: 23x26
#544 @ 954,406: 12x20
#545 @ 753,99: 21x17
#546 @ 118,582: 17x12
#547 @ 794,683: 17x10
#548 @ 201,667: 29x26
#549 @ 46,521: 25x13
#550 @ 843,735: 22x20
#551 @ 254,254: 23x17
#552 @ 309,667: 29x20
#553 @ 426,285: 16x25
#554 @ 556,392: 20x10
#555 @ 144,49: 14x19
#556 @ 251,248: 12x17
#557 @ 191,604: 24x11
#558 @ 515,949: 10x10
#559 @ 452,645: 14x19
#560 @ 71,949: 13x14
#561 @ 730,408: 17x12
#562 @ 218,734: 20x12
#563 @ 276,234: 24x25
#564 @ 914,755: 16x12
#565 @ 27,222: 23x22
#566 @ 904,783: 22x10
#567 @ 709,625: 18x13
#568 @ 324,426: 25x23
#569 @ 127,707: 23x18
#570 @ 8,295: 29x24
#571 @ 484,11: 25x20
#572 @ 346,310: 23x28
#573 @ 86,364: 20x29
#574 @ 967,372: 4x17
#575 @ 775,158: 14x11
#576 @ 444,62: 20x20
#577 @ 159,327: 11x25
#578 @ 626,466: 5x4
#579 @ 314,473: 14x17
#580 @ 840,714: 14x20
#581 @ 870,922: 14x13
#582 @ 287,779: 13x23
#583 @ 861,901: 16x10
#584 @ 749,329: 23x24
#585 @ 914,790: 27x22
#586 @ 59,646: 10x12
#587 @ 763,420: 16x14
#588 @ 480,82: 20x20
#589 @ 186,641: 19x29
#590 @ 30,159: 11x18
#591 @ 585,629: 29x16
#592 @ 130,464: 15x22
#593 @ 632,9: 12x15
#594 @ 216,965: 22x27
#595 @ 28,538: 14x22
#596 @ 669,538: 11x25
#597 @ 753,847: 21x26
#598 @ 445,498: 29x12
#599 @ 533,511: 17x17
#600 @ 344,422: 19x11
#601 @ 58,850: 14x22
#602 @ 225,268: 10x24
#603 @ 969,920: 14x20
#604 @ 654,159: 20x17
#605 @ 55,859: 28x15
#606 @ 917,927: 20x14
#607 @ 756,585: 22x11
#608 @ 51,638: 15x27
#609 @ 568,379: 21x15
#610 @ 129,277: 23x21
#611 @ 20,362: 22x11
#612 @ 398,948: 10x12
#613 @ 950,627: 24x23
#614 @ 536,556: 29x22
#615 @ 461,490: 28x19
#616 @ 248,208: 19x14
#617 @ 261,45: 20x15
#618 @ 195,72: 18x16
#619 @ 923,560: 26x22
#620 @ 175,900: 19x26
#621 @ 482,62: 18x21
#622 @ 756,143: 7x5
#623 @ 478,767: 22x28
#624 @ 274,902: 25x21
#625 @ 126,224: 20x25
#626 @ 964,624: 19x20
#627 @ 111,294: 25x22
#628 @ 656,345: 11x21
#629 @ 251,449: 21x12
#630 @ 700,416: 29x13
#631 @ 102,277: 27x17
#632 @ 881,292: 18x23
#633 @ 61,0: 24x10
#634 @ 136,975: 21x23
#635 @ 99,839: 29x25
#636 @ 195,516: 26x26
#637 @ 839,670: 22x14
#638 @ 652,242: 15x13
#639 @ 210,202: 28x21
#640 @ 594,171: 19x16
#641 @ 113,753: 10x18
#642 @ 538,943: 29x27
#643 @ 318,651: 20x17
#644 @ 235,238: 21x27
#645 @ 705,514: 20x17
#646 @ 118,757: 14x13
#647 @ 128,159: 18x26
#648 @ 288,660: 25x13
#649 @ 519,676: 14x9
#650 @ 754,808: 14x16
#651 @ 421,32: 20x21
#652 @ 660,351: 18x13
#653 @ 241,163: 20x11
#654 @ 140,293: 23x19
#655 @ 490,410: 25x19
#656 @ 506,590: 14x16
#657 @ 261,46: 19x29
#658 @ 539,787: 28x24
#659 @ 349,548: 11x13
#660 @ 293,19: 25x17
#661 @ 275,380: 18x22
#662 @ 52,513: 29x15
#663 @ 37,169: 18x18
#664 @ 43,150: 27x27
#665 @ 343,333: 18x22
#666 @ 797,371: 25x27
#667 @ 611,57: 26x22
#668 @ 727,900: 25x15
#669 @ 128,3: 11x27
#670 @ 483,734: 29x17
#671 @ 427,405: 17x29
#672 @ 863,626: 28x27
#673 @ 519,172: 26x13
#674 @ 585,407: 21x25
#675 @ 225,266: 16x25
#676 @ 977,113: 14x11
#677 @ 544,579: 16x27
#678 @ 890,592: 20x23
#679 @ 74,914: 21x19
#680 @ 45,530: 27x10
#681 @ 191,757: 23x11
#682 @ 59,226: 25x23
#683 @ 74,303: 19x23
#684 @ 463,305: 22x18
#685 @ 915,749: 24x27
#686 @ 923,89: 12x13
#687 @ 620,5: 29x21
#688 @ 933,710: 16x23
#689 @ 299,915: 12x13
#690 @ 458,30: 28x12
#691 @ 674,127: 28x12
#692 @ 321,817: 18x21
#693 @ 788,464: 5x6
#694 @ 411,19: 19x26
#695 @ 981,58: 10x19
#696 @ 101,71: 12x21
#697 @ 67,245: 22x13
#698 @ 251,41: 25x12
#699 @ 667,337: 10x15
#700 @ 624,751: 17x29
#701 @ 626,819: 20x10
#702 @ 730,826: 15x12
#703 @ 740,914: 19x10
#704 @ 946,163: 16x14
#705 @ 85,334: 29x21
#706 @ 848,754: 12x23
#707 @ 642,740: 12x25
#708 @ 840,40: 20x17
#709 @ 232,190: 19x21
#710 @ 419,194: 13x29
#711 @ 647,720: 23x28
#712 @ 723,528: 22x11
#713 @ 408,557: 20x20
#714 @ 906,553: 16x10
#715 @ 336,223: 29x25
#716 @ 954,288: 22x27
#717 @ 145,439: 27x16
#718 @ 272,740: 22x17
#719 @ 709,842: 20x23
#720 @ 774,723: 19x13
#721 @ 562,548: 21x18
#722 @ 944,161: 16x18
#723 @ 303,346: 29x16
#724 @ 583,245: 10x18
#725 @ 98,14: 13x13
#726 @ 811,542: 19x18
#727 @ 117,353: 13x20
#728 @ 429,62: 19x20
#729 @ 147,53: 25x17
#730 @ 481,523: 23x27
#731 @ 517,932: 10x25
#732 @ 472,518: 26x10
#733 @ 6,384: 10x28
#734 @ 597,693: 21x29
#735 @ 403,892: 6x12
#736 @ 338,703: 22x20
#737 @ 451,54: 28x29
#738 @ 690,224: 23x27
#739 @ 493,500: 10x18
#740 @ 180,68: 29x23
#741 @ 645,881: 13x22
#742 @ 640,641: 13x21
#743 @ 113,700: 22x29
#744 @ 83,331: 17x22
#745 @ 30,907: 18x24
#746 @ 205,854: 25x28
#747 @ 654,518: 28x21
#748 @ 784,462: 14x11
#749 @ 83,678: 20x17
#750 @ 545,583: 25x18
#751 @ 533,805: 16x23
#752 @ 545,497: 11x15
#753 @ 687,549: 19x26
#754 @ 521,693: 24x14
#755 @ 484,725: 26x26
#756 @ 660,52: 11x14
#757 @ 776,399: 15x23
#758 @ 15,304: 16x10
#759 @ 721,647: 12x26
#760 @ 196,439: 14x12
#761 @ 749,8: 18x20
#762 @ 926,45: 14x13
#763 @ 752,136: 15x20
#764 @ 294,632: 29x21
#765 @ 389,404: 24x19
#766 @ 306,963: 12x13
#767 @ 280,947: 17x10
#768 @ 329,99: 20x26
#769 @ 733,843: 13x15
#770 @ 408,157: 25x10
#771 @ 82,353: 16x16
#772 @ 423,14: 21x19
#773 @ 924,331: 24x4
#774 @ 384,155: 28x11
#775 @ 394,223: 25x28
#776 @ 791,465: 26x28
#777 @ 873,852: 12x26
#778 @ 767,307: 26x24
#779 @ 475,62: 24x25
#780 @ 260,621: 19x14
#781 @ 483,367: 13x19
#782 @ 668,294: 10x21
#783 @ 373,350: 18x15
#784 @ 713,535: 22x15
#785 @ 335,536: 24x21
#786 @ 427,627: 24x26
#787 @ 140,138: 26x26
#788 @ 874,506: 12x24
#789 @ 541,80: 11x20
#790 @ 471,32: 9x7
#791 @ 39,732: 28x17
#792 @ 377,565: 17x21
#793 @ 659,949: 10x21
#794 @ 226,955: 21x18
#795 @ 60,566: 25x12
#796 @ 203,253: 16x10
#797 @ 451,800: 20x24
#798 @ 194,862: 18x11
#799 @ 916,857: 24x24
#800 @ 116,277: 25x16
#801 @ 474,714: 11x14
#802 @ 453,289: 11x27
#803 @ 879,80: 18x28
#804 @ 307,811: 12x16
#805 @ 755,341: 21x15
#806 @ 675,512: 25x22
#807 @ 555,676: 19x13
#808 @ 549,241: 10x21
#809 @ 432,282: 24x24
#810 @ 744,9: 23x21
#811 @ 669,760: 18x27
#812 @ 577,797: 15x19
#813 @ 232,348: 27x18
#814 @ 915,230: 22x17
#815 @ 922,329: 29x15
#816 @ 447,629: 18x26
#817 @ 911,389: 25x15
#818 @ 850,752: 10x21
#819 @ 313,222: 25x15
#820 @ 492,545: 21x10
#821 @ 131,880: 24x25
#822 @ 491,590: 26x18
#823 @ 66,279: 24x28
#824 @ 529,865: 20x18
#825 @ 650,155: 17x12
#826 @ 529,159: 24x20
#827 @ 650,552: 14x23
#828 @ 703,897: 26x26
#829 @ 441,591: 22x27
#830 @ 901,221: 17x14
#831 @ 539,199: 21x15
#832 @ 115,236: 14x12
#833 @ 32,229: 27x29
#834 @ 263,93: 25x17
#835 @ 917,450: 29x20
#836 @ 420,5: 12x15
#837 @ 544,480: 14x19
#838 @ 10,534: 20x11
#839 @ 918,141: 28x26
#840 @ 683,130: 21x10
#841 @ 690,163: 25x12
#842 @ 646,18: 28x14
#843 @ 501,725: 20x22
#844 @ 372,546: 25x24
#845 @ 613,302: 29x18
#846 @ 78,920: 16x25
#847 @ 935,473: 26x16
#848 @ 533,28: 10x21
#849 @ 107,624: 11x23
#850 @ 820,649: 15x11
#851 @ 572,420: 19x13
#852 @ 725,449: 15x12
#853 @ 183,953: 22x17
#854 @ 651,324: 15x25
#855 @ 500,486: 12x20
#856 @ 692,886: 16x18
#857 @ 451,761: 26x12
#858 @ 938,610: 23x16
#859 @ 260,447: 21x11
#860 @ 434,647: 27x16
#861 @ 253,4: 11x15
#862 @ 400,430: 14x15
#863 @ 723,813: 24x27
#864 @ 607,539: 29x28
#865 @ 856,459: 11x15
#866 @ 310,957: 10x16
#867 @ 262,882: 12x24
#868 @ 355,244: 28x24
#869 @ 421,672: 18x11
#870 @ 645,739: 13x18
#871 @ 61,759: 24x21
#872 @ 447,300: 10x24
#873 @ 64,920: 21x13
#874 @ 595,248: 10x18
#875 @ 202,75: 17x23
#876 @ 882,478: 12x13
#877 @ 637,939: 28x10
#878 @ 949,513: 15x27
#879 @ 577,444: 26x26
#880 @ 760,315: 22x14
#881 @ 271,837: 29x26
#882 @ 969,287: 18x11
#883 @ 784,378: 29x26
#884 @ 483,366: 20x25
#885 @ 46,55: 25x19
#886 @ 386,831: 10x18
#887 @ 464,916: 12x19
#888 @ 766,578: 12x28
#889 @ 510,26: 25x26
#890 @ 442,389: 22x15
#891 @ 764,449: 25x26
#892 @ 798,718: 17x12
#893 @ 327,701: 20x14
#894 @ 641,734: 12x12
#895 @ 267,934: 15x21
#896 @ 241,262: 11x21
#897 @ 792,417: 23x28
#898 @ 122,531: 10x10
#899 @ 827,388: 10x15
#900 @ 282,762: 11x21
#901 @ 420,608: 12x11
#902 @ 576,934: 16x28
#903 @ 257,593: 13x23
#904 @ 122,122: 21x24
#905 @ 916,401: 16x23
#906 @ 908,195: 17x29
#907 @ 801,887: 26x11
#908 @ 262,919: 29x15
#909 @ 515,303: 22x25
#910 @ 259,756: 13x19
#911 @ 127,593: 27x22
#912 @ 508,651: 22x25
#913 @ 456,772: 15x29
#914 @ 624,78: 18x15
#915 @ 333,888: 19x14
#916 @ 799,48: 28x10
#917 @ 864,766: 26x25
#918 @ 589,528: 12x12
#919 @ 34,597: 18x25
#920 @ 511,235: 29x28
#921 @ 114,887: 21x29
#922 @ 69,950: 20x14
#923 @ 254,173: 23x18
#924 @ 342,595: 12x28
#925 @ 960,594: 15x26
#926 @ 236,242: 12x21
#927 @ 350,122: 12x25
#928 @ 877,466: 13x19
#929 @ 10,640: 11x27
#930 @ 762,646: 24x29
#931 @ 469,768: 24x19
#932 @ 673,15: 19x11
#933 @ 316,826: 26x12
#934 @ 82,688: 29x24
#935 @ 759,782: 19x18
#936 @ 705,521: 23x26
#937 @ 201,742: 20x25
#938 @ 769,604: 19x10
#939 @ 32,913: 18x21
#940 @ 737,93: 28x17
#941 @ 37,509: 26x10
#942 @ 179,444: 11x22
#943 @ 692,280: 15x20
#944 @ 496,807: 20x10
#945 @ 670,584: 13x12
#946 @ 127,942: 29x26
#947 @ 642,943: 20x16
#948 @ 832,70: 24x29
#949 @ 625,321: 17x28
#950 @ 924,266: 27x22
#951 @ 792,203: 16x12
#952 @ 867,726: 27x25
#953 @ 207,357: 21x12
#954 @ 200,817: 26x26
#955 @ 509,738: 10x10
#956 @ 550,77: 10x19
#957 @ 755,328: 24x21
#958 @ 738,887: 28x25
#959 @ 76,921: 17x10
#960 @ 868,620: 22x15
#961 @ 892,859: 29x18
#962 @ 672,543: 21x10
#963 @ 167,390: 28x14
#964 @ 130,878: 16x20
#965 @ 155,435: 22x16
#966 @ 554,90: 10x15
#967 @ 363,419: 15x18
#968 @ 167,619: 28x15
#969 @ 887,309: 23x26
#970 @ 926,760: 26x21
#971 @ 529,532: 14x10
#972 @ 309,679: 28x19
#973 @ 747,524: 29x24
#974 @ 837,707: 16x12
#975 @ 285,737: 28x10
#976 @ 704,676: 14x13
#977 @ 122,688: 14x13
#978 @ 907,846: 18x16
#979 @ 907,899: 24x29
#980 @ 44,535: 10x12
#981 @ 481,741: 28x21
#982 @ 555,588: 15x26
#983 @ 693,246: 29x12
#984 @ 502,584: 20x21
#985 @ 137,261: 23x18
#986 @ 568,83: 13x7
#987 @ 818,653: 18x10
#988 @ 631,760: 4x12
#989 @ 301,236: 21x13
#990 @ 658,569: 25x12
#991 @ 862,348: 21x28
#992 @ 303,485: 28x10
#993 @ 523,380: 17x21
#994 @ 717,168: 12x24
#995 @ 759,586: 13x20
#996 @ 65,417: 25x21
#997 @ 850,292: 19x26
#998 @ 559,308: 26x22
#999 @ 322,468: 13x19
#1000 @ 328,555: 25x21
#1001 @ 703,479: 21x26
#1002 @ 945,911: 17x6
#1003 @ 754,116: 22x19
#1004 @ 852,89: 19x19
#1005 @ 806,733: 22x18
#1006 @ 774,150: 10x27
#1007 @ 412,230: 11x17
#1008 @ 974,875: 21x24
#1009 @ 356,153: 20x12
#1010 @ 613,571: 10x26
#1011 @ 443,831: 26x23
#1012 @ 281,805: 19x10
#1013 @ 956,161: 20x28
#1014 @ 984,453: 6x8
#1015 @ 569,244: 29x12
#1016 @ 821,49: 11x18
#1017 @ 902,562: 13x16
#1018 @ 193,82: 20x23
#1019 @ 969,803: 13x16
#1020 @ 681,585: 23x15
#1021 @ 930,98: 19x21
#1022 @ 88,693: 13x19
#1023 @ 845,650: 13x22
#1024 @ 462,913: 27x21
#1025 @ 357,752: 23x25
#1026 @ 206,663: 22x24
#1027 @ 619,511: 13x12
#1028 @ 557,594: 6x11
#1029 @ 128,807: 17x17
#1030 @ 745,718: 26x26
#1031 @ 822,23: 26x11
#1032 @ 484,479: 26x25
#1033 @ 409,194: 21x21
#1034 @ 214,295: 22x10
#1035 @ 31,623: 12x15
#1036 @ 687,165: 12x19
#1037 @ 707,528: 21x18
#1038 @ 768,630: 20x23
#1039 @ 655,892: 13x15
#1040 @ 888,769: 14x12
#1041 @ 835,47: 29x29
#1042 @ 808,323: 16x14
#1043 @ 400,218: 14x10
#1044 @ 168,954: 11x25
#1045 @ 69,225: 19x19
#1046 @ 77,788: 16x15
#1047 @ 407,426: 24x16
#1048 @ 84,674: 12x10
#1049 @ 712,422: 18x11
#1050 @ 326,218: 18x23
#1051 @ 853,734: 24x20
#1052 @ 571,221: 18x26
#1053 @ 783,445: 26x22
#1054 @ 856,724: 17x22
#1055 @ 728,99: 27x10
#1056 @ 580,265: 22x28
#1057 @ 186,276: 17x29
#1058 @ 515,842: 26x23
#1059 @ 577,696: 10x29
#1060 @ 658,924: 18x19
#1061 @ 309,527: 23x28
#1062 @ 407,466: 26x16
#1063 @ 84,972: 17x6
#1064 @ 337,552: 13x18
#1065 @ 745,733: 13x16
#1066 @ 495,60: 17x16
#1067 @ 507,135: 26x15
#1068 @ 439,232: 13x27
#1069 @ 586,227: 24x14
#1070 @ 71,774: 12x22
#1071 @ 520,92: 15x11
#1072 @ 625,733: 13x25
#1073 @ 616,360: 11x13
#1074 @ 202,310: 16x22
#1075 @ 115,249: 12x14
#1076 @ 269,90: 26x11
#1077 @ 120,203: 10x14
#1078 @ 787,52: 21x29
#1079 @ 899,114: 21x21
#1080 @ 146,572: 27x15
#1081 @ 774,424: 17x15
#1082 @ 305,694: 13x29
#1083 @ 523,406: 24x26
#1084 @ 293,291: 25x26
#1085 @ 830,662: 10x29
#1086 @ 915,442: 10x21
#1087 @ 369,935: 24x26
#1088 @ 357,597: 16x22
#1089 @ 352,780: 6x6
#1090 @ 108,368: 17x29
#1091 @ 487,804: 21x11
#1092 @ 497,139: 23x24
#1093 @ 936,174: 12x21
#1094 @ 254,652: 20x10
#1095 @ 75,406: 12x26
#1096 @ 463,766: 14x20
#1097 @ 100,459: 29x15
#1098 @ 116,128: 13x13
#1099 @ 292,585: 12x16
#1100 @ 490,787: 25x13
#1101 @ 91,557: 13x23
#1102 @ 390,557: 17x10
#1103 @ 342,421: 25x10
#1104 @ 21,83: 21x13
#1105 @ 923,141: 21x19
#1106 @ 427,300: 28x26
#1107 @ 550,618: 26x24
#1108 @ 393,457: 22x10
#1109 @ 126,838: 21x22
#1110 @ 254,597: 25x12
#1111 @ 466,905: 12x23
#1112 @ 862,581: 16x28
#1113 @ 938,60: 18x12
#1114 @ 375,286: 15x13
#1115 @ 740,775: 21x20
#1116 @ 268,75: 26x17
#1117 @ 613,615: 14x29
#1118 @ 630,488: 29x13
#1119 @ 401,527: 18x27
#1120 @ 231,789: 27x24
#1121 @ 642,483: 27x14
#1122 @ 528,259: 25x10
#1123 @ 825,884: 28x18
#1124 @ 143,584: 26x21
#1125 @ 502,602: 10x13
#1126 @ 475,417: 25x14
#1127 @ 369,904: 24x12
#1128 @ 825,465: 12x25
#1129 @ 741,76: 12x27
#1130 @ 650,947: 28x15
#1131 @ 723,405: 20x17
#1132 @ 290,700: 20x15
#1133 @ 469,756: 19x19
#1134 @ 726,900: 24x25
#1135 @ 436,487: 22x24
#1136 @ 391,544: 11x27
#1137 @ 196,697: 18x28
#1138 @ 814,335: 24x15
#1139 @ 520,416: 12x24
#1140 @ 845,302: 10x16
#1141 @ 282,298: 25x19
#1142 @ 770,398: 23x27
#1143 @ 130,209: 27x14
#1144 @ 325,324: 24x12
#1145 @ 650,951: 21x26
#1146 @ 701,455: 26x10
#1147 @ 559,86: 28x11
#1148 @ 741,883: 16x13
#1149 @ 509,95: 24x19
#1150 @ 958,219: 17x11
#1151 @ 85,17: 24x11
#1152 @ 763,868: 14x29
#1153 @ 109,921: 22x23
#1154 @ 440,604: 13x10
#1155 @ 230,198: 27x21
#1156 @ 393,255: 18x25
#1157 @ 471,322: 28x13
#1158 @ 543,471: 27x10
#1159 @ 49,243: 17x22
#1160 @ 413,635: 13x21
#1161 @ 69,572: 22x18
#1162 @ 769,975: 25x18
#1163 @ 594,102: 17x28
#1164 @ 744,889: 20x10
#1165 @ 676,743: 11x29
#1166 @ 492,11: 12x18
#1167 @ 393,232: 21x12
#1168 @ 856,774: 14x22
#1169 @ 247,256: 16x29
#1170 @ 488,683: 14x21
#1171 @ 526,244: 25x25
#1172 @ 276,356: 27x13
#1173 @ 514,655: 10x20
#1174 @ 968,118: 16x10
#1175 @ 187,284: 11x16
#1176 @ 717,837: 28x24
#1177 @ 533,548: 28x26
#1178 @ 812,722: 22x12
#1179 @ 441,286: 25x16
#1180 @ 344,682: 10x26
#1181 @ 859,733: 20x14
#1182 @ 117,848: 21x13
#1183 @ 439,12: 14x22
#1184 @ 388,269: 10x23
#1185 @ 350,144: 13x26
#1186 @ 199,218: 13x13
#1187 @ 765,767: 26x20
#1188 @ 204,880: 12x26
#1189 @ 265,574: 25x20
#1190 @ 282,3: 25x29
#1191 @ 247,367: 19x14
#1192 @ 246,723: 18x26
#1193 @ 650,117: 21x14
#1194 @ 560,203: 13x10
#1195 @ 850,457: 25x16
#1196 @ 745,820: 23x13
#1197 @ 230,267: 22x23
#1198 @ 942,908: 24x17
#1199 @ 53,494: 23x10
#1200 @ 548,579: 25x11
#1201 @ 387,538: 11x24
#1202 @ 283,641: 17x11
#1203 @ 925,40: 21x21
#1204 @ 489,555: 20x23
#1205 @ 565,284: 29x21
#1206 @ 823,886: 20x23
#1207 @ 344,414: 19x23
#1208 @ 635,945: 25x17
#1209 @ 38,511: 29x15
#1210 @ 199,834: 21x14
#1211 @ 783,105: 13x20
#1212 @ 772,123: 24x14
#1213 @ 294,588: 6x6
#1214 @ 982,442: 12x26
#1215 @ 766,749: 20x28
#1216 @ 307,916: 26x28
#1217 @ 115,687: 17x22
#1218 @ 274,841: 13x13
#1219 @ 291,256: 16x28
#1220 @ 494,731: 29x11
#1221 @ 130,12: 17x21
#1222 @ 188,869: 18x17
#1223 @ 939,164: 16x23
#1224 @ 449,900: 8x14
#1225 @ 330,922: 23x22
#1226 @ 101,952: 20x13
#1227 @ 78,2: 24x25
#1228 @ 273,83: 21x12
#1229 @ 950,345: 29x27
#1230 @ 280,248: 22x20
#1231 @ 555,380: 15x26
#1232 @ 244,2: 19x17
#1233 @ 790,374: 13x23
#1234 @ 846,922: 27x14
#1235 @ 682,807: 28x12
#1236 @ 35,57: 29x13
#1237 @ 215,226: 24x24
#1238 @ 703,10: 25x15
#1239 @ 690,66: 17x24
#1240 @ 945,86: 22x18
#1241 @ 27,170: 15x22
#1242 @ 2,394: 15x29
#1243 @ 166,334: 11x22
#1244 @ 816,871: 16x19
#1245 @ 223,782: 17x27
#1246 @ 112,217: 20x21
#1247 @ 76,2: 4x4
#1248 @ 875,871: 16x21
#1249 @ 11,371: 23x26
#1250 @ 810,771: 14x19
#1251 @ 914,759: 20x16
#1252 @ 203,121: 11x24
#1253 @ 396,412: 29x14
#1254 @ 912,325: 28x10
#1255 @ 75,344: 12x12
#1256 @ 247,257: 12x13
#1257 @ 253,343: 27x18
#1258 @ 239,380: 21x11
#1259 @ 645,135: 23x15
#1260 @ 881,886: 28x18
#1261 @ 162,379: 10x18
#1262 @ 589,787: 23x10
#1263 @ 437,315: 23x13
#1264 @ 119,208: 10x21
#1265 @ 299,760: 12x25
#1266 @ 3,874: 29x13
#1267 @ 470,667: 27x24
#1268 @ 908,269: 21x10
#1269 @ 92,490: 25x20
#1270 @ 510,674: 28x15
#1271 @ 906,902: 27x18
#1272 @ 880,286: 14x27
#1273 @ 80,464: 21x13
#1274 @ 188,885: 19x15
#1275 @ 541,762: 22x17
#1276 @ 533,5: 25x26
#1277 @ 748,963: 25x24
#1278 @ 401,339: 14x23
#1279 @ 19,611: 24x12
#1280 @ 613,784: 25x28
#1281 @ 897,295: 13x16
#1282 @ 49,760: 14x24
#1283 @ 65,738: 20x20
#1284 @ 749,592: 14x28
#1285 @ 491,780: 16x29
#1286 @ 256,632: 25x23
#1287 @ 589,430: 15x26
#1288 @ 622,460: 29x14
#1289 @ 345,634: 7x6
#1290 @ 907,216: 16x26
#1291 @ 877,140: 27x20
#1292 @ 393,261: 12x19
#1293 @ 881,346: 11x26
#1294 @ 421,626: 14x24
#1295 @ 104,8: 16x13
#1296 @ 237,203: 10x12
#1297 @ 685,291: 26x11
#1298 @ 506,17: 27x16
#1299 @ 570,396: 13x18
#1300 @ 289,277: 13x28
#1301 @ 116,505: 28x11
#1302 @ 515,847: 17x22
#1303 @ 411,209: 14x15
#1304 @ 408,952: 27x20
#1305 @ 331,793: 21x26
#1306 @ 831,882: 19x18
#1307 @ 302,560: 21x8
#1308 @ 506,398: 29x11
#1309 @ 433,387: 25x11
#1310 @ 565,938: 27x13
#1311 @ 205,330: 27x23
#1312 @ 663,835: 12x20
#1313 @ 845,398: 21x21
#1314 @ 532,25: 28x25
#1315 @ 533,757: 11x15
#1316 @ 727,108: 14x17
#1317 @ 658,68: 29x22
#1318 @ 591,390: 19x17
#1319 @ 583,248: 10x12
#1320 @ 942,391: 23x22
#1321 @ 683,778: 21x11
#1322 @ 162,970: 27x11
#1323 @ 709,818: 14x28
#1324 @ 162,282: 14x27
#1325 @ 898,441: 25x12
#1326 @ 657,892: 13x26
#1327 @ 584,226: 20x26
#1328 @ 77,915: 28x20
#1329 @ 449,714: 18x29
#1330 @ 135,293: 24x28
#1331 @ 773,826: 16x19
#1332 @ 875,513: 17x14
#1333 @ 99,135: 24x13
#1334 @ 756,511: 11x20
#1335 @ 756,755: 13x28
#1336 @ 331,621: 22x19
#1337 @ 592,905: 14x27
#1338 @ 554,21: 24x27
#1339 @ 214,244: 27x25
#1340 @ 537,694: 18x15
#1341 @ 955,539: 11x15
#1342 @ 594,509: 16x27
#1343 @ 978,953: 18x23
#1344 @ 225,527: 28x11
#1345 @ 760,83: 24x21
#1346 @ 943,479: 13x22
#1347 @ 670,278: 20x26
#1348 @ 656,749: 14x25
#1349 @ 850,417: 16x15
#1350 @ 957,81: 24x16
#1351 @ 331,914: 11x24
#1352 @ 651,113: 28x19
#1353 @ 240,198: 29x10
#1354 @ 296,697: 21x10
#1355 @ 782,134: 14x26
#1356 @ 33,399: 27x13
#1357 @ 275,416: 16x21`
// Create a proper array with the challenge's input
const formattedInput = input.split('\n')
// Number of columns on our matrix.
const matrixSize = 1000
// Function to parse each string to get the values we need.
const parseString = (string) => {
const id = string.match(/#(\d+)/)[1]
const position = string.match(/@ (\d+,\d+)/)[1].split(',')
const size = string.match(/: (\d+x\d+)/)[1].split('x')
const object = {
id,
position: {
x: parseInt(position[0], 10),
y: parseInt(position[1], 10),
},
size: {
width: parseInt(size[0], 10),
height: parseInt(size[1], 10),
},
}
return object
}
// Function to figure out what cells the object occuppies on the matrix.
const getUsedCells = (object, cols) => {
const answers = []
let x
let y
for (x = object.position.x + 1; x <= object.position.x + object.size.width; x++) {
for (y = object.position.y + 1; y <= object.position.y + object.size.height; y++) {
answers.push(x + (cols * (y - 1)))
}
}
return answers
}
// Map of used spaces and by which IDs.
// Has two special properties:
// overlappingSquareInches - a Set of squareInches that are overlapping
// nonOverlapping - A set of objects that do not overlap with anyone else
const usedSpaces = formattedInput.reduce((acc, value, index, array) => {
// Get a proper object from each string
const object = parseString(value)
// Get used cells by this object
const values = getUsedCells(object, matrixSize)
// We initially assume this object will not overlap.
acc.nonOverlapping.add(object.id)
// We iterate over each cell this object occuppies...
values.forEach((cell) => {
// ... if this cell is not occupied, we add the ID to its array.
if (!acc[cell]) {
acc[cell] = [object.id]
// ... if, however, it is occupied we will...
} else {
// ... add the ID to its (existing) array...
acc[cell].push(object.id)
// ... add the cell number to the overlappingSquareInches Set...
acc.overlappingSquareInches.add(cell)
// ... and remove this and all other object IDs from our
// nonOverlapping Set, since it is overlapping...
acc[cell].forEach(val => acc.nonOverlapping.delete(val))
}
})
return acc
}, { overlappingSquareInches: new Set([]), nonOverlapping: new Set([]) })
// Answer one is just a matter of counting the ammount of unique cells thet are overlapping
const answer1 = usedSpaces.overlappingSquareInches.size
/**
* --- Part Two ---
* Amidst the chaos, you notice that exactly one claim doesn't overlap by even a single square inch of fabric with any other claim. If you can somehow draw attention to it, maybe the Elves will be able to make Santa's suit after all!
*
* For example, in the claims above, only claim 3 is intact after all claims are made.
*
* What is the ID of the only claim that doesn't overlap?
*/
// For answer two, we return the first ID in our nonOverlapping prop.
// We are assuming that this is only 1.
const answer2 = Array.from(usedSpaces.nonOverlapping)[0]
// We log our answers
console.log({
answer1, // 113716
answer2, // 742
})
/**
* --- Day 4: Repose Record ---
* You've sneaked into another supply closet - this time, it's across from the prototype suit manufacturing lab. You need to sneak inside and fix the issues with the suit, but there's a guard stationed outside the lab, so this is as close as you can safely get.
*
* As you search the closet for anything that might help, you discover that you're not the first person to want to sneak in. Covering the walls, someone has spent an hour starting every midnight for the past few months secretly observing this guard post! They've been writing down the ID of the one guard on duty that night - the Elves seem to have decided that one guard was enough for the overnight shift - as well as when they fall asleep or wake up while at their post (your puzzle input).
*
* For example, consider the following records, which have already been organized into chronological order:
*
* [1518-11-01 00:00] Guard #10 begins shift
* [1518-11-01 00:05] falls asleep
* [1518-11-01 00:25] wakes up
* [1518-11-01 00:30] falls asleep
* [1518-11-01 00:55] wakes up
* [1518-11-01 23:58] Guard #99 begins shift
* [1518-11-02 00:40] falls asleep
* [1518-11-02 00:50] wakes up
* [1518-11-03 00:05] Guard #10 begins shift
* [1518-11-03 00:24] falls asleep
* [1518-11-03 00:29] wakes up
* [1518-11-04 00:02] Guard #99 begins shift
* [1518-11-04 00:36] falls asleep
* [1518-11-04 00:46] wakes up
* [1518-11-05 00:03] Guard #99 begins shift
* [1518-11-05 00:45] falls asleep
* [1518-11-05 00:55] wakes up
* Timestamps are written using year-month-day hour:minute format. The guard falling asleep or waking up is always the one whose shift most recently started. Because all asleep/awake times are during the midnight hour (00:00 - 00:59), only the minute portion (00 - 59) is relevant for those events.
*
* Visually, these records show that the guards are asleep at these times:
*
* Date ID Minute
* 000000000011111111112222222222333333333344444444445555555555
* 012345678901234567890123456789012345678901234567890123456789
* 11-01 #10 .....####################.....#########################.....
* 11-02 #99 ........................................##########..........
* 11-03 #10 ........................#####...............................
* 11-04 #99 ....................................##########..............
* 11-05 #99 .............................................##########.....
* The columns are Date, which shows the month-day portion of the relevant day; ID, which shows the guard on duty that day; and Minute, which shows the minutes during which the guard was asleep within the midnight hour. (The Minute column's header shows the minute's ten's digit in the first row and the one's digit in the second row.) Awake is shown as ., and asleep is shown as #.
*
* Note that guards count as asleep on the minute they fall asleep, and they count as awake on the minute they wake up. For example, because Guard #10 wakes up at 00:25 on 1518-11-01, minute 25 is marked as awake.
*
* If you can figure out the guard most likely to be asleep at a specific time, you might be able to trick that guard into working tonight so you can have the best chance of sneaking in. You have two strategies for choosing the best guard/minute combination.
*
* Strategy 1: Find the guard that has the most minutes asleep. What minute does that guard spend asleep the most?
*
* In the example above, Guard #10 spent the most minutes asleep, a total of 50 minutes (20+25+5), while Guard #99 only slept for a total of 30 minutes (10+10+10). Guard #10 was asleep most during minute 24 (on two days, whereas any other minute the guard was asleep was only seen on one day).
*
* While this example listed the entries in chronological order, your entries are in the order you found them. You'll need to organize them before they can be analyzed.
*
* What is the ID of the guard you chose multiplied by the minute you chose? (In the above example, the answer would be 10 * 24 = 240.)
*/
const input = `[1518-10-14 00:05] falls asleep
[1518-09-13 00:12] falls asleep
[1518-03-23 00:26] falls asleep
[1518-03-10 00:48] wakes up
[1518-09-01 23:56] Guard #1019 begins shift
[1518-06-15 00:53] wakes up
[1518-05-01 00:53] wakes up
[1518-04-22 00:52] wakes up
[1518-06-10 00:00] Guard #2129 begins shift
[1518-09-13 00:56] wakes up
[1518-11-06 00:55] wakes up
[1518-04-25 00:03] Guard #733 begins shift
[1518-04-11 00:14] falls asleep
[1518-05-25 00:38] falls asleep
[1518-07-25 00:02] Guard #757 begins shift
[1518-10-03 00:40] falls asleep
[1518-07-31 23:58] Guard #733 begins shift
[1518-06-22 00:58] wakes up
[1518-05-14 00:19] falls asleep
[1518-08-08 23:46] Guard #1607 begins shift
[1518-07-24 00:19] wakes up
[1518-05-24 00:10] falls asleep
[1518-06-11 00:46] falls asleep
[1518-08-19 00:36] falls asleep
[1518-04-05 00:11] falls asleep
[1518-07-27 00:00] Guard #1297 begins shift
[1518-03-13 00:43] falls asleep
[1518-04-22 00:22] falls asleep
[1518-11-07 00:54] wakes up
[1518-03-31 00:00] Guard #2293 begins shift
[1518-10-28 00:12] falls asleep
[1518-03-30 00:32] falls asleep
[1518-03-23 00:49] wakes up
[1518-04-21 00:17] wakes up
[1518-06-25 00:52] falls asleep
[1518-10-23 00:45] wakes up
[1518-08-20 23:57] Guard #2819 begins shift
[1518-08-17 00:59] wakes up
[1518-10-05 00:45] falls asleep
[1518-03-22 00:45] falls asleep
[1518-03-25 00:12] falls asleep
[1518-11-11 00:16] wakes up
[1518-03-10 23:58] Guard #2129 begins shift
[1518-06-24 00:54] falls asleep
[1518-03-07 00:52] wakes up
[1518-10-01 00:58] wakes up
[1518-10-25 00:38] wakes up
[1518-09-01 00:31] falls asleep
[1518-08-02 00:02] falls asleep
[1518-04-26 00:52] falls asleep
[1518-03-30 00:12] falls asleep
[1518-09-30 00:04] falls asleep
[1518-04-24 00:04] Guard #2467 begins shift
[1518-03-05 23:53] Guard #1607 begins shift
[1518-03-02 23:59] Guard #1297 begins shift
[1518-03-02 00:00] Guard #733 begins shift
[1518-04-02 00:39] wakes up
[1518-04-04 00:06] falls asleep
[1518-09-10 23:56] Guard #2467 begins shift
[1518-10-17 23:56] Guard #1889 begins shift
[1518-11-02 00:44] falls asleep
[1518-10-27 00:59] wakes up
[1518-07-05 00:00] Guard #733 begins shift
[1518-07-03 00:33] wakes up
[1518-09-08 00:52] wakes up
[1518-08-06 00:01] Guard #349 begins shift
[1518-08-05 00:00] Guard #2467 begins shift
[1518-02-28 00:51] wakes up
[1518-05-12 00:55] wakes up
[1518-06-26 00:50] wakes up
[1518-08-11 00:51] wakes up
[1518-04-29 00:18] falls asleep
[1518-09-24 00:58] wakes up
[1518-03-28 00:42] wakes up
[1518-03-15 00:29] falls asleep
[1518-08-09 00:40] wakes up
[1518-04-11 23:59] Guard #227 begins shift
[1518-07-24 00:42] wakes up
[1518-04-29 00:58] wakes up
[1518-05-30 00:34] wakes up
[1518-09-29 00:33] wakes up
[1518-11-15 00:13] falls asleep
[1518-06-27 23:57] Guard #317 begins shift
[1518-06-22 00:24] falls asleep
[1518-06-19 00:00] Guard #1297 begins shift
[1518-07-15 00:48] wakes up
[1518-08-18 00:03] Guard #1933 begins shift
[1518-04-16 00:50] wakes up
[1518-09-01 00:59] wakes up
[1518-04-07 00:04] Guard #2129 begins shift
[1518-10-12 00:46] wakes up
[1518-08-27 00:54] falls asleep
[1518-09-21 00:05] falls asleep
[1518-08-19 00:22] wakes up
[1518-04-01 00:41] falls asleep
[1518-04-13 00:22] wakes up
[1518-10-02 00:49] wakes up
[1518-03-03 00:51] falls asleep
[1518-03-02 00:53] wakes up
[1518-06-24 23:56] Guard #1889 begins shift
[1518-11-19 00:19] falls asleep
[1518-09-25 00:08] falls asleep
[1518-05-10 00:25] falls asleep
[1518-03-22 00:47] wakes up
[1518-05-06 00:09] falls asleep
[1518-08-31 00:29] wakes up
[1518-10-23 00:39] falls asleep
[1518-06-08 00:57] falls asleep
[1518-11-08 00:38] falls asleep
[1518-05-16 00:26] wakes up
[1518-06-13 00:46] wakes up
[1518-10-25 00:31] falls asleep
[1518-09-12 00:47] wakes up
[1518-03-03 00:48] wakes up
[1518-03-02 00:25] wakes up
[1518-04-06 00:56] wakes up
[1518-02-24 00:55] falls asleep
[1518-05-30 00:45] falls asleep
[1518-09-24 00:21] falls asleep
[1518-09-07 00:27] falls asleep
[1518-03-05 00:53] falls asleep
[1518-03-24 00:06] falls asleep
[1518-06-07 23:56] Guard #757 begins shift
[1518-11-04 00:00] Guard #1297 begins shift
[1518-03-16 23:50] Guard #1933 begins shift
[1518-11-19 00:50] falls asleep
[1518-03-04 00:52] wakes up
[1518-05-21 23:50] Guard #2819 begins shift
[1518-11-11 00:43] falls asleep
[1518-10-05 00:54] wakes up
[1518-11-06 00:32] wakes up
[1518-06-22 23:57] Guard #2953 begins shift
[1518-06-20 23:48] Guard #751 begins shift
[1518-03-19 00:40] falls asleep
[1518-11-07 00:51] falls asleep
[1518-10-01 23:58] Guard #317 begins shift
[1518-06-23 00:18] falls asleep
[1518-06-17 00:02] Guard #1297 begins shift
[1518-08-14 00:32] falls asleep
[1518-09-22 00:16] wakes up
[1518-05-31 00:19] falls asleep
[1518-03-03 00:23] falls asleep
[1518-05-31 00:58] wakes up
[1518-09-12 00:13] falls asleep
[1518-10-08 00:31] falls asleep
[1518-11-18 00:54] wakes up
[1518-03-29 00:51] falls asleep
[1518-11-12 00:55] falls asleep
[1518-06-13 23:59] Guard #2819 begins shift
[1518-04-21 00:34] wakes up
[1518-05-27 00:46] falls asleep
[1518-07-24 00:37] wakes up
[1518-06-04 00:21] falls asleep
[1518-06-01 00:53] falls asleep
[1518-06-23 00:42] falls asleep
[1518-04-25 23:58] Guard #3433 begins shift
[1518-05-04 00:49] falls asleep
[1518-08-31 23:59] Guard #349 begins shift
[1518-03-13 23:47] Guard #1607 begins shift
[1518-06-23 00:26] wakes up
[1518-06-11 00:27] falls asleep
[1518-05-13 00:53] wakes up
[1518-08-02 00:23] wakes up
[1518-08-15 00:21] wakes up
[1518-06-12 23:57] Guard #3137 begins shift
[1518-04-21 00:32] falls asleep
[1518-04-19 00:26] falls asleep
[1518-11-04 00:47] wakes up
[1518-09-09 00:04] Guard #2129 begins shift
[1518-09-06 00:50] wakes up
[1518-10-06 00:16] wakes up
[1518-08-20 00:46] wakes up
[1518-03-31 00:57] wakes up
[1518-10-31 00:58] wakes up
[1518-08-12 00:16] falls asleep
[1518-08-23 00:54] falls asleep
[1518-05-25 00:47] wakes up
[1518-05-25 23:49] Guard #2953 begins shift
[1518-03-23 00:09] falls asleep
[1518-07-19 23:54] Guard #349 begins shift
[1518-04-26 00:44] wakes up
[1518-11-16 00:36] falls asleep
[1518-06-10 00:38] falls asleep
[1518-04-29 23:57] Guard #733 begins shift
[1518-08-18 00:38] wakes up
[1518-06-14 23:54] Guard #2819 begins shift
[1518-05-26 23:48] Guard #227 begins shift
[1518-08-14 00:42] wakes up
[1518-07-22 00:20] falls asleep
[1518-05-26 00:09] wakes up
[1518-05-08 00:56] wakes up
[1518-06-17 00:47] wakes up
[1518-05-27 00:57] wakes up
[1518-09-21 00:52] falls asleep
[1518-06-02 00:00] falls asleep
[1518-05-24 23:57] Guard #2467 begins shift
[1518-05-14 00:09] falls asleep
[1518-07-07 00:32] falls asleep
[1518-04-01 00:51] wakes up
[1518-05-19 23:58] Guard #349 begins shift
[1518-05-30 00:58] wakes up
[1518-10-26 00:02] falls asleep
[1518-07-21 00:39] falls asleep
[1518-08-15 00:08] falls asleep
[1518-06-11 00:00] Guard #733 begins shift
[1518-07-01 00:56] wakes up
[1518-09-28 00:01] Guard #1013 begins shift
[1518-11-12 00:12] falls asleep
[1518-10-20 00:42] wakes up
[1518-05-08 00:23] falls asleep
[1518-08-05 00:40] falls asleep
[1518-10-28 00:56] wakes up
[1518-09-14 00:46] wakes up
[1518-07-27 00:15] wakes up
[1518-06-16 00:42] wakes up
[1518-05-23 00:46] wakes up
[1518-09-20 00:55] wakes up
[1518-11-14 00:54] wakes up
[1518-09-04 00:05] falls asleep
[1518-06-30 00:36] wakes up
[1518-11-08 00:41] wakes up
[1518-10-03 00:04] Guard #2467 begins shift
[1518-09-20 00:01] falls asleep
[1518-06-26 23:56] Guard #733 begins shift
[1518-10-31 00:06] falls asleep
[1518-04-01 00:00] Guard #349 begins shift
[1518-07-21 00:45] falls asleep
[1518-07-25 23:50] Guard #1297 begins shift
[1518-09-22 00:00] Guard #1607 begins shift
[1518-08-29 00:51] falls asleep
[1518-06-08 00:35] wakes up
[1518-09-15 00:51] wakes up
[1518-09-08 00:20] falls asleep
[1518-11-04 00:11] falls asleep
[1518-08-20 00:35] falls asleep
[1518-09-22 00:39] falls asleep
[1518-05-23 00:01] Guard #733 begins shift
[1518-08-18 00:12] falls asleep
[1518-04-27 00:26] falls asleep
[1518-06-11 00:51] wakes up
[1518-07-16 00:58] wakes up
[1518-03-16 00:12] falls asleep
[1518-08-11 00:17] wakes up
[1518-04-11 00:28] wakes up
[1518-05-22 00:56] wakes up
[1518-06-22 00:05] falls asleep
[1518-02-27 00:52] wakes up
[1518-04-08 00:04] Guard #1297 begins shift
[1518-08-13 00:51] wakes up
[1518-04-28 23:58] Guard #733 begins shift
[1518-09-05 00:12] wakes up
[1518-07-13 00:00] Guard #2293 begins shift
[1518-09-20 00:27] wakes up
[1518-09-26 00:20] falls asleep
[1518-03-14 00:17] wakes up
[1518-07-18 00:13] falls asleep
[1518-10-18 00:41] wakes up
[1518-11-22 00:47] wakes up
[1518-06-15 23:57] Guard #349 begins shift
[1518-05-12 00:45] wakes up
[1518-07-30 00:42] falls asleep
[1518-11-05 23:46] Guard #2953 begins shift
[1518-06-29 23:58] Guard #2819 begins shift
[1518-05-10 00:58] wakes up
[1518-10-28 00:55] falls asleep
[1518-10-24 00:41] wakes up
[1518-03-28 00:34] falls asleep
[1518-07-02 00:28] falls asleep
[1518-09-17 00:21] wakes up
[1518-08-02 23:57] Guard #1889 begins shift
[1518-10-09 00:52] falls asleep
[1518-10-14 23:50] Guard #263 begins shift
[1518-03-28 23:57] Guard #2129 begins shift
[1518-10-15 00:36] falls asleep
[1518-04-27 00:49] wakes up
[1518-04-03 00:39] wakes up
[1518-04-21 00:46] falls asleep
[1518-05-06 00:01] Guard #1607 begins shift
[1518-04-09 00:02] Guard #3433 begins shift
[1518-11-12 00:51] wakes up
[1518-05-23 00:58] wakes up
[1518-11-06 00:51] falls asleep
[1518-10-16 00:54] falls asleep
[1518-10-27 00:55] falls asleep
[1518-07-01 23:58] Guard #317 begins shift
[1518-10-01 00:31] falls asleep
[1518-07-29 00:00] Guard #2467 begins shift
[1518-02-24 00:29] falls asleep
[1518-07-21 00:41] wakes up
[1518-07-19 00:13] falls asleep
[1518-07-27 00:14] falls asleep
[1518-09-18 00:00] Guard #2819 begins shift
[1518-07-05 23:54] Guard #2129 begins shift
[1518-06-14 00:57] wakes up
[1518-03-05 00:59] wakes up
[1518-03-02 00:16] falls asleep
[1518-08-29 00:48] wakes up
[1518-11-07 00:58] wakes up
[1518-11-11 00:11] falls asleep
[1518-04-06 00:46] wakes up
[1518-06-02 00:13] wakes up
[1518-09-29 00:02] Guard #3433 begins shift
[1518-09-21 00:17] wakes up
[1518-05-12 00:24] falls asleep
[1518-05-19 00:02] Guard #1933 begins shift
[1518-06-02 23:56] Guard #349 begins shift
[1518-03-12 00:54] wakes up
[1518-07-22 00:54] wakes up
[1518-09-17 00:04] Guard #1607 begins shift
[1518-06-05 00:03] Guard #1999 begins shift
[1518-04-06 00:00] Guard #2129 begins shift
[1518-05-19 00:34] wakes up
[1518-07-12 00:14] falls asleep
[1518-10-04 00:21] falls asleep
[1518-06-20 00:13] falls asleep
[1518-08-24 00:41] falls asleep
[1518-02-23 00:21] falls asleep
[1518-11-22 00:37] wakes up
[1518-07-27 00:50] wakes up
[1518-09-27 00:20] falls asleep
[1518-08-23 23:56] Guard #1999 begins shift
[1518-06-08 00:41] falls asleep
[1518-07-01 00:44] wakes up
[1518-08-07 00:09] falls asleep
[1518-11-09 00:30] wakes up
[1518-10-13 23:50] Guard #2953 begins shift
[1518-04-02 00:46] falls asleep
[1518-02-27 00:29] falls asleep
[1518-07-21 00:59] wakes up
[1518-08-04 00:35] falls asleep
[1518-11-19 00:23] wakes up
[1518-09-26 23:56] Guard #349 begins shift
[1518-10-26 00:10] wakes up
[1518-05-03 00:01] Guard #1999 begins shift
[1518-09-23 00:33] wakes up
[1518-03-30 00:19] wakes up
[1518-07-26 00:00] falls asleep
[1518-07-30 00:39] wakes up
[1518-04-18 00:48] falls asleep
[1518-07-20 00:33] wakes up
[1518-06-12 00:09] falls asleep
[1518-09-07 00:57] falls asleep
[1518-08-09 00:01] wakes up
[1518-07-10 00:51] wakes up
[1518-05-02 00:11] falls asleep
[1518-09-10 00:54] wakes up
[1518-05-13 23:59] Guard #263 begins shift
[1518-06-25 23:57] Guard #263 begins shift
[1518-05-21 00:59] wakes up
[1518-04-14 00:06] falls asleep
[1518-10-19 00:07] falls asleep
[1518-07-14 23:49] Guard #3137 begins shift
[1518-11-14 00:30] falls asleep
[1518-07-22 23:58] Guard #1999 begins shift
[1518-11-19 00:39] wakes up
[1518-05-21 00:57] falls asleep
[1518-03-07 00:29] falls asleep
[1518-08-12 00:57] wakes up
[1518-05-28 00:41] wakes up
[1518-03-20 00:26] falls asleep
[1518-08-19 23:59] Guard #2467 begins shift
[1518-10-05 00:16] falls asleep
[1518-05-17 23:58] Guard #619 begins shift
[1518-04-18 00:56] wakes up
[1518-10-07 00:11] falls asleep
[1518-06-01 00:59] wakes up
[1518-09-24 23:58] Guard #2953 begins shift
[1518-04-30 00:39] falls asleep
[1518-05-30 00:22] falls asleep
[1518-05-12 00:25] wakes up
[1518-03-11 00:54] wakes up
[1518-07-25 00:50] falls asleep
[1518-10-16 00:56] wakes up
[1518-06-18 00:37] wakes up
[1518-09-13 00:39] falls asleep
[1518-08-22 00:22] falls asleep
[1518-05-15 00:30] falls asleep
[1518-09-17 00:06] falls asleep
[1518-08-22 00:46] falls asleep
[1518-09-16 00:43] falls asleep
[1518-10-06 23:57] Guard #1889 begins shift
[1518-03-03 00:36] wakes up
[1518-11-01 00:27] falls asleep
[1518-07-13 00:52] falls asleep
[1518-04-14 00:52] wakes up
[1518-11-21 00:59] wakes up
[1518-10-15 00:33] wakes up
[1518-10-12 00:38] falls asleep
[1518-07-16 00:53] falls asleep
[1518-11-18 00:49] falls asleep
[1518-11-06 00:45] wakes up
[1518-09-18 00:24] falls asleep
[1518-10-19 23:52] Guard #757 begins shift
[1518-07-20 00:00] falls asleep
[1518-07-02 00:12] falls asleep
[1518-07-03 00:52] wakes up
[1518-04-13 00:31] falls asleep
[1518-03-24 00:00] Guard #751 begins shift
[1518-05-14 00:11] wakes up
[1518-04-21 23:57] Guard #1889 begins shift
[1518-10-08 00:54] falls asleep
[1518-05-09 00:43] wakes up
[1518-03-01 00:59] wakes up
[1518-03-16 00:54] wakes up
[1518-10-20 00:49] wakes up
[1518-02-23 00:29] wakes up
[1518-08-26 00:57] wakes up
[1518-10-18 00:24] falls asleep
[1518-05-20 23:56] Guard #1607 begins shift
[1518-09-15 00:43] falls asleep
[1518-10-04 23:59] Guard #1019 begins shift
[1518-11-03 00:01] Guard #151 begins shift
[1518-03-18 00:38] wakes up
[1518-10-24 00:17] falls asleep
[1518-06-29 00:42] wakes up
[1518-08-01 23:46] Guard #349 begins shift
[1518-05-06 00:59] wakes up
[1518-04-16 00:10] falls asleep
[1518-10-25 00:15] falls asleep
[1518-04-24 00:37] falls asleep
[1518-09-05 00:49] falls asleep
[1518-06-19 00:53] wakes up
[1518-07-23 00:22] falls asleep
[1518-10-10 00:11] wakes up
[1518-04-08 00:36] falls asleep
[1518-03-31 00:52] falls asleep
[1518-10-05 00:30] falls asleep
[1518-11-23 00:55] wakes up
[1518-11-05 00:49] wakes up
[1518-11-12 00:58] wakes up
[1518-07-31 00:22] wakes up
[1518-09-04 00:17] wakes up
[1518-08-22 00:03] Guard #1019 begins shift
[1518-06-29 00:02] Guard #1999 begins shift
[1518-05-07 23:58] Guard #2467 begins shift
[1518-03-11 00:12] falls asleep
[1518-08-25 00:15] falls asleep
[1518-05-09 00:04] Guard #3433 begins shift
[1518-09-19 00:46] falls asleep
[1518-06-24 00:48] wakes up
[1518-08-22 00:34] wakes up
[1518-03-07 00:00] Guard #1999 begins shift
[1518-05-15 23:50] Guard #751 begins shift
[1518-10-22 00:08] falls asleep
[1518-07-08 00:07] falls asleep
[1518-05-22 00:48] falls asleep
[1518-09-06 00:23] falls asleep
[1518-06-21 00:37] falls asleep
[1518-05-02 00:43] wakes up
[1518-09-22 00:13] falls asleep
[1518-11-12 00:02] Guard #3433 begins shift
[1518-09-17 00:46] wakes up
[1518-08-12 23:50] Guard #1297 begins shift
[1518-06-11 00:55] wakes up
[1518-06-01 00:35] falls asleep
[1518-04-14 00:44] wakes up
[1518-07-09 00:02] Guard #733 begins shift
[1518-08-31 00:54] falls asleep
[1518-05-24 00:20] wakes up
[1518-10-25 23:46] Guard #2129 begins shift
[1518-07-20 00:48] falls asleep
[1518-05-13 00:51] falls asleep
[1518-03-21 23:58] Guard #2129 begins shift
[1518-03-24 23:56] Guard #751 begins shift
[1518-10-18 00:25] wakes up
[1518-06-04 00:03] Guard #1999 begins shift
[1518-08-21 00:50] wakes up
[1518-10-30 00:33] wakes up
[1518-05-19 00:07] falls asleep
[1518-10-03 23:59] Guard #349 begins shift
[1518-09-19 00:00] Guard #1019 begins shift
[1518-08-01 00:16] wakes up
[1518-05-03 00:24] falls asleep
[1518-08-07 00:30] wakes up
[1518-07-17 00:02] Guard #1889 begins shift
[1518-05-19 00:15] wakes up
[1518-10-09 00:04] Guard #2293 begins shift
[1518-06-20 00:01] Guard #733 begins shift
[1518-08-06 00:56] wakes up
[1518-03-01 00:47] falls asleep
[1518-10-10 23:59] Guard #1013 begins shift
[1518-03-20 00:00] Guard #1999 begins shift
[1518-03-31 00:40] falls asleep
[1518-03-07 23:57] Guard #263 begins shift
[1518-09-27 00:51] wakes up
[1518-11-19 00:00] Guard #317 begins shift
[1518-10-25 00:43] falls asleep
[1518-09-14 00:03] Guard #3433 begins shift
[1518-08-04 00:56] wakes up
[1518-05-09 00:55] wakes up
[1518-09-20 00:45] falls asleep
[1518-05-23 00:54] falls asleep
[1518-02-23 00:48] wakes up
[1518-08-27 00:59] wakes up
[1518-09-23 00:02] Guard #227 begins shift
[1518-03-24 00:34] falls asleep
[1518-07-22 00:52] falls asleep
[1518-04-08 00:49] wakes up
[1518-03-06 00:49] wakes up
[1518-11-08 00:00] Guard #3433 begins shift
[1518-05-26 00:01] falls asleep
[1518-10-16 23:54] Guard #751 begins shift
[1518-03-10 00:13] wakes up
[1518-02-27 23:58] Guard #1297 begins shift
[1518-05-17 00:02] falls asleep
[1518-11-18 00:03] Guard #1999 begins shift
[1518-07-02 23:48] Guard #227 begins shift
[1518-04-25 00:43] wakes up
[1518-08-31 00:08] wakes up
[1518-07-17 00:35] falls asleep
[1518-07-23 00:41] wakes up
[1518-11-14 00:14] wakes up
[1518-05-17 00:47] wakes up
[1518-08-09 00:14] falls asleep
[1518-09-16 00:31] wakes up
[1518-10-22 23:59] Guard #1607 begins shift
[1518-05-29 23:59] Guard #2953 begins shift
[1518-11-21 23:59] Guard #3137 begins shift
[1518-11-07 00:18] falls asleep
[1518-05-28 00:44] falls asleep
[1518-07-29 23:58] Guard #1607 begins shift
[1518-11-02 00:45] wakes up
[1518-03-05 00:48] wakes up
[1518-08-31 00:19] falls asleep
[1518-06-20 00:58] wakes up
[1518-03-20 23:59] Guard #151 begins shift
[1518-03-30 00:54] wakes up
[1518-10-26 00:24] falls asleep
[1518-11-22 00:55] wakes up
[1518-10-10 00:07] falls asleep
[1518-07-30 23:59] Guard #751 begins shift
[1518-11-23 00:24] falls asleep
[1518-08-15 00:00] Guard #751 begins shift
[1518-07-07 00:55] wakes up
[1518-07-10 00:22] falls asleep
[1518-06-27 00:07] falls asleep
[1518-11-22 00:35] falls asleep
[1518-04-15 00:50] wakes up
[1518-10-26 00:31] wakes up
[1518-06-01 00:46] wakes up
[1518-10-16 00:01] Guard #1607 begins shift
[1518-03-22 23:58] Guard #751 begins shift
[1518-09-15 00:03] Guard #3433 begins shift
[1518-04-06 00:13] falls asleep
[1518-04-26 00:55] wakes up
[1518-08-03 23:58] Guard #2819 begins shift
[1518-05-12 00:44] falls asleep
[1518-10-18 00:35] falls asleep
[1518-07-06 00:03] falls asleep
[1518-06-08 00:58] wakes up
[1518-10-09 23:58] Guard #2129 begins shift
[1518-08-01 00:14] falls asleep
[1518-03-22 00:54] falls asleep
[1518-06-17 00:40] falls asleep
[1518-05-09 00:47] falls asleep
[1518-10-21 00:55] wakes up
[1518-07-05 00:17] falls asleep
[1518-07-08 00:38] wakes up
[1518-09-30 00:48] wakes up
[1518-07-03 00:00] falls asleep
[1518-05-03 00:49] wakes up
[1518-04-19 00:52] wakes up
[1518-07-12 00:35] falls asleep
[1518-06-03 00:24] falls asleep
[1518-11-13 00:33] wakes up
[1518-08-23 00:00] Guard #263 begins shift
[1518-08-26 00:01] Guard #2819 begins shift
[1518-09-09 00:41] wakes up
[1518-10-28 00:31] wakes up
[1518-04-12 00:56] wakes up
[1518-07-27 23:54] Guard #2953 begins shift
[1518-11-11 00:44] wakes up
[1518-07-22 00:48] wakes up
[1518-10-13 00:53] falls asleep
[1518-03-12 00:00] Guard #2953 begins shift
[1518-03-04 00:41] falls asleep
[1518-04-27 00:28] wakes up
[1518-06-06 00:20] falls asleep
[1518-07-13 00:38] falls asleep
[1518-09-17 00:35] falls asleep
[1518-03-24 00:42] wakes up
[1518-05-15 00:53] wakes up
[1518-03-26 00:00] Guard #619 begins shift
[1518-06-30 00:21] falls asleep
[1518-09-26 00:59] wakes up
[1518-08-16 00:22] falls asleep
[1518-03-05 00:47] falls asleep
[1518-06-19 00:32] falls asleep
[1518-03-13 00:04] Guard #2467 begins shift
[1518-11-09 00:33] falls asleep
[1518-09-19 23:52] Guard #757 begins shift
[1518-02-24 00:35] wakes up
[1518-05-11 00:19] falls asleep
[1518-04-06 00:17] wakes up
[1518-10-30 00:01] falls asleep
[1518-08-08 00:30] falls asleep
[1518-03-17 00:05] falls asleep
[1518-11-06 00:02] falls asleep
[1518-04-29 00:23] wakes up
[1518-08-09 23:52] Guard #751 begins shift
[1518-05-05 00:02] Guard #227 begins shift
[1518-11-16 00:58] wakes up
[1518-11-15 00:00] Guard #1999 begins shift
[1518-09-05 00:00] falls asleep
[1518-11-07 00:04] Guard #1889 begins shift
[1518-08-25 00:39] falls asleep
[1518-07-03 00:41] falls asleep
[1518-05-01 23:56] Guard #2953 begins shift
[1518-07-01 00:51] falls asleep
[1518-04-05 00:50] wakes up
[1518-08-09 00:00] falls asleep
[1518-04-14 00:01] Guard #1889 begins shift
[1518-10-06 00:21] falls asleep
[1518-04-04 23:56] Guard #1297 begins shift
[1518-02-23 00:03] Guard #751 begins shift
[1518-09-24 00:03] Guard #2467 begins shift
[1518-09-16 00:00] Guard #1019 begins shift
[1518-11-18 00:09] falls asleep
[1518-06-08 00:54] wakes up
[1518-08-28 00:26] falls asleep
[1518-10-21 23:56] Guard #3433 begins shift
[1518-08-01 00:57] wakes up
[1518-05-05 00:59] wakes up
[1518-07-03 23:57] Guard #3137 begins shift
[1518-08-26 23:59] Guard #2467 begins shift
[1518-10-31 00:03] Guard #317 begins shift
[1518-03-08 00:15] falls asleep
[1518-05-06 00:54] falls asleep
[1518-06-02 00:47] falls asleep
[1518-04-14 00:23] falls asleep
[1518-07-13 00:42] wakes up
[1518-07-02 00:25] wakes up
[1518-03-12 00:49] falls asleep
[1518-07-12 00:23] wakes up
[1518-03-14 00:02] falls asleep
[1518-09-03 00:02] Guard #2129 begins shift
[1518-06-25 00:48] wakes up
[1518-04-20 00:53] wakes up
[1518-02-25 00:21] falls asleep
[1518-06-25 00:54] wakes up
[1518-06-24 00:00] Guard #2293 begins shift
[1518-07-06 23:56] Guard #1297 begins shift
[1518-08-09 00:55] wakes up
[1518-06-18 00:02] Guard #1889 begins shift
[1518-08-11 00:16] falls asleep
[1518-09-21 00:54] wakes up
[1518-06-28 00:54] wakes up
[1518-06-16 00:12] falls asleep
[1518-03-03 00:54] wakes up
[1518-05-25 00:58] wakes up
[1518-07-19 00:18] wakes up
[1518-06-12 00:00] Guard #2467 begins shift
[1518-08-31 00:01] falls asleep
[1518-10-28 00:19] wakes up
[1518-03-19 00:53] wakes up
[1518-07-28 00:01] falls asleep
[1518-11-18 00:43] wakes up
[1518-08-10 00:27] wakes up
[1518-11-16 23:57] Guard #1013 begins shift
[1518-04-02 00:27] falls asleep
[1518-10-17 00:35] wakes up
[1518-03-15 00:06] falls asleep
[1518-11-20 23:57] Guard #2953 begins shift
[1518-08-08 00:02] Guard #317 begins shift
[1518-05-23 23:57] Guard #3433 begins shift
[1518-11-02 00:39] wakes up
[1518-04-24 00:41] wakes up
[1518-08-24 00:42] wakes up
[1518-07-24 00:03] Guard #751 begins shift
[1518-10-27 23:58] Guard #2293 begins shift
[1518-06-05 00:55] wakes up
[1518-05-20 00:26] wakes up
[1518-04-07 00:49] wakes up
[1518-09-07 00:01] Guard #3433 begins shift
[1518-10-05 23:53] Guard #751 begins shift
[1518-10-20 00:46] falls asleep
[1518-10-02 00:36] falls asleep
[1518-08-19 00:52] wakes up
[1518-03-27 00:54] wakes up
[1518-07-30 00:38] falls asleep
[1518-07-28 00:07] wakes up
[1518-05-01 00:02] Guard #2293 begins shift
[1518-07-16 00:01] Guard #2293 begins shift
[1518-06-24 00:11] falls asleep
[1518-05-11 00:29] wakes up
[1518-10-31 23:56] Guard #1889 begins shift
[1518-05-15 00:56] falls asleep
[1518-08-28 00:00] Guard #2129 begins shift
[1518-08-17 00:50] falls asleep
[1518-07-19 00:55] falls asleep
[1518-04-09 00:14] falls asleep
[1518-08-09 00:46] falls asleep
[1518-03-13 00:23] wakes up
[1518-06-23 00:54] wakes up
[1518-08-31 00:58] wakes up
[1518-04-28 00:00] Guard #1019 begins shift
[1518-03-15 00:07] wakes up
[1518-08-15 23:56] Guard #2467 begins shift
[1518-03-06 00:03] falls asleep
[1518-09-09 00:07] falls asleep
[1518-10-03 00:36] wakes up
[1518-09-12 00:01] Guard #751 begins shift
[1518-09-18 00:58] wakes up
[1518-05-19 00:25] falls asleep
[1518-03-15 00:48] wakes up
[1518-07-15 00:16] wakes up
[1518-07-15 00:39] falls asleep
[1518-06-27 00:21] wakes up
[1518-05-28 00:20] falls asleep
[1518-06-06 00:28] wakes up
[1518-09-05 23:57] Guard #1889 begins shift
[1518-04-15 00:43] wakes up
[1518-05-12 00:51] falls asleep
[1518-09-19 00:47] wakes up
[1518-10-13 00:00] Guard #1999 begins shift
[1518-04-15 23:59] Guard #3433 begins shift
[1518-10-27 00:37] falls asleep
[1518-03-09 00:33] falls asleep
[1518-11-22 00:41] falls asleep
[1518-04-02 00:02] Guard #317 begins shift
[1518-02-25 00:00] Guard #3137 begins shift
[1518-08-29 23:59] Guard #2293 begins shift
[1518-11-01 23:58] Guard #1019 begins shift
[1518-07-20 00:58] wakes up
[1518-08-30 00:21] falls asleep
[1518-03-07 00:35] wakes up
[1518-09-18 00:56] falls asleep
[1518-07-10 23:56] Guard #151 begins shift
[1518-03-15 00:04] Guard #317 begins shift
[1518-04-28 00:11] falls asleep
[1518-02-28 00:37] falls asleep
[1518-10-03 00:51] wakes up
[1518-10-29 00:43] wakes up
[1518-10-10 00:52] wakes up
[1518-02-23 00:46] falls asleep
[1518-05-16 00:05] falls asleep
[1518-03-17 23:56] Guard #3433 begins shift
[1518-02-24 00:48] falls asleep
[1518-06-22 00:13] wakes up
[1518-05-28 00:53] falls asleep
[1518-07-15 00:28] falls asleep
[1518-11-09 00:00] Guard #1999 begins shift
[1518-10-27 00:00] Guard #349 begins shift
[1518-04-21 00:05] falls asleep
[1518-04-14 00:51] falls asleep
[1518-05-06 00:47] wakes up
[1518-10-05 00:26] wakes up
[1518-06-15 00:03] falls asleep
[1518-05-07 00:51] wakes up
[1518-03-10 00:19] falls asleep
[1518-05-11 23:58] Guard #2819 begins shift
[1518-05-10 00:47] falls asleep
[1518-07-06 00:52] wakes up
[1518-11-21 00:19] falls asleep
[1518-10-08 00:44] wakes up
[1518-05-15 00:59] wakes up
[1518-09-09 23:51] Guard #1933 begins shift
[1518-10-16 00:40] wakes up
[1518-06-28 00:45] falls asleep
[1518-08-24 23:56] Guard #757 begins shift
[1518-04-13 00:42] wakes up
[1518-03-12 00:57] falls asleep
[1518-11-20 00:55] falls asleep
[1518-05-22 00:45] wakes up
[1518-02-25 00:45] wakes up
[1518-05-28 00:01] Guard #757 begins shift
[1518-07-09 00:26] falls asleep
[1518-11-05 00:01] Guard #263 begins shift
[1518-10-24 23:59] Guard #1607 begins shift
[1518-08-18 23:49] Guard #2129 begins shift
[1518-03-05 00:00] Guard #3433 begins shift
[1518-04-19 00:00] Guard #1297 begins shift
[1518-11-11 00:00] Guard #751 begins shift
[1518-07-29 00:17] falls asleep
[1518-03-20 00:48] wakes up
[1518-08-06 00:08] falls asleep
[1518-10-17 00:23] falls asleep
[1518-10-04 00:59] wakes up
[1518-09-13 00:17] wakes up
[1518-07-25 00:57] wakes up
[1518-04-06 00:35] falls asleep
[1518-09-11 00:18] falls asleep
[1518-06-17 00:51] falls asleep
[1518-04-27 00:36] falls asleep
[1518-09-16 00:09] falls asleep
[1518-10-06 00:43] wakes up
[1518-07-12 00:00] Guard #227 begins shift
[1518-06-25 00:44] falls asleep
[1518-08-24 00:23] falls asleep
[1518-11-20 00:52] wakes up
[1518-04-25 00:15] falls asleep
[1518-05-23 00:27] falls asleep
[1518-06-13 00:40] falls asleep
[1518-05-07 00:02] Guard #757 begins shift
[1518-09-03 23:50] Guard #1607 begins shift
[1518-08-25 00:49] wakes up
[1518-08-30 23:47] Guard #3137 begins shift
[1518-05-10 00:12] wakes up
[1518-08-17 00:23] falls asleep
[1518-10-17 00:00] falls asleep
[1518-06-03 00:25] wakes up
[1518-03-10 00:11] falls asleep
[1518-09-10 00:02] falls asleep
[1518-09-25 00:49] wakes up
[1518-09-18 00:51] wakes up
[1518-07-13 23:56] Guard #2467 begins shift
[1518-11-19 00:59] wakes up
[1518-11-04 00:46] falls asleep
[1518-03-03 23:58] Guard #1889 begins shift
[1518-08-17 00:27] wakes up
[1518-09-04 00:52] wakes up
[1518-06-09 00:03] Guard #1013 begins shift
[1518-03-12 00:59] wakes up
[1518-11-15 23:57] Guard #1999 begins shift
[1518-10-11 23:59] Guard #1019 begins shift
[1518-07-19 00:56] wakes up
[1518-09-02 00:51] wakes up
[1518-07-18 23:56] Guard #751 begins shift
[1518-10-24 00:04] Guard #733 begins shift
[1518-08-26 00:39] falls asleep
[1518-10-29 00:02] Guard #733 begins shift
[1518-05-14 00:26] wakes up
[1518-10-15 00:02] falls asleep
[1518-06-24 00:57] wakes up
[1518-05-22 00:01] falls asleep
[1518-08-13 00:02] falls asleep
[1518-11-07 00:57] falls asleep
[1518-11-13 00:22] falls asleep
[1518-04-26 00:37] falls asleep
[1518-03-26 23:57] Guard #2819 begins shift
[1518-04-03 00:04] falls asleep
[1518-10-25 00:22] wakes up
[1518-05-25 00:55] falls asleep
[1518-06-06 00:01] Guard #1933 begins shift
[1518-03-17 00:59] wakes up
[1518-08-13 23:57] Guard #317 begins shift
[1518-06-02 00:54] wakes up
[1518-09-20 23:52] Guard #349 begins shift
[1518-11-14 00:09] falls asleep
[1518-06-21 00:54] wakes up
[1518-07-09 00:40] wakes up
[1518-06-21 23:48] Guard #349 begins shift
[1518-02-24 00:50] wakes up
[1518-05-10 00:06] falls asleep
[1518-10-07 00:46] wakes up
[1518-04-14 00:15] wakes up
[1518-09-22 00:50] wakes up
[1518-07-27 00:29] falls asleep
[1518-07-15 00:35] wakes up
[1518-02-23 00:10] falls asleep
[1518-09-02 00:06] falls asleep
[1518-05-09 23:59] Guard #757 begins shift
[1518-06-17 00:55] wakes up
[1518-06-08 00:31] falls asleep
[1518-10-15 00:28] falls asleep
[1518-08-21 00:28] falls asleep
[1518-08-30 00:54] wakes up
[1518-04-18 00:51] wakes up
[1518-04-01 00:55] falls asleep
[1518-09-04 00:30] falls asleep
[1518-09-23 00:13] falls asleep
[1518-04-27 00:00] Guard #2467 begins shift
[1518-04-23 00:00] Guard #1013 begins shift
[1518-07-15 00:03] falls asleep
[1518-05-29 00:40] falls asleep
[1518-11-22 00:53] falls asleep
[1518-06-12 00:49] wakes up
[1518-04-02 23:52] Guard #2467 begins shift
[1518-10-13 00:57] wakes up
[1518-07-08 00:04] Guard #349 begins shift
[1518-08-11 00:01] Guard #1933 begins shift
[1518-10-06 00:47] falls asleep
[1518-02-26 00:44] falls asleep
[1518-05-27 00:17] wakes up
[1518-10-21 00:15] falls asleep
[1518-11-10 00:55] wakes up
[1518-05-20 00:19] falls asleep
[1518-08-10 00:00] falls asleep
[1518-05-16 23:52] Guard #751 begins shift
[1518-11-12 23:57] Guard #1889 begins shift
[1518-11-11 00:51] wakes up
[1518-04-18 00:19] falls asleep
[1518-08-16 23:57] Guard #349 begins shift
[1518-05-27 00:01] falls asleep
[1518-09-07 00:50] wakes up
[1518-07-17 23:48] Guard #2129 begins shift
[1518-04-02 00:59] wakes up
[1518-10-20 00:05] falls asleep
[1518-10-18 23:57] Guard #317 begins shift
[1518-08-11 00:40] falls asleep
[1518-11-13 23:58] Guard #2293 begins shift
[1518-07-24 00:35] falls asleep
[1518-04-07 00:17] falls asleep
[1518-05-13 00:00] Guard #2819 begins shift
[1518-04-13 00:20] falls asleep
[1518-06-07 00:00] Guard #2293 begins shift
[1518-11-19 00:29] falls asleep
[1518-03-19 00:04] Guard #733 begins shift
[1518-11-15 00:30] wakes up
[1518-11-22 23:58] Guard #1999 begins shift
[1518-02-24 00:02] Guard #1297 begins shift
[1518-06-10 00:54] wakes up
[1518-07-01 00:02] Guard #733 begins shift
[1518-10-06 00:53] wakes up
[1518-08-11 23:56] Guard #1019 begins shift
[1518-09-03 00:43] wakes up
[1518-04-04 00:03] Guard #2467 begins shift
[1518-03-03 00:41] falls asleep
[1518-07-12 00:48] wakes up
[1518-06-27 00:31] wakes up
[1518-08-28 00:56] wakes up
[1518-08-19 00:04] falls asleep
[1518-04-28 00:45] wakes up
[1518-02-26 00:57] wakes up
[1518-05-28 00:55] wakes up
[1518-09-07 00:58] wakes up
[1518-07-18 00:09] wakes up
[1518-04-30 00:52] wakes up
[1518-08-25 00:32] wakes up
[1518-04-18 00:20] wakes up
[1518-03-28 00:00] Guard #2467 begins shift
[1518-04-15 00:46] falls asleep
[1518-05-10 23:59] Guard #227 begins shift
[1518-10-28 00:30] falls asleep
[1518-06-01 23:46] Guard #2293 begins shift
[1518-07-04 00:46] wakes up
[1518-05-05 00:54] falls asleep
[1518-09-29 23:50] Guard #757 begins shift
[1518-07-30 00:54] wakes up
[1518-08-31 00:45] falls asleep
[1518-06-16 00:50] falls asleep
[1518-10-19 00:45] wakes up
[1518-09-12 23:58] Guard #751 begins shift
[1518-05-28 00:50] wakes up
[1518-09-05 00:51] wakes up
[1518-07-14 00:14] falls asleep
[1518-07-04 00:07] falls asleep
[1518-10-26 00:49] falls asleep
[1518-09-23 00:47] falls asleep
[1518-06-16 00:56] wakes up
[1518-03-16 00:02] Guard #1889 begins shift
[1518-10-15 00:50] wakes up
[1518-07-31 00:18] falls asleep
[1518-07-14 00:24] wakes up
[1518-05-29 00:53] wakes up
[1518-02-28 00:49] falls asleep
[1518-05-29 00:01] Guard #2953 begins shift
[1518-07-26 00:05] wakes up
[1518-07-22 00:04] Guard #263 begins shift
[1518-10-06 00:04] falls asleep
[1518-10-27 00:51] wakes up
[1518-10-25 00:58] wakes up
[1518-09-23 00:51] wakes up
[1518-07-17 00:48] wakes up
[1518-06-07 00:56] wakes up
[1518-03-08 23:58] Guard #1019 begins shift
[1518-03-25 00:59] wakes up
[1518-11-19 23:59] Guard #2293 begins shift
[1518-03-29 23:58] Guard #3433 begins shift
[1518-04-21 00:54] wakes up
[1518-09-16 00:56] wakes up
[1518-03-13 00:56] wakes up
[1518-07-18 00:01] falls asleep
[1518-07-10 00:00] Guard #1297 begins shift
[1518-09-03 00:42] falls asleep
[1518-06-27 00:25] falls asleep
[1518-10-08 00:58] wakes up
[1518-11-06 00:41] falls asleep
[1518-02-28 00:44] wakes up
[1518-03-23 00:45] falls asleep
[1518-03-23 00:39] wakes up
[1518-08-05 00:55] wakes up
[1518-09-04 23:50] Guard #2819 begins shift
[1518-04-18 00:55] falls asleep
[1518-10-10 00:36] falls asleep
[1518-10-29 00:14] falls asleep
[1518-08-31 00:47] wakes up
[1518-10-16 00:36] falls asleep
[1518-11-05 00:14] falls asleep
[1518-04-20 00:23] falls asleep
[1518-07-24 00:06] falls asleep
[1518-04-15 00:04] Guard #1297 begins shift
[1518-04-19 23:58] Guard #2467 begins shift
[1518-06-01 00:00] Guard #1607 begins shift
[1518-03-27 00:48] falls asleep
[1518-05-10 00:32] wakes up
[1518-06-06 00:47] falls asleep
[1518-08-03 00:28] falls asleep
[1518-02-24 00:58] wakes up
[1518-10-29 23:54] Guard #349 begins shift
[1518-10-02 00:19] falls asleep
[1518-09-07 23:59] Guard #1933 begins shift
[1518-06-29 00:50] falls asleep
[1518-08-29 00:57] wakes up
[1518-11-11 00:49] falls asleep
[1518-02-27 00:03] Guard #2293 begins shift
[1518-03-01 00:01] Guard #757 begins shift
[1518-04-29 00:32] falls asleep
[1518-06-05 00:37] falls asleep
[1518-03-29 00:57] wakes up
[1518-09-25 23:59] Guard #757 begins shift
[1518-06-11 00:54] falls asleep
[1518-03-23 00:14] wakes up
[1518-04-10 00:04] Guard #317 begins shift
[1518-03-02 00:30] falls asleep
[1518-11-20 00:59] wakes up
[1518-03-18 00:51] wakes up
[1518-06-26 00:32] falls asleep
[1518-04-10 00:10] falls asleep
[1518-08-22 00:51] wakes up
[1518-10-08 00:04] Guard #733 begins shift
[1518-06-30 00:49] wakes up
[1518-10-15 00:24] wakes up
[1518-06-07 00:43] falls asleep
[1518-11-20 00:51] falls asleep
[1518-05-31 00:04] Guard #317 begins shift
[1518-03-31 00:41] wakes up
[1518-06-21 00:04] falls asleep
[1518-07-02 00:44] wakes up
[1518-11-09 00:43] wakes up
[1518-03-09 23:56] Guard #2467 begins shift
[1518-04-13 00:04] Guard #3433 begins shift
[1518-09-11 00:47] wakes up
[1518-09-14 00:44] falls asleep
[1518-07-21 00:00] Guard #1297 begins shift
[1518-04-04 00:55] wakes up
[1518-11-04 00:24] wakes up
[1518-08-03 00:32] wakes up
[1518-04-09 00:45] wakes up
[1518-10-02 00:26] wakes up
[1518-02-23 00:15] wakes up
[1518-11-01 00:55] wakes up
[1518-06-21 00:18] wakes up
[1518-10-28 00:41] falls asleep
[1518-07-01 00:09] falls asleep
[1518-02-25 23:57] Guard #2293 begins shift
[1518-11-09 00:22] falls asleep
[1518-04-17 00:00] Guard #151 begins shift
[1518-06-29 00:41] falls asleep
[1518-08-07 00:04] Guard #1889 begins shift
[1518-07-05 00:35] wakes up
[1518-07-24 00:40] falls asleep
[1518-11-10 00:00] Guard #2953 begins shift
[1518-04-20 23:51] Guard #733 begins shift
[1518-08-01 00:23] falls asleep
[1518-03-18 00:17] falls asleep
[1518-04-10 00:59] wakes up
[1518-06-29 00:54] wakes up
[1518-03-18 00:41] falls asleep
[1518-05-15 00:00] Guard #1889 begins shift
[1518-10-03 00:09] falls asleep
[1518-10-17 00:20] wakes up
[1518-03-24 00:29] wakes up
[1518-07-29 00:37] wakes up
[1518-11-07 00:44] wakes up
[1518-06-04 00:39] wakes up
[1518-10-22 00:45] wakes up
[1518-10-26 00:56] wakes up
[1518-04-18 00:00] Guard #2467 begins shift
[1518-10-05 00:40] wakes up
[1518-07-13 00:56] wakes up
[1518-06-06 00:50] wakes up
[1518-08-23 00:56] wakes up
[1518-04-11 00:00] Guard #263 begins shift
[1518-05-07 00:44] falls asleep
[1518-03-07 00:41] falls asleep
[1518-10-28 00:51] wakes up
[1518-08-29 00:28] falls asleep
[1518-04-06 00:52] falls asleep
[1518-10-14 00:28] wakes up
[1518-04-01 00:57] wakes up
[1518-06-11 00:41] wakes up
[1518-09-29 00:22] falls asleep
[1518-08-29 00:00] Guard #3433 begins shift
[1518-10-21 00:03] Guard #1999 begins shift
[1518-04-12 00:24] falls asleep
[1518-10-09 00:56] wakes up
[1518-05-04 00:59] wakes up
[1518-05-01 00:50] falls asleep
[1518-06-18 00:07] falls asleep
[1518-03-08 00:44] wakes up
[1518-06-14 00:42] falls asleep
[1518-10-01 00:02] Guard #1297 begins shift
[1518-03-13 00:15] falls asleep
[1518-05-04 00:04] Guard #3433 begins shift
[1518-05-09 00:37] falls asleep
[1518-08-08 00:55] wakes up
[1518-08-16 00:45] wakes up
[1518-03-09 00:35] wakes up
[1518-07-18 00:45] wakes up
[1518-04-15 00:09] falls asleep
[1518-08-24 00:35] wakes up
[1518-03-22 00:58] wakes up
[1518-06-30 00:39] falls asleep
[1518-11-02 00:09] falls asleep
[1518-11-10 00:33] falls asleep`
// Create a proper array with the challenge's input
const formattedInput = input.split('\n')
// Function to parse string into a proper object
const parseString = (string) => {
const parsed = string.match(/\[([^)]+)\] (Guard #([0-9]+) )?([^)]+)/)
const stringDate = parsed[1].split(' 00:')[0]
const minutes = parseInt( parsed[1].split(' 00:')[1], 10)
const date = new Date(parsed[1])
const guard = parseInt(parsed[3], 10)
const message = parsed[4]
const action = message.match(/\bbegins|\bfalls|\bwakes/)[0]
return {
minutes,
stringDate,
date,
message,
guard,
action,
}
}
// Array of objects parsed and sorted
const sortedLogs = formattedInput.map(parseString).sort((a, b) => a.date - b.date)
// Mapped times object
const mappedTimes = sortedLogs.reduce((acc, log) => {
// Set current guard
const guardNumber = log.guard || acc.lastGuard
// Set current guard as the last guard
acc.lastGuard = guardNumber
// Set current guard as mostFrequentRepeater if no other guard exist
acc.mostFrequentRepeater = acc.mostFrequentRepeater || guardNumber
// Set current guard as sleepiest if no other guard exists
acc.sleepiestGuard = acc.sleepiestGuard || guardNumber
// Get our guard from our acc map
acc[guardNumber] = acc[guardNumber] || {}
// Get our guard's minute map from our app map
acc[guardNumber].asleepMinutes = acc[guardNumber].asleepMinutes || {}
// Get our totalSleepTime from our acc map
acc[guardNumber].totalSleepTime = acc[guardNumber].totalSleepTime || 0
if (log.action !== 'begins') {
acc[guardNumber].mostLikelyMinute = acc[guardNumber].mostLikelyMinute || log.minutes
}
// If guard is falling asleep, then we log this info
if (log.action === 'falls') {
acc[guardNumber].lastSleepFrom = log.minutes
// If guard is waking up, we do a small calculation to check how many minutes he slept
} else if (log.action === 'wakes') {
const lastSleepFrom = acc[guardNumber].lastSleepFrom
const sleepUntil = log.minutes
const sleptFor = (log.minutes - acc[guardNumber].lastSleepFrom)
let i
// We sum to his total asleep time
acc[guardNumber].totalSleepTime += sleptFor
for (i = lastSleepFrom; i < sleepUntil; i++) {
// We create a small map of every minute this guard has slept
acc[guardNumber].asleepMinutes[i] = acc[guardNumber].asleepMinutes[i] + 1 || 1
// We also store the most likely minute this guard is to be asleep
acc[guardNumber].mostLikelyMinute = acc[guardNumber].asleepMinutes[i] > acc[guardNumber].asleepMinutes[acc[guardNumber].mostLikelyMinute]
? i
: acc[guardNumber].mostLikelyMinute
// We log how many times the guard has slept on the mostlikelyminute
acc[guardNumber].timesSleptOnMostLikelyMinute = acc[guardNumber].asleepMinutes[acc[guardNumber].mostLikelyMinute]
// We also log who is the mostFrequentRepeater guard (the guard who slept the most times on any given minute)
acc.mostFrequentRepeater = acc[guardNumber].timesSleptOnMostLikelyMinute > acc[acc.mostFrequentRepeater].timesSleptOnMostLikelyMinute
? guardNumber
: acc.mostFrequentRepeater
}
}
// We store the sleepiest guard
acc.sleepiestGuard = acc[guardNumber].totalSleepTime > acc[acc.sleepiestGuard].totalSleepTime ? guardNumber : acc.sleepiestGuard
return acc
}, {})
// Answer 1
const answer1 = mappedTimes[mappedTimes.sleepiestGuard].mostLikelyMinute * mappedTimes.sleepiestGuard
/**
* --- Part Two ---
* Strategy 2: Of all guards, which guard is most frequently asleep on the same minute?
*
* In the example above, Guard #99 spent minute 45 asleep more than any other guard or minute - three times in total. (In all other cases, any guard spent any minute asleep at most twice.)
*
* What is the ID of the guard you chose multiplied by the minute you chose? (In the above example, the answer would be 99 * 45 = 4455.)
*/
// Answer 2
const answer2 = mappedTimes[mappedTimes.mostFrequentRepeater].mostLikelyMinute * mappedTimes.mostFrequentRepeater
// We log our answers
console.log({
answer1, // 98680
answer2, // 9763
})
/**
* --- Day 5: Alchemical Reduction ---
* You've managed to sneak in to the prototype suit manufacturing lab. The Elves are making decent progress, but are still struggling with the suit's size reduction capabilities.
*
* While the very latest in 1518 alchemical technology might have solved their problem eventually, you can do better. You scan the chemical composition of the suit's material and discover that it is formed by extremely long polymers (one of which is available as your puzzle input).
*
* The polymer is formed by smaller units which, when triggered, react with each other such that two adjacent units of the same type and opposite polarity are destroyed. Units' types are represented by letters; units' polarity is represented by capitalization. For instance, r and R are units with the same type but opposite polarity, whereas r and s are entirely different types and do not react.
*
* For example:
*
* In aA, a and A react, leaving nothing behind.
* In abBA, bB destroys itself, leaving aA. As above, this then destroys itself, leaving nothing.
* In abAB, no two adjacent units are of the same type, and so nothing happens.
* In aabAAB, even though aa and AA are of the same type, their polarities match, and so nothing happens.
* Now, consider a larger example, dabAcCaCBAcCcaDA:
*
* dabAcCaCBAcCcaDA The first 'cC' is removed.
* dabAaCBAcCcaDA This creates 'Aa', which is removed.
* dabCBAcCcaDA Either 'cC' or 'Cc' are removed (the result is the same).
* dabCBAcaDA No further actions can be taken.
* After all possible reactions, the resulting polymer contains 10 units.
*
* How many units remain after fully reacting the polymer you scanned? (Note: in this puzzle and others, the input is large; if you copy/paste your input, make sure you get the whole thing.)
*/
const input = 'yZzYilLqQqBbQkKofFOXxjLLllCUuYyVrRvYycJeXtjJZWwzlLTxOmZzMhHowWlLCsrRAaLlSfFKkVuUxXvhHcCcEcCJjjJPJjjJBbYwWyeXhHxEpRrwGgWZzWwZwEKkekuUMMmmhSsCcHQzZTTtteEZzqKFsSfitTIbXxUuBeEWQxXqnHhNwylLgUuGYqQuUnYyPtNnTUupLlNWkKAarRJjzGgfFMmoBbWwOqQtqaVZzQIiqvNcCXxnaAAQryYvVRrlLRQgGRJjUoOurLJjlsShPpXxMmsSEeJFDnNdfFfjRnNruCcSdDsJjUCcRrRrdVvDdDOoHBdDbqHhvlZzLBbmdRrDdDMoOmZBbsSzsSXxMGgVKkTYyCtfFTkKfFAasScAaTCdDkKcmMfFbBBRrWxXwqQuVviIUMmtTGgAaxzZXbJAalLjSUudDsXqQOoxTtTXxiIwfFBbWtzLlXvVxISsijJyYKVvkpZzPXxzZoVvOEezUujgGqQVAavJJjzZceEffFeEfFFBeUuEbkhHKCUHhuyeEYmiRLAalrIMchHbBCGgdDgjJpwGgWPGZzzZAaBMmRLlrbbGYygpPByCcYHxXfFcCZNnrRzlcCLhGkKcCKkVNHWwhnvBbnmMNRrLlveEVPmMmPVvdbBWwDmMMlLmpMlUqrRQkKdDrWwYyQqRAauPpLsUiIuvVRXxrSdkKLlxXDRzZDfFdrqQvcCSTWwtaAsfFXDaAdxDdZzeOovVJpPjkuUKEwWnnNzZNUGHAIiahgGgSsQjJqjJumMRNiInrNnTuUtVQGgyPpYqpOooOvwvCcLXxQqlVOnNoWjCcJpfFUuuULNoOnlFTtJvVjlLlvVnNxXLKAakmMPIipPpyYPpPpfhHCcZzdDuUUfFhgcCGHOKkopLcClPvVuLNnlPFfIfFlLieEKoOYypYyZzEesSPCeEmMBbTNnYkKZzfveECcTtVFVvNeaAEnOWwIiKMmkIioKkBDUujfFJZzyYxXZxXkKzqQdaArRYjEeJybrRDdjTtJjvVJnNjFfPpJFpPjJftnNTMmwZzWyGgnNNnrfhHhHFRHHhhaATtUpnNPaAutwOoBbzbBZfKkfFFKkfFLXxlzXxjJnNnNrRUugGPpnNGgzZDdImMWwaeRrEAXxRrPpBbPAaZkKzIiUucmMCERrOwdDkIiKKkWfQqcCoHjqQWwJhObBoOSsHhtPpTqQeHoOhcDdQqnNgrBbRFCFlLmMfcyYfGHfFhhBEebsSHCsSvbZzuwWyZzGhHgeEkKYOkXxKouUHfFhIigGmMlLdDrRDdxqBUuBBXxbgGbbQMmLlYWwHhCcytTqQXHhcGgiICbZzBlLUhHDdyYyYTtGgYynzZuxXUNIiKYprRPsSZzqQsaASLlqVvtTQhgGnNyYHjJYymPCcpMEeBbtTHhZzVqDdQWwiIvrRkpSsrRqkKQqQPpBBbbJzfFZWwjzZJlLjzZsSzgGZXxDFoOoZzOoNnOOofiIkKIiCcpFdDhHfPdjZzyYRrFfiITtvVRruyHhYUtbBTHDdIYyiwWWtzZTCcwkKPeEzZpTtfXxrRsSRrFAayCcgGYhUuzZhTyYhxXHeEeUuEmIHhyYWwyYMmiQfFRqQrJjxGQqgXqgzZjJZFfOozAyPpYqQadTtSsEeDbiFfzNnZIZOoTKPYypktIXxiuTKkKkkKtUzTtMmOoAajJiIsKkecTtKeQqEkCeEHhESgGxXBZzHhEZzkuUKFfAaxXtTFFfNDdpEeSsmMeEPnsSUTtuUlLyCcYYyGgCcYgVvGHMmhyuFUZLlzuRcCeErfgGWzJjeEvfOoGgPpiIfMmFHYyhIBbiEenNMYymIiCcJjUYsSXvVWwxvVhHRtTryzZSDqQkKTtaAxXhHvVfRrVynNYnNvFsANnaSKYykzLkUuOofFvVKOoqLlQWwaAzHbLELleeEHhiIltsSTdDIiPjZzJpwZpPHdDKtTkgGhkKLlvVbBlLERregGKkzkBbrRcCKXIiIOdDoVvixMwEeWmFfMqQRrXxmMmHhmMiIxXFLlaAfdeEDpPTNntsBwWnNIfFiuYiIyEegGUbELleFHhhHFfGxLlXZdxXjJaADzDvVDdpPRaAaAGgrkrRKYydggLlEeGhHIiDdfYyYOejJENtEVvLleylbBLoOYbBveEjJVtThdXxHRrhDQqHEeSFhHpkKPlhHeoOEoOLfEesLZzQqlLpmMnNPnNlHhFUNnuflAahHHhUuNnLJjTKXxcCWwkKyYDdkaAotTnNVNLlXxKhHkUvdDVnNZIicXmMxCpPZyRrYcCdDBoOSsguDdLlgGUzZGosSRrNnOrRtTaAvxXtTEelnXxNLVRrQyQqYqAaWwtrRTCpPcCKkqTtQdDSsxGgpPJKOoaAcCGglZzAaZzLFSsaAfVAavbBCdDVvCKkcTtlLCRrcfFcnNGgiEeBTtYybcCoOCbBuUcIdDfFbBlLkfFBsStLltkUuKAaDCurFfRUceEPLlPppoOwWoRroHhOPpOdDJjLlZzPTtpiUuIYzZytnNTdOKPpkaAUdAaAaMmTdYyQqKQlLFAafcmiICsSuUNncMnNpPNnNnCHhsSqkDKkPBbtUuWwTpaAuUwZzkdPtTfFpNyYnlLDdGgNnpPLlUuDaAzZxXDVvSsqQsQqSQfFqGtIiTgkKWwEegUuGNncSNnvwZWBgGbwxfFXVZWwCcBRrbzveEEBbnNHhefKnbBSsNMaAYymanNVvFfUuUjPpJnNnsJjmAaMdLlUuDsSVvkKLlSOtTWUuwPDqQKEeLhHbOoPueElLUZzpUufpPFlLJKkjNnloOSdaADssuUSsSLfySjJnNJjvpPVUnBbNmMvVaFfpPDddDrlLFfwWNnEeJjIhHTtAXxNirRIWwPpnafdDRJjrRUqQMmufvVEeFmMvYyugZzhyYAaHeESsGikKIaFfvVKmMkGdSsDdQqUfPppEePNjrRJnmMOaaAAoaAFJSsjSsuTtMjJZzhQqJjyHhbBYexXREerEVvHfFGgIiiixXIbBJjIPuUQqpWwvVrLlRaAIiHgGnaANadBOCcobIiEeDPpBbAGgrRUvOoxXgWwGzqQZkKXFfxVTaxXAwlNneEyXxYWwMmgGxXTtNdOPposfFSDlMrRpPuUmhHMHhiImpPKeEkmgWwGXxcCvVXxMCcFmMKkxYXxHhLlsSyfvVGBbgeENnajxXJzZRrAoOiIiItTiIKBnNcCEUZzuLlyYLQRrqqEPpeQQKkqQqSsleZzlLQqOATDHhdXQqxQvVmvVwmMWMCcwbBWfFYyHRPprHLPpzNnZlOoIiyYsSZznmMgwpPhHFfjJWGZSJjAhxXHacCWMjJmfrRFpPHKktThwGgwWYyEfEeFzeMmHnNhEZJyYmMklLKdDxOoVvJjdxXmMDiBbTtDdoOIYDdAaIikKmMnNsSUufFyBLGgcCNnLlCclcCSsoIicCaAOaAbYyIiavVAVvfFbGoOGgmCcCcJjyYMgecCVdXxDDdvgIiDsoOtTdpPbBOhHQqLQDKkdqlVyYLlhVvMSsmMmyYUqtTUUtTvGgyAaYhMmHqeEQeQkKqETnDdCcNGgKgGkIimmMyYMLlcCtCcVEujJUCcBbMmRrcuUnNgGxfFmFhHfrRXxMVZznNSsvVKkDdMmvIiPpFYyfgGXxmufFKkUcwWCLlMAawWvVMzkKZkWwKoFfVvtbZzzZBTtKkTTtOmVrRBbccCCGgkKZzlLtTgaAnNLlhHYsSybBxJjqQOKIikRsSFfrPpOoIibVvBzZlrRqQhKkHfwWFLhHVfFvHhIiKkaAVVeEyYvVzZvbkKByZzdTOyYyYotDGIaafFAGgxwWcCXkKsSwkIixXBbKxuUXMmcuUFfpTtPCfEexXFiIciaABbICAzZsSkVvKacCAZzIimFfzZAawCczZWRrZfYuUUutMmTLUulzZztahOoHrUuwfFWktkKTpwfFWPKkKGgRrCDdckgaAGxICcxtTCKknGgUaiIAuQqQsSbYdYyVvDwWnAtTaMlxXLlLmoRrOYyNyqAabWwBqQQBBbbfaAUuFnNiIAdwWDaYUuybBBqEeUPrRgUuGKkzLlsSZRrpLlZznjJNudiIDdDERrfFoOIOoieTtDdmMNKkAQqmMawWVhdRrWwffFFkKUAazkKIiZuzXJbaAKkGgjWwsSaAJKpPkvVBxNnJlLPxXAdDbVQqtOoLfFFfcCIinNdDlIiniINCcTnjEeJbBNgvebFfBkXxlLKtTCFfuUctTRrEIiyYjJEeFaCcTtHhCcZzADJjLmMiTtIiIFuSsmMZzzZrRNgTWEeTtEemTDdtTNohHSoOCQMNQqfFmvbBSScCkaVvAKssWAaHhwghHlLRrtTGnNatToOAmMfFwWfFbBQqvVUsjJCvMHhmVcPpXxbCBOoQZzDlgGPpLpPMmpLlPZBbqCcYyhHQQpPqNcCnbatTAWjJIzZSwGgsSwWZzDdYMrRJjzIMPpmDdaAYTtBbyRrEeiIUAabPpwWLlBbMOHhonNLJjsUeEWwrRQCZxplLeqgGNnQDdSskKWpPcoORZzaAZMmhHAamMiIniINzwoOZznNAacCfIiEJjXxBbYyaoOMmsRrSRrAkVvKLMfFYymMJjmUGgQqMmMCYdzZYyGPpgUuLfDdFNnNnGlLAavVNnAavkKVyYglpnNPnqZzQwSskKYyWwrRFuPpsSMjJmtcCaApPtTSsSsmMTqiIQDWUuBbdDEewdCcFPpCJjcilLotTOCcysSAaqwWrRQFAanNfyYiIPtTpJjQqQcCqMmMBbqTdDtQTtlLmlLBbWwSSeSsyvwWLEexXlACcCQqwWqQWRrwcSsaXxbBVYGWJjwgGgaHYPpFfyhJjnkKhHcCMmLjxXJXxnQYyqimjuUXGxXgxSOvIiVxXFfdDbBlLrRzJjZuMmNnUAadKkvVoOiMmWOowwoQqONHhnWIQmMCxanyYsScksStTJjIiLlbBkIErJvVjNnKbIiBEeTtRrMeEmMcCmuiXBbxuUZzoHhOMmoOpPpZFwWuwCcpPnzZNJZzsSmhHvKkVPLlpdLlJjDUudDMxGgXxuUXccCoHDdqqQPdDpMmfFzZSsTqJjQzZwWtLWSswlhbSbebBEBboGcSsYyjlLJepZzPwWsSaAaApPEcCzWwDKkdGgGgFfZCKknSsNIibBbBvzZVRNoOnoOYyWwxEWnNwNeEnQqhHZziLlDTtdJjBPpXJjyYnDhijlYyZzoizZINnGiIkKWDHhdwiIWwgXRcCrRefFhHqyxXYGnNaxXHPpnNIyYXOoxiqQjJIpPihbBxXAIgGZzOobBiMmFOjBfgmMWRHbBhjAaXxvVJjiMmlLjkCcKEeavVAJwWKXxEeFfmwWymMIiSsYnAWwasSRrKkIiNRrveGgEafFdDAqQdsoJZzjJxXPvJdHhDKkiNqQnnNrRKkrSsRaAzEelLWwBIaYyAijJbJjEzZyQqHhQqRfFSatTAaJLUAQqaFfuwWlLjGgYyPpRyYrJYyfYyFwPMmpfFxXtiIAIiaDRrdhGgHRrESpPsgGIWwoOikKhHWwevmMhHePpEEeVBXIiqgGQlcCSEesjcYyogFfGOaAPpKbBaVIisPpSjJyYWwVvESqQCcMrDGERrdBQqbDTtqQGguwtTWxXZzUpPYyUuPpRzZaArsRvVlLYyXnXayYhsSHgGTxbBjJmqQFFaAfRjJcaACyiIYRsSsSriNWTtqQwXdQqDEeqSvVuUsmMQdjehHfFKkExXEIieRrEZzjVYTthdDHlLyvZIizGgBjJHDAbBadhzZbBZzYpKkaFfKkAPqMlLNqQnmSsndDoWfFwRrZzRSsPpqQXnNTtnUuNlPpNCcnLuUIEeixUuezZDdoOHdDhrRNdXbjJBvVxbFfByZzYDneEqQPpqQHhEIinNBboOuAatSsbBhCcHVPSIirRsHhpPZzKQqkNVrYndvVDIiVvAafFLlGgqQNyRfFrTtRrRmMfFFfqQZetLlTjOopNnPPLlzyTtYxXyZiISYyrRLlfsSUiIgMmGozZFOoSTqTvVsFfdDpmJAQqalLPpjqBbQMdiIpPDkKbBVvDEbBedCccCvVlAaLvVpPUuYylMUumLJoOGJjJjwTzZJjKPplLsSkwyKkYUQCcVuUHhvbBquqeEQJjQqRrdtTAazZGTdDIiHhttzZTfFYpPpPZznNyWwaCePpERriImQqeDdECcZldDKkLPnNEepRLlnNDdaAXxPpqRCBTcKkVwWVvmMvDdCcYtpPTwLlNQNloObtTRrBHhjWeErRmMsgGyjJYSwRrBVrgGQqRvsScCXxTtyPuUHhCcdDRAXxaXxVvvVrTNWNcCnOoxnNXTJjuUtRRhHHhncJjCVvEeQxXXxBbtTxXcjJEelROoRruUriIiaAJGgjfXNnrTtRmwBCdlzZLlLDVCcuqQUvqQciHhdDIyYviIYyyYNYynTOzZtgGLlXOozZUuGnNgCcxStbLlJrRSsxXBbdDKkfoMwuUDrRlUuuUcCiImMabeEPpjzZJeElhHLZzdvVoODWwBSsxXWvMJjmBDqQdbHhYeEbDGgBmMqQUaAuuUWwxiZzgGqQIiQAHgGhcWwCfrvVRzIiZFPpnNYyeSsaAjVvkhVvyYmavAaVCcZHhzwTtAaWmMUuHheKkEXkpIiPKLlLDdlTSsfFtlLWeEhFyYcCfJoQqYuKkIiUSsXxruUPoOpXGgNnxbBgEkKeGWwPbBpxmMXyYaAbWwhtTAadZzvEeVDyYGUugXkKxIfFvVkKpPJXxnYkKyYGgyNpkKyYPnVvNdGgYYjJTYZbBzyXbBaAdgGDGHyYhgKkazZZkKyYgwfFWKSbBskeEbBnMmvVNEeqEefFQiIMPpFfmGLnNaqQoaAcCOXxuzkKZUwWwZzoOWeEnUuGvVgNgEeGIiAOcConXoUusSXfFxHhzjeEEeJpPylSkKPSstTOoNInxXpWwPUDdGgOYyopHhPqQRHhrdDuYswWSjJyYnNBKaADdkDZaAGgfMSKksmXxHJjaJjAhyYkbVLlvEQqWwxDlFHhfLhwWNYyAaFfnsSrRBTtcdVvxXDxXavVWGjBbvVJDdkFZzuUJjRhzZbBDdHorRVVvJBQqwWozZIiMTtmMmcCOvVtbBTxXSsZzAaVVykKqJjQtMmQTthHcvVrRyYXmqQUuyMmYJjMxURHhHDIXxiepyvVYPQkkeIiEmMVvJjdPpxXXfFcCuUhHxsFrRfSfIiFDnkNnKNbDdBAamiIMlRrshHSjJLBtQqotWwTOfFTbBeEoOhzZoOCdDcYZzyLlFfNXxnYQqaAQbBUWwuAOohHiXtTxfFQqwWGgwWTFfqgfFCcUuGQEKsDdcCSkwWPppenNiIEPgGcDdrROoIiCstYcCskeERrHpSsIiAaPhBVjEeJvjYAoRryYbiIBWwKNnbBkONnDAamMdCJHhCcYpfNZhHznFSsPVEMmevyWkKCnyKkPMmpZeEPmMyYIDduUuUuvVsqKkjqhIOUuoiHZznKJGgEejceeEECxcCcwWPDdCcCccQqECcePpiIWwCAaaQqJNeEmMBbbBnqdDQRHGgGoYyyYWgIiGfFuULIiGVnNwWhHAhtTHHWwhTFftUufYykKwWETVvteEexpPVvOtToXlIiLiCnNaAciIzIHhBbeqQFfGdDDZzdgPyYCIiTBbBnLZVRrvvVznmMmYHrRhKkKAXgGBbxZzFAeEaeSsOoEyYfZzvVyYmfFfPmMSsZzSZzmrRMazQqZfFBbAsasSAEeFzHhZYyDoxAaTodWrRqjJQrRKAawwWPpWwLlcCWAmXxMaEekiBbIDdbBbBjmMoOPyYpgGEeIunNUwxXDdWiaAwKkTbyOoiIBxJtcCTZzjRRrLJjGgkKDdcCROeEoOaqQAndGCaAcqQgWwDaAduTFsSTtDPUuzZhiIiwWQVFfvqSgGJjsUuKFfkGeuUVvlqQLaTuUKkcFRrbBfymMtpPTtgGvOMmsSoVDCcdDnZzNuRIirUdbBrRyfFQEeLdDhHlkKjRrQYyqdDZTtYyoGgVvaAONkoOEeKkWwrRCnNnNcEeECcCnIiNxXhwWdDlPpLvQYydEsSeKstevVVvkKhRlsSOoLviJjIVxTzZtXrYyVvOoyYeENHLfFqgDdGSSssQMmeEUulFYWgGgBwWbIQHfLlsSuqOaAFfQqvVVKuZzJRVvOornNlFfzZpPxXQrIMmMaAnDdNlLYympJLlUXzOoqQZiTtUzHhDdxXZcmWwMTtCIuUHhqdDpGIigBZzbIgGqOoQpPneEbCcBBbZcCDPsSpGgxXfFdlTtNnYOuOoUomMijJSsLtTLvVlxXLGgJjlLPTXxGLlRraAzZMmiBDdbItmcCIihdDHTtMTZpjJPAPpoqQqLlsSsRDlLtqQrRYPVvqQSbqCcibBIASRCSsVvEYyeKgVvGkAAaSskZzkKKRGlJjlLYyGWwIwgGWZzxXKkiIMmwGVszKAakdNnYyNnhqrLPplhyYSYyhNUunSDqQdlxnNbBKkXxXLUIiudMOHhwoOoiItkXxRrKTOTsStZTtPpzUOoBbxXoOTtyYgGvKNlLPpeEIiNxdDLQZfkKzZawWAeEFbBLlIiHwWoiIMUumygGYVvDnNOgGUuDDddqvVQodNnsjJSNntVvyYTjJLHhLlFgGnNAaaArueiuUpeEYyeEaAPJqQEeKAaRnsSoSsOLBbkKCILlifFcPplNwSbBCmMWwWWwWwtnDdNcCJjpPTZzxeEaAyUuLlYjfSsOesSlLOaAupPfFUqQXwvVtxrRSHAahTtcmMrsrIdDiRSzZPjJLlpeEtmiIToOvVkmbBMsSNnwWbwWXxmMlLzGgMmCsSchHhNnHfvbBKGGqFGgfQtdDhNnFfFBlLZylLwWlcaiRrlDdJjLNWvVaVvOZzWwonhHcqQqnNhHjJRTtrCcRIhjCHMmIihcMgGhLlNmIVvCcCkKLyYOtusMaAAaBbmAHFOofTteWSHhGgGOnJzbBJqBmcgbBuGCcDdgLGgLlLllhHUTKUuydIRSGgsWwNnkoOFmsgqUuQGpPPYqQyprxXBUrOMDKkZZuMYyjQhtTfFHqBbQOvfyYcCyYrRfYeEEswhjsXbBxKkPpROodmeEbPQpPqpCcBtyDdeXxEdDhAJjaHebBhHoOElLdtTkvtjJlLBbiIDOodTVPioOZzBwWNneEvuUVzPPPpppZHKkzrdCcCkNnCcElLMmeKPFKkCZFGycmSXFfxWwpPDdWwlLcCGTtmbBuUUqyYHgGhIhHiyyAaAaEeoOYdnNDnOWwoiIpzOZfFQqdDbDdBJAaQBxTtsSoOnNvVAMoOqQuOBboOTVvnUuCcTtWwxXMmgfFGPpMCuUvnxJjmMaAIIimMoOJjfvVdgGFSdDsfJjQqlcCLxXHRrQFZzAafjJRCAaIitTPhpPHKkzZudKkDBXxfFcCbBbUwWhHuDetrAGgZzbBjJvVEZzeaIirKnvDdTBYyqQAatTqQqOoEZFyYvIihHGHhITtkmMKpPFfiVVEeukKUAeCcEaPtTPuoOWlLwWWIiEexXVvlOoLiZzIQqxAaUuTCLlDdKkAKdXxDMmMmkqQCqQPQqCwWuUcYyVIiBbvuUDdLlrRsSLlppalHhcoOIiAIiaCRHluULKgGQqXtbOBbhyXHhFpkKVnDdUCcYyXkKYSsyYJjgfZzhHFsSMmRpPjJUurAdDaGMmyxVDsJgtTMeEmOuXlVvLUuDiIHhEjJHLlheKkdyYqJzmxXMhcCHSsQsSqpCOoqQuULQqNTHwWNdDnmHhxXnNQDdLZzoJjIiOJvVjEviImAasSvvOoSUSEedDlLlbioOerGgTtzxXAaZLlbOoNnHhqTtwWQnNjOKkoqmjVvVvaRBbMcCmrPpsSICLIilerxhPpHXRJfzZcCTtFjnICyYdhHdDDCMmnZDdUukJGgKkkKvVjKzqQNEkZzKgFrDdSsmpuYtTxsFfSXbMWwgGmBMwhHWhNnHXXmdDTtPpDdMRcCamzVvbBZebBZqQLlLlOPpqmdjkKJTtDeEcCsOoSlLTGgtNnlsikKIVvZoOzkVvKdDVvOiAaAafFzTNtTnHCcbBjJqQMJjSsEeNnYtTgFfGBbplLPUuUuheEvPpVRrTYyAatTjJtKnNzAawrIirRsXJjxVWGKepAaPEexhmXOnGgnGPpgIikTVjJzoIiOdDyYNndDoRrOhMmayYAmDdpPbhHjJzZsSBMZHhMGsSmMqDPiILjYyJZzLUuUuDdlKkboEpPtToOezJSsjSfokKYEtkZRrzRrgGKSzZjJrLUulXUCcrRmyYMjJSsSEegwWGPmMIicCxXFqBiMeEOocqFfBSwWJjiIXxKAZktTKaEeNrvNHZzlxNxXAnlejYyJvrRhUAaRuUritTINnSDKbBkdsmrRMsdYqtTDdmgGyNkKYSsyUunYuUMmvyYVwrsiIVvSIiRrUuDZjtTJzdWOeLlQqEoKkuUEvVJgQAaSsqGjGgcaAAayYXxrwWRXzTtZFLlfIiqQCcMFfAgGyYawjJMmSsrdjJdDNngXTMmIitrRxvVoOuUWbLlBwGtrRTPpeEaAXUvBLmMBbyYvccCCVWwcCQqVIivJjVtTvbzeEpPqQdDAjJazZGgfpPLlxIFsSfjJiNnGSNnsuUgHFgIyYigGGNnIlQmMNoOeEnqEeLiImnwWbBxXqMmXxiIQOofVhuYvVIiwWFfvLMmgGlbBKfFfFEeQevVmuUYyMpuUlNnLHhgGjJhHPZzUYyugTtVvkKMmlLGoOESsYyqHhggjJGxXquUeExwYGgTzZiIXxwWvzZVtGVrtTWWwwFflpoqCctTrxCmpPMcjNIijJEeUunlNnspYQHhyVUoOuDAaJxXjkWuDdGgMpTrgGQqRGgTYkKwWFfywWtfMSDdKpPkPzDJjiIMoOmjJqQVaKkjDdfAaFDddBbOoGgeIiMmgdDaAGwWoupPUZROoVcWaAwYygfTPptPpqmMBaABbhUuUuHWwWoOPLvVuUcYyhLlPVXkCcKxBwwWEeWkKOopZzfFPLeeEWwsGgWwQWwqjJyYZucKkCefFNgGnpHhIpUuyYAaXsSriIRxXxmxXMJKFfRRrMmOortjJTvNnVWwCcMmcxXCKaKflLIiFkKCDBbKkFfdcfSsFfFtTLEelpPhHEeffFKBzlLqYyQzOnFQAGgqQBbRrPuMBbnjTtTtSHvyYfNRLlTeEtELNnldDQqeEbXDdxsSZzUxjJwkgGKCFfcWYyUVvuEeHhUumMXqQTYXZzxBbqeEQnQqEePpNZzTtKBMGVwWjtXxeEKPpkaAQtTixbBXIOoqOoCAacYXxyzgGHbyNvVJjBsSfKkMmJFSsfsSAnZzfFNboOBZDsSdzyIiYJjqSsyblLBeEYeEjJMIWgGmNnEeMrrRmMRjJoBaAbSWwPHhpXxJjEeDlLpPwEkKeGgcCoOeFfEpmsCrjrRMUaLvVocGgWdDRWwktTKyYvkNnQqvVKbMcCmhHBpAaHRrhPkKFtgUMegGvxCcXPpIiVaAESswJwKKkAaEjkHhKUuJkKAGgpYMmyPZzpdDmrJjRlEkKfrRSmMgGsTtgUueLTxXBdDKYAaycCVvdECcaAeKkhHSsDIheFfFzYyZOoVLlLlVrRjqerRuRbObpgkKGwFkKbBhHboLzrwjuUfjJHwWVvbBNnSUuMmsqQSTrbBPTEetpVvYynNdbUuBDRlZsSzLYytRqQrsOxXogGTtbBhCfFdhHnNWweEjJjYVvyJxXLlsuUsdDSXxzDdXxPpDKkFfDddRpuUpPJPpvpGgPvAffsSFtRgdMfStTsNnUuDdDqzcKkClLoYyPpVWwiINMmhHjJlLneEqGvVeEuUBtTOsRuyqqaAQhSsfFrIyYBbirRXxRHIiNdEPCiwWlLXxIIMYQqytdDUuvcCWwmdDMpMpPmTtHHMfNnEeAKkKlcCvVuOoUfvlLhxQqXoQqcTtCIioxXOePNnpExgGItHbBhfElLZzYGgyegeEaLlAZzGofFhdDHYsSMOomywrfFYlLyNhHzBbZzDNnzZBbcVviImMpPCVkKdDIFAaJdcCojqQFYdUCvcNaZdZTXxXbBydhHJjKkqzZcmKkHhMFJjJjUpfFPRHwWhUuYyJjjJbDeBaAOoxAaXjJgGrxXGxIhHZzFfpPiqyYtnNtQqEpnzZJjmavoNoOnOIlhHwWLaAtXxxqetTEQYlLyBbHMatPpTEsUuSILeEEeOoTCOBUuWaAYLlYgGmAaVvtTGuUgbBGpVfFQqSsHhTlQPpqLaVvPIioOpPpAmMtVdGEegfFCcFfFfxXgOonaVvAczZCQvVTtyYLluGgbJjISXxcxXyxBbfFqQkNFfnKzgGzbzxXeuvyYpCcfFBbAEeLMstTtAaxXTdkHBSVvOoorANnzJjVvNXxLdDlnsrRnXCOomMMUuuTtjgUuuhHYyUyDFBieEGSsGgDCvVckoUDdTtTtIHhnNiSETOoHBDdbtTKEekkGGjVvuUJggCaOAWoeHhZzcoOMMQhHMmIikQqNnZAJjFXVvNngSsBbGkKLlsSPpPpMwsNnjKkZzlXNcjEeXeExPBtTeLduUDUuwqQWsTDdbeQWuUukKUwqElxkKEmfxnPVAaGCcgvJmMNIiBosiIRDTtQqNAaQqdDMmIsSXVhHvSsxhCbyYDdBKkaqDaQfQqGgFcCgvkhHKVAvqhHahsDaAYypPxXlLtTQqtTbBdSZQqzIiMmtgHhIipSsRrYCcyXxfMHcvaArTaMmAtSsCZiIzCcMmgGcJjOuUobsOoBJjPpbrRjJSlLMmapQqVQqbBPpKkGgSsOorRvKkvVumMEecCUWZOojLlfFyYZzLSslEeEtzZIiThHiIvVFOJjoLOoBmCKkOnRjJzmMqQqQJjZjmMFqQnnNWwlwWLuUWoXoOMmBfmUuZXxuUiTtbuWwKkoPgGXxRbsSBNfFndDwWSXoewWlYywMTqXxjAvYtTyVaJSsnPexAhPNnOhkKzZHqQqQtShHjSsSsMmiJwWSSssjHhIfMpPprRLmgBbfFkDZzBHzZhLlbSlLLGghHVYySsvsFHhJLmEzuUnNwvVWiIXxBnjJKkSsSsHwonNOoOPHAahxXpDfNjJURdDBSsgGPNnclOovVGNmWwEgHhGePMlyYmMfFhHYIMTtsSmtTNMQoOqMoOrhFJFXaHmPHhpDdWQqwLsoOSaUuAlYydOolkAaqKYbByiPpmMIsSzazUrjPlLlANnaGxNnAgGPlLJivVuAeWJIiILPUupluUMmsJjqQSsCWbBPAaDAjJaOfrRQqFllTOotRrpwugfFyYGUfYLkKaAlynnQqAcCsrdVWxxIiEeXcrBzZeOcCoEcNnrmMIcYyCgqMCctdDeEgtKkinNpZuPpUbByYnzQvVhHSxQqXsuURUuVQqFMmfKkjJeVvdLeFCcMtTaiIwoOWtKYbpPaqymLljJeEFmMfIWwrRquPMNnmOjJMmKWbNnBZrFIiHILVvlAaPpBNHehHEyYtrRTQeEFTtfYfFyTtiqAqQNbBgGhHnQxXGhHgGgfJjFEXxMmpAaEewoOWeEGXiIxkYyIiKRrRbcTiMuUdDQqRYyrRXrRpLlIiPBaPpuWwmMmMnVvyYNCcUSmMneENsCvaxyoOuDKkcuUVvHGFFfQUuOlLdwbBhVvyDcCTxXtRqFfniuUgGIRdiDdHnCZzsgFfYyGNYynScIfiImeAaAkKkxESjGxpPgLlGIoOjJYywWdDrCVUzfFVvZaJCcjrQMmRzxXKPpkZeEeozZYyOSsmoKkCGgcOlLOdDRrHhMmjiIeaNKwpPuUWEHhbBYytaaAoFdspOoOHOSptqQTyVIiFuUOEefOKRrfFFjbBJOOoofUEcUDduvVRrZLlYyzCzZlNTrRfyHhlFImZPzJIiecCfMAkFfKamMMmmFqwWwDdraZzRrnNOYyoGgmMAwDdRrWLloOICciwWJjmMroJZzxiINnSiIvVskKeVTRoOIwWSaFfCSBIiXYROtTorcQqxVNQqnvOokKYHmDXJFfvVjCclLcuGgQqFfWwDHhsMFGauRpPmFkhlfFecCEOHhRroUoyYaAofFbDdgAHhqQaHhAGmcCqUAXeEOoxrniKYxXzZoOnNDSEeFfRAXoOyQqYTRRrruOoDAnNbAaxoOUYDdlrRLegGYyECckTtPpnNKRFdeELlDXAaxfWBnljMmJlEelLWeVwaXiIFMmqUMmqunNUzZBwtJCcnHCqhHVWwdDEewxVhEYypdDSBbKhvVdDBWkOJTtLIoHhHRJjgoOGkKoOlbBLqdDjJkseSsXxPpNnYWwmMYyfSGBbwzHOSCcqoiIOjAaJepKkPHhkNnXxhOokOZzxXfFoCfFdDbiZNnzfZzyySsGgcloOykKMmfFRBbIirmiyQqFfXxcWjcWONIxXuUoOmVDolLhaZuYynDdNxNqRroOvvpPVTtgGvVkKFfonaAmMxVvFKrDvrcquLlcCsSUslQqJBjJbUnMtTUnNvAKkQqYyajJRrlPpbHsShOBbotlLMQtTqfUkKgfYyCZzcixvUJdWwosSODQdDTRhHxpMmjBbAqREerQRrJaAxXkvVKjAaDRrEbdDbSsrRxRwWMmUuMUuuUmtJDdHuUMWwmhNuqQDdUgwckzNqfqQFgGgAaGzZGgiTDTrPPpGEepyaAJjRSsMvgLTkKMmFAnNvVZyYsxZVJsSFdDTlLDddDZzcvcWKeEmrRiIITtqWwsSTlqQWwOoAAQqrRQhAfjJiKXxWNnAaOotTMCcmgZzDdZzNyIiYDcxpoKpoiIONLnNBbLlyYPEehfLMdZzDLlFfPgGNrRnaAVvgNoIqQcLLjcfOvNILbPLtcJjCrwsrRGtLTtVvlqUuNRGVbctTAPpzVvZcCNqIFfiHhKaAEpaRryGsrRhUuoEsSRrcfrRhsSHoOFWMmjGwWImYHerRBmKkpDecrRFglXsiIbnXxbBwWNwcUZzoGlLcpPQqpPBbpROorcCLFgGDdoTtKkRrOTLsxFAafhHFyYZtWQwWqlUOPjJzZsHIhJdhPBlLOoiIEeOowwNuXxdXxEwWkKAiDdItZlrfEeinRrCUjOQeEqCsQqXxQbBrcKkPRZzrpoKkOfvgGsSkKVmMACceEmHGiXxzBdDaAFcCAaGzZDMmdGVQmMrAhIuwWHhyhBbHYyqkDdxXDBaAbqMSssqQwDcBbEeCdzZOEeZRrdICcZdDzVlojZFHhHhuHVaAHhvhyYxXEVuTgvCcVMmGoOCuUxXiIsScFIiXoahcoYSnvOvVjShHsBbJZFfgGiXWwWwUxiEeuQqQqaAvURhHuUbBTLvlrsSiQqZzIiUBFfGIigCuUcboezxwAEzKkrDdRgjJznNZLhHlAMmHvYyVxXsOpPyYkKgtTGAaWwEVtpPolLOGgjOoOEeXxoJWktoOTVtJjNcCnTRoWwOiuUPpxuUvrRoOUfnNyYduUfTcWPpEwWrVIiWpvVPgNOLVvYwWpQgmCSyYoJGrTtkKcJjCUkKjojJZtrvVRdDTRrlLdoqZNVvRrmMOtTNnLjJNnloNnvVmMDdodDRkzLljJZKRvxXVSenNuUbQqBPPppeEuGTtgcCVovnNtTlKaNnACTtpKpgGxHGglcxKkXCpPnNlLDHhHBbmzZqIiUELQAgGyrRYaRzZyRHhwWEeXJjxaPUtsSyYmxrVvqQfFZzebBXxlLgGaSsiIBbNneDOoBkKbdsKdMvVkKkKJjLuUNqQjXxbkSsdsqQSDvVmMyYxGgEiIGPhOomdDEsSCcQnNEeDUyYqQDdfyFfLeEyYYyMgGzZtbPmhoOuUHMpPpvOfFobZEeeuoWwKQqtTkftRrHpZKuqeXxZRFjJzoOxXiAYEUuZzeWRfFhHsSFfhHBsDdlLIpuUPiIiuAxXLwWWwZpPHqQhzblfeEvVtzZTRrYycCoDgOrWwVvAaAbqQBENnzYKXMeEjJftAaKjPpTtxXVvMnPpYiEgftTEVrVaivtpXdDoioZPsSvVIiUvzCAajGmMdUaLlLVJoovVQFlQzPpFtQbBqTflGktTKvhEpPhwEeWHQJuYyUwGgGdDpBbvVPxXKkjwWbBLuUKkNnhYiyDdYpPIclLCTtioIpRAaSsrXxsSRTtRrUYdDbkIiKBilLiFYUZNVSRfJjYiIeAygrgGJjDWmMwdqsbBimWwwxSsXgGeEkKaUySsSSsmZjJZmUYzhLGgslrypGPpSLIilbpTtOoKkyLkySTuUaAQqDddDFftgGpPOKKkBbtRHhrUMEpXSswInRrAafFXwnNWxHhHhxXHpPhvVBvXyBdQqDDdzEeZJjEEgGJaOvvVVoHeYRrUORXxLTtzZXxheENsnNCcJjSvVUulLkSDbBwxlLkNnOoKcrIqheAjHoOdaSswVvBEHrKSsjCMhHmcJYJeuqQUOouTtnhkKFjiIJGXSkCNnYyKkulLIdDvVUunNqLltTaANbBnZPJPtxXBiIEGoMmOjvVJRDLltTwUQquQqJtvZzZzVpPTjXEeArGfFBYupuUOjEeJfkaArRFHGJjgCWwceGgFoRrOpPhHCcfFfRtFIhHYdDyAanGGgiATtUaFfuUZrRzLYyexXgGXIhUpPBbwrJjTVSsyIipQqDdNPLlESsjJvXMEeFMlVwtTWwncFSsQqfgWTzuAsfFiIZLrRZkTalLtOoPwsSUisStTMbBZznZzWHhnJjpdDMQVmqqnNmMQbjrbAHhdRrrRrRQOouUgGqXOFEDzZVDxuAaeECvOoVuhKkHgHLlJjjzBPpbZJXxdDhGhHfFtmQqMTSsJjvVItTGkZzqPuUpAvQvVYyqPRpXxTKfFMKhFrRfpPoOiTenMmIBeqQWuIiUhHwEeEVanqaACauUkvmMiICKnDYilSsLkRswdoODWvXxVrRSrDQqeyYoFLbuUGIigpmMUStFZzWSKkiMmsogGEpWwNnOJCcvxPqQmMvUzZvNFfquUpGyCcEeRrnNrRrRYAagboeEGnMmVMmvjONXCMmvVcLlCxXchHDoiIqdPvVpvoOBDdyYAZsGKWwkhAaHyYgjNzZnGgPQlwNrwgGHhPaAeOoREebeVmqeiIIiguUJjSWwsviIDdlVvKKPpKkkKkRgGJCPbBRrqWwhHHUjJVvrRdRpbFOMmozwboyiGPpmMuUgchgxOxXhHoSaKkhnNwNiIPymMYpuuUUkjUHggCcmMrsSRhlLCOeHhEoGTICmEPeEgpPNnGkNnnNKpSsdFOScFqQkHHMapPJjkKxwWpPpHOPpZzTxXFFkTIitdRrDKBbMMEyYjhUNOoKLSOMmoslAaoVvKkNnIOoMLSdDOKkgRrGpPfToOaANncQrRJgGKkQaTLqQlXtSsfjJDdeUuEdcQqCuDdURrqRXxXOlVvLYXxypsSLlYOceExXCoEufuspPonNBlLbzbBOosSsSZEcCyWwdDhHVDdtnNmRrRrxsSXvQwWekPNaCcbymMCOlrFSIidHEeGghrRmMHbLaOWxXVSsulLqFIiWwbOoIgJjagDWwdDdrGrRVhYygGNbBpPJocCOdNWwnohHORvyYVqFUIjkTtBUubAOKkojJOoaELiNMmLTptTpPbkKxFYyvVrRREerfXEWwHbAaBbXAZaALdYyaAJYDIKonuUpVvPeagpPILhHZzwFLGNYyeSsZaAiYyIfXhxXpDdVyNJJjLBxoOAaXmMrWmMMeEwBMOkKPpomIidDfFXxSJjjJIpPecCEPJykyYQBDDZvHZzcCSpAacmVvVvzwBXxBzZBKKkOoLgtTpPKCoOaAUcMJUwUPDFfgRmKJUJjkKlLUolLdPpDknNixpnbiIBMmnJuUJjLljQVObnqIrRaPpANnDbBEJjefFcPpbbCmSGHcYBbdXxbDyIiOwoOmkuUKDTklbBsIgOtSqQFIivdQqnLBTtiInKVevVuSebAQdXRrLlxpwWQxXbuQhHsglLGdBkBbyBYvVeDWAauXdDxVkkKTmkKOMyGgWwdqauqkxXNnedDljIxMxWwidNbBVdkfFtTwDdOoQqfWwXZzPpJSiIAfLeElFaNBbwjrRCfKkqCcfFphNgfgGVsSDdVomuStAaTOoMypPTFejaymMsSmdMOJFVHvVhGgRrqQpqjegGoWwOEhHzvyYJjevQqecRXxSqQBnzZJoGgfFjvHqMfFFvVJYpPBZzEeoiVvdciamKkAaMOoEeHhtXjJDdWeYReEZbBvVOuUvuTYCRHtmspXJcCrHsSijJrVvuEeeFPpHlkaWJueEenbBnuhBbsVjdVIcrYyRlsSoOzkXeEUuNnxKZAaqhPpGpBXxOofFFfhHqtTUBbIQMYCgAQqoIJmMPSOouhcCfNnFMAamxdDYcaACqoifcPtoOTfdDFWTNqQnwErLlsBhiNnItBClLOuUeEocTtSsnNRrcRraKwOxXCJcCjZqaAPpsLiZEeIKHxBgGWwHoOXxhLllLHTtmfFGKTVvjIizZLBiOoZlVgLWwiIyYZVUuUYltJOUyYNtTEeDCcBjfFBbJMmUhHZqmMQsukKkkKKUSsbBSzuyRrgpPyfJjkBtDdTJKIyrKcCQHOorzZRpMjJpPoOzZPpcCjIzXnNDlLoHWwifrHAaRJjDdzlLvcgGjLTtqkwWakwViIcCvaeEHQqNnMBbJjEeivVMmIxXmzkKPpNHhXksSKxnUugtwNsSSROhOoCRJjosOotTeQMuUBOmMfFuUwQrRBkdDFWQyqQjgMVDdVZzvMiImlyYLMmGgmdolzyYUZzuHXIijjlLJzZEhHMbxXBljkKsCZzcfFPgGyIzZDMkqQmFiILJjvVVqQzwyYwzZWAaERjJnNEPpcCcicyChWoukyrRYKIxXiWJIGNndFioyRIKkgidbTtCcBlXNBbbvVtOWJjECcePvwfOoJKyYwbBwNKknXDdeqUEJjYeEPHhgGtTJODjJdwkCACLYybRrBqQnNlkKzTtibPpAYyaBINqkTtVoIVvFqQmMyyyYfoOwqpRrrVvLJIITTtSwhHbBFyYyYZWTtGpUrWwyVJjvAdnNQCDcCdpPmhHkCcKAeEaaAWwDdMugGaUCaAvVhcJHDXxEcCNAaxHhXUukKIKJjPpjLlJEetOQATteEPmHhkKlLSsnNNdqQmOwLcqqfFopPDduEeUbruzUMmzAaXxfcCvVyvAaDMpibkdDQXoOFxZcCNzZhHwZxdDXmMZzvXfFGznqtTsSRbEeCxNnWkKulFQyYfZzUXJDcuUoOxiIQNSquBXETVvTTbBIxdDKRrvpPhlEeJjqqLYIbBmRreOEmIabBwZrLlRfAyJjnFXxXEexHhHpPMUBCcbumYZQqzWvXclLCxcgFfuUXyYyCVHNirdDRwdRIhfFhryzuUZwJuUQdRrdqQaAHhONNnorVQqyeEhnpGpPcpRrPuUPpCKCcSqQegaAYykeMXxxGgeUJjADdTIuUieQJDMqQJjwgFXDMqRrkNDfnNFdRwlLuUWRDbfYTovEetpDALlaLlarRoCQqdDztTSWwyYszTMmOJImKSsVCrRECZVvadDHhkKlIpvYLlyCcRuGghHUXxUuuCcaAXxaTQqwziPpRwKVfSsFSsvbBkWwDdONSMRriImtFbBfAiIQiDdIiIiPpsSWSRhvHDwOqtTDdCsUuMlLEKkGgOLtCcVAwWrsSRvKkDdYiLlfFHfFhYyqQsFfzUPVaATpjJINnqeUupgZSszVvRJUYztRIFfYDdyfJyYNnuvVHlYysogMmmMCcnNjLldUustUEWSBHsSxXgGvQqVMmEegGYkPpTtnkKcLQGiKHdzqQMbBHOooWwOCBtTpnsHhLXxlzCcZjfMyRrQyBlLiYEewMbTHhDdtWcAeHwWwoODVvdWaAYVGgUlCcRrsUuJjaASpPjJMzRLMHhzFwifwHPddFIWAaErsSYyVvakzWvsSOdYMUibBIWwoaVHxwWXsWNnryYayamDGgHcsSCeKoOxXdHpECMWwSsCcfFvmMVzZCFfTPIZLDVJdbCrSsCYQBDOWVeEvgBbiImwKdqKwxbDdJjXxAaoqEQqnYvVUupxXPrqQVuASRTnNKbwMmnrRSzLlnWbWkKFzZFffsShHarknTZHPpjqpPuUIiJjvHhVKkeFuSBKJjksSoTlxKkegYyGMnXPBVvJQpPxxXyorUuMmcCyYXxFrGlsSlLzAGhMxXGJdDXxxXkKjPpbBwEgbUZzuWipZxvjJpaSsQqqKtBoLOVvdnNDolhZzYKOodDuCAaLlDEeQXOUtJugDdGmMURrOoYVfPRrpRXUdcQVvpUumyYBbuUnhHhHMKksSmKUmMJgWoynpsSlLezZEbproOwWQqAaXxsSRcjJzyAoHsSQqkpdwztTFfQDSuUVsSvKkmtYyPHzZhkPperdpdKkDdcCuFcCpsSjPpWwwWwqoYHyccFcVvsFeEcCVXNnxpPvOSsKkkXniImSlLsRHFnkKNnrROoDquUVQgIoObBwQqOPVgGuFceEAaYycYaZYDcCdibBIvVvVsoWwgeEsGHYyrRhWwiIFOpsSWwPUfFLlLlTtueAvFfOokKGHWwgVqHpJqPToOnvVNeYXkEisaSlERqQfhHFJluUUSYKkVvaAfFzZMmjWwZWSsXxltTbHhCdaADlmqaUVpPLlUdLUEDdoOaAomdtMmcoOzZLnhHzZWwJjnNqMmkNnUbKkBgSsAXYyNnDHSUHhwrnJfycaDhHVvAaBnNXxOWwEYdbIVQTZYeEyYynEeQyGiIrRCQqfFXcdDCCOZmeGgEoOxLlBwWmMOfNrNsSHRVOVkXGgdAjtFNUJafXxFJfZHhtKNnkKIimMBemgGRgfMOFpPCceEqQSscmMxXktCcfeEFfVvOZzouZXxzUlMPvxcuXcjXxNnGZzgnbGSSgcnNyNhRcLkBPpHQDdWHhwEKdsSbBsWqymqbBtOSfprxrRFOofgvXxaqAamMsSQvVeJaXxAjmKNJrRvVjnWwcCRdDQzZQqBtjeEgQrRunAyYVdtTsyYfHnNgGgXlzLuNntnLNFtaHaWhxXHhHhIMmKkSshHJtUmMRruJOADCpYqQyTtuUovANmJjMnLIHGgtiGwyYWgUOouqePpshZzsSrRHSfHyguZQqLlwWcCEehAaFfAaKyYkGMmBDtKlXtTxbBLktsSolLadnhcCQqbXBbvSLNMmPNnAdXOonNGgnmMyIkKGfqQpPhzZyzZZcOpEaXTfAapPyYJcFMTfPihHVvHlLElIiwPpPYsSfJlVxXPAYylJjzZLdfFrpPVdljJUuxMJDTjfIiQlDNEAaeLlndDjHhsgGLHMmkBMmnNUuvvUwdmkKAWwgGLJjLlTAyLRrHhidDIlYFLQqWfFjbBUMmjJYFfMyRUGQqgRJBcEenBlLfoOQmMHEfwiysuUSqciICQXhTtqWXooZCFfcHRrJjDVfFvdhHQUrAxaKXxxqQsSSsWNnNWfWFpsSoDdfuCfNcIPPqLCclJjzSHXaeAZCcwWIMmYsrziewBbHVkKLCyZGQHsIvecEzZjiITzZqcagrclrRQjJgGVvlitMmjKIfFTuIiXmMmMXntkvPpfqvyyYdkssPbBIGgjULlBpvVaAPkqLtrRgMtxVvXDwgPmnFfyYyYNEFfpJjsarKypUEeQrahbBSsxoIeruOonJMkmoUpPgecgGCBvVbNZxXKbxXBbpPwkEetTBofDvVdFjNnJdiIeEDjGlxUVvJWTtuUABDCczlIGgeBVzZoOLhdDmTUbpwkKhalLSxhPPqQBhtUCcLlPrRIiBrpNsKkQHPpgbBMmqQGhxliVOovRrZZzKkUuVvQqWwAdpPnOpPbvZzSxdVvAVBybBuQFnXnNQHOtRrsSdSSsoQqOzZlUuZzLsKfFOHhokOBJjOVvYyobhHohQSsuUmMmpksORwWkTUrRuUcCVSXAlOWXYyTdoOBbDUbVBIiSJUwmbXxQjmMJqzwQmjlCcLJMFNiAaIAPjJkWwcCqQKCcsSaAwsoyZzjKkMNnpPDirjJxCcUGcCrRCrRcVOkKqrZzRQyCaEzCDbBIiZpgCWwcTvVwOIJvVDdjwwFfcuUyLKXKesLlfFMzPTFtMmTKkKktQjqQZzbBLnXTGuiIdYyDdDyEefsPwWGlJWwMmcCzZyCeDdqbsSfFCwWYkKyHhdUGLlguZlwfcrbrMmaAjJqQWTtaRtRBlFtcXIxXtTYynNiOlLDlvxtgkDpfFZskkwWlAMGxyYJPpJAajjXgmEeUwWlLpPjuCObBSaAuUsozBbZLlmtVvVvrHhmMDOHyYLfWMPfWzzZZWbaNMLoOwdnLCVvZcElKTJomMorMmtTsStLlosohHglLMmwVryZaNBXBbbWZzTXxtLlZuUpKBCnhHCcnvCMGgrRmpPsVoOCckIiMUutVVPyhHUTZHhqHFEBbqBrRbQgaAlzKFyYvrFEevUSswIJOanKkOhEeHuUFiKXxFitaNlQBbRgFfruUWwyYVvRGGgPsZXFfSPzZJeMGgnPBajJEaWcbBCNKknfFxXNPptKkTdEUuqQjJslxXLDFgCNaCsSjWhHXuUspHNLOTtKWpEKXWlAaVHhSsjbINfxXkKLkKaAmNsSYynaPJNXrbTyZypDdlLHEeXWwnjAadNUuAuHiJjqQiIisgciICjGGFFSMoTldyCbIUuitstMmnOfiCETHWwXqQxaAbBaApDdPrAJRUuSvVaDXxGJYybBAajgQGKknzZSqUmjtTWSGgLuUrfFRRsqlhHNpdDPCZGmKoBnbQqAEOouVZkfPpmmTtnpPeEgAaItcJVlMZemOxezoxXLMFdVmMKUBbXxfBHhlLOdDQwnNUWwvaATyFsDyYdxpSsgGQNpxzOfhHFDsghHOQMvWwGixHhrqQVshStdOoeEykBbKYsNnuolLZTtUBbkXxLDSsPpTtJUxbMmBZACWwcaAficCFJWciICCcGltaNzdDyYnpWwUWRBsUYyAuYyBDejumjEbtLHKbzZRrTEFfrNnaAXApPoBdDzBNnbixtTXEevubBnNXecKKFpQTvXDdRrGgCVpheEzGiuUcNPJpPcyYjPgGpkKJUumOupPtTRWwMURrumrmMOoKSsoOiCceWwnNWRVrfMmvUukSsVvaAeobBQqOEUusQWwqhzZHQmbFdJTqQLxYyFfmnWwVCcXBbxGgjxlECQSaAdaIrVvTByCcoRQqrfdrAlzZLIQYyXrRHLTtidLqnNnETuUJjlrRvsSmyYlvCytryYpIvLXwWqQlLQzYbuUGKuGgUtDdTSwyeEQvAaZBXxhesUeaIiiJaAEejrRziIDdweEWqeEQWjZzNnTAzrglKUecCYyEBbLVvlXQqxenTthnIxwWIyYGgiDdvWwMbBGeEgLlrUHhuGYUaAoSgGsOubfvVQztxXTZaFXDbBfFfbkAawWqVgegfirkKrOorRhNsPpqWeECmFVaALoJaAJwWjFZzoFBhHbtEmhjVvXgGbYrmILUugbelFfDdqhpNcCRrndONMbBxbBaDFRsdXBsSmxXxXsSlDwilLIWwzZglBbAqPbNcCDkJoPXeCoDFfdOWlaIAaYyaiMmqhHfFHBiIRrnKotwIVvilLWTOyiWmFYybiFKNnRtIqXDFfdxQkKTtIOyiIdDpQBvVjxXkKZMUuwWfFUuVvHhFjvLlWSOqOoZjJjtqqtTJZrEkJHDkkAlyavwbBzAaHnBiHAzDdcFiIfPDYyYpPxRrXqvAacDoWwOGnNhBHhfQqVvvwBEeROoKJjGgrBwWaOXnNxzitewjfFpPVoXXxHtkKVvdDGquNnUgGCCZBbrksSKfNErReEHBFeAaofFwozodUbBJeNHIihsODqNqzDdZSRGVvgmlbMDjVlLFVxTIwsrwWGgTtgPMIfqQlLFwcJpdDPoOgNUutlLQKDdNYUuxXYiGkTtwZhJaEeAjbyPpUbNncCKkOESsrbfAdRrAJjXxLfFSsiIlsDcCmjJORHESsqQZEUwVXLPZwzBFuUfqoMHBsKWpKfFHhEWfFzDpUvpkMvOVJIdBbuJjUCeEvVcfFnNxixiSvVwlLKkNbNniWPLorRNnVvCFrRzyUGgpPMmwYuaazvVaAZXtwWTvVxXvEiuUICcYhssGhoQApGAaakMmKBtmbcxjJXZMbYqNujevVklecMmtTCNxpHhlTCAVzXWECoNcIUZzuWwEJWIdDiWlLkOoXuVvUfZzFyYIMZznrRfnFkyYJjUJTmpPKksbFKsLDzQNxtwQJmMsSCjJxdnKBbnNylZgGWwUYXVzTgBEuvVwoFfjLkHhKpeQsSgWfdDLmMaAfGASsEtZJquDdyaAFgGtlLTtpFfmdWwjZzHhkhXCZydwWFkQhlLoWjuoOUGoBqVAaCcfFsOoSePJsqkKuUzHGOSPZuSsUSiIkvVLrRdUuLdIiKkhuNEwPpZBbRrqQzQqXqQkfFLpCSPxbBbBIiXpVzqEjJuUcCNZLHVoOcCDdiQqbKVvkdWVWwmfFwWMUlMjhHSSLnpZRNZWEewzPpEeHhNYVInGgZbBlUZUYrRscZzGyzptivVYzCXxuAaAaiIEkKnjVMCFtLfLuUGgCsPbAaikAJYNMYeEllzZvWafMmFAwVWjJIiIiLlMmuWwBPKQOEeoqUuzZviGUlfgDCtkKfeEFTBMXbBescCCMwmMWvfMmFVNnobKdYyTvgtoMmwjJzZXWBmzelCcHdGZCsdjDdJDSkRrPhKxXGEeYkNEFciwfPbBpNfFOMmxXEeyYRrjqxatDjJdPkRrMoZfFGbXxMEcJwyYIiZGgOonLlNqnJjmUuUmFfMSpxXPiaEegTtUuGRwRBrJepYyPGBvMLHhtTEeJjaHrcCOJmeXxVndJLljjejYydSsksbBKkInNjIhZbDdddDDBzHisSJMmiSKDJypPYMmYyEJDNvXxVvEMxXjokKRhAuUyZyYGgzYuUlmVdDbwWJjgEjRbZzrWrEeHhaAAIsuMNDdQOozWjDdCeaAmBgzOPpmTtkKKpTAXQJnZrRzNonFWICfecCnKFfygkqQHVvlaALpMmsSKczgDhCTEetuUcLtTExXZMbwxgGWSsOTGVtDkFfBeEOlLmrRcSExmbcdUuGFLugIVoOvVkSspbUfFwrRLLXxymcCdDnyjaKIfFQqBpcCScdNDdnDsSSLlPdAaDpslFhHleCcETfcWwmvJNeAaiIUCcXxcZnNyIBbsSyYTPZYgzZCSvuUVyuzuLzNivyAanpPBbnrzPNGgOolssJmLuvwDBIvcCUuVZzvhlznJjeiMmIQvLlVZvPFfpscQqPlKsSlLDdxgVvwBAaAabjJBbWGWenUKkHoRrRrOWwjJDVvlfFDMmrRlZzAWwaKUhHuszpsPEepoghZQSjpFDZzdfuUEvQbOAagJwCcOHDdqKfKkDcMmOoCYzrRcuUxHKkgGKJWwDtRrTMpPPTfoOYCcUtCcTQjvVzTeXxagFliIGpCcPgnNFwGqEPlJOWUPpBbebGtZvxyQSdDsquOozCcnNLYkNDXjJGgAsSacCGDdgcbBjqiIWTXnquUZZzdDdlSkSsnNfBSqQSsMtTnNtJjfsSESsyYeFjuRryYKfNFNuWwUxXmiIizZxKNnwwqQjeiCnRrOcBbgGfFecCEhHewxZvactmMLPXnaAEdDLKEJUnQyBmzCBMhHTOodDPpOobAgPaqOHgkKStTNnSHyiIeVMmhRrHxQEeqAAUyWMmmkKMuYZvVfcZzOlpwIBnWlLcCsIXIXCbBcGgxXYyDtPpTijvoVmKyYEeYyYyGuXxUCcgPVuPdZVLlvweBbkPwkSbICoOcTtihmOQbZpPlLWzpWmMwluUxvWuYyJjezghHGOoehroMEedSXxSZzsDdaDaFBIiRiIeoBuYBHzWKgIxXyynkqTnGoOYyKkjCqQWBbrRimpLlGhHKkRSWitXvfvwWJYhsSHydmBLMrTtsJjLlQnQdoSMmnEjuDcCOZUuzZOWOEPpfPYypbGghjJenFRzOoccdDoOQMmgTTGPpgWwGjJOothsDzZdSkKxOvJWETuUIdHWwhDZoAcCbEeAaxXcCBgqNnUuQaCcAGbRkFfrbWVAaNnJjFbHgdxXCpPVZzQnNpPdzZDAazZTtJjLEelysSdpCsSZahIbNhvcCVuUDdZWVAYLaKKdhjKeSsRzjyYQQTJzQoshHwVJVvflgGVvLgGmzJbqPYoBbBbDddDSsiiTRrrkfIBMmfMwIYkVvNhHTtWwbhLuUlQVvhBbHIkKApxXPbBiAbBLpPtTwoOcyYExpOxXEejKdnBpQFfaLGrRWVDdvDddcCLMbPpNnxDSHRrhCVaAvcrfdAXmnjJoDmMPAaHhHLlSsQmfFDZzNnVvdMLEBGHhlimMgEeXHhxGMRVviIyBBbOogiIGiIxuUJxXHMehIiHTfOfjJKkHhuUjOlQqvfMcZzwQSMmnHuURxXRVvIFGEGvQKBFdUuxfmMAqWwFAaByFfgTdEeDlLtRPpmVXieENHHhNEHLlhukLWwhkKHhHGRZatJwSsqQiIZIqQAEuSEHXxbrRzVgGBbqYMmWsjJkTtguUByZqVvxlVXxiPJjRTYcVLMVfFLteNQlDIYylueEUhxYtTyzZqhHisSaRDFOYbtRiADEesqceLXJvFfNMXBbltjDfBMqSXxPpMnNmSsRrKVFRvrwEIteETaAkYyFfCcSsDdURrGgoMCjpnCnNWwuUzMuUmpZzPZIgZeEVvHPvDdoOcoOtTxVXyOoYxtqPfkkCEcCxHZzhUVIZbOaxRemMtLtTlQqTHsSRrhtBVvBbcCkhlnNTBeJMUJxgGMmcCXEdOosSbUauXxSbrwMmuPNHhiIVvZNuUnnATLDrRdyYgtNnTwjfIFzZavVvxXVzSsXueEjmMSnNlLsdlKuzoOhHOUSFfOoDTsBsSbHSvpgGPRRrDdXIgVWwmqoGghHGSKkdrKkRfFoIiZXPGgnqpgGPPXSBYybyYfYtVujJWqobFuHhgGeEkvDfRrmlOsSsSJjZEXGgoMgGEzmLvjCTiGNMMeEaAFKTtzvxXUeabBfFBNWwkKbOkMgzcnJjyYLQSrlswJPptTMuQsNgqdAsrjzRrZaRtTNjsoOSJakKAnvNnqQVhBRrblLbBtecTsStIfFFePpEoNCWwcfFTkKtqQTKkSTBcYDLtiIOmsffTtggJGpHhRqlaALQrPiISIIhUBwWbaCcnDJNxmMHhhlzZLUufZzHhnNFPQqYzRrYtCcBRxnjpAMlAaFbYxXjJyBniBEeJvLwxzZkeGgPwaAYyWwkCUjJucPpeEOoolvVnhPSxwJcuUAMmncGaSEesAfdrRMmSexXNtTnDndDfFwAmMmMQqeAbpNlLmEjpsdDxzSpBbrqLnABbvVTLlIfkIwWfKkoNAojiWuVVvfRVfRrkZWxXwuOoULGefVvhUuQztIiPpziIQqYyZuZzLlYpvdDvTmKVvvSMmDmNnaApPMdcVNyYUuNcbkPzwBxbnANyYnzYpPhHRvWkKMyYmHhGOSOULlpPFfuTLdDltTROOjtktTLeWwCzyYclNDWPplmnAGgBwwTtFpmDdwGdDgFvVlHyYhLlhojqQJpPdAbBaRVvTCcMfBbFYyMsSmcUmMuUlLJPjJpuaLgsIiSGeESOosPpKKSzPdKGgUugGGaATEeXqQVLdoFfxCTBbfLbxXrTrAgGVvUvVulLwAWwaVvRBRkKCFWLzDzZcBQBbEcWwYFfjLbBgpSFIqQiSiAaIsyYYUbBgtkNnSsKxhHNlEbBeaAyYcCNqQnJqTfgGuUtpSsZmSEkxwdDWklYCsSXxWWiHhwWIioWteECcHhGPzdcZeoOAcYJjoGgvgbBuPpXPxXpRIeESsOoHhdkcCKmeEJYOSWpaYynfqWZDdFfwJGgjWBMWLlujsgaAGWwbvBuUutxwoLaxsvuEZzetlLHhKroSKPvJjVMqRrHnNcCDYyTohqxNfGgqUYReErbvaDXsVBMXxmocCNDaVvzILXqSMmaAnQqNnPqQRbpuTHbppHbAaBXsAHgavVAGWPButMEeqQHlvAabEVMjJmwzsSZWvnNiLFfZNnEcCeuUdbUuKkaYspOoPSsSywjuXeELJjcCgQqTlLtxXJObKsSWplfFLPBktTznxXEGfnNFeEuPpOMpPPvVpYyKmjNlLURNnvRrVEihHzZOXHqQAeERqEeuPYkMmRiISsxXNVvnAeESaAPenNMpGWdTmGTlQsSKbuhHZzJHhyYiWwrRyYpSSKAaDYVQrRiIFVKTNxxUtikJMmMmTIWweELqLCRGAuUCQtooxvVXOAaOJeMmCErRVkgGKiShqgVvzYclIiSQqsCcvmVvcCMAahWEIZRMmIiSyMmizaEAxhlWwLsZQpAapiCyYnFcUFqQOkzZKPfwBbFwnwHuUyYhXkAXaRuQqKkqhWwzOeEOxwQTtlCcLHxYmMypOoPqIiQYIWFehqJzZjFbpPNCbjrunNrYmiIyiIlLuyYJSWwQRrqJjswlfatlWxXwaMDFfWuVqQVbKJjlLKtTkzLQqEelLljfCcFJZhgGlSJdLqFJEetPWwLpPzZcAdquUnkKNQLlDaDdylRLlWwWwrLYJjCRrlpqQdIijmXGUugLDvuURDuUapiIvLZzjFkKypWcJQqjCnNDEedLehESsxOSsoXeIpFtlLmfCUujFtxAePoCzYHUcCCSsJGCcgjcuFgaAiYNOoxDoOEeaSspCcnlsVxBBBbbcCvmMHhVqNnWwQHgGNDfWNnwgGFAmeEoOMoOOsSjJTKnNkTNnfFdbzPpFfZSeEkKsgHSsWwLgGlzUGYhFZzsaASEQaAIThivVlaVOMQqJjmPcdYylLmMaofFjTjtTLliHwAaACEJjeMmchATviIsSsSYyCcVfnlNXgGyYLlxTaAUlZLxGhFSwWDiIdDeEWwtTvXAaxaNUqaAGcCmMJTsSbqrkgGMEAVyYuUYHhyQsSfFqGXxXRPIiFsoTQMYonNOQwSDkeqzZhPpAabKkKlCrHuAaUXxtbBsSTnYCGssAaNwWngETtnNeBNoOJCcPpCxAaUQqKkCPpXHhVpmHUuhLFTKmMaACiICcFjJffomGgFGrMEbkTzFjxXoOOoAjYyXxunffFTJaDzZxKvovrhnMmKkzxXZRVvnFXxobXMzocxTtqQcgYeEqRrnRrNtTNvVztqviuUBDkKyLleLlobdvnNwWVACYFjNRmqQtrCcRTMdDWnRrNoOushDddxaXxGuNnKmMOooOQcCUuNTtUulCTDMOeNnulDuvhHuAQMRrzZLhXUuhHxAaHcBhkKHLwzJlLysuLwWjreLsASIeQqKxMmywWEurREEeeUtpQoOqxlLXnNQjjJPhQvDdGhFBxXbfgVxXBbaERrofgjJqQhHSGOSyzEeARrNnyqQCCVvfUvpgGpPMmoWiGaAQqqvXxuUQdNZzfhxXrAYxjqQJzZzKZzkZXZzyaMhHNUuPpxKSsofAaSCcCfCQqCYmMsSMmhyOvVgGQWyUuLcClcCYJjJqQPfUrRDKEekVgGIiwWvPDREMmKpTMsdtTqaAGhJNnjHNngCcukKUZWDTtPKhOaYZfQqFCZzPBKkfFPNTtYOIiwGjUqQHhuaAukxFfXNMPqCDhHHeEhxXuxrFvyjdDTuCcoxqdjJcUkyHOTdUuDBbtbGgTkQAPVXbBzPIxXwBGJVvjeOobLltTmMBWFfgmdDHgaZLGgRrTtkDdKdoODgRhHfROYXqDdjbpsrJjRSxNPlLpmPpgGEXLtObuGgUsUfEqQZZzzEcCeQJhlLztbBNKFfRiIAwBwNZsNWBktrsswMmCcWWwSaUvRaAJjaAyNewWQSsOmtTMBXWzZkQDmMPjJIipkKkMmWMGFaAfwolLdBbWwPpbqycRcjuUnNdDJBhHDjvdlziptcmcePhvVDkEwtThlLbBgGHKnNkWRrhdMAYARwShzZtyYyYTvKcCkAOFfuZzJjFfmyDFfoVwZKARewifDJjBQqbvVDESsephWFIWfZmhtTHlrKkZmjDdJNPWwpnLuvyeEhEaCwBmWygGIjJbbBYqYmFJSNosSOvVPbcRrOoOohmZDnNhkRreEIgqlCNZzKrRyhbsweuKkTSDzzkKZZJGOSLhUjFUSsueWwEXBbxhHirTZyujrPpGzZgGPEPpQidDoOPtvVvpuZSPpyYIyDdVnNDdavTlTtoEeeuUEemSwWcQpPoWdhVHrwWwWTtyYswINnqwOocwWCQqWXxeQqEPpLlaTsaAntToWcCYyYyrIZJjRrWtApBbPUJnNIXxdnNDijrVPiLAzXxceIidDvVcdDvcCknNGgMilLjotZRrZnNctTOAdPYsSyTVOtyhHFBdroOrdDeEDdEenKQqQmdOoxfcCjJGWrRmaUKkuAMGgmdjrRqEtaSvVGgsuEfFXmgGEKpuAnNaUNnPGSsEskHGFfgsMmlLShtTgPNHqznNZQYyYvROiInoDDqEejWYRHHirDjJYyWInhvcYxsSdDEeXLlcCnNxGCVvOoAaVwyRrhfNmCcCcMYaFzWCDdcTtgGaADdAiMeoEMiylNnQQLHVRrkXittteHhxbUQscCnqqQXCdjxuFhHCcqDdfLUwXcBAaBsSbrQNZgxVzcCoOWnzOoRrXLlfBbxqKBnPdpPDpNIPsSmdVYFYyZuZURzZBOgGQQCaAxXlWqQoMDnVZGwWgzvdDMpGlTFFffQqtLgmMahHqoTOopPkGgineRrdhjCHcqQRrujJAjJUSYyswWgGDHNnoOhxxtTvVXXxXdcBbqSkKsDaYRyYkGpmMPgEeKuPgwzfWsrRtikKijlOoRAaPQWFYYfiOerREbBKkvKzZvVQnbByYZBXxQqrRbPpcaiIsScgGKWoeEOoJjwWmMjYypyeugqQDJjdmMGQExWzZWkjFWVpJjwMmUuoHhTBnxfFYyLbBDIHhGirYOoOIfDgijwyYUdDjJOwVvbBUzZuHcYCICeIireZzXxWZvlGgbGgBfMPaApKmcCYydiYpHhSJzZLmeJxEehkgGKZZzLOkKDMvmGwzZWeEJGgYqLSslaCcASswfKbCcqWobuUmQqqDdESOrciIHgGnNorsikrRKVvOSsFfoInWTGZhDdxeWwEXAoOGgWKyYAKQlJCVZrhRFkKIEjJehhHGgOdxZiJmtTMmcCPsSmMAiIahqkRUuYinNsSZzPpkjtVvTbKFYGKdxhHtTXLlDkYdDbJjdpPLTtlnuIiojTLyuvzFflGvLzqQIbEelJtkZzgMDdTIitvVhbXhkeEizIlSQdFfDzRrcoVvSsWkACbCcTHbxXuUSRePpWNntwpCFEelLIORrQyXHUspjiOaTtGyYcCcLmMlhgGiIxXPpHymbBGglLFfqiWwuQbPgHQMmLCivDJWwvSHOoUNgZzGNFfWwEUjwAKIiLhfEVvUcCRIaAlLhRjKOokxPSHhMThrcytUFfVYyoziIryqQEwxZxXzTbBZzAICDIObyjfmQhVJKsXxSkfFWwOpPjNbsrDdCUuhHdDitTIEDdVEpPVZQqCcJQPCcvHhOofjZzDdCcoxXmDMYAJEftIiYOomjJsBbUMORrCcvvFGsSnKkHPQDFwJjWozZOCcfgGXxdFcJHhTYywWZztWEenslLCcfFjxFWKPpDvnDIZoOiIIibBztTXmLlXiJLEkFfKIiKQUAQDfFjJYBboOmooOMtcCKvUwdEybtdiIDTCcmMYKbpPcCkOoKDKkSqJjUEDdeBkKqPLlDqaBcCWwjJiIdDECgGfFcSsJjhHMmsZzQNEehHEenqXxUpDqQdPVTtvEtTEevSqgZzGQskJjNAaBbblNDVfsToGTtiSmMLNnKtdMWoYdBDyChgsMcaApPBBCEeCqQcdRrIiaAzZaPpArRiQsSYxBKkbkKXUuyNBovqNAlLJeEIijaEIiuGgUeNPXIKtTOuujkMryMmYGdpuWuUeEujmfFzkKZCuHhckGlHhoOkbgGbbWZMlLCMSsWwmPaAoOpVvtToOPiIqQhhHHsVvhQqVLlzddPpbqKYFfuUjPdDrRuUppiroOtTRsbWmFfwRfFbljnmMJjYeEVrRvAavPHhHxFpEePrVvRzEnDdglfWSsliXxGAEpwWIiPfFVvdDNOkidyjDQqXxlzaxBheBPVveEHhiItjJDdyYlnITtlMmUuCcbNnBepPKJihHufgGQfFrMmDjnHvHhXxgRroORGAGioOBNnfKkQcCUBbeEvwQqWwoiiIiIIAlvVbBNxXnTtFfBhDvVsfROoLocYBAnkKpzZKHhmMEqTtVAanNMTvdDYDGhHgdearRAOSUFUeyFfPYyoViyYpPCqQcIvxUureEQyYOoIiDFTxIitAqjqsSCtTyYuUlLaMmACctFosRrNEenlmilLOaXxAosSAaiINFnaANCcfUunbBUuOyYRreEknuHJemmgGfeEEebBkKfOoteEkKotThPXaAEdDeUuLDdlqQAmIihhKfCwWsofKYykecCEDPTtPppEeeMcSIisDDddhyYHitSqQsgcHGKkGsSgGhuJKnKkeEnNWHAsiIviIVXnvVNjJGHCIQNnqYOBWPpxXZMoOmfeExXHhBtTPrDwWJjuhQawWAHjJhTtdDpcjrkLVdDrmRrMaZzAiIRGEQMTtvEBxLlXGgrEpWRnWLqvVQqpNnJnJjNShHzabyYVhObBooOHDrRQOdxnoJUuMmOoNgRAarOBPERreQnCcVkKutTaAVqQLlpuUsSXVjoPeVvdDOIiSIswqQBbfTsuEeJjPBSslfOEdKnNIpPkKyZzdXxNBbfFkcVKAMrVvPpRmciIQwWNXxbKkBHhZyQqYMmnNaAOozAvbiNXxEtuUICcCcHHhgGkCcmkbBFfEetPrpVDdafFqQQKgicCHhtTUoOcyYriIRUXdvdNnlLexXfoYqQbcCBSAasyxbjJhHPpGgKkBhHDCcIOoiaExXeBRpAaPJqxXcCQBQMXxvqwWtTmKEekMmPNtOoTwNmpPIuWpTsSAtzqWwcCQRrZjJKzlzSoIiOaUrRhHZtHhoOGgwhHSsGCNvWwVhHEeWvTtLmAafmxVQqeLRrlpnDZzdPYuUSdqQgGDsjJqQMmvpPtRMmWHhuhHHipFpPfPRrxElAOoubBacCIOogNifrrFfRRLlTNeEnPpKkROoLloOrBbrRrEhfKFoPnNVcuUCvDdUzZyfFJjJjbmFfMgRQqaxWdrgebTpjpqKkvCciIVQIizQGgStTsNnQqimMUgifFeEIGcKshHLtTlwWxvVgfHOosSlLNUEjuUyVKkdDvkRoOhCoOcebWAgGBbfFBboOOoDMmhJaEiIHQCciJjRCGiIgXeEjJWdsKnMmHzZTtlrPpWwokKunNyYyrREhjJAjeeOonNbhGgHYxVbNiWxZzqQPNneYySswWmbBuTkAaCHoOhcjQGgqJDdDGgdosDuVvUpPdrRYJjKeElYPrPpRtTBsPpgPYRuugGtNnkKaATVvUWwUYyLCHhdDsuUoOiIScSlHZyumMMzmMzZzMOouUslLPdDpYuAWMISQRGYaEymMJoOlLWwjFrwWsvnvLOoFflUOrRorrCmMcoORXlLxRuVrRzjJuyhYBbyHfIIiIyuRrrPiOWwyYIyHSskKqQlJgVEevYyWiIzZzZNfFnjqeHVIigCcsSpPTtXxaAbBMmTtLPpZcCqkKLvVfeEVlLvqOsBbSSsOzWwZjvlAuDgJjDdJqQcCcVvZhHVupIiziIOIOuUxPTcClmMLVIAveERveFGZzeIZzyNmJkTFyYfFbBmOoxNnkROoTtBbryoOyYZeLlSsaKknNpPRoGdZzlLOGgGgEoOeFmMWwLBaAlaUJkKvVjNnAIywWYijJGgaSLIicClbrwLlyadDdDIbBZfsSrzlLEQUkzQqPhTFKBbkOUOotTEzPJjpBZzVBTmlYFoQqOJHhjudqeIiMHpDHhdWwgUuFfeXUuKCcBJEenlmnjJNDvVkgGSlLEsSJjwDdWkKQqAbBEGgHhejJEGgfFsSRrReEXgGMTfFaAuIiUuFfpArYToOtrqleuyMmYQMpPeXLdDlTtxEQqsSqQhMmaaseZzExXSAhhHHAdLvVoOoOhXyYPfFeEfFkPgGckzBbSsZLjJVOvUEsrrOOHhrRBboEeVvnzQFFfpPfyYODXYDdyxtTKkpPCcuUzaAOpPOopnNPJuRgjOcCsSsxXfaAmTtMFcpPMGLlwWqOoPylonKkQqGXxwvRewCtFDFAdDauVvVXIrCcvKEeUpPuTdDtwKiIkoOnNmMoOTsKkUuSveeEFfoSWfFwhacCGZemkAaWwvVSsKMaWXCBbcUnNFflLuAaUuZdriIfFRyGgYJjDEOnNuIRLVltlLvwWRrVrjJIXuDdxFfInNzoKkIirRVfKkFNsyOLlCHAOxIiCcfdDtuUpPUveYyUMzZmlLfzJOLvmMwpKkJjgGPWiDzIcCiLloZzWpPeESmWwhvVjJHQdKQYUiNXxnHdDaRyYEjJeFfPpqjJvkpPNnWfoOFjvmMVPpRrJxXLlwKgGgwWgfbZNcCnZzIPpgGhHhYyHgXNnxeEkKhMarRvnNnOouUNyUuYgGVFRrSsCrRRqaAwWScveLlUuUuEVQxXqdDoJkKucNiIxXUuIFRpPLzuhHUwzEeZWTaSsSzZxXsetgGTMmDIiUnKkZzWWbpHsSDjHiWwhSpDdovVKuUNnktTueEJjQqLwukKUpPTxXzfXAHhqQaDdxXCcSltflPzZpPpMmPCgOuCWFfUuaABQqRrLlEeSkKxLGogeEGOfCEDdgGdPMbZzzZCcKkESsZzhAayMCcEsSeitSsTgJSsoOVvfFIiIiWWzZwwDuUdfRraAgGgGFXzwWZCCcotTOcxwCerRRrQyYqObBiIHlLSgMmeeEEYAPkhHLluUSDdeExXsaAKyYekvVzZhJBLlbDdWAawjHRIdDeEiQcCgGnqQeEMiINOoHhnmPXxmZzxCcXoOMPppatTSsCBkKvgKkrnQruURTgSWmMadpPDARTlpBlintTQqViIhHoLrRlFEeCJkKllFfpPChHipPOxXnSXxsGKkpWwHhmlFAaHplnbBPbBtTkOPXCGQqDdkKgHpPhcCdBbNiInnGeEwkGgIsSwWFlCcLPpaWwHqaaZxXzLCpPctQirRDdMkwqQCdDCEiXxIenNTtcFfZzxyYkKXVWwChHtdDfRrqQjvzWwXSzafVUNnuvXAaxtlGVvIiVmrYPgZzmMTtpsSRthBbHdWwGfFgZMUumkKztIQnZwWtTKCfFWGnAajTrXBNJjnBrRbBdDZzwWeduAPpUuaUqQqtbBXxRDdVvriITEeQIiPpYyJjAxXaaBbbBJPGgsNnSXrtqYfFyjuVWUuwXIFGgpPGuVvFFfmrRTBLcCuUpPVuPpmNiIuprRNnPjLShHQCEeGgRVdReEwWNnkfXNOVcCoOQIinXevVEUzAHOnoOUumMNfFQqdvMinokQqKwZHhzCfNnFJtpkKjJPTwCYMmtoDdOcCTItTMaAYLvVlLCYwWAaYesSEfFSszZdDFIpKkPdDByYcKTtHKECtTcgGEWweQsohZWgEesFySsESjJKZzlLQrhOieAaEgGmMlNnjosSKwXxbHxXFfxXksmKkMPeVvLlHvbBmMXWviIDdQjJchNfFjTWbQpZzPuYyQfUuxAkKTtWRrvEwxXEeLQicCIqLNbFfoOPpwrlHhLyNnuURruXtTBadUtevVKkExarszzZZJyYjMmdOosSykjJIrRYyNRYyauQMgEaARrQPpqBbEeeagGGFfBgGOOTtuLHuUFfhHKfMqQrRrUAgvrRVQqfmqQqtTQfFSdFbdDBfHIiPphUdDrRClYyLxdMhyVCcWwRrvhHXBlLbCyZzEexbwpPWHhscAsirtvoFfONnFfEcjJCgWwGIitTXYySsiIjNnATtPpPpdDaUuYyOoyYORsSVrRvRWQEjZpzDdMnNYyhTOosSPpMmvVtHyYinbBNfLzVvZYFTdDttnvVLeukdDoFodDdDfvlBbLiIYPKksIijJoRKkqQXJDdjjJxVvrhofFPMmGgpPSNnYyFiIfDfOATtUuTVvqQyYxXsSiwWaAIeCcsSjMmRmMuvoOUuVUrRrJknADdEoHhOJzZoMlLErqRAuvVvIXxicYysSRmaAPpMeEiXnkKNlAaLxXgVAuUavBbJjJseIiXKxXaEOoMFlLiavVANhIDrqqQRwWrQNOGgoQrLldYHWRzZreEDDdKkVvfFwWwWoUurRqfaAdDaAghhHCdBbUYXqiIQAFfVDRrdciIuUuqQUPhHpATpPtbhHxHMmhqPrRpQrOomyYSsItDdldDZKkzLIiHoOyYhCBrrRSROorsggrRgGGAaPeqJjaQIIiMWwmqbBnSsuUNUuTmMXxtnJjNUuhnbZSszzZiFnNfBbGZzLlghEePpfHRrhKkoORQXxqCczIinNwIMmikWwbBurLlRUopUQiYyMiIZzYUuQAKkfFqQBvVyBbkTAmfElzZDEblLBBbvRroOqQrqZrRNzPuUGgIWwTUuTmRrQfFGiRYyxnNXmMNnCmMVvbkKRrRCTtXwMmveEDjJRSAaaNpPNPpFzZRMmrboOBWPLLRroRreMmEdpPVIivKkvyYVpbvVBhHwcBbSZziVvfFjgGhHwEaUIjpaCcXgLMkKmXxdCcpeEPbHhBDvVFfpJRtTFfupPZlLAZSsBbkQKrRcCWwLlLDMhAxfmMjuUfHftTFJjRmaAzZmnJjiriIRUuFfjJYyuUfyYFyPqQpLoOmGgpMmMxXWRrGgRpPrwaAnovVOgDfFdLCzZpMmeEbBbrunvUuWwVGgWwkKFdWZppPDdmaAPpMPzZzhNbZCcOoeMuUljfSlsdGgKGHhMlPPpgGWwCcmFZzeETtJsTopHacCXEOopNQtHKkSshmHuUhLlWZzLzLlZvVdDEZzUuOxbBHhsjJrpgGBbORCcrUJjOoBBbIXxzMmZzMhHFJIijbfFxnxXNOaAUueEwNfJDOHgGhodrNKkvVojJcMRrblfUuerRJzLRrlyElLeYwaAWwnNPzgGZcCAvVoOBRaAVjJHIihmMCzZNnhCxXcpPmFPGTqQHCczjJZAWwQEewWFfNfVvafFAFnVaGgGqVvAjJdQOoAvuUtTVZzcBlAaLbgGHFfAailLnZzLldwWrJjSObyYccCCtTxsfFSXLyYljXxJnjpNXFMeNnPpXkKLBtSlEbdtDdTGgRtTrDwWpJSsiIlLCnxLJZWPpwzmMSWiIlLaAmxHzZyEemMgGYhaAfaPpzKnNqJDdjyYXzZxmMmmCIsSPpiDoOdEOwaoIiAHhcuUKCchtuUesuOKdIigurNnRUItTbuUfFSPpsfdYGJMmUqWwRrmMdDQmcxHhNSylLYZaRMGgHIihfFmnNOsbhnNDKkEedjJKoODSmlavsSVPVvVRrUEHhqQeEtTEeyYVyYYyvgGZBwWvVqQZEeFKkfZsQqSXYUuCXlLxsiNnBUlLqxXNGFfGEegzZDvfzKiIkCcZFPgFAaoOfwWDLlcCXxdMyXxRrYyoOsSyEeyYAfFIuUimMamMQqwbmMoctloOzZieyYDdAmhXxXxZzXMmGskKSgoOTiAaVAMNPeTTQIhbBHpURrucCPkKRriXKkgUbBuRXKkxycCYbfFqQYyEdBruJdHhXxDkKjfuUxXZzCQDiIYxKkHhtzDzyYKvVkAWHfFhwYyzzZdDsSZZznAaChHVcXXxxuDyzYyZUufLlJODSsfXxSsFjwWfOoivmMdRrZfGgFQqeEcCnOoshHSnMmNRWObXxYxXAayBmMFQqTOoiXOHmMlLyYjJsSVFviIKkVLkaFcCmhcCQqhPyYVTlLmyYiXxcpeDnQmCcMYUhHrJGAIilSswWoOPpugGULagHhwzZWjSsSSsyYobVvlLPSspAagxXQQSQqsqWwvgGnNXKkxOZrRKkgGQdfFFmDUuGrpPnNyYyYNniInYyNnTtNHhDdYyTWwJjzZFapguUGcCPVlLzZSsVHhjXDAadgGxVvNnpPPrZGguUEesSSdDDcFJWRZlmMKkOBfBbgNkLlKnGWPAaWwBpPoBrUEQZzAJjbFfhHuUIemMEiBIRriaJvvfEHiDOoddDXKkwWxkbtlEGZzZzYycCFGgeLMdDJjPXxaekxXWKwOoFfWkEewRrWjWmuGvaAAaJjNnFfVhHckKCcCyYwvkKVWTfejJEocCOrRhwWhHHVroOwClLOldDKkAumJeEeERcSMPWzGgkKeEwWJjQcrRPpFfCMmqeEcCZdIisOHhNBbXxnAHhuUavVwqQimQWwYyzZajFbrRBbVvJjkKhHdDAazZrRnYBhZBbTJvgGRrgmbfFCcZzkOobBmMytOFfouBFfzZTternPcCFfpFbBVhwWsJNmrRUOopaydDYqfNoyYTJFfjtCcrRZZbkZSsdDzwWjGgJFyYusSUkrRAkjtTJSsaAkjXEeWwpPxTrpPRtJjPZzAaiwEeWPsSpPEUzKHhkSElEepPbvpHYyCeEFfEeXxmMlpoxXLlOtTTtXxwMmbuUQdDHhFGCvkMmmFgGfMKSsGgrYyzSsOgGKkEPZzpDjJZzhRrqQveeEEXxVjJKkpPHJAvdUuZeEAuUagGpGgQqsmFpPdsSdfFrRpPDDGgtSsPmUeDdoOmMEwKRrdvtTVUuvYqyPSqZzWiIwhHOeEoQPpmMLGgJeEXRQOUuPLXTtFcCNnfHhxfFRvSsgyWfFwYyWXsSQGQehHEHldDLhlPtTpLqkYTtRdDrYyyiIVyUHbBvVlLvxXPZmHhiIOoNnKkNnjJMzpFcZzCiINUuMiYfFyIlLiiIGguDbBxXdMmUfhnNXRrIiGgwWHhQqFBfFbdXxmMDZBlbYyVSkdBbYRvVrnNyUuLlDKsurRcCiItTxDREeWYMmyhHJjZJaAjzmxCeDmiIMYFfydwWwRWEOKkoiIvGgVzaAZIierRNKkfFnMQDdyecjGSsqQTtgJCEDSQqErReSsgGuHVELNQqanXyYLgDdGPLlDdphnVRQqnAtTGgReESsDdCgGEeXeExpFfAaPgmlLMGcrGgzEnNaAeaksAVvabbBWwjJBblLQClLAaWwJSsjmIbQfpsuIiIirQqRxLbBlhHRTtZzsTCcegGivVIyOFsvLlHbBYyAahVCcZaAOBWwWwlpdQgmzfFvVEeeEMoOhHqQmHanNAfFZvQqJjEeWwcCOottTKNNsSoxMHbzZuUdDBVwDdWvXEmMkgvVwvSkKxXyYaPpAffFFvVTtRRrZjJzsSoORbRrBEerWQdkKAaDGgZLlzqZkHLlhPpwWfFHyDLlzPpFfZGguUdazZAmhHhyYYyYytORrjHhdcCDAaJoZIJjoSLfFVvpPVBbvcCqQMWwQHhZuUzVvoLRsSrltTPpzEgAhHactTnkwlLWDdKNClLkKGDdNniIpPMAFfrGUkKkKDdYyyhHYuNnHwWhEegxxmejJEqQyUPCBbuUcZzyYMiIrRRBbfGedDvAaVABoObEeaIiyMmSsYcgGCcRrUuciniINNQqEciWwxXAMmYqQyJRrfFMOdXxyYDMmfFogJjGDdtTQfFJlLLlxXoOBmHhhHMRZQAaqVvfFVvztTGgEPpIBLvVlLsuPpAasVjJzZjJVMOcCLloVZzeYyNjJnlqMNnhAaUutYYyympPmdDMbBvSsVMvVjjJpPJnYMmyHhlcKpyYJjPkPQqavVuUDdASseEzZQqZwGgKfFkWjPXxpQaARWQqwrgQqNcCnFfGnkKNYyxUodDQqGZzjScCdvuDhHRrdQqNWwyYzZvSsPLvVlfYyoeUuEHyYhWcCwRrBbzwWZNnTdMmpfFPDtOoOxmqQMlLOoYHoBgzOoZGkKoOTxPpTZXxztDyYdkhzZrOokKLAVvPpPcewHhWEQqCmMcKkbBKzJjZeELlJoWwOjzZOokWwYyalXxLEedDQydfFDYquMZzmfWwqQFURrctXbyYBwTtOowUaAuUppMmvOoQqvCchtTiPLCclpIiOoIHhAaHXeERrKkoOFfxqQoNneTtEhHHhOgVmMxXfmMIwWTtiAabBAaguUGzvVeQmMLlbtVNWwNnJjkYyRKkyYfFeLlcAzZaCEzZRZZzzTyYVvEdUpcrqcChQhHcCzZMmqIiDFIDdPpiCcfFiXNSsVcmwWNubBUtqQOoDMkKmcCdnoONVWwIijJvozZUmaDKkcLlCcCdXbqjgGMmWwapPAzoxXZnNPNNnxXYQOoEeuMgtTWwzZpPsMCEecCYgrREMmeOoZzdvVvVDfIDdiiIheEEeFfZzHzQYyqfFcKkfpZzFfcDRTtoOoOOoZhNphHoOGgPnkdVvDKbvrRTCctTtVJeEfpPFvVjLJjlnNIpKDeEXxYJjTbeEsFfSAaSsAaJBbSsjKkBMDvVmMruUBbwWPpSKkVvaAJHIiWeOoESejrRJlLAacCyFoOFKkVoxXqOoPpIiUuBfFNPpnOobJBhHbmUzCclVRrvLoOuhHUzaAMHhmdmAaQqSsOEyYeooDdbBRIidDorRrROSpEePsyYurSsRbqQROCcoSMfKriRrDpPfFyYYktTtdDHsShGCMbQWwjqQZsSNsSnSsjcSsiIaAbBClLxAaXNoKkgswcCBxXpPVvbOolLSsEhaSIiUpPArAuUaRBgGbAaaTowWZziIlWwcifFBbMnHOomJHirQrqQRwWCkKTtNDdoOsPpSAwnIAhkhHkKdDKDrvDdAanNVgGRdHYyCwWLYzRcCIzZirbfHTDdgSsIiHhgkFfVFdDZnOMIimFfocXxrOhHpBbpPPGgKkxXgWwGWwokKRCNBHhCcaAKtrRfLlFcnAaNwWCtTMcCyYTBbRRrCsXTWxoEyDdYoFJjKlLNuUDdnJhqjeEJQHjkJwWKcPpPpClMyYFfmLkXNnPUxXaAupwfFWIimMwBbjJcCcwWsTtyfFYWyYBbnvVtTJjdDcCNOUOouwWHhlrRLyYdDkKOgwhHpPWfFGGgoorKkPpeEkjIEiFfrMmRaxXOoKkADLlddDBmMLlbIvVeEKkeEUelLEJjRfsSdfFDhHlXxMvVmVvKkoOOhzqxXlXFIifcwpPWGgDdCnMuRDdrUyYmnhHkzZVCcqZzQMmTQqtHZzhzZQquHhaAqQGvVgWoJjbBmDqQCyYckKmuUMsOoHiIBbwWMSsuUJjmsHVvJjsSOoRDdPIiIhpPfFHlLqQqQiLlpGguMmhHUQNXxuUnHyYRrDncCvVNZSkKveETtgKkWiFfgLgrWwacrsaLlQaAkKJjBnNspykKTdrTtMmSRrQOaQzZsSeEfnNFZzzZTtfFAaqzgFfmAaAaMzZOFflLotTtpLVvlghHFgGfGUfEeFuUuoOzZllIyMmLAaQIiqFfScCkKVvvUuxXFfKkVaAszFfUuNnsSGgYyNOoiPoOVvnNQiuIxuyTtYHHhhqCHhcQjPnNMmiJjlPpLgGRqLFfRWwrwWjUkLlJjvEeuUoQlLNnwWvVzZIizvdDVZTtpPUCcFhqMmylLUuKDdtTkuUYiGwKkIifFdDyfnNzOovVkKtfFEeTZfFsSkKhnArRlLaFyYfjJHVvUuETcCSjJkqQwWDqPXxFWwfpVTtVvHpPRrEeEecuUUubBvVeQqCcsZzXxSiIGwWgKnzJrRqbBYlhHZzhHBbLjJOoNnmMmMTYCQFfqKkthwWajJAPpdDHsSNnAaAEKkZwSsWzgGgqQIHVZzcCvpdTtZzpPkKLlJjeRHhrEhHfCcqQtUNUKkunoEeOHZzhHhDXxNnNzZEenDdNKkHyYhoDdLlNWwnrsnNSluUpPbAfFYyyYTtaiIrpLlSsPfFRgGZYyzcCBvVaucCUARrGgrPpXbrRYBtZMmzyYfFbFPpfdDOoBPpWJxXZhHBblLjJzwDEeOlLpPSstKRrdDkbBbBbPpdSsrRDBXUuxZzXOdfaAIipQqsSfFUvVuYyFMWOowapdDPkNnMmeIijJEykKMQqNlNUuxXbsBbStKkgoOGoOeEcpcCEiZBGgbBUubUlLuuUIFbBjJTtQqPpsSaJQqxgGXJjmFfMOofFjvIiFfBbgTtlrRwWwKkDdOENCcMmhHeEneLlmbBoDdOJjMoOghrIirzZRNnThHoOtgGjAfFcCkKpCXRcCrzAaZDduUkYyKkJjDdNOoQYyJQtTzZUuSUJjipzYNbBCccwxXWhHPpwgcCGYiIcpPYrsSRwWyCyzZHhCcjpIEeiPcCGCSscXxgcjHUEeuEeuUSshbBZzgJjVvGvVJaYEpPqvVQeyyJbSseOoEKDduUSIcKkCiBboOxXyDdTlqQLLlhHHhSKklLGgVvPpetZzIHhLoVoOvxXnrRGgNOlabBqgGxXybBlKkTYytNlIiaALnRrLZzHVWwfFvbjiIJBtTnNiINmMIimkKMnwWbdMmDcoOxXFftTRrzZCcCgGAaKKXIixrFfRonNOqsSBbwSsWSsXLlyYgGhHgGdDxEdhnNwjvVCcJtTYyTtsSZzBbWruIzZiKpPAaaAHhkCxXfaEeAFqHhxXTvVxXtTYGgJjvsSqQpYyPgGnNvlLJjLlYlEeSLuUlatHmMhkwWKTAshHLaAdnbBNpPWwVvrRDPpsSRrHhyIiaAaAWwcCkKbjsSwWvnNwWOrJjJjfKCcwWAauUEegwARraAtIioaAxcCXRrOThHqgGSsQPpVvEeKFfkCHhblLZzCNnZwWzqQcHdbBJpPEWvIiwWVweaRrATJTtjtjXeNnBcKkvEeaAVCMmcCKhHpPYyFzCaAcdnNbEecCyHhgGrRwWNinbOlLoBNZzdZzDnpsqQLaASLlsYOocCsSZOvVZNnzvVxwWuUNlkKBbabBfFAjJzaAAuZjRrJkuUKzjJULlxtAayyDjYIibwWByiPpHBfFsDdSuwSsWpLKklPhHUYyBbReEyOcClmMLjcCsLlShHHwLKkQqcqQCmMVvSseEuUwWlfFxUurRWwZAaDdDhHdzZzAmMxXaclLCuYyvDcCbBdVvVUWKkWwSswvVLlADuUdKkxXnNBaAborRHrRhOeEMmMdAarQqRDHKzCcXxwySsYGggSswWGWlLZDdJEKkaaAqIpRrKkPXjJiIbucCEeUoCoOcXxOyYRrjJkGgKOfFouOoJjUyYAiSxXsIYrRlLyadBnNyZzVsSJjwDdSsCRrcHsShWsSwAcdDqQOfFoCZzGgfnNFLdNnWgGvVzZhNsSnHmRrOFQXxkKCcTMmLltqjBPhFfpPHAacCpTgGYystTcCTjJpPvVBbBHGghbTtxXoNntVzqQnNPpptTPZsKfFUuBLlbJFuUpPUufjgGkyYnqQOoNiIvVSpPJjeEUubuUZzWMZzxRrIBbiPcCpdDFpPIfFaALCrytTiIbBSsxXYRAaLSslZzqeESsNYyrqQOortlLSsTeEvVwntpYjgGiIMmJsSbIiWwJGgTtpmMPVRrvLgGZzuUzZWwnsSqnaAjJWwWCkKcyUumLlMmMZzEeCqQSeEDdXxstbcvTiItJUujVrQSSNnsPpsioOIrixXIjSsJKMmqQkfFzMeEkKcAzVvZghfFJIijHxXDWSLlUuYyWwsUueEhHtntTJjqyYQnNNJjYyWgjTJjkKgGOouCcUCctxXqsHhHvfFBbVhSCcQPAJjERreRraKkIiKkJjYynNTtSvVAawEeWLlTttQjJtuBbUsPpsSFffOyYhHSsueEqQqQfFUPpuIiMmmMcCmMyYFsGnNgMmzrqLlQRmMSsYZnNsSnNpPbBGgnNpJPpnNMmEeEzZiIzvEenNnpeERTtrnMEevVmwNOonWNvlPGgQqQqpLWCcOokKwRdDrwWaATUBaAVvmcCYyMEebiIrySsbBYnNxnNTXxtXJjsSONKkXxCcwuUYMmyWQybJxXFfezZmvVMJjXbBKkpPxJGgyYYyDfmMrRrRFxnrRIZzIirfBVvbMXtekKEgGAzZxNxrZMmyYzvVSegyYdaAVvRmPBblLpeEuUsxKkFfnmeEMNUuXcCyYmMnvVhHgCcGRXxrNtTgGevAaGgYyvEelLZmEeMoaAOzNnVFfAxXobQkKyYqBIKkiQeEWwsSNnkKqOSsBbNnMmavVAWwlLYqQtKkTTtXxyRrkNnCdDIklLKiJLyQvVRXxaArqYyYleELiQsSqmMIxYyOobfFqQBhHMmyoOYbTWEeGgljAslLBbrYzZQrRrRqfFeTtsSkKDNndDdHhsHhSZCcVvycCYIjBbVpjOopPOjJFflLKkmCcKxXkDdMXxweEWtTnNDdSDaAgSsGVMRrcCkIJuUqQrYRrywlLUuyjcRrCJACcarOoypbBuUPYcCDdpPWwRYhHIfFiGknKEekaAqQNKrkhHKmMRFIibJTmMtofWwrSUuOosWwRcCgQqOoQqQEkKtAsSaTrDdwIiGgfkKFCcCcRzaALlZrWxOLWwsSDdJqQyYIkfFKLGglHdNKkxbIOozZerRCcXhHrQqGeEvVgSwWQqimgGMIGgsnNdDgIiOgGBwWscCFfMmBPphHNOeEcCotTnHQhOkKCKkzZiIuUpPjWUfzcCPdDAaXxWwYyIpqQtTPmJjMmMUJjkZWwzliILQmMBbqRpuUfFPeixwjJxaAqQXjJWwtIiJjpPMmTmcCtTSsMWqQrZiIwRrWzRKqQkMfFmVYyvGLYyPNnpAaluUWdDEeHhCcjJwgXnYyixHhXgGIxXVvNVpPvkKKvVgGKCgUuGNOoAXcqfoOFDcCYPprRXxyRroxAaSsvVqQzZwWXcCTJjtGgspkbBIiKPVvJXxnmMAzZalLNwWpEePMICcdEeAavVQqDNuUzZCcUuFflxAZzaYyXLyYlNAIiHhZzEssysSYSSssrRJjhHyYqQEepPOaEfFRreAokKduUcqQCDYYzcCZyrRfFpPNvVnYyIcNXxnxXqQydDYYvVyJjqQEeCfUfWCHhcCcNDtTycmSskKuloOVMmkKvUucCfwWFBDFfdwWzZLlNnBNMmnbbcCmMOqQoZzoOeFWrCIinpPNOoJkKxXjJjwKkHhWwVvEPTcCtBOoHhbXHDdYyOoAbBahEPpezaAxXcCXxcwuFfUWirxXRIwwWWqUuCwWcCcnlLsSNKkVvgGuFmMtTdDqQfcCSYylmBxhHLfWwFlXWwuSaAsxXidDhLljJHtOKxrRoOXwWDdkGTFCcfaAdPpHhDtgmCCccMmMQqqQUuOoIivVUKkuCcKHDdsShDdkMmoTLsSlRrZsSzfJjFhLlHiCcIZmZfaAFMmxkKOoXYLlyjjJWwkKsbByYSIiSRDdVEeDdvrsJzpPyaMMmmAUmrRMuOoqQPpZzWsiHhUBbuIioyYkfFKOwBDffFFdTtarRzZAhHAaylLYSvggGbBGjJjJrRrhHaAFfdhHDRcCVoOiIkKsdDlLzdqlLWfFwqQbBbUXxuHhkhHKcBWwWwSuRwWrVMnxDdXpkKPIiwWIiiwWImhHmMqaAcsOnAFhiIHfaJCcOoeXxsStoMmOTziIvVJjZuSsoOUTtUZzuUueLlETtzZfQqzZFWIhHiKkaABbzZkKwboOBiCcFfIOoPMmpQqKqQkEzsxcClkboOUuBRrKLXmMSfNnFZmMMFJjfmFfVvjlLtMlLILlirIihHRTtxXfvVaAFpPsSwxKkNnXiItGzZMmcCFzZwWfuUsStjCckKJTOLlonqQRrSsUaFfAfbBnaANUueOoEXxlSsBbdFfoOaAVvCcCcfpPbBdDSYylLsVtTGgGvDdcwWkKCBamMkpPKpQFfqjDdzZXjxZGOoBbuUgyBbWwxXBbkKOoYeETtDnNHbBjJvEevvRrVkKVuUcfFVviICJMmeRrEjOocEeHPphXiQsSNnqCxXqQqQuUcPpMLkKMmlmeEaAXOoNnxXuUvVKwVvWxXRAlJjLTDvVdZcCyFfSsFJjPpaAgVDdvGzQUuXdDxXKkxqQuRmMWwrUqDdfFuUMeESsqrRQKkxXaWNnDdAMZzmCcnNeEpKHXxhSBbdDsjJkNnhNnWwHfFBbPNhHbBwWnbBYOoTtZzBbSsaAZzmMJDkZzKbkKBdnEpPeNjyeEgGpPohHOfFNnigYSsvPqQbBppPPpoGaABbTtZzgXtcCTTtbBRFfqQrwotTOsSWzZrRXXxYWwyxFfeLleMFIFfXxifmEEAawtrRTWCcGAaGgRFfdDUurIDdyYivXAaeECHhmMrDjJdRevDWwDXxddeEyIizZxYyXFcCfYVBNnyYiUuUuIyfFEeiIYUDxXduJjmMaAaoOiIgGAbQqNnHhuUuKoOjJpPCgGckuPpOqZzQosFCcfYyMAIiSpPsNniIaiImPpXxSBblLQdDnNuUSsLOoluDdjCCcckKJEefFHvwWoDJKRkKrxXkigfxXFGIMUumiuUmMIoXxORrmsStTMjrRSdjtTJyYMmiIqQbBNnPfFpuUGsYTHhtysSSEgGokKMPpcCmNGgnnNOjJTtdDYysSBYyXzZjeszVXxvhHhHzZdyWwYDNhOohqWHhwcCcCOLliiIIoWwXxwLlLlWtUwGgWjRriIJuafFosSpPpPfFbuUUuGghHGgkFZPpSDdscHhRPpiIsSruUzZlLCtTcYyCMmyYRrzXfeZzEceECNdDXxndDdDFfbZQqTtqQuUupPUzSsaAGUuRrgVtxXTmMmNWEewoOnMvUuBlqSsQLOoLnZzLZYyjqQJzYTyYtgGNnMmyXxezZEWMEemtDdNnOorRuNnhDeEdmFOokKyYffZzUcCuFTLlRFfrkKtVaAuUVvvcCyVvXEexYwRrjdYyDzRrZJkAVvabBwkKWSsWnNwFrRMmpQqPfQqKWDCgGcCcxSsXhHEegIiHFfhpOOooEeJuUjPGgCcsSkKABgGGvaAVwTtWgbXxfFiIUpPieEHhCcuMmAaUIVLlBbrOqQeQqLlEbdDBFfouUdkKDUuFHhvLlVuUiNGZNnzfFgniIRlLAnNuyYbBiIUiIcCunqQNHoOJjhPpsWQqoOgGPjJpiIyYLlfweEKaAkWLlBbIiZzKnNkFMmykKdMmDhHYwDMmdfFdrReEDYFBYylkdTtzZbBPzZGgpplLOoVwWvoNuxZikKAaIKkpPaAwlErRexiIXLWzUHhuztTZjJsOIioSptTPVWwdOoDvWwuyYeEPptdeEyYDTUnNpBSssSpPeEbOoPSsXCccYjZzqQWwJyIeEiEKkTyYteIjJzZFGgfiEeKkCDdaMmPpYhHfFyYkKcCyiIAdDsxXSPpZzAkBbFmYyqQRrnNZzVvMEbBnNezHheEWWtJqrRQjDrSsRlLdsSGAajKkJbBPpgLlgDdZZzbBzGTEebBcCeEVvwOoOoVsljJoOCYycLAqQWwaqHhQQqcCCCcdoFVQquRrCyYcUvfObBsSoOpqQPKWyYwwWWlLIodDOitDTfFtjLlJuoMmTFfTWwbjXcIiRTtzZrTtcmMrRCrRmMIiPRXxeEXxrnNFfDdpbzdDOqQokKouYyxXOoUuUOeEmMlLlLbBbBZzUuvwWMmQqfYOoyFfFLlTSsvlLwWCcVhHgGtYyVQRroQqbBOsgGSkKrhHSsIQqiSsgGMmRqQdkKFvVfjJzmDdMZCcUuNnqQNUunDqRruUqQbYyEeYyBzuAanHhvFhkKHfSszZLlOLuUlnvVqBZzbQmMLzZyYloRrAOozZUuXxaSTtyYsVnNSskKpKxXYUuCSscykfFvVPmYthHTyMvHhylLSqQLFflWmMKkXxBCcAaPpZLlYvVUuqQHAKkahYyykcCOoKcCSszTJjtfFhkjIiJKTtkaAVvKKfFkPxWwpwiIJjWPaAMvViILlFgGfDdmgGIFfSsQqiTtdDspPHhSQRrKkFZHAfFahzLAallLfqnqQNIiIdDiXGgiNnIiIdxMmXDpZFLNnlflUqQJjuBboOZTNneEGgtdsuFodDPpoOBbkURruAaKXxzRrZnNOVbBjJoNqQnNSrRslLOojNnBSsbsScCTtJKknJjMmOXZzxfFqQzZoOtTcCZeEHlLhyOoYpPkKJjPpwuUQquuUUwyrRFiIlLfdQqDYpPpPtTouUOSsKkWIitTZzfQPpIipPpPqeRrGBbMvVtrZTXxiItzDdRVvHuUdrRDJJjmMDdFfatjAhHaWwJHhsIiSdbgGBtTDTAuLlhdDHerOoRGgEUTtMZzmuZzlRrLHhZzPpamJKkaAjMfFdDAWwHioOzZqQbBVvcCIJjYUuyhUMmPqQCHhviIzZVDdKkczZdDKpPXxaLlJdDnNjaVvAZTtztTsTdDtSEeFfMIimAtrSsRTZzxXyZznNgMogGOmGYywWkbBvVOoBagGAhHwWRrxXSiIsVEojJfFOFlUuFfpPCcwWuULQIiqBbUuKjJcCkZrRdDfFQJjqzzZQEnNeEzZfFDpPdcCemMqEXxZzNnxXeoOYyQhHqoeywWYEekKCrRcrRfFBbmIifkKFAaeoeEOGgZzWpXxPRrwZLgGxXlLlzDdZzsfFSEgGsSCxXbBUucLlMpnNigqQWwMHhiICUrRuiIQqzZzPpZcDCcdlLaAmRrreERFVvfyXMmeEeExsSsTtSdPOopKkBbDnKIikCclLIitTLPplLlNHbBRcCrtThYGyYGUTtZzcCvJjLlVuHoOhSswWRfFrggGZKasSAkWPprRzZrNnDdwWyqzZsSQwWYWnBbTZztNFmMfwsSRQuUHjJhqrRjJgkKGqQcWwYyZzPpTtehsYySHlRryFfYLEkiSOohuUHDdnZzYyTteENYCcyzZShHDdsOdDogGNnoOsEMmeYpPyYKaJjAVvRrkCMmTxXtcfFyFfVvmMrFiIffMmFPpoKkOEeMmRIRJjrUuvVrReENPpWwWwnKSsePpzZEMAamkNDdnQLlqwOoWfLlGgFkuUKiEeNnIAaBNnbpPEvVLiIlebkKBJjmMVJjFfgZzwWSYwWyrRXxsoyhHYTtOIixXxXxXnNivNnYyVISkDRRrrOWwdDodvVZcCvVzCcBbVvKmWwMPDdHhAaYypKkPpPFnKkEeEeNfvVYyBbOoBbpPGBbtTgrRpRrZDdzsiIZeEvVqQBbpPqIimsSMmMXxaAQChHchHaAHiIhOoaqQAwWJGgjbfFWwxXnpfFEePEeNwWBkKBbXkeEKysXxSrRUuYQqxuUZJjXxZmMzepPnNkKTtmYyMBoObSsmLlMEecCEJZzjPpqQlLNntVeEvmMdrBbROUuokZzKDduUDJjLlyYJaxRzZrXtTAUZzunJjxXpPNjXxwWlfFzqQLlTtZcCXdDRrxXvVxaAqQtTSsJjvVJjvXxpjJPFfhHVLlYyvVUujpPqunNaAqQcCAazZPpdRrDsSdDdhgNnGHofFONZzQqnIjFfJTtfFiVvDJjUCcgGjBbJQyYJTtdDNIIiSspTtPiRrPpnKOoBbUyYzKkZbaAeEBZIizGWwgLliaAIiIaAxXOounNPpdVvDNnVvHrhkSQqLlsOnNwGgWuUsSoyqQYzZqQyYbLlBPHdDhpPtvVYyTJLsSljEwWepJVvfEUupyYiIEehHwWPGqQqiIQxXgeLSslLWwlhFfAaHFzmMVvcCIYySQqsRriDdIiZnNNnHhnNjyYLlLpPmMnHhNyYSwWovlLVbBEWwtTpPejJnNHhjJiIeLlEcCOhFfjuUeuUEJWVvwaAJjwWzZpsdDSPHLsSfFlhtTHeVvSsIidGgDZzEFUufJjLmfFMlnQqNsBIiZzbMkKxMmXmWwQlutyYTyYKkULTtmgGMxYyuUXqymZYyBbzGgMNnrRCnNcsSYyYrwWRWYywtTlEeLxXsqQScCWwTtiIUCcuvVI'
const input2 = 'dabAcCaCBAcCcaDA'
// Let's iterate for our onswer
const react = (string) => {
let result = ''
let current
let i
// We'll go through the whole length of the string
for (i = 0; i < string.length && string[i]; ++i) {
// Current char we're iterating over
current = string[i]
// Previous char in our string
const prev = result[result.length - 1] || ''
// Will the current and previous char react?
const willReactWithPrev = current.localeCompare(prev, undefined, {
sensitivity: 'base'
}) === 0 && current !== prev
// If they will react (or if we're on the first iteration)
if (!result || !willReactWithPrev) {
// We push the char to our result
result = `${result}${string[i]}`
} else {
// Else, remove the previous char from our result (and don't add the next one)
result = `${result.slice(0, -1)}`
}
}
// Return the result
return result
}
const firstReact = react(input)
// Answer 1
const answer1 = firstReact.length
/**
* --- Part Two ---
* Time to improve the polymer.
*
* One of the unit types is causing problems; it's preventing the polymer from collapsing as much as it should. Your goal is to figure out which unit type is causing the most problems, remove all instances of it (regardless of polarity), fully react the remaining polymer, and measure its length.
*
* For example, again using the polymer dabAcCaCBAcCcaDA from above:
*
* Removing all A/a units produces dbcCCBcCcD. Fully reacting this polymer produces dbCBcD, which has length 6.
* Removing all B/b units produces daAcCaCAcCcaDA. Fully reacting this polymer produces daCAcaDA, which has length 8.
* Removing all C/c units produces dabAaBAaDA. Fully reacting this polymer produces daDA, which has length 4.
* Removing all D/d units produces abAcCaCBAcCcaA. Fully reacting this polymer produces abCBAc, which has length 6.
*
* In this example, removing all C/c units was best, producing the answer 4.
*
* What is the length of the shortest polymer you can produce by removing all units of exactly one type and fully reacting the result?
*/
// Parse all letters
const parseAllLetters = (string) => {
// Array of all letters
const letters = [
'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r',
's', 't', 'u', 'v', 'w', 'x',
'y', 'z'
]
// Let's create a new array with the lengths of each letter
const allResults = letters.map((letter) => {
// Regex to remove all instances of the letter, lower or uppercase
const regex = new RegExp(`(${letter}|${letter.toUpperCase()})`, 'g')
// Remove the instances using our regex
const newInput = string.replace(regex, '')
// And return just the length (it's the only thing we care about)
return react(newInput).length
})
// Finally, choose the minimum length from our array
return Math.min.apply(Math, allResults)
}
// Answer 2
const answer2 = parseAllLetters(firstReact)
// We log our answers
console.log({
answer1, // 11264
answer2, // 4552
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment