diff --git a/aoc/src/dev/ctsk/aoc/Main.scala b/aoc/src/dev/ctsk/aoc/Main.scala index ffd8a5b..763e911 100644 --- a/aoc/src/dev/ctsk/aoc/Main.scala +++ b/aoc/src/dev/ctsk/aoc/Main.scala @@ -20,7 +20,8 @@ val solvers = Map[Int, Solver]( 15 -> Day15, 16 -> Day16, 17 -> Day17, - 18 -> Day18 + 18 -> Day18, + 19 -> Day19 ) def runSolver(solver: Solver, input: os.Path): Unit = diff --git a/aoc/src/dev/ctsk/aoc/Memo.scala b/aoc/src/dev/ctsk/aoc/Memo.scala new file mode 100644 index 0000000..490decb --- /dev/null +++ b/aoc/src/dev/ctsk/aoc/Memo.scala @@ -0,0 +1,18 @@ +package dev.ctsk.aoc + +import scala.collection.mutable + +object Memo: + def Y[I, O](f: (I, I => O) => O): I => O = + var yf: I => O = null + yf = Memo(f(_, yf(_))) + yf + +class Memo[-I, +O](f: I => O) extends (I => O): + private[this] val memo = mutable.Map.empty[I, O] + + def apply(i: I): O = + if memo.contains(i) then memo(i) + else { + val o = f(i); memo(i) = o; o + } diff --git a/aoc/src/dev/ctsk/aoc/Trie.scala b/aoc/src/dev/ctsk/aoc/Trie.scala new file mode 100644 index 0000000..30bc88a --- /dev/null +++ b/aoc/src/dev/ctsk/aoc/Trie.scala @@ -0,0 +1,25 @@ +package dev.ctsk.aoc + +import scala.collection.mutable + +class Trie( + var isPrefix: Boolean = false, + var children: mutable.Map[Char, Trie] = mutable.Map.empty +): + def insert(w: String, pos: Int = 0): Unit = + if pos == w.length + then isPrefix = true + else + children.get(w(pos)) match + case Some(child) => child.insert(w, pos + 1) + case None => + val child = Trie() + children(w(pos)) = child + child.insert(w, pos + 1) + + def prefixes(w: String, pos: Int = 0, acc: List[Int] = Nil): List[Int] = + val newAcc = if isPrefix then pos +: acc else acc + if pos >= w.length then return newAcc + children.get(w(pos)) match + case None => newAcc + case Some(child) => child.prefixes(w, pos + 1, newAcc) diff --git a/aoc/src/dev/ctsk/aoc/days/Day19.scala b/aoc/src/dev/ctsk/aoc/days/Day19.scala new file mode 100644 index 0000000..436a3fa --- /dev/null +++ b/aoc/src/dev/ctsk/aoc/days/Day19.scala @@ -0,0 +1,41 @@ +package dev.ctsk.aoc.days + +import dev.ctsk.aoc.* + +import scala.util.boundary +import scala.util.boundary.break + +object Day19 extends Solver(19): + + def pre(input: os.ReadablePath): (Trie, Seq[String]) = + val Array(rules_, words_) = os.read(input).split("\n\n") + val trie = Trie() + for rule <- rules_.split(", ") do trie.insert(rule) + (trie, words_.linesIterator.toSeq) + + def part1(trie: Trie, words: Seq[String]): Int = + def valid(word: String, inj: String => Boolean): Boolean = + if word.isEmpty then return true + boundary: + for p <- trie.prefixes(word) do + if inj(word.slice(p, word.length)) then break(true) + false + + words.count(Memo.Y(valid)) + + def part2(trie: Trie, words: Seq[String]): Long = + def valid(word: String, inj: String => Long): Long = + if word.isEmpty then return 1L + trie.prefixes(word).map(p => inj(word.slice(p, word.length))).sum + + words.map(Memo.Y(valid)).sum + + override def run(input: os.ReadablePath): (Timings, Solution) = + val (pre_time, (trie, words)) = timed { pre(input) } + val (p1_time, p1) = timed { part1(trie, words) } + val (p2_time, p2) = timed { part2(trie, words) } + + ( + Timings(pre_time, p1_time, p2_time), + Solution(Int.box(p1), Long.box(p2)) + ) diff --git a/data/19.ans b/data/19.ans new file mode 100644 index 0000000..8ec8dbe --- /dev/null +++ b/data/19.ans @@ -0,0 +1,2 @@ +280 +606411968721181 diff --git a/data/19.in b/data/19.in new file mode 100644 index 0000000..d217520 --- /dev/null +++ b/data/19.in @@ -0,0 +1,402 @@ +rwgw, ruwgb, urwbr, wu, uurbubr, gbbr, uwwb, rubgwu, wggwbwr, rugubuww, uw, rgru, rgrr, rrg, rbb, uurbrww, br, uwrwrwgb, bwbw, wgbu, wggu, urg, ugr, ugur, gurrbrr, ubgrruu, bb, rburguu, urgg, wggugggr, brww, bwwgr, wugub, grgg, ugw, grubw, gbwru, rww, wbu, ggwbu, ugurw, ggwb, uubuwgb, bbugw, rgg, wurr, bwbb, wburbb, rbrb, bbrwgw, gwbb, ubggr, gurr, rrr, rburg, uug, bbrubu, bwgu, gwug, guw, buwurgw, rruwggg, ubb, wwb, wbrg, wgr, wgrw, gubrr, rrwru, gbub, rbr, rwr, rubwu, ub, bgwr, gu, ggggwrbr, wrw, grg, rbuwu, bgbr, ugww, wrg, brwub, gruu, gbwbw, wubw, wur, grggwb, uuwuug, wug, rruuw, wgwg, uww, gbgu, rurr, gwguu, gwrwbw, guuww, rbugw, gg, uwbw, ubgrubur, wurrb, rgugurr, wrr, buggb, urwrb, ubuu, rgu, gwggb, uuu, uub, bruubb, bww, uwgb, rrubwg, ubwu, ugu, buwrrbwr, bbr, rbrww, ubuwg, bwwrr, gbwg, bw, gguugu, bgbbw, ggb, wrruuwbr, rug, uur, rgw, gbb, wuwg, r, guug, gwb, wbgr, bbbw, grwgwr, gwg, rurur, bubu, rguu, brb, ugbbbrr, wugrrr, bbw, bbru, bgrbubg, ubw, uruu, wgrgrwwr, bbwrugu, gbbbwur, rubbwbuw, wuwrwbu, brwbru, wub, rbrg, wwbwrbu, grbbu, ubbbwb, urw, gwuw, uu, urwugu, bgw, gw, rbwwwurg, gubr, bbu, rur, rburwgr, gwwgr, gb, rbur, rbw, ug, wurur, gbbrrb, ruuuwugr, wwrgug, gbrugu, wrww, wuwbgw, uwwwgrgb, gww, grwwu, ggu, rrurr, bgr, ubugwu, wwgwur, urrrbw, bwr, wrbgbu, wrwbb, gug, bwu, ruurw, rw, wbb, bbwgwrr, wgg, ugwu, wr, wwwr, w, wbwbuw, guugg, bug, bbbb, brbb, brur, rbg, wuu, wurwgb, rru, urrrbugr, grr, rubu, uugrwbb, bgbrurr, wgw, gub, ugwwgr, urwr, wbwbg, wrrb, rwrgg, ggwgrgw, bwbu, uwb, rg, urr, brrur, wg, u, bu, ubbbrw, brgbbbbu, wgrgu, bgb, ubu, uugubg, bub, rwrr, gggbrw, gwwrww, grub, urgrgw, bru, wgwgb, wubrg, ugrwwbb, wbgwrru, gbwb, wugu, uwwwg, ubr, gwr, bguwb, guwbw, wrb, grw, gwwgbb, wbwwr, grbwub, ubg, bwbgw, rwu, uurb, rbwgur, ubbr, grrr, ubwg, rgwuug, rgb, grrbub, bwb, uwuuubg, wrugb, brurub, wurg, urur, uru, bwwrrr, urwub, uwr, brr, ggg, bbg, bgg, guuruuu, ubwb, uburgbb, gbgrgug, rbwr, uwu, rwwbuugr, ubwwg, wwr, brg, wruububu, bgbb, ww, wrgbu, ugb, gru, bbwgbr, brw, bwwbb, wbr, grbg, wbbb, brbrwwbw, gbgwrrub, wwu, wgb, rruruu, wuggr, urb, bwg, wbg, rbu, wwg, wuw, wrbbugg, rb, rrgrbrg, guu, bwwugr, rwrb, gwbrb, wrugub, ubbrwu, uggbb, ggr, wwru, rgbb, bbgbgrr, wuruw, gbg, ubbwrg, bur, wuwuu, bgu, ruwgur, gbu, wwuwb, ggbgg, ugrbb, bugw, rggrb, rrw, rgwru, ubru, grbbuw, wbrr, wruu, ggw, wbgguuw, rggrugw, gbgwwg, gwwru, gur, rr, wbgb, burbwr, rggu, wgwu, rwuug, gwrbr, wbbwbgb, wurb, gbbuggg, gbbgbg, ur, ugwwu, wgu, bg, urrbgr, gurwg, bbb, urrr, bwurbrr, gbr, gwurb, ugg, uwbbrr, buggr, rub, bwrgbw, uwbb, ububggw, uuwrbbu, rrrwr, ruwgub, bugb, wwrw, gwbg, wwwrrr, urgggwb, gwuwr, www, g, wgrg, wbuwb, grwrg, uuw, wuwgb, buru, rgr, rrgu, urbgb, wgrr, gbuwww, rrgrgw, rgbrg, gugbuw, rrb, rrgbug, ugwbrgw, rwuw, grugrrbr, gbgww, ruw, wubb, gr, ruu, ubbg, brgurb, rwg, gwu, ruwr, grb, uwg, wgww, bgbbrww, buu, rurbgr, rwbw, gwwr, rwwbbugu, grgbr + +rubbgwuwbrwgrgrgrbrbbubgbggrbwrurwuggggwrbrgwbrrwb +urwgurrubuguruwuuuruwbbgrbbuwrbwrruuuubbuububuubrw +gguurrubwbuwgrbrrurrgbgburbrrurwbrrrubburuggbbgb +rgbuuwwwgbbwgurrwurgwgrgrbbbuggwgwugbrwb +rwggurbrgwrrwuururwwubgrurwwrubgguububururwb +ggrgrruwwwgrwuubgrggbbwrrgbrwrwgwwububrubguurggbrwbg +ggurrgrggwrwruuwrbrgbrubrbuggugwgrwgwurbub +wwwwuburrwbwugguwuwgwwrbggbwuwuuuuruwwurbwurgbwbggrr +urburguuwwwgrbrbgbbgbgrbgbubguugwubugwgrruuuugbbbbgubggu +guurrgwububururwgugrguuubrwrguurbuuuugrgbuwru +urwuwuuguwwwgrgbuwbgubwuwuurwuwggbwgubrbrguurrgrwb +bwwbbwuwbubgrbbgwuubrrbwgbggubbrbbwrwuuuguugwrwbub +wwwguwbgrrgbrgggwrgwuuwwwgwgwrgbrbgwgwruuruguubruug +gruuwuwbugubrwbbubrubgrruubuwugurbggrrbbbbg +wurubbwuggrrurbwwgrwubgbwguurbrwgwwwgrwuuuggwbguwwr +ggbguwrwguguwubgurgggrguuwugbuwbwwgwburgbwwuwgbrwbub +gwugrwruguwuugubbbrubbwbuwwwrgburrbbguwbgbgwrwb +grgugwwrgggbbbubububwuggrrgwruwrubwbrbbgwrwrggbuwrururrrrg +guwgggwrwrggbgwrrubrwburbuuububrbwrrrgurwugwggr +wuwwugwrbbuuburuururuwwrggbubwwugbuwugbburrwuwbubgbw +ugbggwbgurubbwrgwgggggwggrruubrgrwrgugwwgurrrbwbrwwur +wurubwrrbbgruurbbgurbbubuggubrrwwgbgwrwuuuwrgwbbrbw +rwwbruubgwrrugggwubgwwubwruuwggwrbwwbbrrwb +ugwgbguggggwwbwgwwuggurbwwgrbbuwurugwwrrrgugburruwb +brrrugbwrwbwwurbgbwwuugrbwbrgwgrgrbgrurwgwurgwruuguwbrurwu +rruwrrbgubguurwwugurrgrwbbuuwuburrbwwbbrggwuwr +uuwrburgruurrbuwwguurwbwwbwggrbubrwuuwuuwrbbg +gbbrrwgggbwwggwgwuurubrrurgwgwgbwgubwggrrbggug +wrwuggugbrwuuubbgrbugubbgurgrrburgwrbugrwb +bbbwgbuwbgrgggugrugwwwbwgrrbbbuubuguuugwburrrwrggwrrruwug +urbwwguugwrgbrrrrrrrbbwggrrubwgwugbbbuurugggrg +uugrugurbbruubwgbwbbbwubbrbbgwuuuwggwwwuubrrrwuwubrgrbrw +wbrugrwrwrrgugwugrrugugwubugrrrwbrwbwrggbwurrbgubgwbgbbgrwb +uwwbbubgrrrurgwrbgurugwbbrbbburggguugbwbrbgwbubuwbbgubgwg +rrbwbrbruwurwbwgggwrguwbbubuwuwurwubgwbwwgbubggwbbubbrbr +wwrwggbwwwrgubwrbwuuwbuuuwbrgwwrbrbrguruwrwbrrgrugb +wwbwrrubbbgwurbrbubwwbbbgbrbgbwbbuggrurbrwgwbubguurrwrwwb +rwurrgwuugrubggwbuubrbuwrggguwbgrbbgrgbbuwggbgwrbwgwbuuru +gwrrugbuurgrrwgbggwggguwwrrbgrbwwrrgwwbwubwbwrgbrgbgwwbgu +brrrwbururwwrwwrrgbwbubgbwgrgwwruuuwgugrwwrgbubru +uugbwguruwuwubburrgbbgbbrwrrbubuguugwgwwbw +gwburgbrwgwwubugrrrbuwugrbbwrrguwrbgbbgrggggbwuuwwgwgbww +rwwwbgwuubugurwbwururgbwbwwrwubgwuuruurbwbwgbwwbuwgg +bwwwbuwwrwgurbbwbguwwgwubwuwgwwubbwwwuwuuubbwr +urugrwggbbrburugwggbwbbuubbrbguuggwurgbrbbbgrbwuw +bgrbrbgbgwrrwgugbubbgbrurwrrgbwbbgrwrwbwwb +gbwubwgurggwbbgwwgbrrubguwgwwbrgwgrgwwwgwwbruwrwbuurwb +wuuwrwrbugruurrrrgwurguggbgwubugrugwwuguwwruuwbrrrwwruggb +ugrugbrrwuuwrwuguggwwgggubuwrrbwrugwwuugwbburrbrwb +wrrggbggbrgurbwguurugbwgrgwwgbwbgrbgwrbrwb +bugubbrwbuwugwwrwbgwugbuuubrwbugwrugggbwwrbgbwuurgw +bwrrwbrruuuugugggwgrgrwwrwwgwwgrbggwruwrwwwgrurwgggwbbw +gwwuwbuwwgwuurwwwgbruwuugruuwrgbbwugwbbwbguguw +uwrwwrurwwuwwwuwuubbbwbbrrwwbrrgbwbwggwgwruurrwb +rguuugbrbgrbwbbrwuuwwubwrrwggrwrgwwrgwuubwgbbwubbwbgbrruwu +gbgrgrwgbbbrwgubugwwuuwrrgbwbwgbwuwrugrbururbwrwrwbubrr +ruwrgurgguuurrggrurbuurubrbbguwbbrrbuuuwrgrwb +guurwgbwrbuurrrbugrbgbbrurbubbuugrgbwugbru +uggbgwrrgrrubgbbgwubwurgbbugububwrwbrgwbbbwwrwb +gwwgbbrrurbwwwrrrbruurbruggbrgwbgurbrwggwbrgurbbbwubbuw +wbgrwbuguguwrbbuurbubgubwgwwbrrrrbugurgggbbgb +buurgwggbbwgrrbruwuwruububuubrrbrrwrgbwbbwbwwururbgurbrrgrwb +rbgggbwrugrgwrwgwurggbrbgwgwgwwrbubbrwrbbuurugrrgwbrggbu +grrbbbwwguwbruwggwruwurrgrbgwubbubggwuugwubuwrrugurwb +rrbububbrrbbuwwuuwggbbwuwuwwrwgwwgwgrburbgrgrw +uuurugrbrrgwbrrggurrbubbuwguwuwgrurwbrbgwurwurw +rwubrwbuuuwbggrbwrwgwwrgrbrrbbwgrrwrwrrgbruggwwwgbbrwuuwrg +bburuwbugrggrwggrwbgbbuurwubuuugrbrrwgwgbrggrgggwbuuwbwbuw +wrbrbugwgrbuwrubwgwuwugbrgbwrwrgwururwrrrggrgurrwb +rggrbururgwuuwgbuwuwrruguugwbgubuwrubuwbrggbggbggrwb +gwurbruwrrgrrwbbwuwbgwrgwubbbuburrgbwrwrwb +urbrugbrwurgrgbrruwrbbrgwbrrbrwurbbbugwuugrwguwr +brrgurwwrguuubrggbggwwbgbgrrwwbburwuwrrwggbwubrrbggugubu +rwgwwuugbwrwrguwrrbrgwrurbwurrggwuwuwbgwgwwguurgrwb +guggggubguggwugbgbbwwgurubwugrbwgububbggbbrwb +wgwrguwggbugwwgrrrrwgwwwwrwwubgugwugbwgwggubwubrwb +grwwgbrwbubbwrwwwubugbgrubuuwbgurwurrugbwrgrrr +uugwwbuubggggruwugrurguwwwbrggggggrwwwrbrgugu +rgubgwbwurrguwgwburwubgrgbubbrbrruugrugbgrwwru +wbwwrubbbguggwbuugrgwguruuggurwggrrbruwbwrgbuw +rgugbrwuurrrrrurubrrgguuwbrrwruggubbbubgbwguurburggbrwb +rbuuggwwurwuuwgubgrbrruwrburugurwuubbburrguuruwr +rwurwrbbubgrwgggwwwbruuubwrwuwuwgrgbrgrgbugwrubrrbwbwbwrwb +gwrgbggrwrgbbbuuggbgrrgrrrruurbrwuugbubgbwur +rrurrwuuwuguuwbububrrwugbwuurbbgguwrwrrgrwwgbrggrburwg +ubruwgwbrubwrgbbrbbubggggwrggrgwbgggbgrburuwrbbrurgrgbbww +wrwgubgbwruugwubbggwugbgwwugwrbruuuwrwbbrrrru +rwubrrgbwrbgrbrwggugbbuugrguruwwwugrgurwb +wrgruuwrgguwwbrurbbugbrgruwrgrwggrbwwbwbgwrbrwubwubrwb +bggwugbrbwbgugwuwwurrwrrrwrgrguwuwurwguggwbrrbugrwr +ugubbwurburwrrbbbgwrbgwuwgbubrrgwgubrubrgrbb +gbwuggwruuuguurrwuurubrbwwbbwwuburgwgwurbbubg +uubwugrgburwubbbuururrwrwrgwurbwrrwurrubrwb +urbrwgwbuugbrwgbugggbbwwbuguuubbubwbguuubgbrrbububrru +rrbwwwbgrgwgurwwuwrbgwrwgrruwbgwbgugurwgrbugrbgbrbruw +ugrwbgrbrburugwbgugwugurrgwgrgwwrbgguwgrwrwb +wwbgbrgrwgggrbrugwwrwrbgubgrwguwbwubwwbgguggbbrgugbugrbbr +ubrwgwuwguwbwgguugrrbwuggwubbwwrrurbwruwbuw +gubrwwrbbrwwbuugrbwwugbgwwbbbugwrgbwbwwbwguggb +rurwgbbggugrwbubugrrwugrubuwwwwrwububgwwrwgwbr +wgbbrbbubgrrwwwgugugurbrubbuwbgwwwgwwgwrbwbw +ubgubwgwrwbuubgbbgrwbubugbbbrugrgwurubwgubguwugrrbu +gruuuwggwwwguwwguubggbguguuugwugwwgugwrwb +wrwbrgbgurwgbrbgurbbbggrbgwgubwbbggwrbwgbbu +bggubwbggbgrrrrggwbwbbgrguurrrggwbgurgrgwbuwbwurg +wuwbggrwwwbubrbwgrgrwgbrurggwwwubwwgwgbwuwwuguuwwgggbb +rwrugrubggrbururrwuwurbrwbuuggrbrbuugrwubbruggrbwuuru +wbrgggbwgrwwubbbguuuugrburubbrbrrrwubwgwguu +wrugrwruurrbwwwurggwbbwbuggrbwuruugwrburrwb +rburbbrwwrwgwbrubgwgwrwgrbwurgubuguwwwruuggbbuwwwggrwb +gwuugurgwwwrwwgbrbwwugwgurwbbbrwuwwwgrgbwbbgbbgruwgwwgwrb +rruwgbbwwrugugugrwubgrguguuwggbrrbrbubbwugurbgbubb +uuubwuburgrrwuugububuuwwrwrgbwbbgwgubwwgwgubrrbgbruggbu +wgrwuruuurwwbrwbwgrrwwrgurrbubwrwbgwrggbrrgugbuu +ugwbrgbbbwrgrgwbrguwrbrrgggbbuubgwbwgbgrwbrrwrrrgbrbgg +rgrggguuguwgbgrgrrgwrbbwbgurrrgwbwwguwbgggrbugugrbrurwb +bbwuwgrbbbbwrbrgbrgbbbburgruggrrrrbwrbbrwb +wbwuuwrruwggubggbgwbwwbggwbgbrrruggbwrrrbrwrb +wuubruggbruggbwbwuuugwrrwuwrgbwwbwuwwwrrgwrr +uwwgrbuubwbwbbrwburbrggburubwgguuwbwgbwburggwrgbrwb +ggbrubuwuurubruuubrbrgwuubguwbgbgwrrubrrrwb +rwgbbburwggwwgbbbrruuurbgrgbggrbgruuggbrgggg +rwwbwgwgwwbrbugbuuwbgggggwgrurbgrgwgwrgbbbuugbbgruwgwwwbg +rbwubbwuugwggrruuuugbruwwwwuuuuurgbgwwwgwbggwgbrurww +rwguwwrgugrbuwrwwbbugurrrwubruwugbrwubrwrgrbggbgr +ubbbugrbugrwgwggbwugwwbgwguubugbggbggrbuuwwbbbbbwr +gburuuwbrwrguwbrubgbwgruuwrwgbrwbrwwgwbgwggw +ggwwwguwgbuwrggbugurrrwwwrbrrbgurbbbgbruwrwwrbgrwwbuugrwb +rgbgrbrrubwuggruuwbgggwguuwwwrrrwuwrrgrubbbgrr +uwwgrrbugrrbwgggwuruwuuwggwbgwggwrbbuwbrrruubuguwugbrurwb +brwruwruwggrrubrwugbgbwwuggggruubrruugbgurrgwwugrurbrr +rgbbrrrbubrgbbbuuggruuurguubwgwgrwwgrbbwruwwb +rrbuuwgbuwwwbggrgbuurrbwwbwbwbrwwubuurrggrbg +urgbuwuwwugbrbguugbrbbggwggwgburgwgrwgurrbwwgrbbgw +uubrrugwggwgwbgbbwggwrrwbruwbrwuurgwwugrwgrwg +rgrguwguwrgwwgruggbwwbugbruubgurgrwuwrugbbggbuwrrggrwuug +uwubrubgbbwrgbgugwwwwwubwwubrburbbuurgwrrbwbubrbw +rgrbbwggrbgrrggrgbububggwggwwwwbrubguwgbuwbruwgugrgwrww +bbrwwrwgbgbgbrwwubbrgwuruwbrbubrrburuurwb +uuwgwgubwwbburwgrrbwgwrugrbwwgbggrurgwbuwru +uuggrgwuguuwwrbwrbuwrbrbgbuburuwwbbgbggbbugwwbu +bwbgwgwbrbbbwwbwrwgwbwgurggguwugrubrubrbrbuwwuugubru +uwuwrgwuubbruurbbbururrurrrbrwggbgbbgwrbuwubgbrrgwuurwb +bwgbbrgbbbbuugurgrburrrugbuubgbbwwwwgbuuwuggbgwguubb +uubwbuurbbwgbrgruwbugguguwbubbgrgbbgwbubggrrbwrwb +rrrguwbgwuwwbrrwrrwguwurbgbrburrwgrrburgwbbrruwwrrwbwrb +rruguburbgwgrgbguggggrugrgwbwwbwrbggwwgbruwuwrwwbubgburgr +rurgbwbugrbrgbgrurruwbubugubbgwuubgrwgrwwwgwbwrwbbwb +bbgbwggwgbbwbuugrrubbubgbrbrgubrugugrwbrwwbg +gwgugbburwwwwgbwwubwrwrwuurruuwuwwurugrrrgb +wwwrrrgruwrrrwuubwbrrurwbwrwrwbwggggrrbwuwggg +gbwrwguguggbwwrrbwgwwbwgbbbgwbuwuwrgwwrgbwuurb +guguuugbrbgruwbwbubwurrwggrubruwwggbwwubguub +uubbrubgrwwwuwrwgugbwbgurgrbbrugbrurguwrwwbbuguuuburwb +gubbuuuuubbwubgrwwguruggrbrgrrubuuuurrwrwb +uwwgbgrgrbrrgrguwgubuuwbwgguwbgurbwugbbrgguw +buwbgrggwwubrgrggbwurubgrbuuuwurrbuwurbbbbbrubgbrbuwwwrw +uwbrrbbwwruurgrrgrwruruwuubrgbrwwgwbugrbbrggrbwwbgrrwb +rbwgwbrguubbbugwguwrgrgbggbrruggrwubrwbgbwwuuwrrgwg +rbrbbgwggwuuburggwwrruruuruggwubruwwbrurubwbu +rbubuuurbwrugurggbwwbugbguuuuuwrubbguwrwb +bbwbubwrbuwgubguwrwrwgbgrrwwruurwwrbugrrurwb +bbuguurruwrrbguuuugwrguubwuubrbggrwubgugbwbwrrurugrugrwb +gbuuwurrbrwwrubgurbuubugrrbwubuurwuwwwgbbgbrwbrrrubggrwbgwb +grggrugrrbruuwbbbrrugbbbbuwbrwurrwgbwbuwrwb +bguurbwgwgbgbgrgrbbwgbbwubbwggrbubrwrbrubrbrgrwbburwb +grrrbrrwubuuggrgrurruuwwubwuuwubrrbburbrwwggrwgurgwgggwr +wbgubuuubwuwbrububrbwgrugrrbrrwbugguwwuuugu +rrgwgrguwruwgrwwrbgrgbbbbbwrgbugbggbrrwb +gwbrrgrruurwurburwbgrbggruuurbrbwubguwgrrburbgwwwu +bwwbugbruwrrguubruwbruuwrrwuwbruwgrwgwruwurgrbgurgruguwbg +brgrrbururwguwbburgurgrggbgubuwgruuuurbrrrrwugg +uwrbugwwrwuwgwwbuugbuurbwwbrwwrgrbggbgwwwrbrbwrrubbgrugw +uuggwbwrrwgrruwgggbggbgbubgwgbugwwrggrgbrgrururgugur +bwwwrugrrgbggbggbwubburrgubgwgwwrbwwgwbgurw +gburbuurwgbwgwwgggwbguwuwruububuwububwuwbgg +gbwggbgguwggbgwwrurwggbuburwrrgrbgbbuwuuuwrggwggwb +gbbwwwgbgwurgrbbwbgguwrwrggguwbugwbrgbwurgwuwgrrug +rgbugwrgugwbbbgggrwgwubbbwuurbrbrwbrgrwuurwgrg +ruwbuwurgwbuwrrrgwbrwrrruwwgggwugbwwrgruwgwubbgrwrrrwu +brrbwbbgwwwuururbrbuuwwwuguwwburbrurwuwgbwrbuubrbbww +rrrwrwugurubugbubbgwgrggwbbggbrugwbwrbggburgbrwr +ubrggrgbgwgruggrgrrwbruubwrrurubrbgwrwbggbrgbbrgwbbbr +ggrbbggrurbrbruwwugwrbrwrrbwgbrwwgubwrbrrgrbbwwwruwggww +wugbrbgwwwwrbugbwwrrburuwrbruruwuuuurbuwwwbgrgbrwb +bbgbgruurgbubburgwruwgrwuuubbwbwgugwbrbuuwwgurrurgwwrrb +wwburbbgbwurubrbrurwwgrwgubbgwbgrguuugurbwuwbuwuwuru +bwrgbuwrrrbubbwugbbrrgwgrbbbuguugrwbrurwrugguubbrubuggrwb +rgrwugwgbuuwubwrguuburuuuwuwbgguwuubggrrbugrbugwbgwwubwwbb +wbwrgurwrwrgggbbgggwwrbrbgurggubbbgrgbwbug +rbwbuwgurbbbgwuubwbgrwwubwbbwbgggwurbbbgbuu +wbburugwgrwwwgwwrwrbubrwuwrbgbwgbbwbrrbwbubbwbruubgrug +wrwggwgwwuuubbgrrwggrguubrgurrwuurubwurggwbrbbbugwuuwubwgu +bggrgbruwguurrurrbwuuwgugbrbwbuwwgwrgurggwburbbwgbuw +wwwbbugrrwwbrbwwgwububbuggrgrurggrwgrurruggbburwwgwurwb +rbrrwubgrwrbrbrggwwrurrwbwrurbwgbubggbrrrwwrwb +wuburwgwrwuwggbwwrgwwwugbwbggrurgbrurruwburuugwrwb +gwbwurbrbuurgwwbuuurrubbbrbwgruwuwuuuugwgbbb +wguwrbrbrgbbbggbggbgbgwgwbrggbggwguwurwwbbwbrrrrbwrwgrwb +wwwbruruubrurbugrrwwuburubbguwwrrbbwbbbrgbbubuwrurugr +brurrgggruwgrburwuggugrrbwbuuwbwuubgurwubruwrgwurbrwb +gwrruuwbrbwwbbbuwbwgrgubgggggwubgugubrbgugwuuburubugruwu +uubwruurruwwbrwburwggugggrguuurrgbbwbuggbwbuuurbgrwb +ggwrurbgrwgbbbruuurbbuubrwururgwwbuuwgrgwrgbubugrbrrgg +gubrurubwbrgrwwgggwwbwwguubbgggbggwbwwrguwrgwuggr +rwwugrbggburrrrbgwwgwgrurbbrguwrrbbbruwubgrgbrrwb +bgrrrbbgrguwgwwgurwwwrwugwwgrgrrwwguugbbruruuuwburbbuur +gwrgubrbubbbbrggrrbgwuwwbgbbuubugwgrwubgbbr +bwwwgwguwrrguruugwwbwgrgrwwbbwbrrgwbburuubbugbbrgggw +wburrbwwgubwbbwrbrgrwrbwugwuwwgwuugwwwgurgrguwuwgrgruu +wggrrrbgbgwurwrrwbrubbwbrwgrrwuugbrwwuwgruwwurw +rrbwggggurwrbwrrwubbrrurwwgbbrwuuwrruuwbrwb +ugwwwrbrbugbgrbuwbubwuggbwwugbgwrrwurrrwrrbgwrub +gbwgguuguuuugwgbuubggwuwbgrrbrbgwwbgugguruwrwggwwrwgwgu +wuubbbugwgrugububgrbgwugrurruwbwrbggwbgbbgurgrgbw +gwugwbbrwbwgwrwbrgurbwuwuugrrrbwwrburubgwrwwbbg +wwrgrrbubbuuwwbuwgrrwrrgggguwrrubbugrgwwbbug +gwubbruruuuwbbgrugbbbgbgwurwgwgwbwbwugggugbwuburwb +grgwgwrugugbgbwwbwubgwgbrgwguuwrrwwwugbgwgbgwruwwrwgwwrwb +rwrggugrwbbwgbubuwuwrrrgguguwrggbwbbwrrwb +rbgbwuwbwrbbwbbgugwgbbbwbrrrugwbrbubgruburwgwrrwb +wrrgbbbbwwuwgrgrrrbgurugbuwuubrgbgrbbbrrwb +ggrbwgwgrugrbrrwgugwguuwubuwwrugbbwwbbwuwggwuu +rwuuwwbugruwrruubuwuruuwubrugwrrwgruwrwrubbruruuwwg +rwrwuwbuwugbubgbbrguwgubuubbuwbwbgurubggbgubgwu +ugrrrruuwruuguwggubguwwwgrwuuwrwugwruwgrrbbw +ggwgwgurwrggrrwgwruuguwrugubrbuurwwruwbgrgrwb +rwbrrwuwbbbgbrrbwburwbbgbggwbbggwggugggrrrwbugg +ugbruwrruwgrbwuggrwwbruwwubrurrggbubgubugbgruugrrwb +wwwuubbwubwrubgubwrugrurbugguurburrrrwgguwwuggugurguwurwr +bwwbrruwbugbwguubbgggbrwbbrurgwbrwgggbgugbbgrbww +brgbwwubgubguwugwwuruubggwwuuwgwgwggbbwwbubbbggu +rbbrbbrurbuwwwguggguwgwggburbggubuwwbrbbubruuwwbgbru +rwuuugbwgwuugurbwrrwwbugbggbuururrbgwbwuuurggrurbgwbgggrrwb +bbgrgwwugwbwugggbugbgubgbgwbbuwrruurbwurwrgwurwb +bgwgguuwggrbbugbgwwwrwurrrbugrgguugrbgwbgwgwggruwwggwwgrwb +urrwggrubuwgbwggbbuwwbwbbwwrrgwrwbgurwurru +uwwbugruuuwggrrrrrbrrrbrurgwrrwwrrwbwbruwbbbuggwuu +wrururubbrugbggubggrbruuuubuubwuggggwwwubbwbbwbgbgbbgurwb +ubrubrbrgugurbuwrwuuwgbgwwrrwrrbbgwgbwruwrrrggggr +rbwguruwbgbgbbbbubbrrrugrruggurwwgrrrbrwb +rurgwubwbwgubwrbgguugrruururgwgbuwwurgugww +bwugrgruugguguwbgrbbbwuuwrrgwrrwrrubgrbrgbrggbww +rrgwbrwggbbgrggugurwgrgbrgwgbwrruwgwggwgrwuwrwbburwwbu +uurbwggwubwgwwguwbbgwwggugrrruggbgwbrrgwrr +grwbwbwrgrwrrubbbgwgrbbwrbgrurwrguwwwwggrbwbrwubbwrggr +gbuwbugrgubbrrbwwrbgwuwrwrbrbrwwbwbwrwuurrruurwb +ubrwurrrwwrbgwwgguubuwwgwbguwggurwbbgrugwbbrubug +rbugbwbguwggwwrwbbgwwuuruwwbrububbrurbubrgwwrbugugwbubggru +uuguruubgwwrrrwwugwurbgwbubrgrurrgwuuuuuggwbgrwbugu +gwwbugrrburuuwbwwbbugguubuuwwbuwbuwgubuwbruuugrgurgbuuubbw +ugwwgubwubbrubbrugbbbrurwgrgubgubugururgwgwwburgr +uggrgbruwrrbwrwgrruurwgguguwrwrwgbrggububgwrbguwbugwwguw +gruruurbgwrggggbrrugrbrgubrurrgugbbgrbgrwwugbrubw +ruggggwgbubuuubbgbburuwwgbbugrwubbrubgbrgbggrgubrb +wrguwbuwbrrbbbwbwrbgrrubwggbuwrrrgugbbrwbrguugrbrwgbrgg +rrgrwbgurgbbrgrbgugwrgrruruuugrgrrbbrrrwb +uuggrwugruuggrurbwggwgrwbwrgrbbbgbwbubugwg +rwwwrwrrbgrrgrgrwrgururgwrwburubwgrguwbuwwrrugugbbrwb +bbgguuwwuwbbuuwgwgurrwrwgbbrgurwgbrrbwrwbrwrbuggbwwrwrbuw +wrwwbgwgwruwrubbwrrwurwubgrrwrggbbgbbbgwwbgwggrbbwbrbbgbg +wgggrbrbwuwgubrguubgrguwrwuuuwbwwubuuwgbgrgbruubb +uggrwrwwbguwurbbburrgwgwururgwrgruwbwuubugubrurbuubrwrbuurwb +wrugguwugrgbuuwrbugrubrggggwwrbuwuurbuwruwwuww +wugwrwbbbrbbbrggrwbuwrwgwwbbrbwwgbruwugwruggggbw +uguurbwgwbbuuguwrwguubuugwurbgwrrbgbrrguwuwug +uwwuubgrrwgwrbbrgwwwbwugbbggbuuuurgubgwugrbgurbbwug +gwuwgwrrwgrwbwggugrbrggubbuburbbbgugrbuwrurrwbrwgggr +wwgrugrwuguwbruwugguurguwrugubwubrbgwwbrwbrwgbwrgwrruwurbr +gwgburrgwuurwburubuuwwwwgbbwbggwwgwuugrgwrbwrrw +rbgwgbbruuwwugugugrubbuugggwgubrguwwgrwgrrrgwbggbuguwu +rwwrrbrggruuubgruburgwubrrguwbwwgrgbwggruggwg +burgwuwugwbbbgrwgrubguuwugrbrbguubwwwrbbrwbrrugubuwwguuurw +gburugwwrwrrugugbbubrwrburrugrubbrurbrwwgrbbww +wuubbrbubbrbuubuwuwwgbuubugbrrgrugwrgwgwwwwwwwuurb +wuwgrrgwbbgrurbrgrrurbbgwuggggbgwuurwggurrwb +grbbggbgrugwbuubruwrgbwrbbwuugwrrugwrggbrurbwrrurbrwb +uuubbgrbwrurbwbuggbbgrwuguuwubrwgbgrrwurubbrwgggwbggrwb +urgwrgbbuwwrbrrrbbrwgwugwwrgrugwbgbbgrwb +wgbrwggguwwruuwwggwwrwbbbugbruwugbbbuuuwwgurrrbwwbubbwgburwb +buggbbgbgbbwwwurwrwrwbruwgwbbgrruwwgruubgwwwuggur +rbgbwubgbbgrurwwguwubrwubbuuggrugurubwuwgrwgubgugwguugrgw +urbbgurbubwwgbbwburrrbgrbwwubggwugbrrbugwrbgubrb +wbrurrrbgrgbgbwwwrwurrwbuuwrwwgrburwrrbgruggubgrguwgbwur +uuururbwrrwgwbwwrwwgwgruwurrbugwrgburgwrwrbrbw +rrwrurbrgubuguwurwgururugbgrbgubrgrgggurggugurgrbbuwgw +rrwuwrugwwbbubbrbrwrbwbwubgubgwwgrbugwgrugbgb +grwgbggwwwgwrwgruggbbgwrgwubgwrwguwgrguuuuuwgbbubgguugg +rbuurugruurwuwgburwgwgugrwgwwgwwgbrrugguwruw +urubgguwggurwbgrwwbubguwggbbbgrugwgrbgbrwgwrrbrbbrguub +wrbrurgwbubbwbbrwbbrugwgbubrwbgrgwguwuugbgugrgbg +rwuruwurgugggrgrrrugrurgggrrubguurbububugugbwurwuwwug +uubwuwrwwgrbbwgrrgubwgguggbrrwuruuwuubgrwuggbgruggbrr +uurbbgrgbrgbbgrgrbwwugbrrubgubgurrbbrrrbubr +guguggbgggwbbwrwrbwbgggrurburgurgbbwwgruru +wbrrbbuurwruuuwugrgubwuuurbrwurwurbwwbwububwbbbrwb +ubbrwgggwrwbwwwrbgbrrrbrubwrgurgbbgbuuuuugbwgwgrwuwwbuu +bwrbggbgrbbgubbwrrrubgwburgrgrrruurwuuggbguwbwwurrwrwb +gwuguuwbruwuuggrbrrbuwurbggbbwguwwgwwbgrurrwb +rrggbbgurwbbbgurbgbggubgrruuwbrbwgbrguwubbggguwbgruwwrwb +uwugbwwwrbbruubwbrgbuuubbgrubururrbrrgwwbgrwgbrwruwrwb +bwurruruwuguwrbuuggbwbrubbrwuwurbgwwbrgurgwuggr +ruuuwugrrurbwrgrbgurbrwbrbubbwwuuwwuwwuugugbbgrbggwr +uugrgwgwwgrbrubbugbgbrguwbbwwgrubbbgbgbruwugrrwb +brbgbwwwbbuuugrwrugbwurrgggbwwuubwruuburrbrr +wrwrgwwrwrugrwrrurbuuwgurgbrgbrwwbwrggwbrbbuugrbbwugrwb +rugbbggbuggwgwwuruwrwbggwgburuubuwugbggbrbgubrwgr +ubrrwuwguwwrbgwbbbrrgrggrgrgwgbrugubuwwwwuwguuurwb +ruguguwuruubbwwwgwgrrrwrwwuuuruuuwuwgwubwwrwu +brggrwrbrwwwuwwbwrgwbwurbuwwrbrgrrugbwugrbguuwb +gwuugwuuuggrgurbbwggrubbwuurruuwrggrggurgrrwrrgbrb +ugwggbgbbrrwgwrbuggurrbuugbwrurbbuggubwbgwgwuwgwrrrwubuwurwb +wwuugrrggrbrrgwuuugbwbwrurrbuwwwubwrbrggubbubbgrrr +ggwuubgurubrurbwgrwwuggururbrgruwgruugugrbwgrbubrbrb +rwggguwwubburgwwuurrurrrgwgbrgbbbrruguwbwugguuurr +rrbwbrrwbuwwbwrrbbbwwubuwgurrguwugguwrbuwuubbwuwrbggbuu +grgrbggrburrbgwbwbuugugbburbrwrrrguuwbugggugrrrgrwrwb +buubrrggburbggwgwgrbgurwbwwwubbwbgbwwuwbwwrwb +wguuurrggwguurburgugugbrwrgbwrrwbgrugwuugbwgbbuubggrugbub +wbwgruuugggrrubbwrwwubugguguwwguubwurwgwwrbgubwrgbbubrwb +ruwrggugbbbbgurwggruuggwwggrwwrwbbbrwguuuuug +bggwwuwgwbuguwggrgurbwugbbbuurwgwuggubgrwbwwwbwgrrbuug +rrgwugbuwugubuuggbrwwguurwuwugwuuuubgrwrrwrbgrgwbuggwr +grguwrrurgbwbwrgwwwrggrwbwgbuwbbbwbggrbrwbbrwb +uubgbrgrwbbgwrbrwwgbgburbuurbubbguuwbgbuuwburbubggguug +gwbgwrbwwwubuwwrwbbwrrrgwuwbrubwbgggubugbwwgggburrbugrgu +bwgwguugggbrrbuggwggwgbrbugurbwwuuwwwugbbubbrwb +rwgwbgbwwuwrbgbgwbrwuwruuubbrbwwuruwbwrbrwrwrgru +wwrbwwwurggbgggugwuggubbbwgrrwrbwwuugwrbubwgrbgrrr +ubrubggrgguugburwgbbrwurbrburuuwwrrbrrwwbgwbgggwugurugwwrwb +gbggrubrgubgubbwwwwuwrbburrgrwbrgrwbrwguuwwuwrgguwrwb +bbwgbrwggwrbwugbgubugwwuwwggbgubwubgggwwrbgrwrwwgb +uubrbgbbguugrruurbrwbbuuuubbwwuruuuwbbgwbgrbwrrrgb +bbbwugurwrwurgbuuugrrruubrwrgwguwubrurgburbgrrwrr +gggwwgwubwwwrrbubuuuggrgrgburugbgbuurbgrugrwrgwgruu +burugbguwbuwgubugubbburrgrrwuruubbrbrwwbwrburubwubbb +wrwbwrbggggbgbruwwwubuurwbgwgrrgrwubwrrbbggrgbwbwbbbuwbbrwb +uuurggrbbwubuwbwbwrgrbbwgrgugbrruguuugrgrubb +buuugbwbbgwrgruuwrbwbgwbbrgwbrgrwruwwwgwruggrb +rgwrrguwuugbgrbubgbuburgrbuuwwgbbwgurrwwubrgwguw +ruuwwurgwurgbuwurruurbbbbugrubrrgwrgurgubbgbbwgugrwb +urrwrwgugrrbbrgggrgubwbrwwgbgururbwruguwwrgburg +rugrggruuubgguuwwwbgbgbbgugrwgurrruubrgburgrrwb +ubwwrugbguwrrrbwuwggrwrwrububurbgruwbgwrbbbgrrrgggwr +wuggwbgwbbbwugrbbwwubgrbwrgrgrrgwuuwgrwgwwurug +bgwwbbbwrrwugwgwwrruggrbwuwbwwgrwrgrrguwgrurwgurgggrrwb +guwrwubwrwwwgugguuwwurbgugbuwrrbwrguuwgbwbbgbgurrgwbbu +gwugguubwruguubuguguugbuuugrrwrrrurrbwgrbwgwugburuu +brwgwrbbgwurgrugggrrbbwruugrgburrwggwguwuuwrrbw +bwbugwurgbgurwwrugurgbbgbuurugggwugubrwb +bbbuuubggggggwrbrgbbwruwuuwugurbubgwgrrguugbwuggrubrwbwgr +wgrrrurugrbgwbgbbrrgurrgwrurrwwwbgrguuggrgurwww +gubbrbwurgwwbbggurwgbgrwrwbrugrwrburgrrugb +uubuubgguwwbrrwwwwubgwbbwbwwwwugguguwburgbrbbbg +ubgrwugugrruwuurrwguggwuwbrwbwrugruuuwrugwwuwrubuugbrwrrrwb +wrgwguugruurububuurwurrwuggrrubbrrrgugwuugwurgrg +bwubggubrrburbrbwggrurwrbwbgbbgwggubggbubrububrwb +urugwwbubbrrwwwrbrwuwbwurwgrurbwbrurbrwrgrruburwb +rruubgwwwgrwrggubgubwrbbgwgbguruwwgrgburgwrg +rgugrgrbbrgwbguwgguguwrrubgwwgwgwuwubwbwrggbwuuuwrrbwgwu +gwuwbwuwwbwwggbbgrgwugwrgugruuubgwguwwgbbrwb +bbwuguwwwuguuuuurrbbububurbwruuubugbgrbuwgrururwb +bbbugrrrbrgburgwuuruwrbwgwrgwgrugbrgububrbwwgrbrgbuwbgguu +bubwuuwwuwbggrwwubruwbubbwwgwrubuguwbuuwugwrbbugr +uwrgubbrrgguggubuuwrrrwrrurbuubrgbbbwgrwub +wbbguubbbbguwuwbwrgwwubwrurgwurbrrwurrbgrbbburw +rgbwugbubggbrbwgbuuubrwgbrruwggbbggbbuggwg +rgrugbgrwbwgwuwrbggrwuburrbguwguguuugwgubrgruwwbw +uuuruwuurbwubrwgwuuwbugrrwggbwwubbugwgubbrwgwwwugbwwrwb +brgbguwuwggbbwrbggggbrbubbwbrwbbgwuubbbbgwrgwgbbwu +uggrgrubuuuwruuurbuwwugbwwgwwguubuggubwwugrrwbggwrgubrbwrw +wbburbgbbrbbggrgrrurwwgurbubwuurwwgwbwrgbguuuwrubwwubuu +buwbgbrwgbubbrbrgwuwbgbrwburgbbrwgguwwbwgbwbgbww +gurwggwurgwbbubbgbgruggbrbubuwbruwwrwguggrbbbrggwgbrgbgu +wbwwwbbbwgruuuwubbrrgbbggwbrgwwbgurbbwgwgwgrbggwrugrugggbrwb +bbgrwgruggrwwurwwrggbruugbbrgwggrrugrwuuugbrrwb +wwbugbwuguwgbrwrwgrrbuwgwuwgwrbbbubwwgbrguwuw +ugwbgbwrrgbwrrrbrwwguggruwugwwurwrrbgwubbwrggugbruuw +bbbruuwuwwurrwbuwbuguuggurgbgbruruwurgbgbgrrwb +bggwgrggrrugwwbuwgbrbbgwbbuwwuwbrgbwbggwbbgggugwggrwbbur +uuurruuuuugrbuwwgrbwwuuwbruggggbgrbuuggbuuuwgrrb +gbgrgubggbgrgguuwbwbrwbggwurgbwwwbrubwgwrggrbwurggrwrrr +ggbrbrbguwguuugubruggbgwbbuwwrbuuugbuuwgww +wurrbururbgrbrgwggwggrgrgrgbgrrgbbwwgbrgwururwb +uubugrgbrubuggrggrbwbbbruwbrrwugugrurwbgwwwbubgrggr +rgwwbwgbwugugrwrrwubrwbgwuwuruggbguubbwbugururu +wbuwrbggrrwbgbrbwwwbbgwbwrrggubrubbwbubrgwrwburbgb +gbwuruuwuwwwbggurugrwgwubbgbwwwurgwbruwgbgrbwrgurwb +gwururwwugrrubbruwbuwrbgwrbruugbuuugggwbubwubb +wgrgrrgwwruugbrrrbwwrwrrgbguwwgwrbgwuuwbgwuwrugg +ugurwrbgrbubwbbgrwgrwrbgwbwuwubgrbuwwrubrggwuguwbgbu +ugrrburuwwrrwgrugbruwgwbbubrbuwbwwruuurgbuwwgwgbwwbuburwb +wurugurbrbubbbbburuubrbrrbwubguwggwubbrbrbrgurrbwwwuggwg +bwrburggbggbbgbuguwbgwwbbbubugwguwbbgbgwbg +gbwrbgbgbrugbbguruuwgurwwruggggbuburbgwwrwb +rubrgwubrrrrrwbwbrurbwwggrrburrugrrubwbbguwbbgrwwrbburrwbr +wgbuurbrrbgrugwgubuwbgurrwwuwgrbrgrbgwrwwbrururuuwrrrwb +grwuuggwugwgrbggggbwbgwububwrgwgburrugurbugurrrwrwrububrwb +bbggugurwurrgggrrbbrurubbwbuwbbwwbrwgrrrubrgur +gwwwugwuguubuuwgbgruruwguugrbbwgbbwwgrgrwwrrrrrbuwbbwburwb