<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Scottie Enriquez Blog</title>
        <link>https://your-docusaurus-site.example.com/blog</link>
        <description>Scottie Enriquez Blog</description>
        <lastBuildDate>Sun, 01 Feb 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Measuring the Impact of Gambling Affiliates in My Social Media]]></title>
            <link>https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker</link>
            <guid>https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker</guid>
            <pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Building a Chrome extension to block and track market prediction affiliate accounts]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-rise-of-speculative-wealth-traps">The Rise of Speculative Wealth Traps<a href="https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker#the-rise-of-speculative-wealth-traps" class="hash-link" aria-label="Direct link to The Rise of Speculative Wealth Traps" title="Direct link to The Rise of Speculative Wealth Traps" translate="no">​</a></h2>
<p>Before diving into this post, I want to clarify my specific beliefs regarding sports betting and prediction markets. In
a vacuum, I have no moral qualms with the principle of gambling. I’ve certainly laid down some sports bets while in Las
Vegas. That said, I do not play daily fantasy sports (DFS) or engage in any sort of online betting or prediction
markets. Mirroring many of my thoughts regarding social media, I personally feel that unfettered online access to the
dopamine hits of gambling is deeply unhealthy for the human psyche. In addition, I believe that the potential for sudden
personal wealth via highly speculative risks (much like cryptocurrencies) attracts so many willing participants due to
the rapidly vanishing middle class and the increasing scarcity of quality job opportunities. As the already massive
global wealth inequality continues to widen, I view these as yet another transfer of capital from the middle and lower
classes back to corporations and executives. As a diehard sports fan, I am also profoundly disappointed at how
intertwined sports media and betting have become. People today simply cannot watch any sports coverage without being
bombarded with online betting ads. In fact, I fear that new sports fans are now unable to distinguish between betting
and the sports themselves. Kids and teenagers today only know betting to be woven into the very fabric of sports.</p>
<p>Then came the prediction markets. Let’s start with the definition from Wikipedia:</p>
<blockquote>
<p>Prediction markets, also known as betting markets, information markets, decision markets, idea futures, or event
derivatives, are open markets that enable the prediction of specific outcomes using financial incentives (gambling on
real-world events). They are exchange-traded markets established for trading bets in the outcome of various events.</p>
</blockquote>
<p>Think about why sports are so often the target of betting. It’s a controlled environment with clearly established rules.
Each player and coach has their own incentives to perform to the best of their ability, regardless of circumstances. The
leagues themselves have vested interests in ensuring that the games are refereed and scored fairly in order to maintain
public trust that these are competitions rather than scripted entertainment. Even with these guardrails and incentives,
there have been several cases recently of players engaging in game manipulation across
the <a href="https://www.espn.com/mens-college-basketball/story/_/id/47619154/many-college-players-20-charged-point-shaving-scheme" target="_blank" rel="noopener noreferrer" class="">NCAA</a>,
<a href="https://www.espn.com/nba/story/_/id/47757702/blakeney-nba-gambling-indictment" target="_blank" rel="noopener noreferrer" class="">NBA</a>,
and <a href="https://www.espn.com/mlb/story/_/id/47028214/rob-manfred-addresses-mlb-next-steps-betting-scandal" target="_blank" rel="noopener noreferrer" class="">MLB</a>. Now, throw
out virtually any guardrails. Add in the fact that folks can now bet on damn near anything.</p>
<p>On January 3rd, 2026, the United States illegally invaded Venezuela
after <a href="https://www.aljazeera.com/news/2026/1/13/us-faces-war-crime-allegation-for-disguising-aircraft-in-drug-boat-attack" target="_blank" rel="noopener noreferrer" class="">committing various war crimes</a>
throughout the
region in the months prior. The target of Operation Absolute Resolve (other than Venezuela’s oil) was Nicolás Maduro,
the leader at the time. While this news sent shockwaves around the
world, <a href="https://www.npr.org/2026/01/05/nx-s1-5667232/polymarket-maduro-bet-insider-trading" target="_blank" rel="noopener noreferrer" class="">a story about prediction markets may have been
lost in the mix for some</a>. Someone,
almost certainly with inside information, created a Polymarket account in order to
bet on real-world events. Specifically, they bet on Maduro leaving office, which had odds of approximately 7% at the
time. The user pocketed over $436,000. Real-world insider trading with classified military intelligence.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-common-person-will-not-win">The Common Person Will Not Win<a href="https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker#the-common-person-will-not-win" class="hash-link" aria-label="Direct link to The Common Person Will Not Win" title="Direct link to The Common Person Will Not Win" translate="no">​</a></h2>
<p>While this is by far the most public example, it shows just how rigged the system is. Polymarket and Kalshi, two of the
largest players in the predictive market space, are not who you are betting against. Rather than a traditional betting
model where the customer bets against the house, these two simply facilitate the bets and take a cut of each. As such,
they have no incentive to prevent insider trading unless it decreases trade volume (i.e., their revenue). In fact,
Shayne Coplan (Polymarket CEO) said the following
in <a href="https://youtu.be/ZA5bY4K9XPs?si=WLPbMdQJNNcg05p8&amp;t=369" target="_blank" rel="noopener noreferrer" class="">a 60 Minutes interview</a>:</p>
<blockquote>
<p>I think that people going and having an edge to the market is a good thing. Obviously, you need to curate them, and
you need to be really clear and stringent on where the line is drawn...</p>
</blockquote>
<p>Aside from this being virtually impossible to enforce, this clearly spells out the game. If you have insider information
about world events, you are almost certainly wealthy already. Generally speaking, the average person is not high enough
in their
company's org chart to obtain sufficient information to commit insider trading. This leaves two winners and one loser in
the predictive market game.
Prediction market companies derive revenue from trades with no risk to themselves. The insiders have a significantly
higher chance
of winning than outsiders. This leaves the common person to foot the bill. Their money is then funneled to the elite and
corporations. Game over, sucker.</p>
<p>If you’re hoping for regulatory oversight, you will likely be disappointed. Donald Trump Jr. is <a href="https://www.nytimes.com/2026/01/15/us/politics/donald-trump-jr-prediction-markets.html" target="_blank" rel="noopener noreferrer" class="">a paid advisor for both
Polymarket and Kalshi</a>. Ignoring
the obvious conflicts of interest (as well as the other opportunities that the Trump
family has capitalized on
to <a href="https://www.nytimes.com/interactive/2026/01/20/opinion/editorials/trump-wealth-crypto-graft.html" target="_blank" rel="noopener noreferrer" class="">profit at least $1.4 billion from the presidency</a>),
the Republican administration has yet to
show any initiative in actually regulating these industries.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-impossibility-of-avoiding-gambling-in-modern-life">The Impossibility of Avoiding Gambling in Modern Life<a href="https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker#the-impossibility-of-avoiding-gambling-in-modern-life" class="hash-link" aria-label="Direct link to The Impossibility of Avoiding Gambling in Modern Life" title="Direct link to The Impossibility of Avoiding Gambling in Modern Life" translate="no">​</a></h2>
<p>With all this context, you might think that one could just avoid sports betting and gambling markets altogether. Believe
me, I’ve tried. Even outside the digital realm, I walk past a giant Polymarket ad every single day as I walk around my
neighborhood in downtown Los Angeles.</p>
<p><img decoding="async" loading="lazy" alt="Polymarket" src="https://your-docusaurus-site.example.com/assets/images/polymarket-f62a39563ee0f15b919b0f6016dbef3b.jpg" width="5296" height="3972" class="img_ev3q"></p>
<p>While walking past this poster one day, I thought about all the Twitter accounts in my feed that had suddenly become
affiliates of Kalshi or Polymarket, noted by the respective company logo next to their username. I still haven't been
able to figure out exactly what being an affiliate means or what benefits prediction market companies offer to these
accounts. I even reached out to a few via DM for more information, but none responded. It’s no secret that I’m a Los
Angeles Lakers fan, so here’s an example of an account that I do not follow but often appears in my feed:</p>
<p><img decoding="async" loading="lazy" alt="Lakers Empire" src="https://your-docusaurus-site.example.com/assets/images/lakers-empire-b9cc3f92d5e7aa1f277117f75cfab8cd.png" width="596" height="567" class="img_ev3q"></p>
<p>A simple idea came to mind. What if I could measure just how much of my feed are affiliates of gambling
companies? The experiment begins.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-plan-and-implementation">The Plan and Implementation<a href="https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker#the-plan-and-implementation" class="hash-link" aria-label="Direct link to The Plan and Implementation" title="Direct link to The Plan and Implementation" translate="no">​</a></h2>
<ul>
<li class="">Since Elon Musk ruined Twitter, I’ve noticed that API call limits are much stricter</li>
<li class="">I have no interest in paying money to Twitter, so capturing data client-side (i.e., via the web browser) made a lot of
sense</li>
<li class="">Blocking accounts would impact my algorithm</li>
<li class="">However, simply hiding this type of content via CSS would allow me to observe how often it appears in my feed in a
controlled way, without having to physically see the actual content</li>
<li class="">I had never taken the time to build a Chrome extension, so it seemed like some fun JavaScript hacking</li>
</ul>
<p>The first steps were to parse the HTML from Twitter and figure out a clever way to determine if an account is an
affiliate of one of the gambling companies. Surprisingly, this took a bit of research. One might think that there is
some obvious text indicating the affiliate company. The best way that I found was to parse the URL for the affiliate
image (i.e., the little picture with Kalshi or whichever gambling company). I noticed that the URL contained the
gambling affiliate's <a href="https://docs.x.com/fundamentals/x-ids" target="_blank" rel="noopener noreferrer" class="">Snowflake ID</a>.
After reviewing several of the most prominent affiliations, I built
a simple mapping.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">content.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// far from a complete list</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// these are only the ones that I detected in my feed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BLOCKED_AFFILIATE_BADGE_IDS</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">'1998108505408999424'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Kalshi'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">'2000660110239023106'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Kalshi'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">'1994986527341113344'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Polymarket'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">'2005664281002491904'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Polymarket'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">'1961093049913851904'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ProphetX'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">'1954932272378925056'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'FanDuel'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">'1996078471097761792'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Onyx'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">'2007116898677243904'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Underdog'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>With this mapping, each tweet can be easily categorized by parsing the HTML using JavaScript.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">content.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">processTweets</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> tweets </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">querySelectorAll</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'article[data-testid="tweet"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tweets</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">tweet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> container </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tweet</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">parentElement</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">container</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">container</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">style</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">display</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'none'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">tweet</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dataset</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">scanned</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      tweet</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dataset</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">scanned</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'true'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// function to count total Tweets scanned</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">incrementScannedCount</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> affiliate </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getAffiliateType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tweet</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">affiliate</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> userArea </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tweet</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">querySelector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'[data-testid="User-Name"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> nameLink </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> userArea </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> userArea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">querySelector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'a'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> username </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> nameLink </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> nameLink</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">textContent</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'unknown'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> tweetText </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tweet</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">querySelector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'[data-testid="tweetText"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> body </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tweetText </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> tweetText</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">textContent</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">substring</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'no text'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      container</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">style</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">display</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'none'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">tweet</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dataset</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">blocked</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        tweet</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dataset</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">blocked</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'true'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// track stats in local storage</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">updateBlockedStats</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">username</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> affiliate</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>There’s a bit more code for the UI and storage logic, but you can find the complete
repository <a href="https://github.com/scottenriquez/market-prediction-blocker-chrome-extension" target="_blank" rel="noopener noreferrer" class="">here</a>. I rarely write
JavaScript these days, so I’d hardly consider this my software magnum opus. There’s probably some edge cases remaining,
and I slapped this together over some coffee on a Saturday morning. Pull requests are welcome. Here's the extension in
action:</p>
<p><img decoding="async" loading="lazy" alt="Extension" src="https://your-docusaurus-site.example.com/assets/images/extension-0755f77c92d8c4e7c5e069601a1cd049.gif" width="640" height="406" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-results">The Results<a href="https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker#the-results" class="hash-link" aria-label="Direct link to The Results" title="Direct link to The Results" translate="no">​</a></h2>
<p>As mentioned above, I intentionally do not follow any account that is an affiliate of Polymarket, Kalshi, or any
gambling company. Given the opacity of any recommendation algorithm, I can’t explain or reproduce exactly how or why
certain accounts appear in my feed. This was far from a perfect experiment, but the directional results were still
surprising. Below is the breakdown (with <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>2200</mn></mrow><annotation encoding="application/x-tex">n=2200</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">2200</span></span></span></span> tweets):</p>
<div style="max-width:680px;margin:0 auto"><svg style="height:100%;width:100%;margin-right:0px;margin-left:0px" viewBox="0 0 480 480"><g class="pie-area" transform="translate(240, 240)"></g></svg></div>
<p>Of the affiliates, Kalshi and Polymarket had the lion's share of influence on my feed:</p>
<div style="max-width:680px;margin:0 auto"><svg style="height:100%;width:100%;margin-right:0px;margin-left:0px" viewBox="0 0 480 480"><g class="pie-area" transform="translate(240, 240)"></g></svg></div>
<p>Obviously, everyone’s feed is very different. Mine centers on sports and politics, which now seem more geared toward
gambling, unfortunately. In addition, many of these accounts tweet frequently, especially during live games, trade
rumors, and major world news. For example, during testing today, several of these accounts tweeted about the impending
NBA trade deadline, Austin Reaves’ injury, the Lakers/Knicks game on national television, and the Grammys. Even with all
the caveats, there is no denying the web of influence that these companies have in social media. While it is certainly
not the case that these accounts are constantly spewing gambling ads, there seems to be something much larger at play as
these companies continue to prey on people through constant marketing, addictive products, and promising the hope of making
money.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-yourself">Try It Yourself<a href="https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker#try-it-yourself" class="hash-link" aria-label="Direct link to Try It Yourself" title="Direct link to Try It Yourself" translate="no">​</a></h2>
<p>As mentioned, this code is available under MIT
on <a href="https://github.com/scottenriquez/market-prediction-blocker-chrome-extension" target="_blank" rel="noopener noreferrer" class="">GitHub</a>. At this time, I have no plans
to publish in the Chrome Web
Store due to my unfamiliarity with the rules and requirements. That said, it’s straightforward to install extensions
manually:</p>
<ul>
<li class="">Navigate to <code>chrome://extensions/</code></li>
<li class="">Enable developer mode</li>
<li class="">Click the button to load the unpacked extension</li>
<li class="">Select the directory where you cloned the GitHub repository (specifically where the <code>manifest.json</code> file resides)</li>
<li class="">Go to Twitter</li>
<li class="">Scroll through some content</li>
<li class="">Open the extension to view the UI</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="disclaimer">Disclaimer<a href="https://your-docusaurus-site.example.com/blog/a-market-prediction-affiliate-blocker#disclaimer" class="hash-link" aria-label="Direct link to Disclaimer" title="Direct link to Disclaimer" translate="no">​</a></h2>
<p>The opinions and views expressed here are my own and not those of my employer or school.</p>]]></content:encoded>
            <category>Programming</category>
            <category>Economics</category>
        </item>
        <item>
            <title><![CDATA[An Open Letter to the University of Texas at Austin]]></title>
            <link>https://your-docusaurus-site.example.com/blog/an-open-letter-to-ut-austin</link>
            <guid>https://your-docusaurus-site.example.com/blog/an-open-letter-to-ut-austin</guid>
            <pubDate>Sat, 18 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A plea to reject the Compact]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-hill-worth-dying-on">A Hill Worth Dying On<a href="https://your-docusaurus-site.example.com/blog/an-open-letter-to-ut-austin#a-hill-worth-dying-on" class="hash-link" aria-label="Direct link to A Hill Worth Dying On" title="Direct link to A Hill Worth Dying On" translate="no">​</a></h2>
<p>I am living proof of the American Dream, though I fear that my story is becoming less and less common. I was born and raised in Victoria, Texas, a city of 65,534 as of the 2020 census. In this blue-collar town, I grew up in a working-class home. My father is one of 14 children to immigrant parents and spent the vast majority of his life working in the brutal oilfield elements to provide for his family. My mother, also the child of an immigrant, worked as a substitute teacher. They often reminded me to pursue what my father called an 'office job,' which, in hindsight, represents socioeconomic betterment. Although I have now worked in the technology industry for 13 years, being a software engineer wasn't a vocation that I even knew existed when I was growing up. I was fortunate enough to take a Java programming class in 2004, which radically altered the path of my life. So much so that I spent four years volunteering by teaching AP computer science at various high schools in Houston from 2018 to 2022 to pay this forward. Education is core to my beliefs and identity, and in many ways, that started at the University of Texas at Austin.</p>
<p>DEI is core to the American Dream. Socioeconomic and racial imbalances must be countered for the American Dream to be attainable for everyone. I likely would not have been accepted to the university without the Top 10% Rule (<a href="https://en.wikipedia.org/wiki/Texas_House_Bill_588" target="_blank" rel="noopener noreferrer" class="">Texas House Bill 588</a>). While admission alone did not provide equity in the university experience, it allowed me to demonstrate that I belonged there, despite traditional socioeconomic barriers to higher education, such as the SAT, which naturally favors high-income families with access to private tutors. The Trump Administration states the following in its Compact for Academic Excellence in Higher Education proposal:</p>
<blockquote>
<p>"Treating certain groups as categorically incapable of performing — and therefore in need of preferential treatment — perpetuates a dangerous badge of inferiority, destroys confidence, and does nothing to identify or solve the most pressing challenges for aspiring young people... Institutions shall have all undergraduate applicants take a widely-used standardized test (i.e., SAT, ACT, or CLT) or program-specific measures of accomplishment in the case of music, art, and other specialized programs of study."</p>
</blockquote>
<p>I write to implore the University of Texas at Austin to reject this Compact. Not only would joining effectively end the opportunity for folks of a variety of ethnic and socioeconomic backgrounds to access a premier education, but it would also rapidly advance the intellectual exodus fueled by authoritarian-like government overreach and rampant American xenophobia. I do agree that "American higher education is the envy of the world." This Compact would tarnish that brilliant reputation through financial coercion. As a proud Texas alumnus and current graduate student at the University of Southern California, I urge the University of Texas to refuse to bend the knee to the Trump Administration, just like the five other schools (MIT, Brown, Penn, Virginia, and USC) have at the time of writing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ye-shall-know-the-truth-and-the-truth-shall-set-you-free">Ye Shall Know the Truth and the Truth Shall Set You Free<a href="https://your-docusaurus-site.example.com/blog/an-open-letter-to-ut-austin#ye-shall-know-the-truth-and-the-truth-shall-set-you-free" class="hash-link" aria-label="Direct link to Ye Shall Know the Truth and the Truth Shall Set You Free" title="Direct link to Ye Shall Know the Truth and the Truth Shall Set You Free" translate="no">​</a></h2>
<p>This inscription sits above the entrance to the Main Building on campus. The truth is that tightly coupling funding with ideological requirements undermines the curiosity and independence that made American universities what they are. This Faustian deal is another step towards the suppression of free thought. It's a mechanism designed to deter critics of an administration that clearly aspires to be authoritarian. It also perpetuates a false narrative that conservative voices do not exist on college campuses. During my time as an undergraduate student, I recall a strong presence of Republican voices, including the Young Conservatives of Texas, which notably planned a <a href="https://www.npr.org/sections/thetwo-way/2013/11/19/246122143/university-of-texas-slams-catch-an-illegal-immigrant-game" target="_blank" rel="noopener noreferrer" class="">'Catch an Illegal Immigrant Game'</a> in 2013. Fisher v. University of Texas also sparked conservative voices and debates around the same time. The irony is that this Compact aims to suppress DEI admissions based on socioeconomic factors while at the same time using financial leverage to artificially amplify conservative ideals that the Trump Administration perceives to be underrepresented in higher education. The hypocrisy is blatant.</p>
<p>This Compact is fundamentally and explicitly anti-transgender:</p>
<blockquote>
<p>"Institutions commit to defining and otherwise interpreting 'male,' 'female,' 'woman,' and 'man' according to reproductive function and biological processes."</p>
</blockquote>
<p>A person's gender and sexual identity have nothing to do with education at large whatsoever. It continues a trend of the Trump Administration demonizing and discriminating against one of the most vulnerable populations in the United States. Including something like this is utterly deplorable. If the University of Texas joins this Compact, it will not only turn its back on its trans population but also fail to recognize their very existence.</p>
<blockquote>
<p>"Therefore, no more than 15 percent of a university's undergraduate student population shall be participants in the Student Visa Exchange Program, and no more than 5 percent shall be from any one country."</p>
</blockquote>
<p>Setting arbitrary limits on international students is not only intrinsically xenophobic but also diminishes the so-called 'vibrant marketplace of ideas' when there is less variety in perspectives. Limiting international students, who typically pay full tuition, would also create economic shortfalls for universities like USC, thereby increasing their dependence on federal funding. Not to mention that these international students tend to stay in the United States and drive innovation here. Of the so-called Magnificent Seven tech companies, three were founded by first-generation immigrants. It's impossible to quantify the adverse effect that this would have on the United States economy. Why stop the best and brightest from coming to our great nation?</p>
<p>Let's not mince words here. This Compact is a quid pro quo, a tactic for which the President was already impeached. It's a thinly veiled attempt to install right-wing ideals in some of America's most prestigious schools in exchange for a quick buck. It aims to silence protests and dissenting voices. Much like his maligned and defunct Trump University, this is a grift. Do not let him make a mockery of our beloved university. Do not subject the university to politically-motivated compliance requirements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-plea-for-common-sense">A Plea for Common Sense<a href="https://your-docusaurus-site.example.com/blog/an-open-letter-to-ut-austin#a-plea-for-common-sense" class="hash-link" aria-label="Direct link to A Plea for Common Sense" title="Direct link to A Plea for Common Sense" translate="no">​</a></h2>
<p>If you believe, as I do, that the University of Texas at Austin is a world-class institution, then leave what makes it great in place. With a $20B+ endowment, this university does not need to capitulate to Trump's ideological demands and grovel for money. I am one tiny voice. I am merely a proud alumnus, not a megadonor or booster. I have donated to the university in the past, but if the school joins the Compact, I will withhold all further donations. My pride as a Longhorn will be severely diminished, but I will not be deterred by the xenophobia and prejudice that plagues the United States. Education is worth fighting for.</p>
<p>Hook 'em and fight on!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="disclaimer">Disclaimer<a href="https://your-docusaurus-site.example.com/blog/an-open-letter-to-ut-austin#disclaimer" class="hash-link" aria-label="Direct link to Disclaimer" title="Direct link to Disclaimer" translate="no">​</a></h2>
<p>The opinions and views expressed here are my own and not those of my employer or any school.</p>]]></content:encoded>
            <category>Personal</category>
        </item>
        <item>
            <title><![CDATA[Becoming More Human in an Increasingly AI World]]></title>
            <link>https://your-docusaurus-site.example.com/blog/to-become-more-human</link>
            <guid>https://your-docusaurus-site.example.com/blog/to-become-more-human</guid>
            <pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[My current thoughts on the state of artificial intelligence.]]></description>
            <content:encoded><![CDATA[<p>I'm tired. Existentially.</p>
<p>As a senior engineer with nearly 13 years of professional experience, I've reinvented myself countless times. I've seen more technologies than I can count or remember come and go. I've seen bubbles form and burst. I remember when the latest flop was supposed to be the next big thing. I've spent countless hours learning new skills and honing my craft in a knowingly futile effort to stay up-to-date with technology. I've seen layoffs and downturns. Trust me, I understand that the macroeconomics of the tech industry has peaks and valleys. After all, I wrote my first <code>Hello, world!</code> in high school shortly after the <code>.com</code> crash. However, something feels different this time. I'm starting to feel deeply disillusioned about the future of AI.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="goodharts-law-and-vestigial-structures">Goodhart's Law and Vestigial Structures<a href="https://your-docusaurus-site.example.com/blog/to-become-more-human#goodharts-law-and-vestigial-structures" class="hash-link" aria-label="Direct link to Goodhart's Law and Vestigial Structures" title="Direct link to Goodhart's Law and Vestigial Structures" translate="no">​</a></h2>
<p>I will refer to the concept of Goodhart's Law a few times throughout this post, so I'll quickly define my interpretation. It states that:</p>
<blockquote>
<p>Any observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes.</p>
</blockquote>
<p>Or, in layperson's terms (which I strongly prefer):</p>
<blockquote>
<p>When a measure becomes a target, it ceases to be a good measure.</p>
</blockquote>
<p>I think about this adage almost every single day. It's no secret that Amazon is one of the most data-driven companies on the planet. During my tenure at AWS, I wrote numerous docs overflowing with quantitative evidence to support my claims and proposals. As a customer-facing solutions architect, data was integral to guiding my customers on the right path and measuring the efficacy of my work. That said, Amazonians are also expected to balance the data with anecdotes. Like Jeff Bezos famously said back in 2018:</p>
<blockquote>
<p>The thing I have noticed is that when the anecdotes and the data disagree, the anecdotes are usually right. There is something wrong with the way that you are measuring it.</p>
</blockquote>
<p>I remember my professors at university telling stories of how programmers back in the day used to have their productivity measured by various arbitrary metrics like program execution duration, lines of code, etc. When these metrics become targets, other arguably more meaningful metrics like code maintainability quickly suffer.</p>
<p>Exhibit A:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">terribleAddFunction.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> add </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">first</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> second</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token known-class-name class-name">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token builtin">number</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sleep </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">millisecondsToWait</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token known-class-name class-name">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">void</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name known-class-name class-name">Promise</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">resolve</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">setTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">resolve</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> millisecondsToWait</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// waste five minutes of runtime</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">300000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> first </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> second</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Exhibit B:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">terribleIfFunction.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// replace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// condition ? truePathReturn : falsePathReturn</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// with extra lines</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// add comments for even more lines</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ifWithExtraLines </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">condition</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token known-class-name class-name">Boolean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> truePathReturn</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> object</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> falsePathReturn</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> object </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// check condition</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">condition</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// return true path object if condition is true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> truePathReturn</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// return false path object if condition is false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> falsePathReturn</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>You get the idea. These code snippets are terrible, but if developers' targets are runtime or the number of lines, this is the type of software that is incentivized. Individuals will always index on their targets.</p>
<p>As the tech industry has narrowed its focus and investments on AI lately, I can't help but feel less human. I'm constantly bombarded on social media with the sensationalized idea that developers will soon be replaced. Programmers will become vestigial structures, casualties of the rise of AI agents, and ironically, the very source of data that will lead to our own demise. While I am skeptical about just how close humans are to AGI (artificial general intelligence), there's no doubt that we are approaching a critical juncture in technological history. I'm also not convinced that we're considering the right metrics.</p>
<p>I'm not going to masquerade as some genius economist, but let's consider a stock price as an example of a target for a moment. Everyone can agree that this is a meaningful target, but I argue that this is a short-term target. Why are some executives paid primarily via stock? So their focus is to raise the stock price, of course. Typically, vest periods of a few years ensure no short-term stock manipulation. However, they have a clear target and timeline. Other leadership now indexes on this as well. Many other metrics, such as the company's long-term performance, employee satisfaction, etc., are often less of a focus because they impact their target far less. Goodhart's Law in action. Now, most employees are constantly laser-focused on short-term growth in perpetuity. Not all companies are like this, but this example illustrates the point. However, I fear this myopic mentality honing in on short-term profitability and adoption, instead of ethics and considerations of socioeconomic impact, is prevalent in AI.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developer-productivity-is-not-for-you">Developer Productivity Is Not for You<a href="https://your-docusaurus-site.example.com/blog/to-become-more-human#developer-productivity-is-not-for-you" class="hash-link" aria-label="Direct link to Developer Productivity Is Not for You" title="Direct link to Developer Productivity Is Not for You" translate="no">​</a></h2>
<p>With the advent of large language models (LLMs) and AI agents, there are typically two value propositions: hire fewer developers and/or materially augment their performance. While we can debate just how much the productivity gains are, tools like these undoubtedly help developers like me ship features faster than ever. But have you ever asked yourself who benefits from these productivity gains? In theory, these productivity gains mean more features. More features correlate to more revenue. More revenue sways the market. The market support bolsters the stock price. So simply put, your employer and its shareholders benefit from your increased productivity as a developer. Developer productivity is not for you.</p>
<p>While I use these tools daily for tasks like explaining code I did not write, I have no idea how this will impact my skills and cognitive sharpness in the long term. This is a nuanced question about human psychology. Having an LLM available to generate code for me can make me far less motivated to do my own thinking and research, especially during project crunch times when I am under massive pressure to deliver. These tools certainly make me more productive, but may not make me a better programmer. That is the key distinction because one benefits my employer, and the other benefits me as a skilled worker.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-gave-away-the-knowledge-for-free-under-mit">We Gave Away the Knowledge for Free (Under MIT)<a href="https://your-docusaurus-site.example.com/blog/to-become-more-human#we-gave-away-the-knowledge-for-free-under-mit" class="hash-link" aria-label="Direct link to We Gave Away the Knowledge for Free (Under MIT)" title="Direct link to We Gave Away the Knowledge for Free (Under MIT)" translate="no">​</a></h2>
<p>I also won't parade myself around as an open-source purist. The lion's share of the software I've authored resides under the lock and key of my megacorporate employers' private repositories. That said, I never imagined that all the code I (and much more so the actual open-source contributors) published freely on the internet would benefit a select few companies later, back when I signed up for my GitHub account over a decade ago. While access to these models is democratized for a fee, creating these massive models is limited to the select few corporate titans with the means of production (mountains of GPUs, barring revolutionary advancements in the vein of DeepSeek).</p>
<p>While these technological advancements are truly remarkable, I still struggle with the ethics of using these large models at times. Without namedropping any company or model, you can find countless lawsuits from creators who have coaxed significant portions of their works from LLMs and diffusion models without the proper licensing. These cases are ample evidence, in my opinion, that the macroeconomic corporate stance is to ask for forgiveness, not permission, for what content is acceptable to train models on.</p>
<p>Ultimately, we gave away the knowledge for free, but now we have to pay for access to its application. When we look at the jobs that are most at risk of being replaced by AI (or rather by its perceived value), they are mostly well-paying jobs in a rapidly vanishing middle class (e.g., developers) or creative fields like graphic design. To quote the <a href="https://x.com/QuinnCat13/status/1609711617062703104" target="_blank" rel="noopener noreferrer" class="">brilliant tweet</a> of <code>@QuinnCat13</code>:</p>
<blockquote>
<p>We could automate menial jobs so people have time to make art and music, but apparently, we'd rather automate art and music so people have time for menial jobs.</p>
</blockquote>
<p>Software like <a href="https://glaze.cs.uchicago.edu/what-is-glaze.html" target="_blank" rel="noopener noreferrer" class="">Glaze</a>, which adds minor modifications to images that are imperceptible to the human eye but makes it more difficult for models to train on, gives me hope for checks, balances, and enforcement in AI ethics. However, these powerful models already exist. Remediation is much more challenging than prevention.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="saas-is-not-going-to-save-us">SaaS Is Not Going to Save Us<a href="https://your-docusaurus-site.example.com/blog/to-become-more-human#saas-is-not-going-to-save-us" class="hash-link" aria-label="Direct link to SaaS Is Not Going to Save Us" title="Direct link to SaaS Is Not Going to Save Us" translate="no">​</a></h2>
<p>One trendy take I've seen from the indie hacker influencers on Twitter and LinkedIn is that instead of working for a corporation, you should quickly build your own products using LLMs and IDEs like Cursor. This way, you own your intellectual property and generate revenue directly. However, I see several problems.</p>
<p>I do not want to gatekeep how we define a programmer, so I'll use artistry as an example. I have zero experience in Photoshop, Illustrator, etc. I am not a graphic designer or illustrator by any stretch of the imagination. However, I can now throw a sentence or two into a diffusion model and produce imagery. Am I now an artist? I argue not. If any modifications need to be made to the output, I am utterly incapable of handling them unless I can do so via prompt engineering. The rendered art will also be soulless, lack perspective, and solely regurgitate existing works of actual artists. Similar problems exist for purely AI-generated codebases by inexperienced programmers. I won't namedrop and pile on to them, but you can find numerous examples of security breaches and unexpected cost spikes due to issues in AI-generated code.</p>
<p>Another key issue is the concept of differentiated value. This is a common argument for using cloud service providers like AWS. You can run your own data centers, manage your own virtualization, build your own provisioning automation, etc. However, if AWS can do it out-of-the-box with better economies of scale than your company, why waste time on work that does not set your product apart from its competition? A common approach is to limit undifferentiated work. If AI primarily writes your SaaS product, then the differentiated value of your business is effectively a set of prompts. While I predict that LLMs have and will continue to plateau, let's assume I'm wrong. Why would a company (or individual power users) pay a recurring fee for your product if they can get the same results by generating and plugging in the prompts themselves? The barrier to entry for developers is lowered with AI appliances, but corporations also have this exact ability with far more resources behind them. SaaS is not going to save us.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="no-one-left-to-pay">No One Left to Pay<a href="https://your-docusaurus-site.example.com/blog/to-become-more-human#no-one-left-to-pay" class="hash-link" aria-label="Direct link to No One Left to Pay" title="Direct link to No One Left to Pay" translate="no">​</a></h2>
<p>At the height of the Great Depression, unemployment hit approximately 25% in the United States. Most people fail to realize how much the global economy depends on people having money to consume services and goods. Again, let's assume that I'm wrong about the AI plateau. Let's also ignore supply and demand issues for compute resources. Who is left to pay for anything if AGI replaces all these jobs? A global economic crisis would ensue. I don't know whether it's a universal basic income, an oligarchy with access to key resources, or something else that emerges after AGI, but it does not look bright for humanity at that point.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-focus-on-humanity">A Focus on Humanity<a href="https://your-docusaurus-site.example.com/blog/to-become-more-human#a-focus-on-humanity" class="hash-link" aria-label="Direct link to A Focus on Humanity" title="Direct link to A Focus on Humanity" translate="no">​</a></h2>
<p>Believe it or not, this post started as a therapy exercise. I've been struggling lately to define my worth, identity, and goodness as a human being without relying on my career accolades, the perceived prestige of the company I work for, the quality of my education, etc. When I look to others for inspiration online, I see the same qualities: braggadocious reflections about their many followers, indie makers plastering their incomes on their profiles, toxic elitism, etc. We've been conditioned for these targets in this influencer-obsessed society.</p>
<p>Over the years, I've sought personal validation and measured my worth through various metrics that, unfortunately, are deeply rooted in capitalism and vanity. At no other point in human history have we had unfettered access to data about ourselves as we do now. We can measure how seen we are with social media views, how much people approve of our thoughts via likes, how valuable we are with our incomes and contributions to our employers, etc. Perhaps even worse, we can also see these metrics for our peers. We choose these arbitrary metrics as our targets, and the wrong actions are incentivized. We build and optimize for these targets, and humanity takes a backseat. No longer do we have time to gaze up at the stars, draw constellations, tell stories, have downtime, etc., as our ancient ancestors did. We've replaced this with incessant media consumption, working more than ever, and nonstop reminders that all the numbers that matter to us must keep going up.</p>
<p>I don't blog often, but I felt inspired to write about my frustrations with the industry, society, and myself. I still have a genuine love of technology and am grateful that my career revolves around this passion, a privilege I do not take for granted. However, now more than ever, it's time for me to relinquish some of that competitive, capitalistic vanity and reconnect with my humanity. I do not care about constant improvement, revenue growth, external validation, etc., the same way that I used to. I want to spend more time creating for myself, learning for fun, exploring spirituality or connection with the natural world, and investing time in things that make the world a slightly better place. If AI replaces me in the process, then so be it.</p>
<p>I have no power to make changes on a massive scale. I'm a minuscule cog in this intricate and profoundly unfair machine, like most people. I can offer up my authentic self, though. I can share my tiny voice that questions the ethics and benefits of this technology that we know and use. I acknowledge that the anecdote has much more context than the data. I can share my journey to define my self-worth and goodness without the quantitative pressure of comparing myself to others. I can strive to be more human in an increasingly AI-obsessed world.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="disclaimer">Disclaimer<a href="https://your-docusaurus-site.example.com/blog/to-become-more-human#disclaimer" class="hash-link" aria-label="Direct link to Disclaimer" title="Direct link to Disclaimer" translate="no">​</a></h2>
<p>When I started this blog post, I worked for Amazon Web Services. The opinions and views expressed here are my own and not those of Amazon. I have since left the company.</p>]]></content:encoded>
            <category>Personal</category>
            <category>Technology</category>
        </item>
        <item>
            <title><![CDATA[Preparing for the Certified Kubernetes Application Developer (CKAD) Exam Using Amazon EKS]]></title>
            <link>https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks</link>
            <guid>https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks</guid>
            <pubDate>Thu, 08 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[A companion for learning Kubernetes in the AWS ecosystem.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation-and-background">Motivation and Background<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#motivation-and-background" class="hash-link" aria-label="Direct link to Motivation and Background" title="Direct link to Motivation and Background" translate="no">​</a></h2>
<p>While I've used Kubernetes professionally in a few capacities (particularly in customer engagements while working at AWS), I wanted to cement my knowledge and increase my mastery with a systematic approach. I decided to prepare for the Certified Kubernetes Application Developer (CKAD) exam. I've taken and passed more than a dozen technology certification exams spanning AWS, Azure, HashiCorp, and more. This exam is unique in several ways. Namely, it's all hands-on in a lab environment. Azure exams often have a coding, configuration, or CLI command component, but even these are typically multiple-choice questions. The CKAD presents you with a virtual desktop and several Kubernetes clusters, making you tackle 15-20 tasks with a strict two-hour time limit. I put together this repository and post for a few reasons:</p>
<ul>
<li class="">I wanted to document all of my hands-on preparation for when I have to recertify in two years</li>
<li class="">I wanted to share my knowledge with others and offer a supplemental guide to a CKAD course</li>
<li class="">Since the CKAD exam focuses on Kubernetes from a cloud-agnostic perspective, I wanted to fill in the gaps in my own knowledge of running Kubernetes in the AWS ecosystem (e.g., Karpenter, Container Insights, etc.)</li>
<li class="">Many courses and guides leverage Microk8s or minikube to run Kubernetes locally, but I wanted to focus on cloud-based infrastructure, especially for things like EBS volumes created via PVCs, ELBs created via a Service, etc.</li>
</ul>
<p>In summary, this material focuses on hands-on exercises for preparing for the exam and other tools in the cloud-agnostic and AWS ecosystems.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preparing-for-the-exam">Preparing for the Exam<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#preparing-for-the-exam" class="hash-link" aria-label="Direct link to Preparing for the Exam" title="Direct link to Preparing for the Exam" translate="no">​</a></h2>
<p>While two hours may sound like plenty of time, you'll need to work quickly to complete the exam. With an average of six to eight minutes per exercise (each is <strong>not</strong> timed individually), ensuring you can work efficiently and ergonomically is paramount. The following items were incredibly useful for me:</p>
<ul>
<li class="">Running through a practice exam to get a feel for the CKAD structure</li>
<li class="">Proficiency with <a href="https://vimdoc.sourceforge.net/htmldoc/motion.html" target="_blank" rel="noopener noreferrer" class="">Vim motions</a> (since most of the exam takes place in a terminal) to efficiently edit code</li>
<li class="">Generating YAML manifests via the command line for new resources instead of copying and pasting from documentation (e.g., <code>kubectl create namespace namespace-one -o yaml --dry-run=client</code>)</li>
<li class="">Generating YAML manifests for existing resources that do not have one (e.g., <code>kubectl get namespace namespace-one -o yaml &gt; namespace.yaml</code>)</li>
<li class="">Leveraging the <code>explain</code> command instead of looking up resource properties in the web documentation (e.g., <code>kubectl explain pod.spec</code>)</li>
<li class="">Memorizing the syntax for running commands in a container (e.g., <code>kubectl exec -it pod-one -- /bin/sh</code>) and for quickly creating a new Pod to run commands from (e.g., <code>kubectl run busybox-shell --image=busybox --rm -it --restart=Never -- sh</code>)</li>
<li class="">Refreshing knowledge of Docker commands like exporting an image (i.e., <code>docker save image:tag --output image.tar</code>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="materials-and-getting-started">Materials and Getting Started<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#materials-and-getting-started" class="hash-link" aria-label="Direct link to Materials and Getting Started" title="Direct link to Materials and Getting Started" translate="no">​</a></h2>
<p>All code shown here resides in <a href="https://github.com/scottenriquez/ckad-exam-prep-using-amazon-eks" target="_blank" rel="noopener noreferrer" class="">this GitHub repository</a>. In addition to this content, I highly recommend the following:</p>
<ul>
<li class="">The <a href="https://www.pluralsight.com/paths/certified-kubernetes-application-developer-ckad-2023" target="_blank" rel="noopener noreferrer" class="">CKAD courses on Pluralsight</a> for classroom learning</li>
<li class=""><a href="https://killer.sh/pricing" target="_blank" rel="noopener noreferrer" class="">Killer Shell</a> for practice exams</li>
<li class=""><a href="https://github.com/dgkanatsios/CKAD-exercises/blob/main/README.md" target="_blank" rel="noopener noreferrer" class="">This GitHub repository</a> for many useful CLI commands</li>
</ul>
<p>My preferred approach was to work through the Pluralsight course first. After reviewing the classroom material, I designed and implemented the examples below. If you have foundational Kubernetes knowledge, skip to the most useful exercises. Each one is designed to be a standalone experience.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="00-eksctl-configuration">00: eksctl Configuration<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#00-eksctl-configuration" class="hash-link" aria-label="Direct link to 00: eksctl Configuration" title="Direct link to 00: eksctl Configuration" translate="no">​</a></h2>
<p>eksctl is a powerful CLI tool that quickly spins up and tears down Kubernetes clusters via Amazon EKS. Nearly all of the exercises below start by leveraging the tool to create a cluster:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">00-eksctl-configuration/create-cluster.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># before running these commands, first authenticate with AWS (e.g., aws configure sso)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl create cluster </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> cluster.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># if connecting to an existing cluster</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl utils write-kubeconfig </span><span class="token parameter variable" style="color:#36acaa">--cluster</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">learning-kubernetes</span><br></div></code></pre></div></div>
<p>The default cluster configuration uses a two-node cluster of <code>t3.medium</code> instances to keep hourly costs as low as possible. At the time of writing this blog post, the exam tests on Kubernetes version 1.30.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">00-eksctl-configuration/culster.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> eksctl.io/v1alpha5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterConfig</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> learning</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">kubernetes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">region</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1.30'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">nodeGroups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> node</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">group</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">instanceType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> t3.medium</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">desiredCapacity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">minSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">maxSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><br></div></code></pre></div></div>
<p>This cluster can be transient for learning purposes. To keep costs low, be sure to run the <code>destroy-cluster.sh</code> script to delete the cluster when not in use. I also recommend configuring an <a href="https://aws.amazon.com/aws-cost-management/aws-budgets/" target="_blank" rel="noopener noreferrer" class="">AWS Budget</a> as an extra measure of cost governance.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">00-eksctl-configuration/destroy-cluster.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">eksctl delete cluster --config-file</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">cluster.yaml --disable-nodegroup-eviction</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="01-first-deployment-with-nginx-ckad-topic">01: First Deployment with Nginx (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#01-first-deployment-with-nginx-ckad-topic" class="hash-link" aria-label="Direct link to 01: First Deployment with Nginx (CKAD Topic)" title="Direct link to 01: First Deployment with Nginx (CKAD Topic)" translate="no">​</a></h2>
<p>With the cluster created, we can now make our first <a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/" target="_blank" rel="noopener noreferrer" class="">Deployment</a>. We'll start by creating a web server with three replicas using the latest Nginx image:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">01-first-deployment-with-nginx/deployment.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><br></div></code></pre></div></div>
<p>The following commands leverage the manifest to create three <a href="https://kubernetes.io/docs/concepts/workloads/pods/" target="_blank" rel="noopener noreferrer" class="">Pods</a> and inspect them:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">01-first-deployment-with-nginx/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># returns three pods (e.g., nginx-deployment-5449cb55b-jfgnc)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># clean up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl delete </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="02-pod-communication-over-ip-ckad-topic">02: Pod Communication over IP (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#02-pod-communication-over-ip-ckad-topic" class="hash-link" aria-label="Direct link to 02: Pod Communication over IP (CKAD Topic)" title="Direct link to 02: Pod Communication over IP (CKAD Topic)" translate="no">​</a></h2>
<p>The Deployment in this example is identical to the previous: a web server with three replicas. Use the following commands to explore how IP addressing works for Pods:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">02-pod-communication-over-ip/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 192.168.51.32 is one of my pod's IP address, but yours will be different</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># when the pod is replaced, this IP address changes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># creates a pod with the BusyBox image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># entering BusyBox container shell to communicate with pods in the cluster</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl run </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--restart</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Never busybox </span><span class="token parameter variable" style="color:#36acaa">--image</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">busybox </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># replace the IP address as needed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">192.168</span><span class="token plain">.51.32</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># displys the nginx homepage code</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> index.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># returning to default shell and deletes the BusyBox pod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">exit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># clean up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl delete </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="03-first-service-ckad-topic">03: First Service (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#03-first-service-ckad-topic" class="hash-link" aria-label="Direct link to 03: First Service (CKAD Topic)" title="Direct link to 03: First Service (CKAD Topic)" translate="no">​</a></h2>
<p>Since each Pod has a separate IP address that can change, we can use a <a href="https://kubernetes.io/docs/concepts/services-networking/service/" target="_blank" rel="noopener noreferrer" class="">Service</a> to keep track of the Pod's IP addresses on our behalf. This abstraction allows us to group Pods via a <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors" target="_blank" rel="noopener noreferrer" class="">selector</a> and reference them via a single Service. In the Service manifest and leveraging the same Deployment as before, we specify how to select which Pods to target, what port to expose, and the type of Service:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">03-first-service/service.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># nodePort is used for external access</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># ClusterIP services are only accessible within the cluster</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># NodePort services are a way to expose ClusterIP services externally without using a cloud provider's load balancer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># LoadBalancer is covered in the next section</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterIP</span><br></div></code></pre></div></div>
<p>Using the Service, we have a single interface to the three <code>nginx</code> replicas. We can also use the Service name instead of its IP address.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">03-first-service/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 10.100.120.203 is the service IP address</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe </span><span class="token function" style="color:#d73a49">service</span><span class="token plain"> nginx-service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># entering BusyBox container shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl run </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--restart</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Never busybox </span><span class="token parameter variable" style="color:#36acaa">--image</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">busybox </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># can also use the IP address instead</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> nginx-service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> index.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># returning to default shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">exit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># clean up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl delete </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="04-elastic-load-balancers-for-kubernetes-service-ckad-topic">04: Elastic Load Balancers for Kubernetes Service (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#04-elastic-load-balancers-for-kubernetes-service-ckad-topic" class="hash-link" aria-label="Direct link to 04: Elastic Load Balancers for Kubernetes Service (CKAD Topic)" title="Direct link to 04: Elastic Load Balancers for Kubernetes Service (CKAD Topic)" translate="no">​</a></h2>
<p>A significant benefit of Kubernetes is that it can create and manage resources in AWS on our behalf. Using the <a href="https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/" target="_blank" rel="noopener noreferrer" class="">AWS Load Balancer Controller</a>, we can specify <a href="https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/service/annotations/" target="_blank" rel="noopener noreferrer" class="">annotations</a> to create a Service of type LoadBalancer that leverages an Elastic Load Balancer. Using the same Deployment from the past two sections, this manifest illustrates how to leverage a Network Load Balancer for the Service:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">04-load-balancer/load-balancer.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">load</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">balancer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service.beta.kubernetes.io/aws-load-balancer-internal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'true'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># by default, a Classic Load Balancer is created</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># this annotation creates a Network Load Balancer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service.beta.kubernetes.io/aws-load-balancer-type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'nlb'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> LoadBalancer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">loadBalancer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ip</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'192.0.2.127'</span><br></div></code></pre></div></div>
<p>The following commands deploy the LoadBalancer Service:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">04-load-balancer/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># entering BusyBox container shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl run </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--restart</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Never busybox </span><span class="token parameter variable" style="color:#36acaa">--image</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">busybox </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> nginx-load-balancer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> index.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># returning to default shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">exit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># clean up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># this command ensures that the load balancer is deleted</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># be sure to run before destroying the cluster</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl delete </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="05-ingress-ckad-topic">05: Ingress (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#05-ingress-ckad-topic" class="hash-link" aria-label="Direct link to 05: Ingress (CKAD Topic)" title="Direct link to 05: Ingress (CKAD Topic)" translate="no">​</a></h2>
<p>Services of type ClusterIP only support internal cluster networking. The NodePort configuration allows for external communication by exposing the same port on every node (i.e., EC2 instances in our case). However, this introduces a different challenge because the consumer must know the nodes' IP addresses (and nodes are often transient). The LoadBalancer configuration has a 1:1 relationship with the Service. If you have numerous Services, the cost of load balancers may not be feasible. <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/" target="_blank" rel="noopener noreferrer" class="">Ingress</a> alleviates some of these challenges by providing a single external interface over HTTP or HTTPS with support for path-based routing. Leveraging the Nginx example one last time, we can create an Ingress that exposes a Service with the NodePort configuration via an Application Load Balancer.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">05-ingress/ingress.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kubernetes.io/ingress.class</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> alb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">alb.ingress.kubernetes.io/scheme</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> internet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">facing</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">paths</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">pathType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Prefix</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">backend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><br></div></code></pre></div></div>
<p>The following commands install the AWS Load Balancer Controller, configure required IAM permissions, and deploy the Ingress. Be sure to set the <code>$AWS_ACCOUNT_ID</code> environment variable first.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">05-ingress/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># install AWS Load Balancer Controller</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># https://docs.aws.amazon.com/eks/latest/userguide/lbc-manifest.html</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-O</span><span class="token plain"> https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws iam create-policy </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --policy-name AWSLoadBalancerControllerIAMPolicy </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --policy-document file://iam_policy.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> iam_policy.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl utils associate-iam-oidc-provider </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">us-west-2 </span><span class="token parameter variable" style="color:#36acaa">--cluster</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">learning-kubernetes </span><span class="token parameter variable" style="color:#36acaa">--approve</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl create iamserviceaccount </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--cluster</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">learning-kubernetes </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--namespace</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">kube-system </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">aws-load-balancer-controller </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --role-name AmazonEKSLoadBalancerControllerRole </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --attach-policy-arn</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">arn:aws:iam::</span><span class="token variable" style="color:#36acaa">$AWS_ACCOUNT_ID</span><span class="token plain">:policy/AWSLoadBalancerControllerIAMPolicy </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--approve</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">--validate</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">false </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-Lo</span><span class="token plain"> v2_7_2_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.7.2/v2_7_2_full.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i.bak</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'596,604d'</span><span class="token plain"> ./v2_7_2_full.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sed</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i.bak</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'s|your-cluster-name|learning-kubernetes|'</span><span class="token plain"> ./v2_7_2_full.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> v2_7_2_full.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> v2_7_2_full.yaml*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get deployment </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> kube-system aws-load-balancer-controller</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># apply maniftests</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># gets address (e.g, http://k8s-default-ingress-08daebdfec-204015293.us-west-2.elb.amazonaws.com/) that can be opened in a web browser</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># clean up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl delete </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="06-jobs-and-cronjobs-ckad-topic">06: Jobs and CronJobs (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#06-jobs-and-cronjobs-ckad-topic" class="hash-link" aria-label="Direct link to 06: Jobs and CronJobs (CKAD Topic)" title="Direct link to 06: Jobs and CronJobs (CKAD Topic)" translate="no">​</a></h2>
<p><a href="https://kubernetes.io/docs/concepts/workloads/controllers/job/" target="_blank" rel="noopener noreferrer" class="">Jobs</a> are a powerful mechanism that reliably ensures that Pods are completed successfully. <a href="https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/" target="_blank" rel="noopener noreferrer" class="">CronJobs</a> extend this functionality by supporting a recurring schedule.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">06-jobs-and-cronjobs/job.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> batch/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Job</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> perl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">5.34.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'perl'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'-Mbignum=bpi'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'-wle'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'print bpi(2000)'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">restartPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Never</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">backoffLimit</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><br></div></code></pre></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">06-jobs-and-cronjobs/cronjob.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> batch/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CronJob</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hello</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># runs every minute</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">schedule</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'* * * * *'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">jobTemplate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hello</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> busybox</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">1.28</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">imagePullPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> IfNotPresent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /bin/sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">c</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> date; echo Hello from the Kubernetes cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">restartPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> OnFailure</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="07-metrics-server-and-pod-autoscaling-ckad-topic">07: Metrics Server and Pod Autoscaling (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#07-metrics-server-and-pod-autoscaling-ckad-topic" class="hash-link" aria-label="Direct link to 07: Metrics Server and Pod Autoscaling (CKAD Topic)" title="Direct link to 07: Metrics Server and Pod Autoscaling (CKAD Topic)" translate="no">​</a></h2>
<p><a href="https://github.com/kubernetes-sigs/metrics-server" target="_blank" rel="noopener noreferrer" class="">Metrics Server</a> provides container-level resource metrics for autoscaling within Kubernetes. It is not installed by default and is meant only for autoscaling purposes. There are <a href="https://github.com/kubernetes-sigs/metrics-server?tab=readme-ov-file#use-cases" target="_blank" rel="noopener noreferrer" class="">other options</a>, such as Container Insights, Prometheus, and Grafana, for more accurate resource usage metrics (all covered later in this post). With Metrics Server installed, a <a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/" target="_blank" rel="noopener noreferrer" class="">HorizontalPodAutoscaler</a> resource can be configured with values such as target metric, minimum replicas, maximum replicas, etc.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">07-metrics-server-and-pod-autoscaling/horizontal-pod-autoscaler.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> autoscaling/v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HorizontalPodAutoscaler</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> php</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">apache</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">scaleTargetRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> php</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">apache</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">metrics</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cpu</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Utilization</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">averageUtilization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">observedGeneration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">currentReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">desiredReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">currentMetrics</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cpu</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">current</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">averageUtilization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">averageValue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><br></div></code></pre></div></div>
<p>HorizontalPodAutoscalers create and destroy Pods based on metric usage. On the other hand, <a href="https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler" target="_blank" rel="noopener noreferrer" class="">vertical autoscaling</a> rightsizes the resource limits (covered in the next section) for Pods.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="08-resource-management-ckad-topic">08: Resource Management (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#08-resource-management-ckad-topic" class="hash-link" aria-label="Direct link to 08: Resource Management (CKAD Topic)" title="Direct link to 08: Resource Management (CKAD Topic)" translate="no">​</a></h2>
<p>When creating a Pod, you can optionally specify an estimate for the number of resources a container needs (e.g., CPU and RAM). This baseline estimate should be specified in the <code>requests</code> parameter. The <code>limits</code> parameter specifies the threshold for which a container should be terminated to prevent starvation of other processes. Limits also help with cluster capacity planning (e.g., EKS node groups). Below is the Nginx Deployment from earlier with resource management applied:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">08-resource-management/deployment.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># estimated resources for container to run optimally</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># kills the container if threshold is crossed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="09-karpenter">09: Karpenter<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#09-karpenter" class="hash-link" aria-label="Direct link to 09: Karpenter" title="Direct link to 09: Karpenter" translate="no">​</a></h2>
<p>In the previous two sections, we covered how additional Pods are created (i.e., horizontal scaling) and how resources (e.g., CPU and RAM) are requested and limited in Kubernetes. The next topic is managing the underlying compute when additional infrastructure is required. There are two primary options for scaling compute using EKS on EC2: Cluster Autoscaler and <a href="https://karpenter.sh/" target="_blank" rel="noopener noreferrer" class="">Karpenter</a>. On AWS, Cluster Autoscaler leverages EC2 Auto Scaling Groups (ASGs) to manage node groups. Cluster Autoscaler typically runs as a&nbsp;Deployment&nbsp;in the cluster. Karpenter does not leverage ASGs, allowing for the ability to select from a wide array of instance types that match the exact requirements of the additional containers. Karpenter also allows for easy adoption of <a href="https://aws.amazon.com/ec2/spot/" target="_blank" rel="noopener noreferrer" class="">Spot</a> for further cost savings on top of better matching the workload to compute resources. The cluster defined in <code>00-eksctl-configuration</code> uses an unmanaged node group and does not leverage Cluster Autoscaler or Karpenter. To demonstrate how to leverage Karpenter, we'll need a different cluster configuration file. We can dynamically generate it like so:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">09-karpenter/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># set environment variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">KARPENTER_NAMESPACE</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">karpenter</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">KARPENTER_VERSION</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">v0.32.10</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">K8S_VERSION</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.28</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">AWS_PARTITION</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"aws"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">CLUSTER_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">${</span><span class="token string variable environment constant" style="color:#36acaa">USER</span><span class="token string variable" style="color:#36acaa">}</span><span class="token string" style="color:#e3116c">-karpenter-demo"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">AWS_DEFAULT_REGION</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"us-west-2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">AWS_ACCOUNT_ID</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable" style="color:#36acaa">aws sts get-caller-identity </span><span class="token string variable parameter variable" style="color:#36acaa">--query</span><span class="token string variable" style="color:#36acaa"> Account </span><span class="token string variable parameter variable" style="color:#36acaa">--output</span><span class="token string variable" style="color:#36acaa"> text</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ARM_AMI_ID</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable" style="color:#36acaa">aws ssm get-parameter </span><span class="token string variable parameter variable" style="color:#36acaa">--name</span><span class="token string variable" style="color:#36acaa"> /aws/service/eks/optimized-ami/$</span><span class="token string variable punctuation" style="color:#393A34">{</span><span class="token string variable" style="color:#36acaa">K8S_VERSION</span><span class="token string variable punctuation" style="color:#393A34">}</span><span class="token string variable" style="color:#36acaa">/amazon-linux-2-arm64/recommended/image_id </span><span class="token string variable parameter variable" style="color:#36acaa">--query</span><span class="token string variable" style="color:#36acaa"> Parameter.Value </span><span class="token string variable parameter variable" style="color:#36acaa">--output</span><span class="token string variable" style="color:#36acaa"> text</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">AMD_AMI_ID</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable" style="color:#36acaa">aws ssm get-parameter </span><span class="token string variable parameter variable" style="color:#36acaa">--name</span><span class="token string variable" style="color:#36acaa"> /aws/service/eks/optimized-ami/$</span><span class="token string variable punctuation" style="color:#393A34">{</span><span class="token string variable" style="color:#36acaa">K8S_VERSION</span><span class="token string variable punctuation" style="color:#393A34">}</span><span class="token string variable" style="color:#36acaa">/amazon-linux-2/recommended/image_id </span><span class="token string variable parameter variable" style="color:#36acaa">--query</span><span class="token string variable" style="color:#36acaa"> Parameter.Value </span><span class="token string variable parameter variable" style="color:#36acaa">--output</span><span class="token string variable" style="color:#36acaa"> text</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">GPU_AMI_ID</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable" style="color:#36acaa">aws ssm get-parameter </span><span class="token string variable parameter variable" style="color:#36acaa">--name</span><span class="token string variable" style="color:#36acaa"> /aws/service/eks/optimized-ami/$</span><span class="token string variable punctuation" style="color:#393A34">{</span><span class="token string variable" style="color:#36acaa">K8S_VERSION</span><span class="token string variable punctuation" style="color:#393A34">}</span><span class="token string variable" style="color:#36acaa">/amazon-linux-2-gpu/recommended/image_id </span><span class="token string variable parameter variable" style="color:#36acaa">--query</span><span class="token string variable" style="color:#36acaa"> Parameter.Value </span><span class="token string variable parameter variable" style="color:#36acaa">--output</span><span class="token string variable" style="color:#36acaa"> text</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># deploy resources to support Karpenter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws cloudformation deploy </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --stack-name </span><span class="token string" style="color:#e3116c">"Karpenter-</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --template-file karpenter-support-resources-cfn.yaml </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--capabilities</span><span class="token plain"> CAPABILITY_NAMED_IAM </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --parameter-overrides </span><span class="token string" style="color:#e3116c">"ClusterName=</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># generate cluster file and deploy</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token string" style="color:#e3116c">EOF</span><span class="token string bash punctuation" style="color:#393A34"> </span><span class="token string bash punctuation operator" style="color:#393A34">&gt;</span><span class="token string bash punctuation" style="color:#393A34"> cluster.yaml</span><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">---</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">apiVersion: eksctl.io/v1alpha5</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">kind: ClusterConfig</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  name: </span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  region: </span><span class="token string variable" style="color:#36acaa">${AWS_DEFAULT_REGION}</span><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  version: "</span><span class="token string variable" style="color:#36acaa">${K8S_VERSION}</span><span class="token string" style="color:#e3116c">"</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  tags:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    karpenter.sh/discovery: </span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">iam:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  withOIDC: true</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  serviceAccounts:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  - metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      name: karpenter</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      namespace: "</span><span class="token string variable" style="color:#36acaa">${KARPENTER_NAMESPACE}</span><span class="token string" style="color:#e3116c">"</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    roleName: </span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">-karpenter</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    attachPolicyARNs:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    - arn:</span><span class="token string variable" style="color:#36acaa">${AWS_PARTITION}</span><span class="token string" style="color:#e3116c">:iam::</span><span class="token string variable" style="color:#36acaa">${AWS_ACCOUNT_ID}</span><span class="token string" style="color:#e3116c">:policy/KarpenterControllerPolicy-</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    roleOnly: true</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">iamIdentityMappings:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">- arn: "arn:</span><span class="token string variable" style="color:#36acaa">${AWS_PARTITION}</span><span class="token string" style="color:#e3116c">:iam::</span><span class="token string variable" style="color:#36acaa">${AWS_ACCOUNT_ID}</span><span class="token string" style="color:#e3116c">:role/KarpenterNodeRole-</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  username: system:node:{{EC2PrivateDNSName}}</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  groups:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  - system:bootstrappers</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  - system:nodes</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">managedNodeGroups:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">- instanceType: t3.medium</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  amiFamily: AmazonLinux2</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  name: </span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">-ng</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  desiredCapacity: 2</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  minSize: 2</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  maxSize: 5</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl create cluster </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> cluster.yaml</span><br></div></code></pre></div></div>
<p>Next, we install Karpenter on the EKS cluster:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">09-karpenter/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># set additional environment variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">CLUSTER_ENDPOINT</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable" style="color:#36acaa">aws eks describe-cluster </span><span class="token string variable parameter variable" style="color:#36acaa">--name</span><span class="token string variable" style="color:#36acaa"> $</span><span class="token string variable punctuation" style="color:#393A34">{</span><span class="token string variable" style="color:#36acaa">CLUSTER_NAME</span><span class="token string variable punctuation" style="color:#393A34">}</span><span class="token string variable" style="color:#36acaa"> </span><span class="token string variable parameter variable" style="color:#36acaa">--query</span><span class="token string variable" style="color:#36acaa"> </span><span class="token string variable string" style="color:#e3116c">"cluster.endpoint"</span><span class="token string variable" style="color:#36acaa"> </span><span class="token string variable parameter variable" style="color:#36acaa">--output</span><span class="token string variable" style="color:#36acaa"> text</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">KARPENTER_IAM_ROLE_ARN</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"arn:</span><span class="token string variable" style="color:#36acaa">${AWS_PARTITION}</span><span class="token string" style="color:#e3116c">:iam::</span><span class="token string variable" style="color:#36acaa">${AWS_ACCOUNT_ID}</span><span class="token string" style="color:#e3116c">:role/</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">-karpenter"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># install Karpenter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm registry </span><span class="token builtin class-name">logout</span><span class="token plain"> public.ecr.aws</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm upgrade </span><span class="token parameter variable" style="color:#36acaa">--install</span><span class="token plain"> karpenter oci://public.ecr.aws/karpenter/karpenter </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">${KARPENTER_VERSION}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--namespace</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">${KARPENTER_NAMESPACE}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> --create-namespace </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--set</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"serviceAccount.annotations.eks\.amazonaws\.com/role-arn=</span><span class="token string variable" style="color:#36acaa">${KARPENTER_IAM_ROLE_ARN}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--set</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"settings.clusterName=</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--set</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"settings.interruptionQueue=</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--set</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">controller.resources.requests.cpu</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--set</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">controller.resources.requests.memory</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">1Gi </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--set</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">controller.resources.limits.cpu</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--set</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">controller.resources.limits.memory</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">1Gi </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--wait</span><br></div></code></pre></div></div>
<p>Finally, we create a node pool that specifies what compute our workload can support. In this case, Karpenter can provision EC2 Spot instances from the <code>c</code>, <code>m</code>, or <code>r</code> families from any generation greater than two running Linux on AMD64 architecture.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">09-karpenter/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># create NodePool</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token string" style="color:#e3116c">EOF</span><span class="token string bash punctuation" style="color:#393A34"> </span><span class="token string bash punctuation operator" style="color:#393A34">&gt;</span><span class="token string bash punctuation" style="color:#393A34"> node-pool.yaml</span><span class="token string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">apiVersion: karpenter.sh/v1beta1</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">kind: NodePool</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  name: default</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  template:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      requirements:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        - key: kubernetes.io/arch</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          operator: In</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          values: ["amd64"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        - key: kubernetes.io/os</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          operator: In</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          values: ["linux"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        - key: karpenter.sh/capacity-type</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          operator: In</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          values: ["spot"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        - key: karpenter.k8s.aws/instance-category</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          operator: In</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          values: ["c", "m", "r"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        - key: karpenter.k8s.aws/instance-generation</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          operator: Gt</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">          values: ["2"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">      nodeClassRef:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        apiVersion: karpenter.k8s.aws/v1beta1</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        kind: EC2NodeClass</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        name: default</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  limits:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    cpu: 1000</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  disruption:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    consolidationPolicy: WhenUnderutilized</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    expireAfter: 720h</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">---</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">apiVersion: karpenter.k8s.aws/v1beta1</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">kind: EC2NodeClass</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  name: default</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  amiFamily: AL2</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  role: "KarpenterNodeRole-</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  subnetSelectorTerms:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    - tags:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        karpenter.sh/discovery: "</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  securityGroupSelectorTerms:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    - tags:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">        karpenter.sh/discovery: "</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  amiSelectorTerms:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    - id: "</span><span class="token string variable" style="color:#36acaa">${ARM_AMI_ID}</span><span class="token string" style="color:#e3116c">"</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    - id: "</span><span class="token string variable" style="color:#36acaa">${AMD_AMI_ID}</span><span class="token string" style="color:#e3116c">"</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> node-pool.yaml</span><br></div></code></pre></div></div>
<p>With the new EKS cluster deployed and Karpenter installed, we can add new Pods and see new EC2 instances created on our behalf.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">09-karpenter/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># deploy pods and scale</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> deployment.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl scale deployment inflate </span><span class="token parameter variable" style="color:#36acaa">--replicas</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><br></div></code></pre></div></div>
<p>In less than a minute after the <code>inflate</code> command, a new EC2 instance is created that matches the node pool specifications. In my case, a <code>c5n.2xlarge</code> server was deployed.</p>
<p><img decoding="async" loading="lazy" alt="Karpenter instances" src="https://your-docusaurus-site.example.com/assets/images/karpenter-instances-8b1dff37637eae033985093a509f07c5.png" width="2890" height="436" class="img_ev3q"></p>
<p>As expected, the node pool leverages Spot instances.</p>
<p><img decoding="async" loading="lazy" alt="Karpenter instances" src="https://your-docusaurus-site.example.com/assets/images/karpenter-spot-instance-25b4e1cff2f3391692612fe27c53e3eb.png" width="2788" height="632" class="img_ev3q"></p>
<p>You can monitor the Karpenter logs via the command below. Less than a minute after deleting the Deployment, the <code>c5n.2xlarge</code> instance was terminated. Be sure to follow the cleanup steps when done to ensure no resources become orphaned.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">09-karpenter/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># monitor Karpenter events</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl logs </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">${KARPENTER_NAMESPACE}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> app.kubernetes.io/name</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">karpenter </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> controller</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># scale down</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl delete deployment inflate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># clean up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm uninstall karpenter </span><span class="token parameter variable" style="color:#36acaa">--namespace</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">${KARPENTER_NAMESPACE}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws cloudformation delete-stack --stack-name </span><span class="token string" style="color:#e3116c">"Karpenter-</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws ec2 describe-launch-templates </span><span class="token parameter variable" style="color:#36acaa">--filters</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">Name</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">tag:karpenter.k8s.aws/cluster,Values</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    jq </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">".LaunchTemplates[].LaunchTemplateName"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">xargs</span><span class="token plain"> -I</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> aws ec2 delete-launch-template --launch-template-name </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl delete cluster </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">${CLUSTER_NAME}</span><span class="token string" style="color:#e3116c">"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-persistent-volumes-using-ebs-ckad-topic">10: Persistent Volumes Using EBS (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#10-persistent-volumes-using-ebs-ckad-topic" class="hash-link" aria-label="Direct link to 10: Persistent Volumes Using EBS (CKAD Topic)" title="Direct link to 10: Persistent Volumes Using EBS (CKAD Topic)" translate="no">​</a></h2>
<p>Storage in Kubernetes can be classified as either ephemeral or persistent. Without leveraging <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" target="_blank" rel="noopener noreferrer" class="">PersistentVolumes</a> (PVs), containers read and write data to the volume attached to the node they run on. Ephemeral storage is temporary and tied to the Pod's lifecycle. If requirements dictate that the storage persists or be shared across Pods, there are some prerequisites before EBS can be leveraged for PVs.</p>
<p>The first step is installing the <a href="https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html" target="_blank" rel="noopener noreferrer" class="">AWS EBS Container Storage Interface (CSI) driver</a>. The next step is to define a <a href="https://kubernetes.io/docs/concepts/storage/storage-classes/" target="_blank" rel="noopener noreferrer" class="">StorageClass</a> (SC) that includes configuration such as volume type (e.g., <code>gp3</code>), encryption, etc. The final step is to reference a <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/#dynamic" target="_blank" rel="noopener noreferrer" class="">PersistentVolumeClaim</a> (PVC) when deploying a Pod in order to dynamically provision the EBS volume and attach to the containers.</p>
<p>In practice, this goes as follows:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">10-persistent-volumes/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># create an OIDC provider</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl utils associate-iam-oidc-provider </span><span class="token parameter variable" style="color:#36acaa">--cluster</span><span class="token plain"> learning-kubernetes </span><span class="token parameter variable" style="color:#36acaa">--approve</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># install aws-ebs-csi-driver</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl create iamserviceaccount </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> ebs-csi-controller-sa </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">--namespace</span><span class="token plain"> kube-system </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">--cluster</span><span class="token plain"> learning-kubernetes </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --role-name AmazonEKS_EBS_CSI_DriverRole </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --role-only </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token parameter variable" style="color:#36acaa">--approve</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl create addon </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> aws-ebs-csi-driver </span><span class="token parameter variable" style="color:#36acaa">--cluster</span><span class="token plain"> learning-kubernetes --service-account-role-arn arn:aws:iam::</span><span class="token variable" style="color:#36acaa">$AWS_ACCOUNT_ID</span><span class="token plain">:role/AmazonEKS_EBS_CSI_DriverRole </span><span class="token parameter variable" style="color:#36acaa">--force</span><br></div></code></pre></div></div>
<p>Once completed, the add-on will appear in the AWS Console.</p>
<p><img decoding="async" loading="lazy" alt="EBS CSI" src="https://your-docusaurus-site.example.com/assets/images/eks-ebs-csi-add-on-33871dd5be6aa396a89f52d938c7a575.png" width="2670" height="536" class="img_ev3q"></p>
<p>Next, define the StorageClass and PersistentVolumeClaim:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">10-persistent-volumes/storage-class.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> storage.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> StorageClass</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ebs</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">provisioner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ebs.csi.aws.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">volumeBindingMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> WaitForFirstConsumer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">csi.storage.k8s.io/fstype</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xfs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gp3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">encrypted</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'true'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">allowedTopologies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabelExpressions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> topology.ebs.csi.aws.com/zone</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">values</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2a</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2b</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2c</span><br></div></code></pre></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">10-persistent-volumes/persistent-volume-claim.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PersistentVolumeClaim</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ebs</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">claim</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">accessModes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ReadWriteOnce</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">storageClassName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ebs</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 4Gi</span><br></div></code></pre></div></div>
<p>Finally, attach the PVC to the Pod and deploy:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">10-persistent-volumes/persistent-volume-claim.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> centos</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'/bin/sh'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">args</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'-c'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'while true; do echo $(date -u) &gt;&gt; /data/out.txt; sleep 5; done'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">volumeMounts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> persistent</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">mountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /data</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> persistent</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">persistentVolumeClaim</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">claimName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ebs</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">claim</span><br></div></code></pre></div></div>
<p>As soon as the Pod is created, a <code>gp3</code> volume is provisioned.</p>
<p><img decoding="async" loading="lazy" alt="PVC" src="https://your-docusaurus-site.example.com/assets/images/pvc-96cd8044b685333804dd96362d98f4eb.png" width="2732" height="892" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-prometheus-and-grafana">11: Prometheus and Grafana<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#11-prometheus-and-grafana" class="hash-link" aria-label="Direct link to 11: Prometheus and Grafana" title="Direct link to 11: Prometheus and Grafana" translate="no">​</a></h2>
<p>The next several sections focus on observability. <a href="https://prometheus.io/" target="_blank" rel="noopener noreferrer" class="">Prometheus</a> is an open-source monitoring system commonly leveraged in Kubernetes clusters. As a de facto standard, it's widely used with <a href="https://grafana.com/" target="_blank" rel="noopener noreferrer" class="">Grafana</a> to provide cluster monitoring. Using Helm we can quickly deploy both of these tools to our cluster.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">11-prometheus-and-grafana/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># install Helm on local machine</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># https://helm.sh/docs/intro/install/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> helm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># install Helm charts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm repo </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> prometheus-community https://prometheus-community.github.io/helm-charts</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm repo update</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> v60-0-1 prometheus-community/kube-prometheus-stack </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60.0</span><span class="token plain">.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># use http://localhost:9090 to access Prometheus</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl port-forward svc/prometheus-operated </span><span class="token number" style="color:#36acaa">9090</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># get Grafana password for admin</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get secret v60-0-1-grafana </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">jsonpath</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"{.data.admin-password}"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> base64 </span><span class="token parameter variable" style="color:#36acaa">--decode</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token builtin class-name">echo</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># use http://localhost:3000 to access Grafana</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl port-forward svc/v60-0-1-grafana </span><span class="token number" style="color:#36acaa">3000</span><span class="token plain">:80</span><br></div></code></pre></div></div>
<p>Using port forwarding, we can quickly access Prometheus:</p>
<p><img decoding="async" loading="lazy" alt="Prometheus" src="https://your-docusaurus-site.example.com/assets/images/prometheus-f82b5b53c4214329e2d7195b286d4b71.png" width="3456" height="1802" class="img_ev3q"></p>
<p>And Grafana:</p>
<p><img decoding="async" loading="lazy" alt="Grafana" src="https://your-docusaurus-site.example.com/assets/images/grafana-ee985a82dabf911260c1c95b889c7d99.png" width="3456" height="1812" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-container-insights">12: Container Insights<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#12-container-insights" class="hash-link" aria-label="Direct link to 12: Container Insights" title="Direct link to 12: Container Insights" translate="no">​</a></h2>
<p>Prometheus and Grafana are both open-source and cloud-agnostic. AWS has a native infrastructure monitoring offering called <a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContainerInsights.html" target="_blank" rel="noopener noreferrer" class="">Container Insights</a> that integrates cluster data with the AWS Console via CloudWatch with two simple commands:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">12-container-insights/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># configure permissions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># change role to the one created by eksctl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws iam attach-role-policy </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--role-name </span><span class="token variable" style="color:#36acaa">$EKSCTL_NODEGROUP_ROLE_NAME</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># wait until add-on is installed and give time for data to propagate</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws eks create-addon --cluster-name learning-kubernetes --addon-name amazon-cloudwatch-observability</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Container Insights" src="https://your-docusaurus-site.example.com/assets/images/container-insights-18c40b4aeab21aea360c7ec7b79e2fba.png" width="3456" height="1724" class="img_ev3q"></p>
<p>It's worth noting that Container Insights can also <a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContainerInsights-Prometheus.html" target="_blank" rel="noopener noreferrer" class="">ingest Prometheus metrics</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-eks-split-cost-allocation-data-in-cost-and-usage-reports">13: EKS Split Cost Allocation Data in Cost and Usage Reports<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#13-eks-split-cost-allocation-data-in-cost-and-usage-reports" class="hash-link" aria-label="Direct link to 13: EKS Split Cost Allocation Data in Cost and Usage Reports" title="Direct link to 13: EKS Split Cost Allocation Data in Cost and Usage Reports" translate="no">​</a></h2>
<p>The <a href="https://docs.aws.amazon.com/cur/latest/userguide/what-is-cur.html" target="_blank" rel="noopener noreferrer" class="">AWS Cost and Usage Reports</a> (CUR) are the most comprehensive and detailed billing data available to customers. It offers <a href="https://docs.aws.amazon.com/cur/latest/userguide/table-dictionary-cur2.html" target="_blank" rel="noopener noreferrer" class="">a well-defined schema</a> that we can use to write <a href="https://catalog.workshops.aws/cur-query-library/en-US" target="_blank" rel="noopener noreferrer" class="">SQL queries against via Athena</a>. CUR data offers resource-level time series data for in-depth AWS cost and usage analysis. In April 2024, AWS released <a href="https://docs.aws.amazon.com/cur/latest/userguide/split-cost-allocation-data.html" target="_blank" rel="noopener noreferrer" class="">EKS split cost allocation data for CUR</a>. Previously, the lowest resource level available was an EC2 instance. This feature adds billing data container-level resources in EKS (e.g., Pods).</p>
<p>Create a new CUR via Data Exports in the Billing and Cost Management Console if required. If you have an existing CUR without split cost allocation data, you can modify the report content configuration to add this.</p>
<p><img decoding="async" loading="lazy" alt="Data Exports" src="https://your-docusaurus-site.example.com/assets/images/data-exports-split-cost-b6916496651ac6c41da93e46579fcc02.png" width="2652" height="1220" class="img_ev3q"></p>
<p>With this configured, we can use the following <a href="https://docs.aws.amazon.com/cur/latest/userguide/cur-query-athena.html" target="_blank" rel="noopener noreferrer" class="">SQL query in Athena</a> to gather cost and usage data for the EKS cluster resources:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">13-cur-split-cost-allocation/query.sql</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  DATE_FORMAT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    DATE_TRUNC</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'day'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"line_item_usage_start_date"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'%Y-%m-%d'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"date"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">"line_item_resource_id"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"resource_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">CONCAT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">REPLACE</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      SPLIT_PART</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"line_item_resource_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'pod'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'cluster'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SPLIT_PART</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">"line_item_resource_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cluster_arn"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SPLIT_PART</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"line_item_resource_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cluster_name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"split_line_item_parent_resource_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"node_instance_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"resource_tags_aws_eks_node"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"node_name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SPLIT_PART</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"line_item_resource_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"namespace"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"resource_tags_aws_eks_workload_type"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"controller_kind"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"resource_tags_aws_eks_workload_name"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"controller_name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"resource_tags_aws_eks_deployment"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"deployment"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SPLIT_PART</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"line_item_resource_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pod_name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ARBITRARY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SPLIT_PART</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"line_item_resource_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pod_uid"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">SUM</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">CASE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">WHEN</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"line_item_usage_type"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">LIKE</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'%EKS-EC2-vCPU-Hours'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">THEN</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"split_line_item_split_cost"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"split_line_item_unused_cost"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ELSE</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">END</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cpu_cost"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">SUM</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">CASE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">WHEN</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"line_item_usage_type"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">LIKE</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'%EKS-EC2-GB-Hours'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">THEN</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"split_line_item_split_cost"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"split_line_item_unused_cost"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ELSE</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">END</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ram_cost"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">SUM</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"split_line_item_split_cost"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"split_line_item_unused_cost"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"total_cost"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  cur</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">"line_item_operation"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'EKSPod-EC2'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">CURRENT_DATE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTERVAL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'7'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DAY</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"line_item_usage_start_date"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">GROUP</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">"cluster_arn"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">"date"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">DESC</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Athena" src="https://your-docusaurus-site.example.com/assets/images/cur-split-cost-allocation-56b1a1e671afb14f2687f5330d9f9be1.png" width="3050" height="1666" class="img_ev3q"></p>
<p>AWS also offers <a href="https://d1s0yx3p3y3rah.cloudfront.net/anonymous-embed?dashboard=containers-cost-allocation&amp;sheet=default" target="_blank" rel="noopener noreferrer" class="">open-source QuickSight dashboards</a> that provide a visualization of this data.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="14-configmap-ckad-topic">14: ConfigMap (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#14-configmap-ckad-topic" class="hash-link" aria-label="Direct link to 14: ConfigMap (CKAD Topic)" title="Direct link to 14: ConfigMap (CKAD Topic)" translate="no">​</a></h2>
<p>The following two sections focus on configuration management. A <a href="https://kubernetes.io/docs/concepts/configuration/configmap/" target="_blank" rel="noopener noreferrer" class="">ConfigMap</a> is a Kubernetes construct that stores non-sensitive key-value pairs (e.g., URLs, feature flags, etc.). There are several ways to consume ConfigMaps, but we'll set an environment variable for a container below. First, I created a TypeScript <a href="https://aws.amazon.com/cdk/" target="_blank" rel="noopener noreferrer" class="">Cloud Development Kit</a> (CDK) application to deploy a <a href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener noreferrer" class="">FastAPI</a> container to Elastic Container Repository (ECR). The API is simple:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">14-configmap/api-cdk/container/app/main.py</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">api </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fastapi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">FastAPI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@api</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/api/config'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">config</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'message'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'CONFIG_MESSAGE'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Message not set'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>We publish the container to ECR via CDK:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">14-configmap/api-cdk/lib/api-cdk-stack.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports operator" style="color:#393A34">*</span><span class="token imports"> </span><span class="token imports keyword module" style="color:#00009f">as</span><span class="token imports"> cdk</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'aws-cdk-lib'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Construct</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'constructs'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">DockerImageAsset</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'aws-cdk-lib/aws-ecr-assets'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name">ApiCdkStack</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">cdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Stack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">constructor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">Construct</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> cdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">StackProps</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">super</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> dockerImageAsset </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name">DockerImageAsset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'MyDockerImage'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      directory</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./container/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Next, we define the ConfigMap:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">14-configmap/configmap.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">configmap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">config-message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Hello from ConfigMap!'</span><br></div></code></pre></div></div>
<p>Finally, we reference the ConfigMap in the Deployment:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">14-configmap/deployment.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># deployed via CDK</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># replace with your image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 196736724465.dkr.ecr.us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2.amazonaws.com/cdk</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hnb659fds</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">assets</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">196736724465</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">afbbd8d7b43a7f833eb07c26a13d5344fa7656c136b1e27b545490fa58dad983</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CONFIG_MESSAGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">valueFrom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">configMapKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">configmap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">message</span><br></div></code></pre></div></div>
<p>With the API deployed, we can verify that the configuration propagates correctly.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">14-configmap/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># entering BusyBox container shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl run </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--restart</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Never busybox </span><span class="token parameter variable" style="color:#36acaa">--image</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">busybox </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> config-api-service:80/api/config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> config</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="15-secrets-ckad-topic">15: Secrets (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#15-secrets-ckad-topic" class="hash-link" aria-label="Direct link to 15: Secrets (CKAD Topic)" title="Direct link to 15: Secrets (CKAD Topic)" translate="no">​</a></h2>
<p><a href="https://kubernetes.io/docs/concepts/configuration/secret/" target="_blank" rel="noopener noreferrer" class="">Secrets</a> are very similar to ConfigMaps except that they are intended for sensitive information. Opaque is the default type of Secret for arbitrary user data unless you need to store SSH credentials, TLS certificates, <code>~/.dockercfg</code>, etc. For a complete list of types, see the <a href="https://kubernetes.io/docs/concepts/configuration/secret/#secret-types" target="_blank" rel="noopener noreferrer" class="">documentation</a>. Kubernetes Secrets do not encrypt the data on your behalf. That responsibility is on the developer.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">15-secrets/secret.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Secret</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> busybox</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">password</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Opaque</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> MWYyZDFlMmU2N2Rm</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="16-multi-container-pods-ckad-topic">16: Multi-Container Pods (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#16-multi-container-pods-ckad-topic" class="hash-link" aria-label="Direct link to 16: Multi-Container Pods (CKAD Topic)" title="Direct link to 16: Multi-Container Pods (CKAD Topic)" translate="no">​</a></h2>
<p>In the examples so far, Pods and containers had a 1:1 relationship. Two common patterns for multi-container Pods in Kubernetes are <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" target="_blank" rel="noopener noreferrer" class="">init containers</a> and <a href="https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/" target="_blank" rel="noopener noreferrer" class="">sidecars</a>. To illustrate these patterns, we'll use a PostgreSQL database with a backend that relies on it. Given that the backend container depends on the database, we must ensure that PostgreSQL is available before starting it. To do so, we can use an init container that verifies the ability to connect to the database. All init containers run before the Pod starts. If any init container fails, the Pod fails.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">16-multi-container-pods/backend.deployment.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> backend</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">database</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> backend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> backend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">initContainers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> verify</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">database</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">online</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token string" style="color:#e3116c">'sh'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token string" style="color:#e3116c">'-c'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              'until pg_isready </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">h database</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">p 5432;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              do echo waiting for database; sleep 2; done;'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> backend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div></code></pre></div></div>
<p>An example of a sidecar container is a GUI called Adminer for the database. The GUI has a lifecycle tightly coupled to the Postgres container (i.e., if we don't need the database anymore, we don't need the GUI). To configure a sidecar, append another container to the Deployment's <code>spec</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">16-multi-container-pods/database.deployment.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">database</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">envFrom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">configMapRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">access</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5432</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">admin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> adminer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><br></div></code></pre></div></div>
<p>With the sidecar in place, we can deploy and leverage the GUI to log into our database.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">16-multi-container-pods/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># assumes cluster created from 00-eksctl-configuration first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> database.configmap.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> backend.deployment.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># check that the primary container is not yet running because the init container has not completed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># STATUS shows as Init:0/1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># deploy database and service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> database.deployment.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> database.service.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># verify that init container has completed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># get database pod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># forward ports</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl port-forward pod/postgres-database-697695b774-xcp9p </span><span class="token number" style="color:#36acaa">9000</span><span class="token plain">:8080</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># open Adminer in browser</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># see screenshot for logging in</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> http://localhost:9000</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># clean up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl delete </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> ./</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="17-deployment-strategies-ckad-topic">17: Deployment Strategies (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#17-deployment-strategies-ckad-topic" class="hash-link" aria-label="Direct link to 17: Deployment Strategies (CKAD Topic)" title="Direct link to 17: Deployment Strategies (CKAD Topic)" translate="no">​</a></h2>
<p>The four most common deployment strategies are rolling, blue/green, canary, and recreate. Rolling updates involve deploying new Pods in a batch while decreasing old Pods at the same rate. This is the default behavior in Kubernetes. Blue/green deployments provision an entirely new environment (green) parallel to the existing one (blue), then perform a Service selector cutover when approved for production release. Canary deployments allow developers to test a new deployment with a subset of users in parallel with the current production release. Recreating an environment involves destroying the old environment and then provisioning a new one, which may result in downtime.</p>
<p>For a blue/green release, let's start by creating the blue and green deployments. The following YAML for the blue deployment is nearly identical to the green. The only difference is the Docker image used.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">17-deployment-strategies/blue-green-deployment/blue.deployment.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blue</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blue</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blue</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># the green deployment uses the green Docker image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blue</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> scottenriquez/blue</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">imagePullPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Always</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'128Mi'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'200m'</span><br></div></code></pre></div></div>
<p>By default, the production Service should point to the blue environment.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">17-deployment-strategies/blue-green-deployment/production.service.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterIP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">9000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><br></div></code></pre></div></div>
<p>To perform the release, change the selector on the Production service. Then verify that the web application contains the green release instead of the blue.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">17-deployment-strategies/blue-green-deployment/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># perform cutover</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># can also be done via manifest</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl </span><span class="token builtin class-name">set</span><span class="token plain"> selector </span><span class="token function" style="color:#d73a49">service</span><span class="token plain"> production-service </span><span class="token string" style="color:#e3116c">'role=green'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># entering BusyBox container shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl run </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--restart</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Never busybox </span><span class="token parameter variable" style="color:#36acaa">--image</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">busybox </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># verify green in HTML</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> production-service:9000</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> index.html</span><br></div></code></pre></div></div>
<p>Switching gears to a canary release, we start by creating stable and canary Deployments. In this code example, the two web applications are nearly identical, except that the canary has a yellow message in a <code>&lt;h1&gt;</code> tag. We control the percentage of canary Pods by splitting the number of canary and stable replicas. For this example, there is a 20% chance of using a canary Pod because there is one canary replica and four stable replicas.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">17-deployment-strategies/canary-deployment/canary.deployment.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> canary</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># the stable Deployment has four replicas</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">track</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> canary</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">track</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> canary</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># the stable deployment uses the stable Docker image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> canary</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> scottenriquez/canary</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">imagePullPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Always</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'128Mi'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'200m'</span><br></div></code></pre></div></div>
<p>With this approach, traffic will be directed to the canary pod on average 20% of the time. It may take several requests to the Service, but a canary webpage will eventually be returned.</p>
<p><img decoding="async" loading="lazy" alt="Canary" src="https://your-docusaurus-site.example.com/assets/images/canary-a5ebdc94a14460fa544e1424c565ee62.png" width="3422" height="1132" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="18-probes-ckad-topic">18: Probes (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#18-probes-ckad-topic" class="hash-link" aria-label="Direct link to 18: Probes (CKAD Topic)" title="Direct link to 18: Probes (CKAD Topic)" translate="no">​</a></h2>
<p>There are two primary types of probes: <a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/" target="_blank" rel="noopener noreferrer" class="">readiness and liveness</a>. Kubernetes uses liveness probes to determine when to restart a container (i.e., a health check). It uses readiness probes to determine when a container is ready to accept traffic. These two probes are independent and unaware of each other. Probes of type HTTP, TCP, gRPC, and shell commands are supported. For this example, we'll use HTTP for both and add them as endpoints to an API:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">18-probes-and-health-checks/api-cdk/container/app/main.py</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token decorator annotation punctuation" style="color:#393A34">@api</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/api/healthy'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">config</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'healthy'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@api</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/api/ready'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">config</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'ready'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>In the Deployment manifest, we simply map the probes to the endpoints:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">18-probes-and-health-checks/deployment.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> probe</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> probe</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> probe</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> probe</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># deployed via CDK</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># replace with your image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 196736724465.dkr.ecr.us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2.amazonaws.com/cdk</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hnb659fds</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">assets</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">196736724465</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">86b591781a296c7b2980608eeb67e30aaf316c732c92b6a47e536555bce0dc93</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 250m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">livenessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /api/healthy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">readinessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /api/ready</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8000</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="19-securitycontext-ckad-topic">19: SecurityContext (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#19-securitycontext-ckad-topic" class="hash-link" aria-label="Direct link to 19: SecurityContext (CKAD Topic)" title="Direct link to 19: SecurityContext (CKAD Topic)" translate="no">​</a></h2>
<p>A <a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/" target="_blank" rel="noopener noreferrer" class="">SecurityContext</a> resource configures a Pod's privilege and access control settings, such as enabling or disabling Linux capabilities and running as a specific user ID. This topic is straightforward but critical for the exam.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">19-security-context/pod.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> security</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">securityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">runAsUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">runAsGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">fsGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> security</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">volume</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">emptyDir</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> security</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> busybox</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">1.28</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'sh'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'-c'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'id'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">volumeMounts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> security</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">volume</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">mountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /data/security</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">volume</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">securityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">allowPrivilegeEscalation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="20-serviceaccounts-and-role-based-access-control-ckad-topic">20: ServiceAccounts and Role-Based Access Control (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#20-serviceaccounts-and-role-based-access-control-ckad-topic" class="hash-link" aria-label="Direct link to 20: ServiceAccounts and Role-Based Access Control (CKAD Topic)" title="Direct link to 20: ServiceAccounts and Role-Based Access Control (CKAD Topic)" translate="no">​</a></h2>
<p>Like how Identity and Access Management (IAM) in AWS grants principals permissions to specific actions for specific resources, Kubernetes <a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/" target="_blank" rel="noopener noreferrer" class="">Roles</a> and <a href="https://kubernetes.io/docs/concepts/security/service-accounts/" target="_blank" rel="noopener noreferrer" class="">ServiceAccounts</a> allow resources within the cluster to leverage the control plane to perform operations on the cluster. For this example, let's grant a Pod access to <code>get</code> other Pods. We start by creating a Role:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">20-service-accounts-and-rbac/role.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rbac.authorization.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Role</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">reader</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># "" indicates the core API group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">apiGroups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'pods'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">verbs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'get'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'watch'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'list'</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p>A ServiceAccount&nbsp;provides an identity for processes that run inside Pods. We generate one next:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">20-service-accounts-and-rbac/service-account.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ServiceAccount</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kubernetes.io/enforce-mountable-secrets</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'true'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sa</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">reader</span><br></div></code></pre></div></div>
<p>Next, we bind the Role to the ServiceAccount:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">20-service-accounts-and-rbac/role-binding.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rbac.authorization.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RoleBinding</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> read</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">subjects</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ServiceAccount</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sa</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">reader</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">apiGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">roleRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Role</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">reader</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">apiGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><br></div></code></pre></div></div>
<p>Then, we create a Pod that leverages the ServiceAccount:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">20-service-accounts-and-rbac/pod.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> reader</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">serviceAccountName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sa</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">reader</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> reader</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> alpine</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">3.12</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'128Mi'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'500m'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'/bin/sh'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">args</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'-c'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sleep 3600'</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p>Finally, we can test specific operations against the API server to validate that certain actions are allowed and others are denied.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">20-service-accounts-and-rbac/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># entering Pod shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl </span><span class="token builtin class-name">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> reader-pod -- </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># install curl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">apk </span><span class="token parameter variable" style="color:#36acaa">--update</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># get Pods</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># allowed by Role</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--header</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Authorization: Bearer </span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable function" style="color:#d73a49">cat</span><span class="token string variable" style="color:#36acaa"> /var/run/secrets/kubernetes.io/serviceaccount/token</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--cacert</span><span class="token plain"> /var/run/secrets/kubernetes.io/serviceaccount/ca.crt https://kubernetes/api/v1/namespaces/default/pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># get Secrets</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># denied by Role</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--header</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Authorization: Bearer </span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable function" style="color:#d73a49">cat</span><span class="token string variable" style="color:#36acaa"> /var/run/secrets/kubernetes.io/serviceaccount/token</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--cacert</span><span class="token plain"> /var/run/secrets/kubernetes.io/serviceaccount/ca.crt https://kubernetes/api/v1/namespaces/default/secrets</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-networkpolicy-ckad-topic">21: NetworkPolicy (CKAD Topic)<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#21-networkpolicy-ckad-topic" class="hash-link" aria-label="Direct link to 21: NetworkPolicy (CKAD Topic)" title="Direct link to 21: NetworkPolicy (CKAD Topic)" translate="no">​</a></h2>
<p>By default, network traffic between Pods is unrestricted. In other words, any Pod can communicate with any other Pod. A <a href="https://kubernetes.io/docs/concepts/services-networking/network-policies/" target="_blank" rel="noopener noreferrer" class="">NetworkPolicy</a> is a Kubernetes resource that uses selectors to implement granular ingress and egress rules. However, a <a href="https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/" target="_blank" rel="noopener noreferrer" class="">network plugin</a> must first be installed in the cluster to leverage NetworkPolicies. For this example, we will use <a href="https://docs.tigera.io/calico/latest/about/" target="_blank" rel="noopener noreferrer" class="">Calico</a>. For EKS, this only requires two commands:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">21-network-policy/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> - </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token string" style="color:#e3116c">EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">kind: Installation</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">apiVersion: operator.tigera.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  name: default</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  kubernetesProvider: EKS</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  cni:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    type: AmazonVPC</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  calicoNetwork:</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">    bgp: Disabled</span><br></div><div class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">EOF</span><br></div></code></pre></div></div>
<p>With the network plugin installed, we can define a simple NetworkPolicy based on three example Pods:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">21-network-policy/network-policy.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> NetworkPolicy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">one</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">and</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">two</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">policy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">podSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># this label is also attached to the first two Pods but not the third</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">network</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> allow</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">one</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">and</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">two</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyTypes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Egress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">from</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">podSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">network</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> allow</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">one</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">and</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">two</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">to</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">podSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">network</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> allow</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">one</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">and</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">two</span><br></div></code></pre></div></div>
<p>After applying the manifest above, we can validate that the network traffic now behaves as expected (i.e., the first two Pods can communicate with each other without allowing traffic from the third).</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">21-network-policy/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># get Pod IP addresses</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># enter pod-three shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl </span><span class="token builtin class-name">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> pod-three -- </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ping pod-one and pod-two IP address (replace with yours)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># these commands should hang</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ping</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">192.168</span><span class="token plain">.2.246</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ping</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">192.168</span><span class="token plain">.21.2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># returning to default shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">exit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># enter pod-one shell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl </span><span class="token builtin class-name">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-it</span><span class="token plain"> pod-one -- </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ping pod-two IP address (replace with yours)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># this command should be successful</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ping</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">192.168</span><span class="token plain">.21.2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ping pod-three IP address (replace with yours)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># this command should hang</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ping</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">192.168</span><span class="token plain">.71.123</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-argocd">22: ArgoCD<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#22-argocd" class="hash-link" aria-label="Direct link to 22: ArgoCD" title="Direct link to 22: ArgoCD" translate="no">​</a></h2>
<p>ArgoCD is a declarative continuous delivery tool for Kubernetes that leverages the GitOps pattern (i.e., storing configuration files in a Git repository to serve as the single source of truth). Instead of developers constantly typing <code>kubectl apply -f manifest.yaml</code>, ArgoCD monitors a specified Git repository for changes to manifests. ArgoCD applications can be configured to automatically update when deltas are detected or require manual intervention. Applications can be created using a GUI or through a YAML file. To get started, we install ArgoCD on the cluster and configure port forwarding to access the UI locally.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">22-argocd/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># install CLI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># install ArgoCD on the cluster</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create namespace argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> argocd </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># get initial password</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd admin initial-password </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># forward ports to access the ArgoCD UI locally</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl port-forward svc/argocd-server </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> argocd </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain">:443</span><br></div></code></pre></div></div>
<p>Once we've navigated to the UI in the browser, we create an ArgoCD application using the following YAML:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">22-argocd/argocd-application.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">webapp</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destination</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">webapp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># all credit to devopsjourney1 for the repository</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># https://github.com/devopsjourney1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># https://www.youtube.com/@DevOpsJourney</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repoURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/scottenriquez/argocd</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">examples</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetRevision</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HEAD</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">valueFiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> values</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">project</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">syncPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">automated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">prune</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">selfHeal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><br></div></code></pre></div></div>
<p>Based on the configuration, the ArgoCD application will automatically be updated when we commit to the specified GitHub repository. Via the UI, we can monitor the resources that have been created, sync status, commit information, etc.</p>
<p><img decoding="async" loading="lazy" alt="ArgoCD" src="https://your-docusaurus-site.example.com/assets/images/argocd-910df0172334a0617317ec0fc5bd774a.png" width="3456" height="1810" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="23-cdk8s">23: cdk8s<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#23-cdk8s" class="hash-link" aria-label="Direct link to 23: cdk8s" title="Direct link to 23: cdk8s" translate="no">​</a></h2>
<p>The AWS Cloud Development Kit (CDK) is an open-source software development framework that brings the capabilities of general-purpose programming languages (e.g., unit testing, adding robust logic, etc.) to infrastructure as code. In addition to being more ergonomic for those with a software engineering background, CDK also provides higher levels of abstraction through <a href="https://docs.aws.amazon.com/cdk/v2/guide/constructs.html" target="_blank" rel="noopener noreferrer" class="">constructs</a> and <a href="https://cdkpatterns.com/" target="_blank" rel="noopener noreferrer" class="">patterns</a>. HashiCorp also created a spinoff called <a href="https://developer.hashicorp.com/terraform/cdktf" target="_blank" rel="noopener noreferrer" class="">CDK for Terraform</a> (CDKTF). Using a similar design, AWS created a project called <a href="https://cdk8s.io/" target="_blank" rel="noopener noreferrer" class="">Cloud Development Kit for Kubernetes</a> (cdk8s). Rather than managing the cloud infrastructure, cdk8s only manages the resources within a Kubernetes cluster. The code compiles the TypeScript (or language of your choice) to a YAML manifest file. Below is an example:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">23-cdk8s/cluster/main.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name">MyChart</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name maybe-class-name">Chart</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">constructor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">Construct</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">ChartProps</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">super</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name">KubeDeployment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'my-deployment'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      spec</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        replicas</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        selector</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> matchLabels</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> app</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'frontend'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        template</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          metadata</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> labels</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> app</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'frontend'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          spec</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            containers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'app-container'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                image</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'nginx:latest'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                ports</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> containerPort</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Which produces:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">my</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">c8e7fb18</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">container</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="24-openfaas">24: OpenFaaS<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#24-openfaas" class="hash-link" aria-label="Direct link to 24: OpenFaaS" title="Direct link to 24: OpenFaaS" translate="no">​</a></h2>
<p><a href="https://www.openfaas.com/" target="_blank" rel="noopener noreferrer" class="">OpenFaaS</a> is a nifty project that allows you to run serverless functions on Kubernetes. We start by installing OpenFaaS to our cluster and as a CLI:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">24-openfaas/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># install CLI on local machine</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># https://docs.openfaas.com/cli/install/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> faas-cli</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># create namespace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> namespace.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># add Helm charts to cluster</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm repo </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> openfaas https://openfaas.github.io/faas-netes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> my-openfaas openfaas/openfaas </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">14.2</span><span class="token plain">.49 </span><span class="token parameter variable" style="color:#36acaa">--namespace</span><span class="token plain"> openfaas</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># forward the API's port in a separate terminal tab</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl port-forward svc/gateway </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--namespace</span><span class="token plain"> openfaas</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># fetch password and log in</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">faas-cli login </span><span class="token parameter variable" style="color:#36acaa">--password</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable" style="color:#36acaa">kubectl </span><span class="token variable parameter variable" style="color:#36acaa">-n</span><span class="token variable" style="color:#36acaa"> openfaas get secret basic-auth </span><span class="token variable parameter variable" style="color:#36acaa">-o</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable assign-left variable" style="color:#36acaa">jsonpath</span><span class="token variable operator" style="color:#393A34">=</span><span class="token variable string" style="color:#e3116c">"{.data.basic-auth-password}"</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable operator" style="color:#393A34">|</span><span class="token variable" style="color:#36acaa"> base64 </span><span class="token variable parameter variable" style="color:#36acaa">--decode</span><span class="token variable" style="color:#36acaa">)</span><br></div></code></pre></div></div>
<p>Next, we create a simple function that looks similar to AWS Lambda:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">24-openfaas/commands.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># create a function</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">faas-cli new </span><span class="token parameter variable" style="color:#36acaa">--lang</span><span class="token plain"> python openfaas-python-function</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># requires Docker running locally</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">faas-cli build </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> openfaas-python-function.yml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># push to DockerHub</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">faas-cli publish </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> openfaas-python-function.yml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># deploy to cluster</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">faas-cli deploy </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> openfaas-python-function.yml</span><br></div></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">24-openfaas/openfaas-python-function/handler.py</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello from OpenFaaS!"</span><br></div></code></pre></div></div>
<p>Finally, we can invoke the function through the web UI:</p>
<p><img decoding="async" loading="lazy" alt="OpenFaaS" src="https://your-docusaurus-site.example.com/assets/images/open-faas-32c53878ac9fb5b2b3d04021eeded6ae.png" width="3442" height="1806" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="disclaimer">Disclaimer<a href="https://your-docusaurus-site.example.com/blog/ckad-prep-using-amazon-eks#disclaimer" class="hash-link" aria-label="Direct link to Disclaimer" title="Direct link to Disclaimer" translate="no">​</a></h2>
<p>At the time of writing this blog post, I currently work for Amazon Web Services. The opinions and views expressed here are my own and not the views of my employer.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[The Nature of Code Companion Series: Chapter One]]></title>
            <link>https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples</link>
            <guid>https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples</guid>
            <pubDate>Sat, 25 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[A companion for chapter one of Daniel Shiffman's book.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="about-the-book">About the Book<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples#about-the-book" class="hash-link" aria-label="Direct link to About the Book" title="Direct link to About the Book" translate="no">​</a></h2>
<p>Recently, I started reading a fantastic book called <em>The Nature of Code</em> by Daniel Shiffman. From the <a href="https://natureofcode.com/" target="_blank" rel="noopener noreferrer" class="">description</a>:</p>
<blockquote>
<p>How can we capture the unpredictable evolutionary and emergent properties of nature in software? How can understanding the mathematical principles behind our physical world help us to create digital worlds? This book focuses on a range of programming strategies and techniques behind computer simulations of natural systems, from elementary concepts in mathematics and physics to more advanced algorithms that enable sophisticated visual results. Readers will progress from building a basic physics engine to creating intelligent moving objects and complex systems, setting the foundation for further experiments in generative design.</p>
</blockquote>
<p>Daniel implements numerous examples using a programming language called <a href="https://processing.org/" target="_blank" rel="noopener noreferrer" class="">Processing</a>. Instead, I decided to write my own versions using JavaScript, React, Three.js, and D3. For this blog series, I intend to implement my learnings from each chapter.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="previous-entries-in-the-blog-series">Previous Entries in the Blog Series<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples#previous-entries-in-the-blog-series" class="hash-link" aria-label="Direct link to Previous Entries in the Blog Series" title="Direct link to Previous Entries in the Blog Series" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://scottie.is/blog/nature-of-code-introduction-examples" target="_blank" rel="noopener noreferrer" class="">Introduction</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="source-code">Source Code<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples#source-code" class="hash-link" aria-label="Direct link to Source Code" title="Direct link to Source Code" translate="no">​</a></h2>
<p>The source code for this post is located on <a href="https://github.com/scottenriquez/scottie-is-xxx-v3/tree/main/scottie-is-xxx/src/components/NatureOfCode/One" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-euclidean-vectors">Introduction to Euclidean Vectors<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples#introduction-to-euclidean-vectors" class="hash-link" aria-label="Direct link to Introduction to Euclidean Vectors" title="Direct link to Introduction to Euclidean Vectors" translate="no">​</a></h2>
<p>The book references example code in the Processing programming language that simulates a bouncing ball in two-dimensional space. Below is the core logic:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">Bounce.pde</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">draw</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  xpos </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> xpos </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">xspeed </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> xdirection</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ypos </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ypos </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">yspeed </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> ydirection</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// width-rad and rad refer to the boundaries of the screen</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">xpos </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> width</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">rad </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> xpos </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> rad</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// invert direction if an edge has been hit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    xdirection </span><span class="token operator" style="color:#393A34">*=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ypos </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> height</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">rad </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> ypos </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> rad</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// invert direction if an edge has been hit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ydirection </span><span class="token operator" style="color:#393A34">*=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">ellipseMode</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">RADIUS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">fill</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">256</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">ellipse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">xpos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ypos</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rad</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rad</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>This image from the Processing code output shows the ball's movement through vector space. The circle's path is tracked by selecting a random color for the ball on each iteration:</p>
<p><img decoding="async" loading="lazy" alt="Bouncing Ball Processing" src="https://your-docusaurus-site.example.com/assets/images/bouncing-ball-processing-19bc62dd4d18491acb63e2b1e45ce17f.png" width="1288" height="718" class="img_ev3q"></p>
<p>From <a href="https://en.wikipedia.org/wiki/Euclidean_vector" target="_blank" rel="noopener noreferrer" class="">Wikipedia</a>:</p>
<blockquote>
<p>In mathematics, physics, and engineering, a Euclidean vector or simply a vector (sometimes called a geometric vector or spatial vector) is a geometric object that has magnitude (or length) and direction. Euclidean vectors can be added and scaled to form a vector space. A Euclidean vector is frequently represented by a directed line segment, or graphically as an arrow connecting an initial point <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal">A</span></span></span></span> with a terminal point <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal" style="margin-right:0.0502em">B</span></span></span></span>.</p>
</blockquote>
<p>To expand this example to the third dimension, additional variables called <code>zpos</code> and <code>zspeed</code> are required. Obviously, this approach does not scale well to <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span></span></span></span> dimensions since each needs new speed and position variables. While vectors alone don't expand the physics functionality (e.g., the circle's motion), they streamline and minimize the amount of code required to include new dimensions. In JavaScript, we can write a simple class to organize the components and implement vector operations such as addition.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/components/NatureOfCode/One/NVector/nVector.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">constructor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter spread operator" style="color:#393A34">...</span><span class="token parameter">components</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> components</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">get</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dimensions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// assumes that the second vector has the same dimensions as the first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">otherVector</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token spread operator" style="color:#393A34">...</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">component</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> component </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> otherVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>After instantiating two <code>NVector</code> objects, a third vector can be created to capture the sum. This vector addition is the basis for simulating motion:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> circleLocation </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> circleVelocity </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">circleLocation </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> circleLocation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">circleVelocity</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// { components: [5, 7, 9] }</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">circleLocation</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>In other words (with location as <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em"></span><span class="mord mathnormal" style="margin-right:0.0197em">l</span></span></span></span> and velocity as <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal" style="margin-right:0.0359em">v</span></span></span></span>):</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>l</mi><mo stretchy="true">→</mo></mover><mo>=</mo><mover accent="true"><mi>l</mi><mo stretchy="true">→</mo></mover><mo>+</mo><mover accent="true"><mi>v</mi><mo stretchy="true">→</mo></mover></mrow><annotation encoding="application/x-tex">\overrightarrow{l} = \overrightarrow{l} + \overrightarrow{v}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2164em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.2164em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0197em">l</span></span><span class="svg-align" style="top:-3.6944em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.2998em;vertical-align:-0.0833em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.2164em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0197em">l</span></span><span class="svg-align" style="top:-3.6944em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.9526em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9526em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0359em">v</span></span><span class="svg-align" style="top:-3.4306em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span></span></span></span></span>
<p>Or:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mi>x</mi></msub><mo>=</mo><msub><mi>l</mi><mi>x</mi></msub><mo>+</mo><msub><mi>v</mi><mi>x</mi></msub></mrow><annotation encoding="application/x-tex">l_{x} = l_{x} + v_{x}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0197em">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0197em">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span></span>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mi>y</mi></msub><mo>=</mo><msub><mi>l</mi><mi>y</mi></msub><mo>+</mo><msub><mi>v</mi><mi>y</mi></msub></mrow><annotation encoding="application/x-tex">l_{y} = l_{y} + v_{y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0197em">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">y</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0197em">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">y</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">y</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></span></span></span>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mi>z</mi></msub><mo>=</mo><msub><mi>l</mi><mi>z</mi></msub><mo>+</mo><msub><mi>v</mi><mi>z</mi></msub></mrow><annotation encoding="application/x-tex">l_{z} = l_{z} + v_{z}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0197em">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.044em">z</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0197em">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.044em">z</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.044em">z</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span></span>
<p>Vector subtraction behaves the same way as addition:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/components/NatureOfCode/One/NVector/nVector.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// assumes that the second vector has the same dimensions as the first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">subtract</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">otherVector</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">component</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> component </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> otherVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>For multiplication, there are both scalar and vector products:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/components/NatureOfCode/One/NVector/nVector.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">scale</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">scalar</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token spread operator" style="color:#393A34">...</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">component</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> component </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> scalar</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// assumes that the second vector has the same dimensions as the first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">otherVector</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">reduce</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">sum</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> component</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> sum </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> component </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> otherVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">components</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Scalar multiplication can be written as (where <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span></span></span></span> is a single number):</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>w</mi><mo stretchy="true">→</mo></mover><mo>=</mo><mover accent="true"><mi>u</mi><mo stretchy="true">→</mo></mover><mo>∗</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">\overrightarrow{w} = \overrightarrow{u} * n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9526em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9526em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0269em">w</span></span><span class="svg-align" style="top:-3.4306em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.9526em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9526em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">u</span></span><span class="svg-align" style="top:-3.4306em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span></span></span></span></span>
<p>Or:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>w</mi><mi>x</mi></msub><mo>=</mo><msub><mi>u</mi><mi>x</mi></msub><mo>∗</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">w_{x} = u_{x} * n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0269em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6153em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span></span></span></span></span>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>w</mi><mi>y</mi></msub><mo>=</mo><msub><mi>u</mi><mi>y</mi></msub><mo>∗</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">w_{y} = u_{y} * n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0269em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">y</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.7514em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">y</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span></span></span></span></span>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>w</mi><mi>z</mi></msub><mo>=</mo><msub><mi>u</mi><mi>z</mi></msub><mo>∗</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">w_{z} = u_{z} * n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0269em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.044em">z</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6153em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.044em">z</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span></span></span></span></span>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> u </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> n </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> w </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> u</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">scale</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">n</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// { components: [3, 9, 15] }</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">w</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>For dot products (where <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span></span></span></span> is the dimension of vector space):</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mstyle scriptlevel="0" displaystyle="true"><mi mathvariant="bold">u</mi><mo>⋅</mo><mi mathvariant="bold">v</mi><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>u</mi><mi>i</mi></msub><msub><mi>v</mi><mi>i</mi></msub><mo>=</mo><msub><mi>u</mi><mn>1</mn></msub><msub><mi>v</mi><mn>1</mn></msub><mo>+</mo><mo>⋯</mo><mo>+</mo><msub><mi>u</mi><mi>n</mi></msub><msub><mi>v</mi><mi>n</mi></msub></mstyle></mrow><annotation encoding="application/x-tex">{\displaystyle \mathbf {u} \cdot \mathbf {v} =\sum _{i=1}^{n}u_{i}v_{i}=u_{1}v_{1}+\cdots +u_{n}v_{n}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.9291em;vertical-align:-1.2777em"></span><span class="mord"><span class="mord mathbf">u</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord mathbf" style="margin-right:0.016em">v</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span></span></span>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> u </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> v </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> w </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> u</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">dot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">w</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Finally, a vector's magnitude (or length) can be calculated like so:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mstyle scriptlevel="0" displaystyle="true"><mi mathvariant="normal">∥</mi><mi mathvariant="bold">u</mi><mi mathvariant="normal">∥</mi><mo>=</mo><msqrt><mrow><msubsup><mi>u</mi><mn>1</mn><mn>2</mn></msubsup><mo>+</mo><mo>⋯</mo><mo>+</mo><msubsup><mi>u</mi><mi>n</mi><mn>2</mn></msubsup></mrow></msqrt><mi mathvariant="normal">.</mi></mstyle></mrow><annotation encoding="application/x-tex">{\displaystyle \|\mathbf {u} \|={\sqrt {u_{1}^{2}+\cdots +u_{n}^{2}}}.}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.84em;vertical-align:-0.5413em"></span><span class="mord"><span class="mord">∥</span><span class="mord mathbf">u</span><span class="mord">∥</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.2987em"><span class="svg-align" style="top:-3.8em"><span class="pstrut" style="height:3.8em"></span><span class="mord" style="padding-left:1em"><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7959em"><span style="top:-2.4337em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.0448em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2663em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span style="top:-2.989em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span></span></span><span style="top:-3.2587em"><span class="pstrut" style="height:3.8em"></span><span class="hide-tail" style="min-width:1.02em;height:1.88em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.88em" viewBox="0 0 400000 1944" preserveAspectRatio="xMinYMin slice"><path d="M983 90
l0 -0
c4,-6.7,10,-10,18,-10 H400000v40
H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7
s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744
c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30
c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722
c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5
c53.7,-170.3,84.5,-266.8,92.5,-289.5z
M1001 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.5413em"><span></span></span></span></span></span></span><span class="mord">.</span></span></span></span></span></span>
<p>This is useful for normalizing a vector (which we do in the bouncing sphere example later in the post):</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mstyle scriptlevel="0" displaystyle="true"><mover accent="true"><mi mathvariant="bold">u</mi><mo>^</mo></mover><mo>=</mo><mfrac><mi mathvariant="bold">u</mi><mrow><mi mathvariant="normal">∥</mi><mi mathvariant="bold">u</mi><mi mathvariant="normal">∥</mi></mrow></mfrac></mstyle></mrow><annotation encoding="application/x-tex">{\displaystyle \mathbf {\hat {u}} ={\frac {\mathbf {u}}{\|\mathbf {u} \|}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0574em;vertical-align:-0.936em"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7079em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathbf">u</span></span><span style="top:-3.0134em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2875em"><span class="mord mathbf">^</span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">∥</span><span class="mord mathbf">u</span><span class="mord">∥</span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathbf">u</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></span>
<p>With this code in hand (plus <a href="https://threejs.org/" target="_blank" rel="noopener noreferrer" class="">a graphics library called Three.js</a>), we can begin to model vectors in three-dimensional space:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// additionally, a line is drawn between the two vectors</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> vectors </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// use the graphics library's implementation of a vector instead of NVector</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Vector3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Vector3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div id="noc-vector-1-canvas-div" style="height:400px;width:100%;background-color:#272e33;position:relative"><canvas id="noc-bouncing-vector-1-canvas"></canvas><div style="position:absolute;top:0;left:0;width:100%;height:100%;background:radial-gradient(ellipse at center, transparent 40%, rgba(0, 0, 0, 0.6) 80%, rgba(0, 0, 0, 0.9) 100%);pointer-events:none"></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bouncing-sphere">Bouncing Sphere<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples#bouncing-sphere" class="hash-link" aria-label="Direct link to Bouncing Sphere" title="Direct link to Bouncing Sphere" translate="no">​</a></h2>
<p>Using our knowledge of vectors and a Vector class (<code>THREE.Vector3</code>, which is our graphics library's implementation of our <code>NVector</code> class above), we can expand the bouncing ball Processing example into the third dimension. First, we create a sphere with a random starting position vector within the bounds of our space (i.e., -50 to 50).</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/components/NatureOfCode/One/BouncingSphere/boucingSphere.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">generateSphere</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> y </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> z </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphereLocationVector </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Vector3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphereGeometry </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">SphereGeometry</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">32</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphereMaterial </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">MeshStandardMaterial</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">color</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xa4ff90</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">roughness</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphere </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Mesh</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphereGeometry</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sphereMaterial</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphereLocationVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sphereLocationVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sphereLocationVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> sphere</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Similarly to the <code>draw</code> function in the two-dimensional example above, the <code>animate</code> function uses the screen's boundaries as a signal to invert the direction of the sphere's motion by negating the corresponding component in the velocity vector:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/components/NatureOfCode/One/BouncingSphere/sceneInit.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">generateVelocityVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isXPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> y </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isYPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> z </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isZPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Vector3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">animate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphere </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">scene</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getObjectByName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'sphere'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token dom variable" style="color:#36acaa">window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">requestAnimationFrame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">animate</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">topXPosition</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">bottomXPosition</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isXPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isXPositiveDirection</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">topYPosition</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">bottomYPosition</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isYPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isYPositiveDirection</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">z</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">topZPosition</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">z</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">bottomZPosition</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isZPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isZPositiveDirection</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> timeDelta </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">clock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getDelta</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphereVelocityVector </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">generateVelocityVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sphereVelocityVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">multiplyScalar</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">timeDelta</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sphereVelocityVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">normalize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphereVelocityVector</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">render</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">controls</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">update</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>After leveraging the <a href="https://threejs.org/docs/#api/en/core/Clock" target="_blank" rel="noopener noreferrer" class="">clock's time delta</a> (i.e., the time elapsed since the last frame) for scalar multiplication and normalizing the sphere velocity vector, we see the sphere move through our three-dimensional environment.</p>
<div id="noc-bouncing-ball-canvas-div" style="height:400px;width:100%;background-color:#272e33;position:relative"><canvas id="noc-bouncing-ball-canvas"></canvas><div style="position:absolute;top:0;left:0;width:100%;height:100%;background:radial-gradient(ellipse at center, transparent 40%, rgba(0, 0, 0, 0.6) 80%, rgba(0, 0, 0, 0.9) 100%);pointer-events:none"></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bouncing-sphere-with-random-acceleration">Bouncing Sphere with Random Acceleration<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples#bouncing-sphere-with-random-acceleration" class="hash-link" aria-label="Direct link to Bouncing Sphere with Random Acceleration" title="Direct link to Bouncing Sphere with Random Acceleration" translate="no">​</a></h2>
<p>In the first bouncing sphere model, the initial position is random. However, the path that the sphere takes is a deterministic loop. Next, we add random acceleration to the velocity. In other words, the final algorithm is (with <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>u</mi><mo stretchy="true">→</mo></mover></mrow><annotation encoding="application/x-tex">\overrightarrow{u}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9526em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9526em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">u</span></span><span class="svg-align" style="top:-3.4306em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span></span></span></span> as the initial velocity, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>a</mi><mo stretchy="true">→</mo></mover></mrow><annotation encoding="application/x-tex">\overrightarrow{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9526em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9526em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">a</span></span><span class="svg-align" style="top:-3.4306em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span></span></span></span> as acceleration, and <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em"></span><span class="mord mathnormal">t</span></span></span></span> as time):</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>v</mi><mo stretchy="true">→</mo></mover><mo>=</mo><mover accent="true"><mi>u</mi><mo stretchy="true">→</mo></mover><mo>+</mo><mover accent="true"><mi>a</mi><mo stretchy="true">→</mo></mover><mo>∗</mo><mi>t</mi></mrow><annotation encoding="application/x-tex">\overrightarrow{v} = \overrightarrow{u} + \overrightarrow{a} * t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9526em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9526em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0359em">v</span></span><span class="svg-align" style="top:-3.4306em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.0359em;vertical-align:-0.0833em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9526em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">u</span></span><span class="svg-align" style="top:-3.4306em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.9526em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9526em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">a</span></span><span class="svg-align" style="top:-3.4306em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.6151em"></span><span class="mord mathnormal">t</span></span></span></span></span>
<p>With the final velocity as <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">v</mi></mrow><annotation encoding="application/x-tex">{\mathbf {v}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4444em"></span><span class="mord"><span class="mord mathbf" style="margin-right:0.016em">v</span></span></span></span></span>:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mstyle scriptlevel="0" displaystyle="true"><mover accent="true"><mi mathvariant="bold">v</mi><mo>^</mo></mover><mo>=</mo><mfrac><mi mathvariant="bold">v</mi><mrow><mi mathvariant="normal">∥</mi><mi mathvariant="bold">v</mi><mi mathvariant="normal">∥</mi></mrow></mfrac></mstyle></mrow><annotation encoding="application/x-tex">{\displaystyle \mathbf {\hat {v}} ={\frac {\mathbf {v}}{\|\mathbf {v} \|}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0574em;vertical-align:-0.936em"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7079em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathbf" style="margin-right:0.016em">v</span></span><span style="top:-3.0134em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2875em"><span class="mord mathbf">^</span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">∥</span><span class="mord mathbf" style="margin-right:0.016em">v</span><span class="mord">∥</span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathbf" style="margin-right:0.016em">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></span>
<p>With the normalized vector as <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi mathvariant="bold">v</mi><mo>^</mo></mover></mrow><annotation encoding="application/x-tex">{\mathbf {\hat {v}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7079em"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7079em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathbf" style="margin-right:0.016em">v</span></span><span style="top:-3.0134em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2875em"><span class="mord mathbf">^</span></span></span></span></span></span></span></span></span></span></span> and location as <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em"></span><span class="mord mathnormal" style="margin-right:0.0197em">l</span></span></span></span>:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>l</mi><mo stretchy="true">→</mo></mover><mo>=</mo><mover accent="true"><mi>l</mi><mo stretchy="true">→</mo></mover><mo>+</mo><mstyle scriptlevel="0" displaystyle="true"><mover accent="true"><mi mathvariant="bold">v</mi><mo>^</mo></mover></mstyle></mrow><annotation encoding="application/x-tex">{\overrightarrow{l} = \overrightarrow{l} + \displaystyle \mathbf {\hat {v}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2998em;vertical-align:-0.0833em"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.2164em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0197em">l</span></span><span class="svg-align" style="top:-3.6944em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.2164em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0197em">l</span></span><span class="svg-align" style="top:-3.6944em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="height:0.522em;min-width:0.888em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128
-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7079em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathbf" style="margin-right:0.016em">v</span></span><span style="top:-3.0134em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2875em"><span class="mord mathbf">^</span></span></span></span></span></span></span></span></span></span></span></span>
<p>Implemented in JavaScript, this is:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/components/NatureOfCode/One/BouncingSphereWithAcceleration/sceneInit.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">generateVelocityVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isXPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> y </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isYPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> z </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isZPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Vector3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">generateRandomAccelerationVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> y </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> z </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">THREE</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Vector3</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">animate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphere </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">scene</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getObjectByName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'sphere-acceleration'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token dom variable" style="color:#36acaa">window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">requestAnimationFrame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">animate</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">bind</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">topXPosition</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">bottomXPosition</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isXPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isXPositiveDirection</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">topYPosition</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">bottomYPosition</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isYPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isYPositiveDirection</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">z</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">topZPosition</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">z</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">bottomZPosition</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isZPositiveDirection</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">isZPositiveDirection</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> timeDelta </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">clock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getDelta</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphereVelocityVector </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">generateVelocityVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sphereAccelerationVector </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">generateRandomAccelerationVector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sphereVelocityVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">multiplyScalar</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">timeDelta</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sphereVelocityVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphereAccelerationVector</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sphereVelocityVector</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">normalize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sphere</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">position</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sphereVelocityVector</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">render</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">controls</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">update</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div id="noc-bouncing-ball-acceleration-canvas-div" style="height:400px;width:100%;background-color:#272e33;position:relative"><canvas id="noc-bouncing-ball-acceleration-canvas"></canvas><div style="position:absolute;top:0;left:0;width:100%;height:100%;background:radial-gradient(ellipse at center, transparent 40%, rgba(0, 0, 0, 0.6) 80%, rgba(0, 0, 0, 0.9) 100%);pointer-events:none"></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-section">Next Section<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-chapter-one-examples#next-section" class="hash-link" aria-label="Direct link to Next Section" title="Direct link to Next Section" translate="no">​</a></h2>
<p><a href="https://natureofcode.com/forces/" target="_blank" rel="noopener noreferrer" class="">Chapter two</a> examines forces and laws of motion.</p>]]></content:encoded>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[AWS Billing Conductor SP/RI Benefit Utility]]></title>
            <link>https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility</link>
            <guid>https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility</guid>
            <pubDate>Wed, 13 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[SAM application for creating Billing Conductor custom line items to distribute SP/RI benefits purchased outside of billing groups.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="about">About<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#about" class="hash-link" aria-label="Direct link to About" title="Direct link to About" translate="no">​</a></h2>
<p>This is a tool that I developed and open sourced at AWS. Find the latest in the GitHub repository <a href="https://github.com/aws-samples/aws-billing-conductor-sp-ri-benefit-utility" target="_blank" rel="noopener noreferrer" class="">here</a>. It's released under MIT-0.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws-billing-conductor-abc-overview">AWS Billing Conductor (ABC) Overview<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#aws-billing-conductor-abc-overview" class="hash-link" aria-label="Direct link to AWS Billing Conductor (ABC) Overview" title="Direct link to AWS Billing Conductor (ABC) Overview" translate="no">​</a></h2>
<p>AWS Billing Conductor is a <a href="https://aws.amazon.com/blogs/aws-cloud-financial-management/ad-everything-you-need-to-know-about-aws-billing-conductors-new-pricing-model/" target="_blank" rel="noopener noreferrer" class="">priced service</a> in the AWS billing suite designed to support showback and chargeback workflows for any AWS customer who needs to enforce visibility boundaries within their Organization or add custom rates unique to their business. This alternative version of the monthly bill is called a pro forma bill.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-billing-conductor-handles-savings-plans-sp-and-reserved-instances-ri">How Billing Conductor Handles Savings Plans (SP) and Reserved Instances (RI)<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#how-billing-conductor-handles-savings-plans-sp-and-reserved-instances-ri" class="hash-link" aria-label="Direct link to How Billing Conductor Handles Savings Plans (SP) and Reserved Instances (RI)" title="Direct link to How Billing Conductor Handles Savings Plans (SP) and Reserved Instances (RI)" translate="no">​</a></h2>
<p>It’s important to note that AWS Billing Conductor does not change the application of SPs or RIs in the account’s billing family. It only affects how the application is visible in the pro forma views. To conceptualize the difference between the two, consider the intention behind each of the two products. When applying SPs and RIs, the AWS billing system prioritizes maximizing the discount benefit of each product to save customers the most money possible. When calculating pro forma costs, AWS Billing Conductor prioritizes creating the prescribed view for each billing group by enforcing strict visibility boundaries within the Organization.</p>
<p>By default, AWS Billing Conductor shares the benefits of Savings Plans and Reserved Instances that were purchased in a linked account belonging to a billing group with all accounts placed in the same billing group. However, benefits from any Savings Plans or Reserved Instances owned outside a billing group are not included in that billing group’s pro forma cost. A few examples of how SP and RI benefits will or will not appear in pro forma data:</p>
<ul>
<li class="">A Savings Plan was purchased in the payer account, which is not in any billing group. Billing groups will not see any SP benefit in their pro forma view. <strong>Sharing purchases made outside of billing groups (e.g., in the payer account) is the primary use case for this tool.</strong></li>
<li class="">Linked account 1 is in billing group A, and linked account 1 has received benefit from a Savings Plan or Reserved Instance that was purchased outside the billing group A in the consolidated bill (i.e., what the customer pays to AWS). Linked account 1 will not see any benefit in their pro forma view.</li>
<li class="">Linked account 2 owns an RI and is in billing group A. Linked account 2 consumed its own RI during the month. It will see the benefit of that RI in its pro forma view as well.</li>
<li class="">Linked account 2 owns an RI and is in billing group A. Linked account 2 did not have any usage that the RI could apply to and neither did any account in billing group A. In the consolidated bill (i.e., what the customer pays to AWS), the RI benefit was applied to linked account 3, which is not in billing group A. Linked account 2’s pro forma view will show the RI as unused.</li>
<li class="">Linked account 2 owns an RI and is in billing group A. Linked account 2 does not have usage that the RI could apply to. However, linked account 3 (also in billing group A) does have usage that the RI could apply to. In the consolidated bill (i.e., what the customer pays to AWS), the RI applied to linked account 4, which does not belong to billing group A. In the pro forma view, the RI was applied to linked account 3 because ABC constrains application to the billing group where it was purchased regardless of whether sharing is enabled.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="utility-logic-overview">Utility Logic Overview<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#utility-logic-overview" class="hash-link" aria-label="Direct link to Utility Logic Overview" title="Direct link to Utility Logic Overview" translate="no">​</a></h2>
<p>This utility shows how ABC custom line items can be used to distribute the benefits of SPs and RIs purchased outside of billing groups (e.g., in a payer account) to linked accounts belonging to billing groups. The solution's logic is as follows:</p>
<ul>
<li class="">Trigger on the fifth of every month using EventBridge</li>
<li class="">Determine the date range of the previous billing period (i.e., the first and last day of the previous full month)<!-- -->
<ul>
<li class="">For example, if the current date is January 5th, the previous billing period would be December 1st to 31st</li>
</ul>
</li>
<li class="">Get the account associations from Billing Conductor for the previous billing period (i.e., which accounts belonged to which billing group during the last full month)</li>
<li class="">Pull the number of EC2 running hours by instance type via the Cost Explorer API and calculate normalized hours based on <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/apply_ri.html" target="_blank" rel="noopener noreferrer" class="">normalization factor</a>
<ul>
<li class="">Include normalized Fargate usage if the <code>INCLUDE_FARGATE_FOR_SAVINGS_PLANS</code> feature flag is enabled (disabled by default)</li>
<li class="">Include normalized Lambda usage if the <code>INCLUDE_LAMBDA_FOR_SAVINGS_PLANS</code> feature flag is enabled (disabled by default)</li>
</ul>
</li>
<li class="">Pull the number of RDS running hours by instance type via the Cost Explorer API and calculate normalized hours based on <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/apply_ri.html" target="_blank" rel="noopener noreferrer" class="">normalization factor</a></li>
<li class="">Pull the net savings for the previous billing period per Savings Plan and Reserved Instance</li>
<li class="">Divide the net savings for each commitment proportionally across the linked accounts that belong to a billing group<!-- -->
<ul>
<li class="">Each linked account's percentage is its normalized usage divided by the total normalized usage for all accounts belonging to a billing group</li>
</ul>
</li>
<li class="">Create a custom line per commitment per account</li>
<li class="">Write the custom line items to Billing Conductor if the <code>DRY_RUN</code> flag is disabled (enabled by default for testing purposes), otherwise only return the output (viewable in the Lambda Console)</li>
<li class="">If an error occurs, an SNS topic is notified</li>
<li class="">In regard to managed services, the initial solution only covers RDS, but includes code comments about how to expand to other services such as ElastiCache and OpenSearch</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture">Architecture<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#architecture" class="hash-link" aria-label="Direct link to Architecture" title="Direct link to Architecture" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="abc-sp-ri-utility-architecture-diagram.png" src="https://your-docusaurus-site.example.com/assets/images/abc-sp-ri-utility-architecture-diagram-508246f15740d8aaafd7b018a57feba4.png" width="1179" height="617" class="img_ev3q"></p>
<p>The core functionality resides in a Lambda function built using <a href="https://aws.amazon.com/serverless/sam/" target="_blank" rel="noopener noreferrer" class="">AWS Serverless Application Model (SAM)</a>. The infrastructure is defined using a CloudFormation template with the following resources <strong>intended to be deployed in the payer account</strong>:</p>
<ul>
<li class="">Lambda function using Python 3.12</li>
<li class="">EventBridge rule using a <code>cron</code> expression to trigger on the fifth day of every month (i.e., so that the bill for the previous month is finalized)</li>
<li class="">An SNS topic to subscribe to on errors</li>
<li class="">An IAM policy and execution role with the minimum required permissions</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="minimum-iam-permissions-required">Minimum IAM Permissions Required<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#minimum-iam-permissions-required" class="hash-link" aria-label="Direct link to Minimum IAM Permissions Required" title="Direct link to Minimum IAM Permissions Required" translate="no">​</a></h2>
<p>From the CloudFormation file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">template.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">Policies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Statement</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Sid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> BillingConductorAndCostExplorer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Effect</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allow</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> billingconductor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ListAccountAssociations</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> billingconductor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">CreateCustomLineItem</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ce</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">GetCostAndUsage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ce</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">GetReservationUtilization</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ce</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">GetSavingsPlansUtilizationDetails</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> organizations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ListAccounts</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Statement</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Sid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> SNSPublishToFailureTopic</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Effect</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allow</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> sns</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Publish</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> rLambdaFailureTopic</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-setup">Local Setup<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#local-setup" class="hash-link" aria-label="Direct link to Local Setup" title="Direct link to Local Setup" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-virtual-environment">Creating a Virtual Environment<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#creating-a-virtual-environment" class="hash-link" aria-label="Direct link to Creating a Virtual Environment" title="Direct link to Creating a Virtual Environment" translate="no">​</a></h3>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone git@github.com:aws-samples/aws-billing-conductor-sp-ri-benefit-utility.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> aws-billing-conductor-sp-ri-benefit-utility</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">python3.12 </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> venv </span><span class="token string" style="color:#e3116c">'.venv'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">.</span><span class="token plain"> .venv/bin/activate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> sam_sp_ri_utility/requirements.txt</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-unit-tests">Running Unit Tests<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#running-unit-tests" class="hash-link" aria-label="Direct link to Running Unit Tests" title="Direct link to Running Unit Tests" translate="no">​</a></h3>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">pytest</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deployment">Deployment<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#deployment" class="hash-link" aria-label="Direct link to Deployment" title="Direct link to Deployment" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-using-aws-sam">Building Using AWS SAM<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#building-using-aws-sam" class="hash-link" aria-label="Direct link to Building Using AWS SAM" title="Direct link to Building Using AWS SAM" translate="no">​</a></h3>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sam build</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploying-using-aws-sam">Deploying Using AWS SAM<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#deploying-using-aws-sam" class="hash-link" aria-label="Direct link to Deploying Using AWS SAM" title="Direct link to Deploying Using AWS SAM" translate="no">​</a></h3>
<p>First, ensure that <a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html" target="_blank" rel="noopener noreferrer" class="">local AWS credentials are configured correctly</a>.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sam deploy </span><span class="token parameter variable" style="color:#36acaa">--guided</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="leveraging-the-sample">Leveraging the Sample<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#leveraging-the-sample" class="hash-link" aria-label="Direct link to Leveraging the Sample" title="Direct link to Leveraging the Sample" translate="no">​</a></h2>
<p>By default, the Lambda function <strong>does not</strong> write the custom line items to Billing Conductor. To disable dry run mode, change the Lambda environment variable called <code>DRY_RUN</code> to <code>Disabled</code> either via the Console or CloudFormation template. <strong>Before doing so, we strongly recommend that you review what would have been written to ensure that the benefit distribution meets your business requirements.</strong> For feature ideas and/or questions that could apply to all ABC users, please open an issue in this repository. Contact your account team or open an AWS support case for 1:1 discussions that require specifics that cannot be shared publicly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="edge-cases-and-additional-considerations">Edge Cases and Additional Considerations<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#edge-cases-and-additional-considerations" class="hash-link" aria-label="Direct link to Edge Cases and Additional Considerations" title="Direct link to Edge Cases and Additional Considerations" translate="no">​</a></h2>
<ul>
<li class="">This utility assumes that ABC has been configured and some linked accounts are associated with billing groups. The payer (or account where purchases are centrally made) must not belong to a billing group. It also assumes that there is at least one month of ABC data for each billing group given that it looks back to the previous month.</li>
<li class="">If some or all of the linked accounts that belong to billing groups have commitment purchases, be aware that these accounts would receive benefits in the pro forma data both from the purchases made at the linked account level <strong>and</strong> outside the billing group (e.g., in the payer) as well. However, this utility does not allocate any benefits for purchases made within a linked account belonging to a billing group since ABC does this already.</li>
<li class="">Spot usage is ignored by the EC2 and Fargate normalized usage calculation functions. This is intended to mirror the way that Savings Plans and Reserved Instances are applied by AWS billing systems. <a href="https://docs.aws.amazon.com/cur/latest/userguide/monitor-ondemand-reservations.html" target="_blank" rel="noopener noreferrer" class="">Unused ODCRs</a> (i.e., usage types containing <code>UnusedBox</code> and <code>UnusedDed</code>) are also excluded from the total eligible usage and every linked accounts' eligible usage.</li>
<li class="">Not all sizes (e.g., <code>m6i.metal</code>) are contained in the normalization map. If an instance size is not found, the normalization factor defaults to <code>1.0</code>. In addition, only size is currently considered. Users may also want to customize the weights based on instance family as well (e.g., for GPU usage).</li>
<li class="">It is possible that a commitment can have negative net savings due to low utilization. If this occurs, the negative value will be distributed to the eligible linked accounts as a fee.</li>
<li class="">The distribution logic <strong>does not</strong> match benefits to usage (e.g., only applying the benefits for an RDS RI to accounts with the region, instance type, etc. specified by the commitment). This aims to support centralized purchasing strategies.</li>
<li class="">In regard to non-US currency payers, since the sample utility distributes benefits based on normalized usage hours, it is not reliant on any one currency for its calculation logic (other than net savings). However, we recommend that every customer using the utility, regardless of the currency they use, validates that the custom line items produce the expected results.</li>
<li class="">Fargate and Lambda usage are ignored by default because Compute Savings Plans cover EC2 usage first due to <a href="https://aws.amazon.com/savingsplans/compute-pricing/" target="_blank" rel="noopener noreferrer" class="">higher savings percentage over On-Demand</a>. To enable these features, change the <code>INCLUDE_FARGATE_FOR_SAVINGS_PLANS</code> and/or <code>INCLUDE_LAMBDA_FOR_SAVINGS_PLANS</code> Lambda environment variable(s) to <code>Enabled</code>.</li>
<li class="">Lambda has a 15-minute maximum timeout. If the function cannot complete within that time period, the code may need to leverage a different offering like Fargate that can support longer run times.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cost">Cost<a href="https://your-docusaurus-site.example.com/blog/abc-sp-ri-benefit-utility#cost" class="hash-link" aria-label="Direct link to Cost" title="Direct link to Cost" translate="no">​</a></h2>
<p>For a complete list of resources deployed by this utility, see the <code>template.yaml</code> file. The Lambda function leverages ARM and runs once per month by default. The number of seconds will vary based on the environment. See the <a href="https://aws.amazon.com/lambda/pricing/" target="_blank" rel="noopener noreferrer" class="">Lambda pricing</a> for details. The core logic leverages the Cost Explorer API for the following:</p>
<ul>
<li class="">Pulling Savings Plans and Reserved Instances utilization</li>
<li class="">Fetching cost and usage for EC2, RDS, Lambda, and Fargate</li>
</ul>
<p>Each Cost Explorer API request costs <a href="https://aws.amazon.com/aws-cost-management/aws-cost-explorer/pricing/" target="_blank" rel="noopener noreferrer" class="">0.01 USD</a>. Monitor these costs via Cost Explorer by filtering to the <code>Cost Explorer</code> service and/or by API operation (i.e., <code>GetCostAndUsage</code>, <code>GetReservationUtilization</code>, <code>GetSavingsPlansUtilDetails</code>, and <code>GetSavingsPlansUtilization</code>). The unit tests located in the <code>sam_sp_ri_utility/test</code> directory mock API calls by patching SDK methods. To test locally without incurring costs, modify these Python objects to emulate API calls.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[Writing Optimized Functions Using AWS Lambda Power Tuning]]></title>
            <link>https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions</link>
            <guid>https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions</guid>
            <pubDate>Fri, 03 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[A CI/CD pipeline that ensures Lambda functions are optimized for cost.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-overview">Solution Overview<a href="https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions#solution-overview" class="hash-link" aria-label="Direct link to Solution Overview" title="Direct link to Solution Overview" translate="no">​</a></h2>
<p>As I <a href="https://scottie.is/blog/cost-conscious-terraform/" target="_blank" rel="noopener noreferrer" class="">wrote about previously</a>, AWS users are shifting left on
costs using DevOps and automation. While tools like <a href="https://www.infracost.io/" target="_blank" rel="noopener noreferrer" class="">Infracost</a> are powerful for estimating
costs for Lambda and other services, they alone do not provide optimization or tuning feedback during the development
lifecycle. This is where a tool like AWS Lambda Power Tuning assists:</p>
<blockquote>
<p>AWS Lambda Power Tuning is an open-source tool that can help you visualize and fine-tune the memory and power
configuration of Lambda functions. It runs in your own AWS account, powered by AWS Step Functions, and it supports three
optimization strategies: cost, speed, and balanced.</p>
</blockquote>
<p>Lambda pricing is determined by the number of invocations and the execution duration. There are several strategies for
decreasing duration costs including using Graviton for 20% savings (which this solution does for both Lambda and
CodeBuild), leveraging the latest runtime versions, taking advantage of execution reuse, etc. In addition to these,
optimizing memory allocation is a key mechanism for efficiency. From
the <a href="https://aws.amazon.com/lambda/pricing/" target="_blank" rel="noopener noreferrer" class="">documentation</a>:</p>
<blockquote>
<p>The [duration] price depends on the amount of memory you allocate to your function. In the AWS Lambda resource model,
you choose the amount of memory you want for your function and are allocated proportional CPU power and other resources.
An increase in memory size triggers an equivalent increase in CPU available to your function.</p>
</blockquote>
<p>Without running the Lambda function using different configurations, it is unclear what is the most optimal memory amount
for cost and/or performance. This solution demonstrates AWS Lambda Tuning Tools integration with a CodeSuite CI/CD
pipeline to bring Lambda tuning information to the pull request process and code review discussion. The source code is
hosted on <a href="https://github.com/scottenriquez/lambda-power-tuned" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-architecture">Solution Architecture<a href="https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions#solution-architecture" class="hash-link" aria-label="Direct link to Solution Architecture" title="Direct link to Solution Architecture" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Diagram" src="https://your-docusaurus-site.example.com/assets/images/lambda-power-tuned-architecture-diagram-df336a869e200c9652bedfc4476c31c0.png" width="1188" height="628" class="img_ev3q"></p>
<p>This solution deploys several resources:</p>
<ul>
<li class="">The AWS Lambda Power Tuning application</li>
<li class="">A CodeCommit repository preloaded with Terraform code for a Lambda function to tune</li>
<li class="">A CodeBuild project triggered by pull request state changes that invoke the AWS Lambda Power Tuning state machine</li>
<li class="">A CodePipeline with manual approvals to deploy the Terraform for changes pushed to the <code>main</code> branch</li>
<li class="">An S3 bucket to store Terraform state remotely</li>
<li class="">An S3 bucket to store CodePipeline artifacts</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preparing-your-development-environment">Preparing Your Development Environment<a href="https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions#preparing-your-development-environment" class="hash-link" aria-label="Direct link to Preparing Your Development Environment" title="Direct link to Preparing Your Development Environment" translate="no">​</a></h2>
<p>While this solution is for writing and deploying Terraform HCL syntax, I wrote the infrastructure code for the
deployment pipeline and dependent resources using AWS CDK, which is my daily driver for infrastructure as code. I
intentionally used Terraform for the target Lambda function to clearly differentiate between the code for resources
managed by the pipeline and the pipeline itself.</p>
<p>The following dependencies are required to deploy the pipeline infrastructure:</p>
<ul>
<li class="">An AWS account</li>
<li class="">Node.js</li>
<li class="">Terraform</li>
<li class=""><a href="https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html" target="_blank" rel="noopener noreferrer" class="">AWS CDK</a></li>
<li class=""><a href="https://github.com/scottenriquez/lambda-power-tuned" target="_blank" rel="noopener noreferrer" class="">Source code</a></li>
</ul>
<p>Rather than installing Node.js, CDK, Terraform, and all other dependencies on your local machine, you can alternatively
create a <a href="https://aws.amazon.com/cloud9/" target="_blank" rel="noopener noreferrer" class="">Cloud9 IDE</a> with these pre-installed via the Console or with a CloudFormation
template:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">Resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rCloud9Environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Cloud9</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EnvironmentEC2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">AutomaticStopTimeMinutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ConnectionType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CONNECT_SSH</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Environment for writing and deploying CDK</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># AWS Free Tier eligible</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">InstanceType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> t2.micro</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PowerTuningCDKPipelineCloud9Environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># https://docs.aws.amazon.com/cloud9/latest/user-guide/vpc-settings.html#vpc-settings-create-subnet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SubnetId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> subnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">EXAMPLE</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-and-deployment">Installation and Deployment<a href="https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions#installation-and-deployment" class="hash-link" aria-label="Direct link to Installation and Deployment" title="Direct link to Installation and Deployment" translate="no">​</a></h2>
<p>To install and deploy the pipeline, use the following commands:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/scottenriquez/lambda-power-tuned.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> lambda-power-tuned</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">python3 </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> venv .venv</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">.</span><span class="token plain"> .venv/bin/activate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> lambda_power_tuned</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> requirements.txt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk bootstrap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk deploy</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-deployment-pipeline">Using the Deployment Pipeline<a href="https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions#using-the-deployment-pipeline" class="hash-link" aria-label="Direct link to Using the Deployment Pipeline" title="Direct link to Using the Deployment Pipeline" translate="no">​</a></h2>
<p>The CodePipeline pipeline is triggered at creation, but there are manual approval stages to prevent any infrastructure
from being created without intervention. Feel free to deploy the Terraform, but it is not required for generating tuning
information via a pull request. The CodePipeline is triggered by changes to <code>main</code>.</p>
<p><img decoding="async" loading="lazy" alt="Pipeline" src="https://your-docusaurus-site.example.com/assets/images/pipeline-screenshot-3addec5d707e15cf35b8b897a054bb3b.png" width="2802" height="1718" class="img_ev3q"></p>
<p>Next, make some code changes to see the performance impact. To modify the Lambda code, either use the CodeCommit GUI in
the Console or clone the repository to your development environment. First, create a branch called <code>feature</code> off of
<code>main</code>. Then make some kind of code change, commit to <code>feature</code>, and open a pull request. This automatically triggers
the build, which does the following:</p>
<ul>
<li class="">Add a comment to the pull request with a hyperlink back to the CodeBuild run</li>
<li class="">Initialize Terraform against the deployment state to detail resources changed relative to <code>main</code></li>
<li class="">Add a comment to the pull request with the <code>resource_changes</code> property from the Terraform plan</li>
<li class="">Reinitialize the environment to create a transient deployment of the <code>feature</code> branch infrastructure to leverage for
tuning purposes</li>
<li class="">Generate an input file for AWS Lambda Power Tuning</li>
<li class="">Run the <code>execute-power-tuning.sh</code> Bash code to invoke the state machine and capture results</li>
<li class="">Add a comment to the pull request with a hyperlink to the tuning results for easy consumption</li>
</ul>
<p><img decoding="async" loading="lazy" alt="PR" src="https://your-docusaurus-site.example.com/assets/images/pull-request-build-screenshot-1baf4e84809ff00d774bd2130f8901b4.png" width="2790" height="1722" class="img_ev3q"></p>
<p>The results are encoded into the query string of the hyperlink, so the tuning results can easily be shared. As shown by
the <a href="https://lambda-power-tuning.show/#gAAAAQACAAQ=;AAAAQAAAAEAAAABAAAAAQA==;b6VpMW+l6TFvpWkyb6XpMg==" target="_blank" rel="noopener noreferrer" class="">results of the example function</a>
included in the repository, 128MB is the cheapest configuration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="diving-into-the-pull-request-build-logic">Diving Into the Pull Request Build Logic<a href="https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions#diving-into-the-pull-request-build-logic" class="hash-link" aria-label="Direct link to Diving Into the Pull Request Build Logic" title="Direct link to Diving Into the Pull Request Build Logic" translate="no">​</a></h2>
<p>The Python code for describing the deployment pipeline lives in <code>power_tuned_lambda_stack.py</code>. The build logic is spread
across the pull request project's <code>buildspec</code> and a Bash script residing in the CodeCommit repository. The CodeBuild
logic is responsible for creating and destroying the transient testing environment, while the <code>execute-power-tuning.sh</code>
contains the specific logic needed to tune the target Lambda function(s). The following code snippets (with comments
explaining the <code>build</code> phase) contain the core logic for integrating AWS Lambda Power Tuning into the pull request:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">lambda_power_tuned/lambda_power_tuned/lambda_power_tuned_stack.py</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">pull_request_codebuild_project </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> aws_codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Project</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'PullRequestCodeBuildProject'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  build_spec</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">aws_codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">BuildSpec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">from_object</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'version'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'0.2'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'phases'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'install'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'commands'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'git checkout $CODEBUILD_SOURCE_VERSION'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'yum -y install unzip util-linux jq'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string-interpolation string" style="color:#e3116c">f'wget https://releases.hashicorp.com/terraform/</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">terraform_version</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">/terraform_</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">terraform_version</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">_linux_arm64.zip'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string-interpolation string" style="color:#e3116c">f'unzip terraform_</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">terraform_version</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">_linux_arm64.zip'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'mv terraform /usr/local/bin/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'export BUILD_UUID=$(uuidgen)'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'build'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'commands'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'aws codecommit post-comment-for-pull-request --repository-name $REPOSITORY_NAME --pull-request-id $PULL_REQUEST_ID --content \"The pull request CodeBuild project has been triggered. See the [logs for more details]($CODEBUILD_BUILD_URL).\" --before-commit-id $SOURCE_COMMIT --after-commit-id $DESTINATION_COMMIT'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># create plan against the production function (i.e., what is currently in main)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string-interpolation string" style="color:#e3116c">f'terraform init -backend-config="bucket=</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">terraform_state_s3_bucket</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">bucket_name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'terraform plan -out tfplan-pr-$BUILD_UUID.out'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># format plan output into Markdown</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'terraform show -json tfplan-pr-$BUILD_UUID.out &gt; plan-$BUILD_UUID.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'echo "\`\`\`json\n$(cat plan-$BUILD_UUID.json | jq \'.resource_changes\')\n\`\`\`" &gt; plan-formatted-$BUILD_UUID.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># write plan to the pull request comments</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># limit to 10,000 bytes to due the CodeCommit limit pull request content</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'aws codecommit post-comment-for-pull-request --repository-name $REPOSITORY_NAME --pull-request-id $PULL_REQUEST_ID --content \"Terraform resource changes:\n$(cat plan-formatted-$BUILD_UUID.json | head -c 10000)\" --before-commit-id $SOURCE_COMMIT --after-commit-id $DESTINATION_COMMIT'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># reinitialize and create a new state file to manage the transient environment for performance tuning</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string-interpolation string" style="color:#e3116c">f'terraform init -reconfigure -backend-config="bucket=</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">terraform_state_s3_bucket</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">bucket_name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">" -backend-config="key=pr-$BUILD_UUID.tfstate"'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'terraform apply -auto-approve'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># execute the state machine and get tuning results</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># defer tuning logic and configuration to the repository for developer customization</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'sh execute-power-tuning.sh'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># destroy transient environment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'terraform destroy -auto-approve'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    source</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">aws_codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">code_commit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      repository</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">lambda_repository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      badge</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      environment</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">aws_codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">BuildEnvironment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      build_image</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">aws_codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">LinuxBuildImage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">AMAZON_LINUX_2_ARM_3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      environment_variables</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'REPOSITORY_NAME'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> aws_codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">BuildEnvironmentVariable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          value</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">lambda_repository</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">repository_name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'STATE_MACHINE_ARN'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> aws_codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">BuildEnvironmentVariable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          value</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">power_tuning_tools_application</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get_att</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Outputs.StateMachineARN'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        compute_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">aws_codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ComputeType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SMALL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        privileged</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    role</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">terraform_apply_codebuild_iam_role</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># continues</span><br></div></code></pre></div></div>
<p>Since the CodeBuild project does not have contextual awareness of what the Terraform HCL in the CodeCommit repository is
describing (e.g., how many Lambda functions exist), the developer can implement the tuning logic in
<code>execute-power-tuning.sh</code>. For this example, this is simply grabbing the Lambda ARN, formatting the AWS Lambda Power
Tuning input file, and executing the state machine. However, this logic could be expanded for multiple Lambda functions
and other use cases.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">lambda_power_tuned/lambda_power_tuned/terraform/execute-power-tuning.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token shebang important">#!/bin/bash</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># obtain ARN from Terraform and build input file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">TARGET_LAMBDA_ARN</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable" style="color:#36acaa">terraform output </span><span class="token variable parameter variable" style="color:#36acaa">-raw</span><span class="token variable" style="color:#36acaa"> arn</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable" style="color:#36acaa">jq </span><span class="token variable parameter variable" style="color:#36acaa">--arg</span><span class="token variable" style="color:#36acaa"> arn $TARGET_LAMBDA_ARN </span><span class="token variable string" style="color:#e3116c">'. += {"lambdaARN" : $arn}'</span><span class="token variable" style="color:#36acaa"> power-tuning-input.json</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> power-tuning-input-</span><span class="token variable" style="color:#36acaa">$BUILD_UUID</span><span class="token plain">.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">POWER_TUNING_INPUT_JSON</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable function" style="color:#d73a49">cat</span><span class="token variable" style="color:#36acaa"> power-tuning-input-$BUILD_UUID.json</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># start execution</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">EXECUTION_ARN</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable" style="color:#36acaa">aws stepfunctions start-execution --state-machine-arn $STATE_MACHINE_ARN </span><span class="token variable parameter variable" style="color:#36acaa">--input</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable string" style="color:#e3116c">"</span><span class="token variable string variable" style="color:#36acaa">$POWER_TUNING_INPUT_JSON</span><span class="token variable string" style="color:#e3116c">"</span><span class="token variable" style="color:#36acaa">  </span><span class="token variable parameter variable" style="color:#36acaa">--query</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable string" style="color:#e3116c">'executionArn'</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable parameter variable" style="color:#36acaa">--output</span><span class="token variable" style="color:#36acaa"> text</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Execution started..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># poll execution status until completed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">do</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># retrieve execution status</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">STATUS</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable" style="color:#36acaa">aws stepfunctions describe-execution --execution-arn $EXECUTION_ARN </span><span class="token variable parameter variable" style="color:#36acaa">--query</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable string" style="color:#e3116c">'status'</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable parameter variable" style="color:#36acaa">--output</span><span class="token variable" style="color:#36acaa"> text</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$STATUS</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RUNNING"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># keep looping and wait if still running</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">sleep</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$STATUS</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FAILED"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># exit if failed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string entity" style="color:#36acaa">\n</span><span class="token string" style="color:#e3116c">The execution failed, you can check the execution logs with the following script:</span><span class="token string entity" style="color:#36acaa">\n</span><span class="token string" style="color:#e3116c">aws stepfunctions get-execution-history --execution-arn </span><span class="token string variable" style="color:#36acaa">$EXECUTION_ARN</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin class-name">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># print execution output if succeeded</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$STATUS</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Execution output: "</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># retrieve output</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        aws stepfunctions describe-execution --execution-arn </span><span class="token variable" style="color:#36acaa">$EXECUTION_ARN</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--query</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'output'</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> text </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> power-tuning-output-</span><span class="token variable" style="color:#36acaa">$BUILD_UUID</span><span class="token plain">.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin class-name">break</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">fi</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">done</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># get output URL and comment on pull request</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">POWER_TUNING_OUTPUT_URL</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable function" style="color:#d73a49">cat</span><span class="token variable" style="color:#36acaa"> power-tuning-output-$BUILD_UUID.json </span><span class="token variable operator" style="color:#393A34">|</span><span class="token variable" style="color:#36acaa"> jq </span><span class="token variable parameter variable" style="color:#36acaa">-r</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable string" style="color:#e3116c">'.stateMachine .visualization'</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws codecommit post-comment-for-pull-request --repository-name </span><span class="token variable" style="color:#36acaa">$REPOSITORY_NAME</span><span class="token plain"> --pull-request-id </span><span class="token variable" style="color:#36acaa">$PULL_REQUEST_ID</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--content</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Lambda tuning is complete. See the [results for full details](</span><span class="token string variable" style="color:#36acaa">$POWER_TUNING_OUTPUT_URL</span><span class="token string" style="color:#e3116c">)."</span><span class="token plain"> --before-commit-id </span><span class="token variable" style="color:#36acaa">$SOURCE_COMMIT</span><span class="token plain"> --after-commit-id </span><span class="token variable" style="color:#36acaa">$DESTINATION_COMMIT</span><br></div></code></pre></div></div>
<p>Lastly, note that there is an AWS Lambda Power Tuning input file included in the CodeCommit repository that can be
modified as well. The <code>"lambdaARN"</code> property is excluded because it will be dynamically added by the build for the
transient environment. For more details on the input and output configurations, see
the <a href="https://github.com/alexcasalboni/aws-lambda-power-tuning/blob/master/README-INPUT-OUTPUT.md" target="_blank" rel="noopener noreferrer" class="">documentation on GitHub</a>.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">lambda_power_tuned/lambda_power_tuned/terraform/power-tuning-input.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"powerValues"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">128</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">256</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">512</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1024</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"num"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"payload"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"parallelInvocation"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"strategy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cost"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cleanup">Cleanup<a href="https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions#cleanup" class="hash-link" aria-label="Direct link to Cleanup" title="Direct link to Cleanup" translate="no">​</a></h2>
<p>If you deployed resources via the deployment pipeline, be sure to either use the <code>DestroyTerraform</code> CodeBuild project or
run:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># set the bucket name variable or replace with a value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># the bucket name nomenclature is 'terraform-state-' followed by a UUID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># this can also be found via the Console</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform init -backend-config</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"bucket=</span><span class="token string variable" style="color:#36acaa">$TERRAFORM_STATE_S3_BUCKET_NAME</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform destroy</span><br></div></code></pre></div></div>
<p>To destroy the pipeline itself run:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cdk destroy</span><br></div></code></pre></div></div>
<p>If you spun up a Cloud9 environment, be sure to delete that as well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="disclaimer">Disclaimer<a href="https://your-docusaurus-site.example.com/blog/power-tuned-lambda-functions#disclaimer" class="hash-link" aria-label="Direct link to Disclaimer" title="Direct link to Disclaimer" translate="no">​</a></h2>
<p>At the time of writing this blog post, I currently work for Amazon Web Services. The opinions and views expressed here
are my own and not the views of my employer.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[AWS re:Invent 2022]]></title>
            <link>https://your-docusaurus-site.example.com/blog/about-reinvent-2022</link>
            <guid>https://your-docusaurus-site.example.com/blog/about-reinvent-2022</guid>
            <pubDate>Tue, 29 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Thoughts and proofs-of-concepts from re:Invent 2022 releases.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://your-docusaurus-site.example.com/blog/about-reinvent-2022#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>I learn best by doing, so with every release cycle, I take the time to build fully functional examples and digest the blog posts and video content. Below are some of my favorite releases from re<!-- -->:Invent<!-- --> 2022. You can find all source code in <a href="https://github.com/scottenriquez/reinvent-2022-examples" target="_blank" rel="noopener noreferrer" class="">this GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compute-optimizer-third-party-metrics">Compute Optimizer Third-Party Metrics<a href="https://your-docusaurus-site.example.com/blog/about-reinvent-2022#compute-optimizer-third-party-metrics" class="hash-link" aria-label="Direct link to Compute Optimizer Third-Party Metrics" title="Direct link to Compute Optimizer Third-Party Metrics" translate="no">​</a></h2>
<p>Compute Optimizer is a powerful and free offering from AWS that analyzes resource usage and provides recommendations. Most commonly, it produces rightsizing and termination opportunities for EC2 instances. However, in my experience, the most significant limitation for customers is that Compute Optimizer does not factor memory or disk utilization into findings by default. As a result, AWS customers that use CloudWatch metrics have their findings enhanced, but other customers who use third-party alternatives to capture memory and disk utilization did not. AWS announced <a href="https://aws.amazon.com/blogs/aws-cloud-financial-management/aws-compute-optimizer-launches-integration-with-application-performance-monitoring-and-observability-partners/" target="_blank" rel="noopener noreferrer" class="">third-party metric support for Compute Optimizer</a>, including Datadog.</p>
<p>To test this new feature, we need a few things:</p>
<ul>
<li class="">Compute Optimizer enabled for the proper AWS account(s)</li>
<li class="">Datadog AWS integration enabled</li>
<li class="">An EC2 instance (i.e., candidate for rightsizing) with the Datadog agent installed</li>
</ul>
<p>First, <a href="https://aws.amazon.com/compute-optimizer/getting-started/" target="_blank" rel="noopener noreferrer" class="">opt in to Compute Optimizer</a> in your AWS account. Next, enable <a href="https://docs.datadoghq.com/integrations/amazon_web_services/" target="_blank" rel="noopener noreferrer" class="">AWS integration</a> in your Datadog account. This can be done in an automated fashion via a CloudFormation stack. It's also worth noting that Datadog offers a <a href="https://www.datadoghq.com/free-datadog-trial/" target="_blank" rel="noopener noreferrer" class="">14-day free trial</a>.</p>
<p><img decoding="async" loading="lazy" alt="datadog-aws-integration.png" src="https://your-docusaurus-site.example.com/assets/images/datadog-aws-integration-551dcad9c5dca0052f57cdff00ed4190.png" width="3138" height="1720" class="img_ev3q"></p>
<p>Back in the AWS Console for Compute Optimizer, select Datadog as an external metrics ingestion source.</p>
<p><img decoding="async" loading="lazy" alt="compute-optimizer-third-party.png" src="https://your-docusaurus-site.example.com/assets/images/compute-optimizer-third-party-f257dff2aa97b96de408dcd9105bf52f.png" width="2402" height="1178" class="img_ev3q"></p>
<p>Lastly, we need to deploy an EC2 instance. The following CDK stack creates a VPC, EC2 instance (<code>t3.medium</code>; be aware of charges) with the Datadog agent installed, security group, and an IAM role. Before deploying the stack, be sure to set <code>DD_API_KEY</code> and <code>DD_SITE</code> environment variables. The EC2 instance, role, and security group are also configured for Instance Connect.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">ec2-instance-with-datadog/lib/ec2-instance-with-datadog-stack.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name">Ec2InstanceWithDatadogStack</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">cdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Stack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">constructor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">Construct</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> cdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">StackProps</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">super</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// networking</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> vpc </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">Vpc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'VPC'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      ipAddresses</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">IpAddresses</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">cidr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'10.0.0.0/16'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      natGateways</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> selection </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> vpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">selectSubnets</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// using public subnets as to not incur NAT Gateway charges</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      subnetType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">SubnetType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">PUBLIC</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> datadogInstanceSecurityGroup </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">SecurityGroup</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'datadog-instance-sg'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      vpc</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> vpc</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      allowAllOutbound</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// IP range for EC2 Instance Connect</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    datadogInstanceSecurityGroup</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addIngressRule</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Peer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">ipv4</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'18.206.107.24/29'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Port</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">tcp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">22</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'allow SSH access for EC2 Instance Connect'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// IAM</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> datadogInstanceRole </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">iam</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">Role</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'datadog-instance-role'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      assumedBy</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">iam</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">ServicePrincipal</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'ec2.amazonaws.com'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      managedPolicies</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">iam</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">ManagedPolicy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fromAwsManagedPolicyName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'EC2InstanceConnect'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// EC2 instance</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> userData </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">UserData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">forLinux</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    userData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addCommands</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'sudo yum install ec2-instance-connect'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// set these environment variables with your Datadog API key and site</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">DD_API_KEY=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">env</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation constant" style="color:#36acaa">DD_API_KEY</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c"> DD_SITE="</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">env</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation constant" style="color:#36acaa">DD_SITE</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">" bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script_agent7.sh)"</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ec2Instance </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">Instance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ec2-instance'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      vpc</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> vpc</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      vpcSubnets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        subnetType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">SubnetType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">PUBLIC</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      role</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> datadogInstanceRole</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      securityGroup</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> datadogInstanceSecurityGroup</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// note: this will incur a charge</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      instanceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">InstanceType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">InstanceClass</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">T3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">InstanceSize</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">MEDIUM</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      machineImage</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">AmazonLinuxImage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        generation</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ec2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">AmazonLinuxGeneration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">AMAZON_LINUX_2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      userData</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> userData</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Once successfully deployed, metrics for the EC2 instance will appear in your Datadog account.</p>
<p><img decoding="async" loading="lazy" alt="datadog-ec2-metrics.png" src="https://your-docusaurus-site.example.com/assets/images/datadog-ec2-metrics-91b28fcdeec1627c6b7628015a7809a7.png" width="3136" height="1366" class="img_ev3q"></p>
<p>Finally, wait up to 30 hours for a finding to appear in Compute Optimizer with the proper third-party APM metrics.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws-lambda-snapstart">AWS Lambda SnapStart<a href="https://your-docusaurus-site.example.com/blog/about-reinvent-2022#aws-lambda-snapstart" class="hash-link" aria-label="Direct link to AWS Lambda SnapStart" title="Direct link to AWS Lambda SnapStart" translate="no">​</a></h2>
<p>Cold starts are one of the most common drawbacks of serverless adoption. Specific runtimes, such as Java, are more affected by this, especially in conjunction with frameworks like Spring Boot. <a href="https://aws.amazon.com/blogs/compute/starting-up-faster-with-aws-lambda-snapstart/" target="_blank" rel="noopener noreferrer" class="">SnapStart</a> aims to address this:</p>
<blockquote>
<p>After you enable Lambda SnapStart for a particular Lambda function, publishing a new version of the function will trigger an optimization process. The process launches your function and runs it through the entire <code>Init</code> phase. Then it takes an immutable, encrypted snapshot of the memory and disk state, and caches it for reuse. When the function is subsequently invoked, the state is retrieved from the cache in chunks on an as-needed basis and used to populate the execution environment. This optimization makes invocation time faster and more predictable, since creating a fresh execution environment no longer requires a dedicated <code>Init</code> phase.</p>
</blockquote>
<p>For now, SnapStart only supports the Java runtime.</p>
<p>With the release came support via CloudFormation and CDK. However, at the time of writing, CDK only supports SnapStart via the <a href="https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.CfnFunction.html" target="_blank" rel="noopener noreferrer" class="">L1 construct</a>: <code>CfnFunction</code>. The <a href="https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda-readme.html" target="_blank" rel="noopener noreferrer" class="">L2 <code>Function</code> class</a> does not yet have support, so this may be a temporary blocker for CDK projects. Using CDK, I wrote a simple stack to test a trivial function:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">java11-snapstart-lambda/lib/java11-snapstart-lambda-stack.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name maybe-class-name">Java11SnapstartLambdaStack</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">cdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Stack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">constructor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">Construct</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> cdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">StackProps</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">super</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// artifact bucket and ZIP deployment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> artifactBucket </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">s3</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">Bucket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ArtifactBucket'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> artifactDeployment </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">s3Deployment</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">BucketDeployment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'DeployFiles'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      sources</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">s3Deployment</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">asset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'./artifact'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      destinationBucket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> artifactBucket</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// IAM role</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> lambdaExecutionRole </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">iam</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">Role</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'LambdaExecutionRole'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      assumedBy</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">iam</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">ServicePrincipal</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'lambda.amazonaws.com'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    lambdaExecutionRole</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addManagedPolicy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      iam</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">ManagedPolicy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fromAwsManagedPolicyName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'service-role/AWSLambdaBasicExecutionRole'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Lambda functions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> withSnapStart </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">lambda</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">CfnFunction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'WithSnapStart'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      code</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        s3Bucket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> artifactDeployment</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">deployedBucket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">bucketName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        s3Key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'corretto-test.zip'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      functionName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'withSnapStart'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      handler</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'example.Hello::handleRequest'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      role</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> lambdaExecutionRole</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">roleArn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      runtime</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'java11'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      snapStart</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> applyOn</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'PublishedVersions'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> withoutSnapStart </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">lambda</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">CfnFunction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'WithoutSnapStart'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      code</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        s3Bucket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> artifactDeployment</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">deployedBucket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">bucketName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        s3Key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'corretto-test.zip'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      functionName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'withoutSnapStart'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      handler</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'example.Hello::handleRequest'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      role</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> lambdaExecutionRole</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">roleArn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      runtime</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'java11'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>In <a href="https://aws.amazon.com/blogs/aws/new-accelerate-your-lambda-functions-with-lambda-snapstart/" target="_blank" rel="noopener noreferrer" class="">Jeff Barr's post</a>, he used a Spring Boot function and achieved significant performance benefits. Next, I wanted to see if there were any benefits to a barebones Java 11 function, given that there is no additional charge for SnapStart. With a few tests, I reproduced a slight decrease in total duration.</p>
<p>Cold start without SnapStart (577.84 milliseconds):
<img decoding="async" loading="lazy" alt="without-snapstart.png" src="https://your-docusaurus-site.example.com/assets/images/without-snapstart-b4f124fa1d5cbcfe8fb09dca3a64bbe4.png" width="2956" height="588" class="img_ev3q"></p>
<p>Cold start with SnapStart (537.94 milliseconds):
<img decoding="async" loading="lazy" alt="with-snapstart.png" src="https://your-docusaurus-site.example.com/assets/images/with-snapstart-818e9703862a5a92b76bf281af58ceb9.png" width="2960" height="582" class="img_ev3q"></p>
<p>A few cold start tests are hardly conclusive, but I'm excited to see how AWS customers' performance and costs fare at scale. One thing to note is that in both my testing and the Jeff Barr example, the billed duration increased with SnapStart while the total duration decreased (i.e., this may be faster but come with an indirect cost).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws-codecatalyst">AWS CodeCatalyst<a href="https://your-docusaurus-site.example.com/blog/about-reinvent-2022#aws-codecatalyst" class="hash-link" aria-label="Direct link to AWS CodeCatalyst" title="Direct link to AWS CodeCatalyst" translate="no">​</a></h2>
<p>I started my career as a .NET developer writing C#. My first experience with professional software development involved using Team Foundation Server. Even as a consultant focused on AWS about a year ago, many customers I worked for primarily used Azure DevOps to manage code, CI/CD pipelines, etc. While it may seem strange to use a Microsoft tool for AWS, the developer experience felt more unified than AWS CodeSuite in my opinion. CodeCommit, CodeBuild, and CodePipeline feel like entirely separate services within the AWS Console. While they are easily integrated via automation like CloudFormation or CDK, navigating between the services in the UI often takes several clicks.</p>
<p>Enter CodeCatalyst. In addition to the <a href="https://aws.amazon.com/blogs/aws/announcing-amazon-codecatalyst-preview-a-unified-software-development-service/" target="_blank" rel="noopener noreferrer" class="">release blog post</a>, there is an excellent <a href="https://soundcloud.com/awsdevelopers/episode-061-announcing-amazon-codecatalyst-with-harry-mower-and-doug-clauson" target="_blank" rel="noopener noreferrer" class="">AWS Developers podcast episode</a> outlining the vision for the product. I'm paraphrasing, but these are the four high-level problems that CodeCatalsyt aims to solve in addition to the feedback above:</p>
<ul>
<li class="">Setting up the project itself</li>
<li class="">Setting up CI/CD</li>
<li class="">Setting up infrastructure and environments</li>
<li class="">Onboarding new developers</li>
</ul>
<p>CodeCatalyst does not live in the AWS Console. It's a separate offering that integrates via Builder ID authentication. While CodeCatalyst can be used to create resources that reside in an account (i.e., via infrastructure as code), the underlying repositories, pipelines, etc. that power the developer experience are not exposed to the user. In addition to this, the team recognized that many customers have at least some of the tooling in place that CodeCatalyst provides. As such, it supports third-party integration for various components (e.g., Jira for issues, GitHub for a repository, GitHub Actions for CI/CD, etc.).</p>
<p>One of the most compelling features of CodeCatalyst is blueprints. Blueprints aim to provide fully functional starter kits encapsulating useful defaults and best practices. For example, I chose the .NET serverless blueprint that provisioned a Lambda function's source code and IaC in a Git repository with a CI/CD pipeline.</p>
<p><img decoding="async" loading="lazy" alt="codecatalyst.png" src="https://your-docusaurus-site.example.com/assets/images/codecatalyst-eeffaf5c960374b477dadfdf5df326d5.png" width="3456" height="1814" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws-application-composer-preview">AWS Application Composer Preview<a href="https://your-docusaurus-site.example.com/blog/about-reinvent-2022#aws-application-composer-preview" class="hash-link" aria-label="Direct link to AWS Application Composer Preview" title="Direct link to AWS Application Composer Preview" translate="no">​</a></h2>
<p>Application Composer is a new service from AWS that allows developers to map out select resources using a GUI with the feel of an architecture diagram. These resources can be connected to one another (e.g., an EventBridge Schedule to trigger Lambda). A subset of attributes can also be modified, such as the Lambda runtime.</p>
<p><img decoding="async" loading="lazy" alt="aws-application-composer.png" src="https://your-docusaurus-site.example.com/assets/images/aws-application-composer-ad4e4f891389cc484f77ab723483fcbf.png" width="3456" height="1720" class="img_ev3q"></p>
<p>While the creation process is UI-driven, the output is a SAM template (i.e., a CloudFormation template with a <code>Transform</code> statement). For example, the diagram above creates the following:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">Transform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Serverless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token datetime number" style="color:#36acaa">2016-10-31</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">Bucket</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">S3</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Bucket</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BucketName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Sub</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">StackName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">bucket</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">AccountId</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BucketEncryption</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ServerSideEncryptionConfiguration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ServerSideEncryptionByDefault</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">SSEAlgorithm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> aws</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">kms</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">KMSMasterKeyID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> alias/aws/s3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PublicAccessBlockConfiguration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">IgnorePublicAcls</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">RestrictPublicBuckets</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">BucketBucketPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">S3</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">BucketPolicy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Bucket</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> Bucket</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PolicyDocument</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RequireEncryptionInTransit</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2012-10-17'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Statement</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">Principal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">Action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">Effect</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deny</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">Resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!GetAtt</span><span class="token plain"> Bucket.Arn</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Sub</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Bucket.Arn</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">/*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">Condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">Bool</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">aws:SecureTransport</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'false'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">S3Function</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Serverless</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Function</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Sub</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Stack $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">StackName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> Function $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">ResourceName</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ResourceName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> S3Function</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">CodeUri</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> src/Function</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Handler</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> index.handler</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Runtime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nodejs18.x</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">MemorySize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3008</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Tracing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Active</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Events</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Bucket</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> S3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">Bucket</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> Bucket</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">Events</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> s3</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ObjectCreated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> s3</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ObjectRemoved</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">S3FunctionLogGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Logs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">LogGroup</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">DeletionPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Retain</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">LogGroupName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Sub</span><span class="token plain"> /aws/lambda/$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">S3Function</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>This service has the potential to offer the best of both worlds: an easy-to-use GUI and a deployable artifact. There's a clear focus on serverless design for now, but I'd like to see if this expands to other areas (e.g., VPC design). It's also worth noting that Application Composer utilizes the browser's file API for Google Chrome and Microsoft Edge to save the latest template changes locally. I'd love to see CDK L2 construct support here in addition to CloudFormation also.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="amazon-rds-managed-bluegreen-deployments">Amazon RDS Managed Blue/Green Deployments<a href="https://your-docusaurus-site.example.com/blog/about-reinvent-2022#amazon-rds-managed-bluegreen-deployments" class="hash-link" aria-label="Direct link to Amazon RDS Managed Blue/Green Deployments" title="Direct link to Amazon RDS Managed Blue/Green Deployments" translate="no">​</a></h2>
<blockquote>
<p>When updating databases, using a blue/green deployment technique is an appealing option for users to minimize risk and downtime. This method of making database updates requires two database environments: your current production environment, or blue environment, and a staging environment, or green environment.</p>
</blockquote>
<p>I find <a href="https://aws.amazon.com/blogs/aws/new-fully-managed-blue-green-deployments-in-amazon-aurora-and-amazon-rds/" target="_blank" rel="noopener noreferrer" class="">this release</a> particularly valuable, given that many AWS customers are trying to maximize their use of Graviton for managed services, including RDS. Graviton processors are designed by AWS and achieve significant price-performance improvements. They also offer savings versus Intel chips. Typically, the adoption of Graviton for EC2 is a high-lift engineering activity since code and dependencies must support ARM. However, with managed services, AWS handles software dependency management. This makes RDS an excellent candidate for Graviton savings. Due to the stateful nature of databases, changes introduce additional risks. Blue/Green Deployments mitigate much of this risk by having two fully functional environments coexisting.</p>
<p>To test this feature, I provisioned a MySQL RDS instance with an older version on an Intel instance with a previous-generation general-purpose SSD. A Blue/Green Deployment can then be created via the Console and CLI, which spawns a second instance. I then modified the Green instance to use <code>gp3</code> storage, a Graviton instance type (<code>db.t4g.medium</code>), and the latest version of MySQL.</p>
<p><img decoding="async" loading="lazy" alt="rds-blue-green-deployment.png" src="https://your-docusaurus-site.example.com/assets/images/rds-blue-green-deployment-57a863b65a5130f2635b80d44cca5bc7.png" width="2732" height="558" class="img_ev3q"></p>
<p>Once the Green instance modifications were finished, I then switched over the instances.</p>
<p><img decoding="async" loading="lazy" alt="rds-blue-green-switch-over.png" src="https://your-docusaurus-site.example.com/assets/images/rds-blue-green-switch-over-6f8c9ea87cde1c14ef9c4434f9446022.png" width="2732" height="558" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="amazon-codewhisperer-support-for-c-and-typescript">Amazon CodeWhisperer Support for C# and TypeScript<a href="https://your-docusaurus-site.example.com/blog/about-reinvent-2022#amazon-codewhisperer-support-for-c-and-typescript" class="hash-link" aria-label="Direct link to Amazon CodeWhisperer Support for C# and TypeScript" title="Direct link to Amazon CodeWhisperer Support for C# and TypeScript" translate="no">​</a></h2>
<p>CodeWhisperer, Amazon's response to GitHub Copilot, is described as an ML-powered coding companion. I had yet to test the preview, but <a href="https://aws.amazon.com/about-aws/whats-new/2022/11/amazon-codewhisperer-enterprise-controls-sign-up-new-languages/" target="_blank" rel="noopener noreferrer" class="">this release</a> is relevant to me, given I write mostly TypeScript and C# these days. Moreover, TypeScript is particularly interesting to the cloud community, given that it is the de facto standard for CDK as the first language supported. CodeWhisperer is available as part of the AWS Toolkit for Visual Studio Code and the JetBrains suite, but I opted to give it a test run in Cloud9, AWS's cloud-based IDE.</p>
<p><img decoding="async" loading="lazy" alt="amazon-codewhisperer.png" src="https://your-docusaurus-site.example.com/assets/images/amazon-codewhisperer-2c64460042f06cc2b86e789e87ad7f76.png" width="3456" height="1866" class="img_ev3q"></p>
<p>CodeWhisperer is proficient at generating code against the AWS SDK, such as functions to stop an EC2 instance or fetch objects from an S3 bucket. With regards to CDK, it generated simple constructs sufficiently for me. However, CodeWhisperer tended to generate recommendations line-by-line instead of in large blocks for larger and more complex constructs. In addition, the recommendations seemed to be context-aware (i.e., recommending valid properties and methods based on class definitions). These two use cases alone provide a great deal of opportunity since most of the time I spend writing code with AWS SDK and CDK tends to be spent reading documentation.</p>]]></content:encoded>
            <category>Cloud</category>
        </item>
        <item>
            <title><![CDATA[The Nature of Code Companion Series: Introduction Chapter]]></title>
            <link>https://your-docusaurus-site.example.com/blog/nature-of-code-introduction-examples</link>
            <guid>https://your-docusaurus-site.example.com/blog/nature-of-code-introduction-examples</guid>
            <pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[A companion for the introduction section of Daniel Shiffman's book.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="about-the-book">About the Book<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-introduction-examples#about-the-book" class="hash-link" aria-label="Direct link to About the Book" title="Direct link to About the Book" translate="no">​</a></h2>
<p>Recently, I started reading a fantastic book called <em>The Nature of Code</em> by Daniel Shiffman. From the <a href="https://natureofcode.com/" target="_blank" rel="noopener noreferrer" class="">description</a>:</p>
<blockquote>
<p>How can we capture the unpredictable evolutionary and emergent properties of nature in software? How can understanding the mathematical principles behind our physical world help us to create digital worlds? This book focuses on a range of programming strategies and techniques behind computer simulations of natural systems, from elementary concepts in mathematics and physics to more advanced algorithms that enable sophisticated visual results. Readers will progress from building a basic physics engine to creating intelligent moving objects and complex systems, setting the foundation for further experiments in generative design.</p>
</blockquote>
<p>Daniel implements numerous examples using a programming language called <a href="https://processing.org/" target="_blank" rel="noopener noreferrer" class="">Processing</a>. Instead, I decided to write my own versions using JavaScript, React, Three.js, and D3. For this blog series, I intend to implement my learnings from each chapter. This first post covers the introduction section of the book.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="random-walk">Random Walk<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-introduction-examples#random-walk" class="hash-link" aria-label="Direct link to Random Walk" title="Direct link to Random Walk" translate="no">​</a></h2>
<p>A random walk traces a path through a Cartesian plane going in a random direction with each step (i.e., one pixel). The walks are built by plotting individual pixels as rectangles in Scalable Vector Graphics (SVGs). The program starts at <code>(200, 400)</code> for each walk to represent the center of the Cartesian plane. The <code>walk</code> function chooses a random direction and updates the internal state to indicate that a step has been taken.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">walk</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">pixels</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> step </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">step</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token operator" style="color:#393A34">--</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword module" style="color:#00009f">default</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token operator" style="color:#393A34">--</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    pixels</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The <code>walkWeightedRight</code> function illustrates the same functionality but with a non-uniform distribution. In this code, there's a 70% chance of moving to the right.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">walkWeightedRight</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">pixels</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> step </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">step </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">step </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token operator" style="color:#393A34">--</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">step </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token operator" style="color:#393A34">--</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    pixels</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The <code>randomWalk</code> function calls the <code>walk</code> or <code>walkWeightedRight</code> function until an edge is hit. The SVG is then rendered based on the pixels stored in memory representing the path.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">randomWalk</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">weightedRight</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> pixels </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">steps</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">current</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">steps</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">current</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">steps</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">max</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> width </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> height </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">coordinates</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">weightedRight</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">walkWeightedRight</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pixels</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">walk</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pixels</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">steps</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">current</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> pixels</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The random walks are capped at 10,000 pixels for performance reasons.</p>
<div><div><button class="button button--secondary button--md" style="background-color:#a7c080;color:#272e33"><svg data-prefix="fas" data-icon="arrows-rotate" class="svg-inline--fa fa-arrows-rotate" role="img" viewBox="0 0 512 512" aria-hidden="true"><path fill="currentColor" d="M65.9 228.5c13.3-93 93.4-164.5 190.1-164.5 53 0 101 21.5 135.8 56.2 .2 .2 .4 .4 .6 .6l7.6 7.2-47.9 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-128c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 53.4-11.3-10.7C390.5 28.6 326.5 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1zm443.5 64c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-53 0-101-21.5-135.8-56.2-.2-.2-.4-.4-.6-.6l-7.6-7.2 47.9 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 320c-8.5 0-16.7 3.4-22.7 9.5S-.1 343.7 0 352.3l1 127c.1 17.7 14.6 31.9 32.3 31.7S65.2 496.4 65 478.7l-.4-51.5 10.7 10.1c46.3 46.1 110.2 74.7 180.7 74.7 129 0 235.7-95.4 253.4-219.5z"></path></svg> Generate <!-- -->Random Walk</button><div><svg style="height:100%;width:100%;margin-right:0px;margin-left:0px" viewBox="0 0 800 400"><g class="plot-area"></g><g class="x-axis"></g><g class="y-axis"></g><rect x="399" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="214" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="214" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="214" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="214" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="213" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="212" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="211" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="210" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="209" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="208" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="207" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="195" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="194" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="193" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="192" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="191" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="190" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="189" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="188" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="187" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="175" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="175" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="175" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="186" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="185" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="184" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="183" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="182" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="181" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="180" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="179" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="178" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="177" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="176" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="175" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="174" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="173" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="172" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="171" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="170" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="99" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="398" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="397" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="396" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="395" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="99" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="98" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="98" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="99" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="98" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="99" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="98" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="98" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="98" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="97" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="97" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="95" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="95" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="94" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="94" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="93" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="94" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="94" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="94" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="94" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="95" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="94" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="93" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="93" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="93" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="93" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="93" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="94" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="95" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="95" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="95" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="96" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="97" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="97" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="98" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="97" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="97" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="97" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="97" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="98" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="99" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="100" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="101" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="102" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="103" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="104" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="105" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="106" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="107" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="108" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="109" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="110" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="111" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="112" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="113" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="114" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="394" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="115" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="393" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="392" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="391" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="116" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="390" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="117" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="389" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="118" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="119" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="120" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="121" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="122" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="123" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="124" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="125" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="126" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="127" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="128" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="129" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="130" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="131" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="132" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="133" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="134" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="135" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="136" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="388" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="387" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="386" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="385" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="384" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="383" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="137" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="138" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="139" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="382" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="381" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="140" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="141" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="380" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="379" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="142" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="143" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="144" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="378" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="145" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="146" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="147" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="148" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="149" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="377" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="376" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="375" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="374" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="373" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="372" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="371" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="150" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="151" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="152" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="153" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="370" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="369" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="154" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="155" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="156" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="368" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="157" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="367" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="366" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="365" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="158" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="364" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="347" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="347" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="347" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="347" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="347" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="348" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="159" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="160" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="161" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="349" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="350" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="169" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="168" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="351" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="352" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="353" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="162" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="354" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="355" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="356" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="357" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="358" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="163" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="359" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="164" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="363" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="362" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="361" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="165" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="166" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="360" y="167" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect></svg></div></div></div>
<br>
<div><div><button class="button button--secondary button--md" style="background-color:#a7c080;color:#272e33"><svg data-prefix="fas" data-icon="arrows-rotate" class="svg-inline--fa fa-arrows-rotate" role="img" viewBox="0 0 512 512" aria-hidden="true"><path fill="currentColor" d="M65.9 228.5c13.3-93 93.4-164.5 190.1-164.5 53 0 101 21.5 135.8 56.2 .2 .2 .4 .4 .6 .6l7.6 7.2-47.9 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-128c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 53.4-11.3-10.7C390.5 28.6 326.5 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1zm443.5 64c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-53 0-101-21.5-135.8-56.2-.2-.2-.4-.4-.6-.6l-7.6-7.2 47.9 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 320c-8.5 0-16.7 3.4-22.7 9.5S-.1 343.7 0 352.3l1 127c.1 17.7 14.6 31.9 32.3 31.7S65.2 496.4 65 478.7l-.4-51.5 10.7 10.1c46.3 46.1 110.2 74.7 180.7 74.7 129 0 235.7-95.4 253.4-219.5z"></path></svg> Generate <!-- -->Random Walk Weighted Right</button><div><svg style="height:100%;width:100%;margin-right:0px;margin-left:0px" viewBox="0 0 800 400"><g class="plot-area"></g><g class="x-axis"></g><g class="y-axis"></g><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="399" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="400" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="401" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="402" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="403" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="404" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="405" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="406" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="407" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="408" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="409" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="410" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="411" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="412" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="413" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="414" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="415" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="416" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="417" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="418" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="419" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="420" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="421" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="422" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="423" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="424" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="425" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="426" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="427" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="428" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="429" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="430" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="431" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="432" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="433" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="434" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="435" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="436" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="437" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="438" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="439" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="440" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="440" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="441" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="442" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="442" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="443" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="444" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="445" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="446" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="447" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="448" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="449" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="450" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="451" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="452" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="451" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="450" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="451" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="451" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="451" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="450" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="451" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="452" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="452" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="453" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="454" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="453" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="453" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="454" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="455" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="456" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="455" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="456" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="457" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="457" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="456" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="455" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="455" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="456" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="456" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="457" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="458" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="459" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="460" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="461" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="462" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="462" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="463" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="462" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="463" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="464" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="465" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="466" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="466" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="467" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="466" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="467" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="468" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="469" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="468" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="469" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="470" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="470" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="471" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="472" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="473" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="474" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="474" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="473" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="474" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="475" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="476" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="477" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="478" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="479" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="480" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="481" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="482" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="483" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="484" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="485" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="486" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="487" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="486" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="487" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="487" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="486" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="487" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="488" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="487" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="488" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="488" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="489" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="490" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="491" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="491" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="492" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="493" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="494" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="495" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="496" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="496" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="497" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="498" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="499" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="500" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="500" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="501" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="502" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="503" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="504" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="505" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="506" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="507" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="507" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="508" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="508" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="509" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="510" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="511" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="512" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="513" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="514" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="514" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="515" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="516" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="517" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="518" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="519" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="520" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="521" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="521" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="522" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="522" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="522" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="523" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="524" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="524" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="525" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="525" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="526" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="527" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="528" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="529" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="530" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="531" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="532" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="533" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="534" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="535" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="535" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="536" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="536" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="537" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="537" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="536" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="536" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="535" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="536" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="537" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="537" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="538" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="539" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="540" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="540" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="541" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="542" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="542" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="542" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="543" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="544" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="544" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="545" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="546" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="547" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="548" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="549" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="550" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="551" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="552" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="552" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="553" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="553" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="554" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="555" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="556" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="557" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="556" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="556" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="556" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="556" y="196" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="556" y="197" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="556" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="557" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="557" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="558" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="559" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="560" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="561" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="562" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="563" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="564" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="565" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="566" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="567" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="568" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="569" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="570" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="570" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="570" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="571" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="572" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="573" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="573" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="574" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="575" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="576" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="577" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="578" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="579" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="580" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="581" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="582" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="583" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="584" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="585" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="585" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="586" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="586" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="585" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="586" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="586" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="587" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="588" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="589" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="589" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="588" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="589" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="590" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="591" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="592" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="592" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="593" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="594" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="595" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="596" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="597" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="597" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="597" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="596" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="597" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="598" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="599" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="600" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="600" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="601" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="602" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="603" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="604" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="603" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="604" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="605" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="606" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="607" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="606" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="605" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="606" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="607" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="606" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="607" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="608" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="609" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="609" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="609" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="609" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="611" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="609" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="609" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="611" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="611" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="611" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="610" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="611" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="612" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="613" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="612" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="612" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="613" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="614" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="615" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="616" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="617" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="618" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="619" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="619" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="620" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="621" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="620" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="620" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="621" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="622" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="621" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="622" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="623" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="624" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="624" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="625" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="626" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="627" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="628" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="628" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="629" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="630" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="631" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="632" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="633" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="634" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="635" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="636" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="637" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="638" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="639" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="639" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="639" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="638" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="639" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="639" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="639" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="640" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="641" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="642" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="643" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="643" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="642" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="643" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="644" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="645" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="645" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="646" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="645" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="646" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="646" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="647" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="648" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="649" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="650" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="651" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="652" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="653" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="654" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="654" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="655" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="656" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="657" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="657" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="657" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="658" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="659" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="660" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="661" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="662" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="661" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="662" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="663" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="663" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="664" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="664" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="665" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="666" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="666" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="667" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="668" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="669" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="670" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="670" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="671" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="672" y="206" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="672" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="673" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="674" y="205" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="674" y="204" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="674" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="675" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="676" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="676" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="677" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="676" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="677" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="677" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="677" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="677" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="677" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="677" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="677" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="678" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="678" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="678" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="679" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="680" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="679" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="680" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="681" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="682" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="682" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="683" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="683" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="684" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="685" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="685" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="686" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="685" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="685" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="686" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="687" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="688" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="689" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="688" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="688" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="689" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="690" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="691" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="691" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="692" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="693" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="693" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="692" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="691" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="692" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="693" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="694" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="694" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="695" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="696" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="697" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="696" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="697" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="697" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="698" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="698" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="699" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="699" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="700" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="699" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="700" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="700" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="700" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="700" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="701" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="702" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="703" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="704" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="705" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="706" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="706" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="707" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="708" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="709" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="708" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="708" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="709" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="708" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="709" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="710" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="711" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="712" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="713" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="714" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="714" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="714" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="715" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="716" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="717" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="718" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="719" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="720" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="721" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="722" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="723" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="724" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="724" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="725" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="724" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="725" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="726" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="727" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="728" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="729" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="730" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="731" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="732" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="733" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="734" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="735" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="735" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="736" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="735" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="736" y="198" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="736" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="737" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="738" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="739" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="740" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="741" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="741" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="741" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="742" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="743" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="742" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="743" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="743" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="744" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="743" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="744" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="745" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="746" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="747" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="748" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="749" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="750" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="751" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="750" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="751" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="752" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="752" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="753" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="754" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="753" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="753" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="754" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="755" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="755" y="203" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="755" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="756" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="757" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="758" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="759" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="760" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="761" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="760" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="761" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="760" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="761" y="202" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="761" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="762" y="201" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="762" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="762" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="763" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="764" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="765" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="766" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="767" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="768" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="769" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="769" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="769" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="771" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="771" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="771" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="771" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="771" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="769" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="769" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="768" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="769" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="769" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="770" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="771" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="771" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="772" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="773" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="772" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="773" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="773" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="774" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="775" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="776" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="776" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="777" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="777" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="778" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="779" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="780" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="781" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="782" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="783" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="784" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="785" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="786" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="787" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="788" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="789" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="790" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="791" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="792" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="793" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="794" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="795" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="796" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="797" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="798" y="199" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="798" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect><rect x="799" y="200" width="1" height="1" style="fill:rgb(167, 192, 128)"></rect></svg></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="random-numbers-with-normal-distribution">Random Numbers with Normal Distribution<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-introduction-examples#random-numbers-with-normal-distribution" class="hash-link" aria-label="Direct link to Random Numbers with Normal Distribution" title="Direct link to Random Numbers with Normal Distribution" translate="no">​</a></h2>
<p>This example plots random numbers generated with a normal distribution (i.e., no specific weights).</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">generateRandomData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> datasetSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> maxValue </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> datasetSize</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">index</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> index</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> maxValue</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div><div><button class="button button--secondary button--md" style="background-color:#a7c080;color:#272e33"><svg data-prefix="fas" data-icon="arrows-rotate" class="svg-inline--fa fa-arrows-rotate" role="img" viewBox="0 0 512 512" aria-hidden="true"><path fill="currentColor" d="M65.9 228.5c13.3-93 93.4-164.5 190.1-164.5 53 0 101 21.5 135.8 56.2 .2 .2 .4 .4 .6 .6l7.6 7.2-47.9 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-128c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 53.4-11.3-10.7C390.5 28.6 326.5 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1zm443.5 64c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-53 0-101-21.5-135.8-56.2-.2-.2-.4-.4-.6-.6l-7.6-7.2 47.9 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 320c-8.5 0-16.7 3.4-22.7 9.5S-.1 343.7 0 352.3l1 127c.1 17.7 14.6 31.9 32.3 31.7S65.2 496.4 65 478.7l-.4-51.5 10.7 10.1c46.3 46.1 110.2 74.7 180.7 74.7 129 0 235.7-95.4 253.4-219.5z"></path></svg> Generate New Data</button><div><svg style="height:100%;width:100%;margin-right:0px;margin-left:0px" viewBox="0 0 800 400"><g class="plot-area"></g><g class="x-axis"></g><g class="y-axis"></g></svg></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bell-curve-frequency-distribution">Bell Curve (Frequency Distribution)<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-introduction-examples#bell-curve-frequency-distribution" class="hash-link" aria-label="Direct link to Bell Curve (Frequency Distribution)" title="Direct link to Bell Curve (Frequency Distribution)" translate="no">​</a></h2>
<p>This example shows how to create a bell curve for one thousand monkeys ranging in height from 200 to 300 pixels with a normal distribution. First, the code generates the data.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">generateHeightData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> datasetSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> baseHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> maxRandomValue </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> datasetSize</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">index</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> index</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// generate a height between 200 and 300</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> baseHeight </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> maxRandomValue</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">current</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> next</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> current</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> next</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Next, the code computes the standard deviation.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">computeMean</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">array</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> sum </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        sum </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> array</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> sum </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">computeStandardDeviation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">data</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> mean</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> sumSquareDeviation </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        sumSquareDeviation </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">pow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> mean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sqrt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sumSquareDeviation </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Lastly, the code groups each monkey by standard deviations for the x-axis and plots the frequency counts for the y-axis.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">generateHeightBellCurve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">generateHeightData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> meanHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">computeMean</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> standardDeviationHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">computeStandardDeviation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> meanHeight</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> bellCurveData </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">standardDeviations</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">round</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> meanHeight</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> standardDeviationHeight</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">bellCurveData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">standardDeviations</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            bellCurveData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">standardDeviations</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">standardDeviations</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">standardDeviations</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">count</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            bellCurveData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">standardDeviations</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">count</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token known-class-name class-name">Object</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bellCurveData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">key</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> bellCurveData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">key</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">one</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> other</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> one</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">standardDeviations</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> other</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">standardDeviations</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div><div><button class="button button--secondary button--md" style="background-color:#a7c080;color:#272e33"><svg data-prefix="fas" data-icon="arrows-rotate" class="svg-inline--fa fa-arrows-rotate" role="img" viewBox="0 0 512 512" aria-hidden="true"><path fill="currentColor" d="M65.9 228.5c13.3-93 93.4-164.5 190.1-164.5 53 0 101 21.5 135.8 56.2 .2 .2 .4 .4 .6 .6l7.6 7.2-47.9 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-128c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 53.4-11.3-10.7C390.5 28.6 326.5 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1zm443.5 64c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-53 0-101-21.5-135.8-56.2-.2-.2-.4-.4-.6-.6l-7.6-7.2 47.9 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 320c-8.5 0-16.7 3.4-22.7 9.5S-.1 343.7 0 352.3l1 127c.1 17.7 14.6 31.9 32.3 31.7S65.2 496.4 65 478.7l-.4-51.5 10.7 10.1c46.3 46.1 110.2 74.7 180.7 74.7 129 0 235.7-95.4 253.4-219.5z"></path></svg> Generate New Bell Curve</button><div><svg style="height:100%;width:100%;margin-right:0px;margin-left:0px" viewBox="0 0 800 400"><g class="plot-area"></g><g class="x-axis"></g><g class="y-axis"></g></svg></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-section">Next Section<a href="https://your-docusaurus-site.example.com/blog/nature-of-code-introduction-examples#next-section" class="hash-link" aria-label="Direct link to Next Section" title="Direct link to Next Section" translate="no">​</a></h2>
<p><a href="https://scottie.is/blog/nature-of-code-chapter-one-examples" target="_blank" rel="noopener noreferrer" class="">Chapter one</a> explores Euclidean vectors and the basics of motion.</p>]]></content:encoded>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[Writing Cost-Conscious Terraform Using Infracost and AWS Developer Tools]]></title>
            <link>https://your-docusaurus-site.example.com/blog/cost-conscious-terraform</link>
            <guid>https://your-docusaurus-site.example.com/blog/cost-conscious-terraform</guid>
            <pubDate>Sat, 16 Jul 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[A CI/CD pipeline that alerts Terraform developers of cost increases.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-overview">Solution Overview<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#solution-overview" class="hash-link" aria-label="Direct link to Solution Overview" title="Direct link to Solution Overview" translate="no">​</a></h2>
<p>My current role focuses on every facet of AWS cost optimization. Much of this entails helping to remediate existing infrastructure and usage. Many customers ask how they can shift left on cloud costs, like they do with security. Ultimately, cost consciousness needs to be injected into every aspect of the engineering lifecycle: from the initial architecture design to implementation and upkeep.</p>
<p>One such aspect is providing developers visibility into the impact of their code changes. Infrastructure as code has made it easy to deploy cloud resources faster and at larger scale than ever before, but this means that cloud bills can also scale up quickly in parallel. This solution demonstrates how to integrate <a href="https://www.infracost.io/" target="_blank" rel="noopener noreferrer" class="">Infracost</a> into a deployment pipeline to bring cost impact to the pull request process and code review discussion. The source code is <a href="https://github.com/scottenriquez/infracost-cdk-pipeline" target="_blank" rel="noopener noreferrer" class="">hosted on GitHub</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-architecture">Solution Architecture<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#solution-architecture" class="hash-link" aria-label="Direct link to Solution Architecture" title="Direct link to Solution Architecture" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Diagram" src="https://your-docusaurus-site.example.com/assets/images/infracost-de5fbcd14329e25578a5f4f91694b35a.png" width="1386" height="627" class="img_ev3q"></p>
<p>This solution deploys several resources:</p>
<ul>
<li class="">A CodeCommit repository pre-loaded with Terraform code for a VPC, EC2 instance, S3 bucket, and Lambda function to serve as some example infrastructure costs to monitor</li>
<li class="">A CodeBuild project triggered by pull request state changes that analyzes cost changes relative to the <code>main</code> branch</li>
<li class="">A CodePipeline with manual approvals to deploy the Terraform for changes pushed to the <code>main</code> branch</li>
<li class="">An SNS topic to notify developers of cost changes</li>
<li class="">An S3 bucket to store Terraform state remotely</li>
<li class="">An S3 bucket to store CodePipeline artifacts</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preparing-your-development-environment">Preparing Your Development Environment<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#preparing-your-development-environment" class="hash-link" aria-label="Direct link to Preparing Your Development Environment" title="Direct link to Preparing Your Development Environment" translate="no">​</a></h2>
<p>While this solution is for writing, deploying, and analyzing Terraform HCL syntax, I wrote the infrastructure code for the deployment pipeline and dependent resources using AWS CDK, which is my daily driver for infrastructure as code. Of course, the source code could be rewritten using Terraform or <a href="https://www.terraform.io/cdktf" target="_blank" rel="noopener noreferrer" class="">CDK for Terraform</a>, but I used CDK for the sake of a quick prototype that only creates AWS resources (i.e., no need for additional providers). In addition, Infracost currently only supports Terraform, but there are <a href="https://www.infracost.io/docs/supported_resources/overview/" target="_blank" rel="noopener noreferrer" class="">plans for CloudFormation and CDK</a> in the future.</p>
<p>The following dependencies are required to deploy the pipeline infrastructure:</p>
<ul>
<li class="">An AWS account</li>
<li class="">Node.js</li>
<li class="">Terraform</li>
<li class=""><a href="https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html" target="_blank" rel="noopener noreferrer" class="">AWS CDK</a></li>
<li class=""><a href="https://www.infracost.io/docs/" target="_blank" rel="noopener noreferrer" class="">An Infracost API key</a></li>
<li class=""><a href="https://github.com/scottenriquez/infracost-cdk-pipeline" target="_blank" rel="noopener noreferrer" class="">Source code</a></li>
</ul>
<p>Rather than installing Node.js, CDK, Terraform, and all other dependencies on your local machine, you can alternatively create a <a href="https://aws.amazon.com/cloud9/" target="_blank" rel="noopener noreferrer" class="">Cloud9 IDE</a> with these pre-installed via the Console or with a CloudFormation template:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">Resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rCloud9Environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Cloud9</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EnvironmentEC2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">AutomaticStopTimeMinutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ConnectionType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CONNECT_SSH</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Environment for writing and deploying CDK</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># AWS Free Tier eligible</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">InstanceType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> t2.micro</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> InfracostCDKPipelineCloud9Environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># https://docs.aws.amazon.com/cloud9/latest/user-guide/vpc-settings.html#vpc-settings-create-subnet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SubnetId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> subnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">EXAMPLE</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-deployment-and-configuration">Installation, Deployment, and Configuration<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#installation-deployment-and-configuration" class="hash-link" aria-label="Direct link to Installation, Deployment, and Configuration" title="Direct link to Installation, Deployment, and Configuration" translate="no">​</a></h2>
<p>Before deploying the CDK application, <a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-create-console.html" target="_blank" rel="noopener noreferrer" class="">store the Infracost API key in an SSM parameter</a> <code>SecureString</code> called <code>/terraform/infracost/api_key</code>.</p>
<p>To install and deploy the pipeline, use the following commands:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/scottenriquez/infracost-cdk-pipeline.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> infracost-cdk-pipeline/infracost-cdk-pipeline/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk bootstrap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk deploy</span><br></div></code></pre></div></div>
<p>Before testing the pipeline, <a href="https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html" target="_blank" rel="noopener noreferrer" class="">subscribe to the SNS topic via the Console</a>. For testing purposes, use email to get the cost change data delivered.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-deployment-pipeline">Using the Deployment Pipeline<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#using-the-deployment-pipeline" class="hash-link" aria-label="Direct link to Using the Deployment Pipeline" title="Direct link to Using the Deployment Pipeline" translate="no">​</a></h2>
<p>The CodePipeline resource is triggered at creation, but there are manual approval stages to prevent any infrastructure from being created without intervention. Feel free to deploy the Terraform, but it is not required for generating cost differences via a pull request. The CodePipeline is triggered by changes to <code>main</code>.</p>
<p><img decoding="async" loading="lazy" alt="Approval" src="https://your-docusaurus-site.example.com/assets/images/codepipeline-approval-3addec5d707e15cf35b8b897a054bb3b.png" width="2802" height="1718" class="img_ev3q"></p>
<p>Make some code changes to see the cost impact. To modify the Terraform code, either use the CodeCommit GUI in the Console or clone the repository to your development environment. First, create a branch called <code>feature</code> off of <code>main</code>. Then modify <code>ec2.tf</code> to use a different instance type:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">infracost-cdk-pipeline/lib/terraform/ec2.tf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">resource </span><span class="token keyword type variable" style="color:#36acaa">"aws_instance"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"server"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Amazon Linux 2 Kernel 5.10 AMI 2.0.20220606.1 x86_64 HVM in us-east-1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># if deploying outside of us-east-1, you must use the corresponding AL2 AMI for your region</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">ami</span><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ami-0cff7528ff583bf9a"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># changed from t3.micro</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">instance_type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"m5.large"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">subnet_id</span><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> module.vpc.private_subnets</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">root_block_device</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">volume_type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gp3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">volume_size</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Infracost also supports usage estimates in addition to resource costs. For example, changing the storage GBs for the S3 bucket in <code>infracost-usage.yml</code> will also update the cost comparison and estimate. These values are hardcoded and version-controlled here, but Infracost is also <a href="https://www.infracost.io/docs/features/usage_based_resources/" target="_blank" rel="noopener noreferrer" class="">experimenting with fetching actual usage data via CloudWatch</a>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">infracost-cdk-pipeline/lib/terraform/infracost-usage.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">resource_usage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">aws_lambda_function.function</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">monthly_requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">request_duration_ms</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">250</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">aws_s3_bucket.bucket</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">standard</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># changed from 10000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">storage_gb</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">monthly_tier_1_requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><br></div></code></pre></div></div>
<p>Commit these changes to the <code>feature</code> branch and open a pull request. Doing so will trigger the CodeBuild project that computes the cost delta and publishes the payload to the SNS topic if the amount increases. Assuming you subscribed to the SNS topic via email, some JSON should be in your inbox. Here's an abridged example output:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"currency"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"USD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"projects"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"codecommit::us-east-1://TerraformRepository/."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"metadata"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"path"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/tmp/main"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"infracostCommand"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"breakdown"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"terraform_dir"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"branch"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"main"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"commit"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2e6eafd94811a0c9ac814a8c31132dc3badc0b9f"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"commitAuthorName"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AWS CodeCommit"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"commitAuthorEmail"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"noreply-awscodecommit@amazon.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"commitTimestamp"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2022-07-16T05:47:50Z"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"commitMessage"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Initial commit by AWS CodeCommit"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"vcsRepoUrl"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"codecommit::us-east-1://TerraformRepository"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"vcsSubPath"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"totalHourlyCost"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.41661461198630137000733251"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"totalMonthlyCost"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"304.12866675"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"pastTotalHourlyCost"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.33101461198630137000733251"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"pastTotalMonthlyCost"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"241.64066675"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"diffTotalHourlyCost"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.0856"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"diffTotalMonthlyCost"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"62.488"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"timeGenerated"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2022-07-16T06:21:02.155239211Z"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"summary"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"totalDetectedResources"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"totalSupportedResources"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"totalUnsupportedResources"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"totalUsageBasedResources"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"totalNoPriceResources"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"unsupportedResourceCounts"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"noPriceResourceCounts"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="diving-into-the-pull-request-build-logic">Diving Into the Pull Request Build Logic<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#diving-into-the-pull-request-build-logic" class="hash-link" aria-label="Direct link to Diving Into the Pull Request Build Logic" title="Direct link to Diving Into the Pull Request Build Logic" translate="no">​</a></h2>
<p>The TypeScript for describing the deployment pipeline lives in <code>infracost-cdk-pipeline-stack.ts</code>. The following code snippet (with comments explaining the <code>install</code> and <code>build</code> phases) contains the core logic for integrating Infracost into the pull request:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">infracost-cdk-pipeline/lib/infracost-cdk-pipeline-stack.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> pullRequestCodeBuildProject </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">Project</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'TerraformPullRequestCodeBuildProject'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  buildSpec</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> codebuild</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">BuildSpec</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fromObject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    version</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'0.2'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    phases</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      install</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        commands</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// checkout the feature branch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'git checkout $CODEBUILD_SOURCE_VERSION'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'sudo yum -y install unzip python3-pip jq'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'sudo pip3 install git-remote-codecommit'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">wget https://releases.hashicorp.com/terraform/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">terraformVersion</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">/terraform_</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">terraformVersion</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">_linux_amd64.zip</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">unzip terraform_</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">terraformVersion</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">_linux_amd64.zip</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'sudo mv terraform /usr/local/bin/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// clone the main branch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">git clone </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">terraformRepository</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">repositoryCloneUrlGrc</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c"> --branch=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">mainBranchName</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c"> --single-branch /tmp/main</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// generate Infracost baseline file for main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'infracost breakdown --path /tmp/main --usage-file infracost-usage.yml --format json --out-file infracost-main.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      build</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        commands</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// initialize Terraform with remote state</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">terraform init -backend-config="bucket=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">terraformStateBucket</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">bucketName</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">"</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'terraform plan'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// compute diff based on baseline created from main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'infracost diff --path . --compare-to infracost-main.json --usage-file infracost-usage.yml --format json --out-file infracost-pull-request.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// parse JSON to get total monthly difference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">DIFF_TOTAL_MONTHLY_COST=$(jq '.diffTotalMonthlyCost | tonumber | floor' infracost-pull-request.json)</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// if there's a cost increase, publish the diff to the SNS topic</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">if [[ $DIFF_TOTAL_MONTHLY_COST -gt 0 ]]; then aws sns publish --topic-arn </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">terraformCostTopic</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">topicArn</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c"> --message file://infracost-pull-request.json; fi</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>More advanced notification logic, such as using the percentage increase for an alert threshold, could be implemented to minimize noise for developers. Additionally, offloading the logic to a Lambda function and invoking it via the CLI or SNS would allow for more robust and testable logic than a simple shell script. Alternatively, the cost delta could be added as a comment on the source pull request. Choose the option that makes the most sense for your code review process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Technology alone will not resolve all cost optimization challenges. However, integrating cost analysis into code reviews is integral to shaping a cost-conscious culture. It is much better to find and address cost spikes before infrastructure is deployed. Seeing a large cost increase from <code>infracost diff</code> is scary, but seeing it in Cost Explorer later is far scarier.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cleanup">Cleanup<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#cleanup" class="hash-link" aria-label="Direct link to Cleanup" title="Direct link to Cleanup" translate="no">​</a></h2>
<p>If you deployed resources via the deployment pipeline, be sure to either use the <code>DestroyTerraform</code> CodeBuild project or run:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># set the bucket name variable or replace with a value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># the bucket name nomenclature is 'terraform-state-' followed by a UUID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># this can also be found via the Console</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform init -backend-config</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"bucket=</span><span class="token string variable" style="color:#36acaa">$TERRAFORM_STATE_S3_BUCKET_NAME</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform destroy</span><br></div></code></pre></div></div>
<p>To destroy the pipeline itself run:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cdk destroy</span><br></div></code></pre></div></div>
<p>If you spun up a Cloud9 environment, be sure to delete that as well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="disclaimer">Disclaimer<a href="https://your-docusaurus-site.example.com/blog/cost-conscious-terraform#disclaimer" class="hash-link" aria-label="Direct link to Disclaimer" title="Direct link to Disclaimer" translate="no">​</a></h2>
<p>At the time of writing this blog post, I currently work for Amazon Web Services. The opinions and views expressed here are my own and not the views of my employer.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[A CDK Companion for Rahul Nath's .NET Lambda Course]]></title>
            <link>https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course</link>
            <guid>https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course</guid>
            <pubDate>Fri, 17 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[CDK examples for .NET Lambda functions.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-course-and-companion">The Course and Companion<a href="https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course#the-course-and-companion" class="hash-link" aria-label="Direct link to The Course and Companion" title="Direct link to The Course and Companion" translate="no">​</a></h2>
<p><a href="https://www.rahulpnath.com/" target="_blank" rel="noopener noreferrer" class="">Rahul Nath</a> recently released a course called AWS Lambda for the .NET Developer on <a href="https://www.udemy.com/course/aws-lambda-dotnet/" target="_blank" rel="noopener noreferrer" class="">Udemy</a> and <a href="https://rahulpnath.gumroad.com/l/aws-lambda-dot-net" target="_blank" rel="noopener noreferrer" class="">Gumroad</a>. I had a ton of fun going through the exercises and highly recommend purchasing a copy. While working through the material, I implemented the solutions with infrastructure as code using AWS CDK in C# and .NET 6. I also containerized most of the Lambda functions and wrote unit tests for both the functions and infrastructure. You can find all my <a href="https://github.com/scottenriquez/rahul-nath-dotnet-lambda-course-cdk-companion" target="_blank" rel="noopener noreferrer" class="">source code on GitHub</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="technology-decisions-and-benefits">Technology Decisions and Benefits<a href="https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course#technology-decisions-and-benefits" class="hash-link" aria-label="Direct link to Technology Decisions and Benefits" title="Direct link to Technology Decisions and Benefits" translate="no">​</a></h2>
<p>While infrastructure as code (IaC) has existed within the AWS ecosystem for over a decade, adoption has exploded in recent years due to the ability to manage large amounts of infrastructure at scale and standardize design across an organization. There are many options including CloudFormation (CFN), CDK, and Terraform for IaC and Serverless Application Model (SAM) and Serverless Framework for development. <a href="https://acloudguru.com/blog/engineering/cloudformation-terraform-or-cdk-guide-to-iac-on-aws" target="_blank" rel="noopener noreferrer" class="">This article from A Cloud Guru</a> quickly sums up the pros and cons of each IaC option. I choose this particular stack for some key reasons:</p>
<ul>
<li class="">Docker ensures that the Lambda functions run consistently across local development, builds, and production environments and simplifies dependency management</li>
<li class="">CDK allows the infrastructure to be described as C# instead of YAML, JSON, or HCL</li>
<li class="">CDK provides the ability to inject more robust logic than intrinsic functions in CloudFormation and more modularity as well while still being an AWS-supported offering</li>
<li class="">CDK supports unit testing</li>
</ul>
<p>Elaborating on the final point, here is an example unit test for ensuring that a DynamoDB table is destroyed when the stack is. The default behavior is for the table to be retained, leading to clutter and cost since this is a non-production project. This is an example how of IaC can be meaningfully tested:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token attribute class-name">Fact</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Stack_DynamoDb_ShouldHaveDeletionPolicyDelete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// arrange</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">App</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">App</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">LambdaWithApiGatewayStack</span><span class="token plain"> stack </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">LambdaWithApiGatewayStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LambdaWithApiGatewayStack"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// act</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Template</span><span class="token plain"> template </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Template</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">stack</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// assert</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    template</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">HasResource</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"AWS::DynamoDB::Table"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Dictionary</span><span class="token constructor-invocation class-name punctuation" style="color:#393A34">&lt;</span><span class="token constructor-invocation class-name keyword" style="color:#00009f">string</span><span class="token constructor-invocation class-name punctuation" style="color:#393A34">,</span><span class="token constructor-invocation class-name"> </span><span class="token constructor-invocation class-name keyword" style="color:#00009f">object</span><span class="token constructor-invocation class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"DeletionPolicy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Delete"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dependencies">Dependencies<a href="https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course#dependencies" class="hash-link" aria-label="Direct link to Dependencies" title="Direct link to Dependencies" translate="no">​</a></h2>
<p>To build and run this codebase, the following dependencies must be installed:</p>
<ul>
<li class="">.NET 6</li>
<li class="">Node.js</li>
<li class="">Docker</li>
<li class="">AWS CDK</li>
<li class="">Credentials configured in <code>~/.aws/credentials</code>(easily done with the AWS CLI)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-development-environment-and-cpu-architecture-considerations">My Development Environment and CPU Architecture Considerations<a href="https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course#my-development-environment-and-cpu-architecture-considerations" class="hash-link" aria-label="Direct link to My Development Environment and CPU Architecture Considerations" title="Direct link to My Development Environment and CPU Architecture Considerations" translate="no">​</a></h2>
<p>I developed all the code on my M1 MacBook Pro using JetBrains Rider. Because of my machine's ARM processor, it's key to note that all of my Dockerfiles use ARM images (e.g., <code>public.ecr.aws/lambda/dotnet:6-arm64</code>) and are deployed to <a href="https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/" target="_blank" rel="noopener noreferrer" class="">Graviton2 Lambda environments</a>. I suspect that most folks reading this are using x86 Windows machines, so here is a modified Dockerfile illustrating the requisite changes:</p>
<div class="language-dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaWithAPIGateway/src/LambdaWithApiGateway.DockerFunction/src/LambdaWithApiGateway.DockerFunction/Dockerfile</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># ARM</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># FROM public.ecr.aws/lambda/dotnet:6-arm64 AS base</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># x86</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> public.ecr.aws/lambda/dotnet:6 </span><span class="token instruction keyword" style="color:#00009f">AS</span><span class="token instruction"> base</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ARM</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim-amd64 as build</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># x86</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim </span><span class="token instruction keyword" style="color:#00009f">as</span><span class="token instruction"> build</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">WORKDIR</span><span class="token instruction"> /src</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">COPY</span><span class="token instruction"> [</span><span class="token instruction string" style="color:#e3116c">"LambdaWithApiGateway.DockerFunction.csproj"</span><span class="token instruction">, </span><span class="token instruction string" style="color:#e3116c">"LambdaWithApiGateway.DockerFunction/"</span><span class="token instruction">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> dotnet restore </span><span class="token instruction string" style="color:#e3116c">"LambdaWithApiGateway.DockerFunction/LambdaWithApiGateway.DockerFunction.csproj"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">WORKDIR</span><span class="token instruction"> </span><span class="token instruction string" style="color:#e3116c">"/src/LambdaWithApiGateway.DockerFunction"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">COPY</span><span class="token instruction"> . .</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> dotnet build </span><span class="token instruction string" style="color:#e3116c">"LambdaWithApiGateway.DockerFunction.csproj"</span><span class="token instruction"> --configuration Release --output /app/build</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> build </span><span class="token instruction keyword" style="color:#00009f">AS</span><span class="token instruction"> publish</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> dotnet publish </span><span class="token instruction string" style="color:#e3116c">"LambdaWithApiGateway.DockerFunction.csproj"</span><span class="token instruction"> </span><span class="token instruction operator" style="color:#393A34">\</span><span class="token instruction"></span><br></div><div class="token-line" style="color:#393A34"><span class="token instruction">            --configuration Release </span><span class="token instruction operator" style="color:#393A34">\</span><span class="token instruction"></span><br></div><div class="token-line" style="color:#393A34"><span class="token instruction">            </span><span class="token instruction comment" style="color:#999988;font-style:italic"># ARM</span><span class="token instruction"></span><br></div><div class="token-line" style="color:#393A34"><span class="token instruction">            </span><span class="token instruction comment" style="color:#999988;font-style:italic"># --runtime linux-arm64</span><span class="token instruction"></span><br></div><div class="token-line" style="color:#393A34"><span class="token instruction">            </span><span class="token instruction comment" style="color:#999988;font-style:italic"># x86</span><span class="token instruction"></span><br></div><div class="token-line" style="color:#393A34"><span class="token instruction">            --runtime linux-x64 </span><span class="token instruction operator" style="color:#393A34">\</span><span class="token instruction"></span><br></div><div class="token-line" style="color:#393A34"><span class="token instruction">            --self-contained false </span><span class="token instruction operator" style="color:#393A34">\</span><span class="token instruction"></span><br></div><div class="token-line" style="color:#393A34"><span class="token instruction">            --output /app/publish </span><span class="token instruction operator" style="color:#393A34">\</span><span class="token instruction"></span><br></div><div class="token-line" style="color:#393A34"><span class="token instruction">            -p:PublishReadyToRun=true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> base </span><span class="token instruction keyword" style="color:#00009f">AS</span><span class="token instruction"> final</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">WORKDIR</span><span class="token instruction"> /var/task</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">COPY</span><span class="token instruction"> </span><span class="token instruction options property" style="color:#36acaa">--from</span><span class="token instruction options punctuation" style="color:#393A34">=</span><span class="token instruction options string" style="color:#e3116c">publish</span><span class="token instruction"> /app/publish .</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">CMD</span><span class="token instruction"> [</span><span class="token instruction string" style="color:#e3116c">"LambdaWithApiGateway.DockerFunction::LambdaWithApiGateway.DockerFunction.Function::FunctionHandler"</span><span class="token instruction">]</span><br></div></code></pre></div></div>
<p>The CDK code for the Lambda function also requires a slight change:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaWithAPIGateway/src/LambdaWithApiGateway/LambdaWithApiGatewayStack.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token class-name">DockerImageFunction</span><span class="token plain"> sqsDockerImageFunction </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DockerImageFunction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LambdaFunction"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DockerImageFunctionProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ARM</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Architecture = Architecture.ARM_64,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// x86</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Architecture </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Architecture</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">X86_64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Code </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sqsDockerImageCode</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Description </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">".NET 6 Docker Lambda function for polling SQS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Role </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sqsDockerFunctionExecutionRole</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Timeout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Duration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Seconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-cloud9">Using Cloud9<a href="https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course#using-cloud9" class="hash-link" aria-label="Direct link to Using Cloud9" title="Direct link to Using Cloud9" translate="no">​</a></h2>
<p>AWS offers a browser-based IDE called Cloud9 that has nearly all required dependencies installed. The IDE can be provisioned from the AWS Console or via infrastructure as code. Unfortunately, Cloud9 does not support Graviton-based instances yet. Below is a CloudFormation template for provisioning an environment with the source code pre-loaded:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">Resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rCloud9Environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Cloud9</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EnvironmentEC2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">AutomaticStopTimeMinutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ConnectionType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CONNECT_SSM</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">based cloud development environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">InstanceType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> m5.large</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Cloud9Environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Repositories</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">PathComponent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /repos/rahul</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">nath</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dotnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">lambda</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">course</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cdk</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">companion</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">RepositoryUrl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/scottenriquez/rahul</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">nath</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dotnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">lambda</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">course</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cdk</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">companion.git</span><br></div></code></pre></div></div>
<p>Note that the instance must be deployed to a public subnet. The Cloud9 AMI does not have .NET 6 pre-installed. To do so, run the following commands:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-Uvh</span><span class="token plain"> https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> yum </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> dotnet-sdk-6.0</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-structure">Code Structure<a href="https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course#code-structure" class="hash-link" aria-label="Direct link to Code Structure" title="Direct link to Code Structure" translate="no">​</a></h2>
<p>Each section of the course has a separate solution in the repository:</p>
<ul>
<li class=""><code>FirstLambda</code> is a simple ZIP Lambda function that returns the uppercase version of a string</li>
<li class=""><code>LambdaWithDynamoDb</code> is a simple Lambda function that queries a DynamoDB table</li>
<li class=""><code>LambdaWithApiGateway</code> is a full CRUD app using DynamoDB for storage</li>
<li class=""><code>LambdaTriggers</code> are event-driven Lambda functions triggered by SNS and SQS</li>
</ul>
<p>Each solution is structured in the same way. I generated the CDK app using the CLI and used the Lambda templates to create my functions like so:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># create the CDK application</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># the name is derived from the directory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># this snippet assumes the directory is called Lambda</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk init app </span><span class="token parameter variable" style="color:#36acaa">--language</span><span class="token plain"> csharp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># install the latest version of the .NET Lambda templates</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet new </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> Amazon.Lambda.Templates</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> src/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># create the function</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet new lambda.image.EmptyFunction </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> Lambda.DockerFunction</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># add the projects to the solution file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet sln </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> Lambda.DockerFunction/src/Lambda.DockerFunction/Lambda.DockerFunction.csproj</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet sln </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> Lambda.DockerFunction/test/Lambda.DockerFunction.Tests/Lambda.DockerFunction.Tests.csproj</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># build the solution and run the sample unit test to verify that everything is wired up correctly</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet </span><span class="token builtin class-name">test</span><span class="token plain"> Lambda.sln</span><br></div></code></pre></div></div>
<p>Each Lambda function has projects for the handler code and unit tests. All CDK code for infrastructure resides in the corresponding <code>*Stack.cs</code> file. Here is some example IaC for a Lambda function triggered by SQS:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaTriggers/src/LambdaTriggers/LambdaTriggersStack.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">LambdaTriggersStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token type-list class-name">Stack</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">LambdaTriggersStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Construct</span><span class="token plain"> scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">IStackProps</span><span class="token plain"> props </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">base</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Queue</span><span class="token plain"> queue </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Queue</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Queue"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Role</span><span class="token plain"> sqsDockerFunctionExecutionRole </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Role</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SqsDockerFunctionExecutionRole"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">RoleProps</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            AssumedBy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ServicePrincipal</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"lambda.amazonaws.com"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            ManagedPolicies </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">IManagedPolicy</span><span class="token constructor-invocation class-name punctuation" style="color:#393A34">[</span><span class="token constructor-invocation class-name punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ManagedPolicy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ManagedPolicy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ManagedPolicyProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Document </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">PolicyDocument</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">PolicyDocumentProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        Statements </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">PolicyStatement</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">PolicyStatementProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                Actions </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sqs:*"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                Resources </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> queue</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">QueueArn </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">PolicyStatement</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">PolicyStatementProps</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                Actions </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                    </span><span class="token string" style="color:#e3116c">"logs:CreateLogGroup"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                    </span><span class="token string" style="color:#e3116c">"logs:CreateLogStream"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                    </span><span class="token string" style="color:#e3116c">"logs:PutLogEvents"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                Effect </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Effect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ALLOW</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                Resources </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">DockerImageCode</span><span class="token plain"> sqsDockerImageCode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> DockerImageCode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromImageAsset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"src/LambdaTriggers.SqsDockerFunction/src/LambdaTriggers.SqsDockerFunction"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">DockerImageFunction</span><span class="token plain"> sqsDockerImageFunction </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DockerImageFunction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LambdaFunction"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DockerImageFunctionProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                Architecture </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Architecture</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ARM_64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                Code </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sqsDockerImageCode</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                Description </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">".NET 6 Docker Lambda function for polling SQS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                Role </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sqsDockerFunctionExecutionRole</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                Timeout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Duration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Seconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">SqsEventSource</span><span class="token plain"> sqsEventSource </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">SqsEventSource</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">queue</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        sqsDockerImageFunction</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddEventSource</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sqsEventSource</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resource-deployment">Resource Deployment<a href="https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course#resource-deployment" class="hash-link" aria-label="Direct link to Resource Deployment" title="Direct link to Resource Deployment" translate="no">​</a></h2>
<p>To deploy the infrastructure, navigate to the corresponding section folder and use the CDK CLI like so:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> LambdaTriggers</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk deploy</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resource-cleanup">Resource Cleanup<a href="https://your-docusaurus-site.example.com/blog/a-cdk-companion-for-the-rahul-nath-lambda-course#resource-cleanup" class="hash-link" aria-label="Direct link to Resource Cleanup" title="Direct link to Resource Cleanup" translate="no">​</a></h2>
<p>To destroy resources, run this command in the same directory:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cdk destroy</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[Using the New Terraform for CDK Convert Feature]]></title>
            <link>https://your-docusaurus-site.example.com/blog/about-cdktf-convert</link>
            <guid>https://your-docusaurus-site.example.com/blog/about-cdktf-convert</guid>
            <pubDate>Mon, 02 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Testing the new CDKTF 0.5 feature.]]></description>
            <content:encoded><![CDATA[<p>I previously wrote <a href="https://scottie.is/blog/cdktf-alpha-csharp-infrastructure/" target="_blank" rel="noopener noreferrer" class="">a blog post</a> about getting started with Terraform for CDK and the benefits. At that time, the latest version was 0.3. Last week, <a href="https://github.com/hashicorp/terraform-cdk/releases/tag/v0.5.0" target="_blank" rel="noopener noreferrer" class="">version 0.5</a> was released. In this version, some new experimental features could make adopting CDK for Terraform exponentially easier.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-convert-command">The Convert Command<a href="https://your-docusaurus-site.example.com/blog/about-cdktf-convert#the-convert-command" class="hash-link" aria-label="Direct link to The Convert Command" title="Direct link to The Convert Command" translate="no">​</a></h2>
<p>The CLI command takes in a Terraform file and converts it to the language specified.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> terraform.tf </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> cdktf convert </span><span class="token parameter variable" style="color:#36acaa">--language</span><span class="token plain"> csharp</span><br></div></code></pre></div></div>
<p>I started with a single <code>terraform.tf</code> file that creates an Azure App Service.</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">source</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">version</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"=2.46.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">provider</span><span class="token keyword type variable" style="color:#36acaa"> "azurerm" </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">features</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">resource </span><span class="token keyword type variable" style="color:#36acaa">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf_convert_rg"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">name</span><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf-convert-resource-group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">location</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Central US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">resource </span><span class="token keyword type variable" style="color:#36acaa">"azurerm_app_service_plan"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf_convert_app_service_plan"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">name</span><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf-convert-appserviceplan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">location</span><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> azurerm_resource_group.cdktf_convert_rg.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> azurerm_resource_group.cdktf_convert_rg.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">sku</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">tier</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Free"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">size</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"F1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">resource </span><span class="token keyword type variable" style="color:#36acaa">"azurerm_app_service"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf_convert_app_service"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">name</span><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf-convert-app-service"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">location</span><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> azurerm_resource_group.cdktf_convert_rg.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> azurerm_resource_group.cdktf_convert_rg.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">app_service_plan_id</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> azurerm_app_service_plan.cdktf_convert_app_service_plan.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The command creates a C# snippet.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Gen</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Providers</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Azurerm</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AzurermProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"azurerm"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Features </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> azurermResourceGroupCdktfConvertRg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">ResourceGroup</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf_convert_rg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Location </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Central US"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf-convert-resource-group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> azurermAppServicePlanCdktfConvertAppServicePlan </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AppServicePlan</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf_convert_app_service_plan"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Location </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> azurermResourceGroupCdktfConvertRg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Location</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf-convert-appserviceplan"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ResourceGroupName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> azurermResourceGroupCdktfConvertRg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Sku </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Size </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"F1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Tier </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Free"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AppService</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf_convert_app_service"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    AppServicePlanId </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> azurermAppServicePlanCdktfConvertAppServicePlan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Location </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> azurermResourceGroupCdktfConvertRg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Location</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdktf-convert-app-service"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ResourceGroupName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> azurermResourceGroupCdktfConvertRg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>While this alone is extremely powerful, the C# code cannot be executed until the provider objects (i.e., <code>Gen.Providers.Azurerm</code> from the <code>using</code> statement) are generated with <code>cdktf get</code>. I see the use case for this command being translation of individual files for migration into an existing CDK for Terraform project. The <code>--language</code> flag currently supports all languages that CDK does. Instead, the option to generate an entire project from a folder seems much more helpful for converting entire solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initializing-from-an-existing-terraform-project">Initializing from an Existing Terraform Project<a href="https://your-docusaurus-site.example.com/blog/about-cdktf-convert#initializing-from-an-existing-terraform-project" class="hash-link" aria-label="Direct link to Initializing from an Existing Terraform Project" title="Direct link to Initializing from an Existing Terraform Project" translate="no">​</a></h2>
<p>Rather than converting a single file, the <code>init</code> command has been updated to support creating from an existing project. At the time of writing, only TypeScript is supported.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cdktf init --from-terraform-project terraform-project-folder </span><span class="token parameter variable" style="color:#36acaa">--template</span><span class="token plain"> typescript</span><br></div></code></pre></div></div>
<p>I tested against <a href="https://github.com/futurice/terraform-examples/tree/master/aws/aws_lambda_cronjob" target="_blank" rel="noopener noreferrer" class="">a Terraform example on GitHub from Futurice</a> that creates a scheduled Lambda function. I forked and <a href="https://github.com/scottenriquez/cdktf-convert-playground/tree/main/aws-lambda-cron" target="_blank" rel="noopener noreferrer" class="">updated the template</a> to work with Terraform version 1.0.3. The HCL is split across multiple files (i.e., main, variables, outputs, and permissions). I also created a Lambda function via the SAM CLI and built a ZIP artifact. The updated <code>init</code> command was smart enough to merge all of the <code>.tf</code> files into a single stack. However, the command does not migrate folders and assets outside of Terraform (i.e., my Lambda code, SAM folders, etc.). For now, these will need to be copied manually. Find the full output project <a href="https://github.com/scottenriquez/cdktf-convert-playground/tree/main/aws-lambda-cron-cdktf" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notes-about-conversion">Notes About Conversion<a href="https://your-docusaurus-site.example.com/blog/about-cdktf-convert#notes-about-conversion" class="hash-link" aria-label="Direct link to Notes About Conversion" title="Direct link to Notes About Conversion" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="interacting-with-the-provider">Interacting with the Provider<a href="https://your-docusaurus-site.example.com/blog/about-cdktf-convert#interacting-with-the-provider" class="hash-link" aria-label="Direct link to Interacting with the Provider" title="Direct link to Interacting with the Provider" translate="no">​</a></h3>
<p>I did not specify the region in the source HCL <code>provider</code> like so:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">provider</span><span class="token keyword type variable" style="color:#36acaa"> "aws" </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">region</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>To modify the provider settings, instantiate a provider object. The <code>convert</code> method will translate this, but it was not apparent to me how to code this manually.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name maybe-class-name">AwsProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'aws'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  region</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'us-east-1'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="counts">Counts<a href="https://your-docusaurus-site.example.com/blog/about-cdktf-convert#counts" class="hash-link" aria-label="Direct link to Counts" title="Direct link to Counts" translate="no">​</a></h3>
<p>At the time of writing, the <code>count</code> meta-argument does not work consistently yet. I've opened up <a href="https://github.com/hashicorp/terraform-cdk/issues/889" target="_blank" rel="noopener noreferrer" class="">an issue on GitHub</a> accordingly. The following HCL throws an error when converting:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">resource </span><span class="token keyword type variable" style="color:#36acaa">"aws_instance"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"multiple_server"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">count</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">ami</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ami-0c2b8ca1dad447f8a"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">instance_type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"t2.micro"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">Name</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Server </span><span class="token string interpolation punctuation" style="color:#393A34">$</span><span class="token string interpolation punctuation" style="color:#393A34">{</span><span class="token string interpolation keyword" style="color:#00009f">count</span><span class="token string interpolation punctuation" style="color:#393A34">.</span><span class="token string interpolation type variable" style="color:#36acaa">index</span><span class="token string interpolation punctuation" style="color:#393A34">}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>I'm not sure if the intent is that this will be translated into a for loop or if the <code>count</code> meta-argument will just be modified. In any case, this can easily be rewritten using the general-purpose language in a much cleaner way (i.e., a loop).</p>
<p>I've seen a common pattern in Terraform templates that uses the <code>count</code> attribute to create resources conditionally. In the snippet below, a Lambda function resource is created based on whether or not an S3 bucket name is specified.</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">resource </span><span class="token keyword type variable" style="color:#36acaa">"aws_lambda_function"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"local_zipfile"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">count</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> var.function_s3_bucket </span><span class="token punctuation" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> ? </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> : </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">filename</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> var.function_zipfile</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>This pattern does not convert directly because in CDK for Terraform, <code>count</code> is set via <a href="https://github.com/hashicorp/terraform-cdk/blob/main/docs/working-with-cdk-for-terraform/escape-hatch.md" target="_blank" rel="noopener noreferrer" class="">an escape hatch</a> using the <code>addOverride</code> method. The underlying Terraform configuration will be modified, but there is not a way to access individual constructs in the list of constructs in the code. However, this is another opportunity to leverage the benefits of using a general-purpose language by using conditionals, lists, for loops, etc.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-in-functions">Built-In Functions<a href="https://your-docusaurus-site.example.com/blog/about-cdktf-convert#built-in-functions" class="hash-link" aria-label="Direct link to Built-In Functions" title="Direct link to Built-In Functions" translate="no">​</a></h3>
<p>Terraform built-in functions are converted and supported by CDK for Terraform. Below is a simple example using the <code>max()</code> function in the instance's tag:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">resource </span><span class="token keyword type variable" style="color:#36acaa">"aws_instance"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ec2_instance"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">ami</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ami-0c2b8ca1dad447f8a"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">instance_type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"t2.micro"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">Name</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Server </span><span class="token string interpolation punctuation" style="color:#393A34">$</span><span class="token string interpolation punctuation" style="color:#393A34">{</span><span class="token string interpolation function" style="color:#d73a49">max</span><span class="token string interpolation punctuation" style="color:#393A34">(</span><span class="token string interpolation number" style="color:#36acaa">1</span><span class="token string interpolation punctuation" style="color:#393A34">,</span><span class="token string interpolation" style="color:#e3116c"> </span><span class="token string interpolation number" style="color:#36acaa">2</span><span class="token string interpolation punctuation" style="color:#393A34">,</span><span class="token string interpolation" style="color:#e3116c"> </span><span class="token string interpolation number" style="color:#36acaa">12</span><span class="token string interpolation punctuation" style="color:#393A34">)</span><span class="token string interpolation punctuation" style="color:#393A34">}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>This converts to the following TypeScript:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">aws</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access maybe-class-name" style="color:#d73a49">Instance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ec2_instance'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ami-0c2b8ca1dad447f8a'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instanceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'t2.micro'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Server ${max(1, 2, 12)}'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>The string containing the built-in function is preserved in the <code>cdk.tf.json</code> build artifact file and evaluated accordingly. As best practices form, I'm curious how often built-in functions will be used versus their corresponding equivalents in the general-purpose language. While this is useful for easily converting templates with built-in functions, I would argue that there are many benefits to rewriting this logic in TypeScript (i.e., unit testing, readability, etc.).</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[Configuring AWS SAM Pipelines for GitHub Actions]]></title>
            <link>https://your-docusaurus-site.example.com/blog/sam-pipelines-for-github</link>
            <guid>https://your-docusaurus-site.example.com/blog/sam-pipelines-for-github</guid>
            <pubDate>Thu, 29 Jul 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Creating a multi-account CI/CD pipeline using the latest SAM CLI functionality.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="about-aws-sam-pipelines">About AWS SAM Pipelines<a href="https://your-docusaurus-site.example.com/blog/sam-pipelines-for-github#about-aws-sam-pipelines" class="hash-link" aria-label="Direct link to About AWS SAM Pipelines" title="Direct link to About AWS SAM Pipelines" translate="no">​</a></h2>
<p>Last week, <a href="https://aws.amazon.com/blogs/compute/introducing-aws-sam-pipelines-automatically-generate-deployment-pipelines-for-serverless-applications/" target="_blank" rel="noopener noreferrer" class="">AWS announced the public preview for SAM Pipelines</a>. This feature expands the SAM CLI allowing users to create multi-account CI/CD pipelines for serverless applications quickly across several providers such as GitHub Actions, GitLab CI/CD, and Jenkins. Along with <a href="https://scottie.is/blog/an-api-with-dotnet-lambda/" target="_blank" rel="noopener noreferrer" class="">CDK Pipelines</a>, the AWS tooling keeps making it easier to standardize with best practices.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preparing-your-machine">Preparing Your Machine<a href="https://your-docusaurus-site.example.com/blog/sam-pipelines-for-github#preparing-your-machine" class="hash-link" aria-label="Direct link to Preparing Your Machine" title="Direct link to Preparing Your Machine" translate="no">​</a></h2>
<p>I opted to create a container image for my Lambda function for my testing, so the core dependencies are the AWS CLI, SAM CLI, and Docker.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># aws-cli/2.2.23 Python/3.9.6 Darwin/20.6.0 source/x86_64 prompt/off</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># SAM CLI, version 1.27.2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sam </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Docker version 20.10.7, build f0df350</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--version</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-the-sam-application-and-pipeline">Creating the SAM Application and Pipeline<a href="https://your-docusaurus-site.example.com/blog/sam-pipelines-for-github#creating-the-sam-application-and-pipeline" class="hash-link" aria-label="Direct link to Creating the SAM Application and Pipeline" title="Direct link to Creating the SAM Application and Pipeline" translate="no">​</a></h2>
<p>First, create a starter application. I chose <code>amazon/nodejs14.x-base</code> for a base image. Then, run the <code>pipeline</code> command with the <code>--bootstrap</code> flag to configure the CI/CD provider and requisite AWS resources like IAM policies.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sam init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sam pipeline init </span><span class="token parameter variable" style="color:#36acaa">--bootstrap</span><br></div></code></pre></div></div>
<p>The <code>pipeline</code> command walks you through a series of configuration steps. For the CI/CD provider, choose GitHub Actions which is a two-stage pipeline. For each stage, provide the following information:</p>
<ul>
<li class="">Name (i.e., pre-production, production)</li>
<li class="">Account details (i.e., access keys provided for AWS CLI)</li>
<li class="">Reference application build resources (i.e., pipeline execution role, CloudFormation execution role, S3 bucket for build artifacts, ECR repository for container images)</li>
</ul>
<p>The pipeline user's access key and secret key will display in the terminal, which will be required for configuring the GitHub Actions. Repeat the steps for the second stage. The CLI creates <code>.aws-sam/pipeline/pipelineconfig.toml</code> to store the configuration.</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">.aws-sam/pipeline/pipelineconfig.toml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">version</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">default</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">default.pipeline_bootstrap</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">default.pipeline_bootstrap.parameters</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">pipeline_user</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"arn:aws:iam::123456789199:user/aws-sam-cli-managed-Pre-production-pi-PipelineUser-CGSL85Y74RRL"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">Pre-production</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">Pre-production.pipeline_bootstrap</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">Pre-production.pipeline_bootstrap.parameters</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">pipeline_execution_role</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"arn:aws:iam::123456789199:role/aws-sam-cli-managed-Pre-prod-PipelineExecutionRole-HKCRZ2IX8SOY"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">cloudformation_execution_role</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"arn:aws:iam::123456789199:role/aws-sam-cli-managed-Pre-p-CloudFormationExecutionR-1XKKSR1ZGOTH3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">artifacts_bucket</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws-sam-cli-managed-pre-productio-artifactsbucket-g2pauw42amc"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">image_repository</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"123456789199.dkr.ecr.us-east-1.amazonaws.com/aws-sam-cli-managed-pre-production-pipeline-resources-imagerepository-qjnaif21ukb0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">region</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">Production</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">Production.pipeline_bootstrap</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">Production.pipeline_bootstrap.parameters</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">pipeline_execution_role</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"arn:aws:iam::123456789199:role/aws-sam-cli-managed-Producti-PipelineExecutionRole-1ANR2SNKQD638"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">cloudformation_execution_role</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"arn:aws:iam::123456789199:role/aws-sam-cli-managed-Produ-CloudFormationExecutionR-17RL86055A01I"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">artifacts_bucket</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws-sam-cli-managed-production-pi-artifactsbucket-177nd7ab4h4bz"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">image_repository</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"123456789199.dkr.ecr.us-east-1.amazonaws.com/aws-sam-cli-managed-production-pipeline-resources-imagerepository-nhdrmzfnssnr"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">region</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><br></div></code></pre></div></div>
<p>The CLI will prompt you for the secret name to use for the IAM pipeline user in GitHub Actions (i.e., <code>${{ secrets.AWS_ACCESS_KEY_ID }}</code> instead of a hardcoded value). These credentials should never be exposed in the source code. <code>pipeline.yaml</code> is created in the <code>.github/workflows</code> folder.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">.github/workflows/pipeline.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Pipeline</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'main'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'feature**'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PIPELINE_USER_ACCESS_KEY_ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.AWS_ACCESS_KEY_ID </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PIPELINE_USER_SECRET_ACCESS_KEY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.AWS_SECRET_ACCESS_KEY </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">SAM_TEMPLATE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pipelines</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app/template.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TESTING_STACK_NAME</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pipelines</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TESTING_PIPELINE_EXECUTION_ROLE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> arn</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">iam</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">123456789199</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">role/aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">managed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Pre</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prod</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">PipelineExecutionRole</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">HKCRZ2IX8SOY</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TESTING_CLOUDFORMATION_EXECUTION_ROLE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> arn</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">iam</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">123456789199</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">role/aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">managed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Pre</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">CloudFormationExecutionR</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1XKKSR1ZGOTH3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TESTING_ARTIFACTS_BUCKET</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">managed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pre</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">productio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">artifactsbucket</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">g2pauw42amc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TESTING_IMAGE_REPOSITORY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 123456789199.dkr.ecr.us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">east</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1.amazonaws.com/aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">managed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pre</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">production</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pipeline</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">resources</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">imagerepository</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">qjnaif21ukb0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">TESTING_REGION</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">east</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PROD_STACK_NAME</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pipelines</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PROD_PIPELINE_EXECUTION_ROLE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> arn</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">iam</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">123456789199</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">role/aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">managed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Producti</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">PipelineExecutionRole</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1ANR2SNKQD638</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PROD_CLOUDFORMATION_EXECUTION_ROLE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> arn</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">aws</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">iam</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">123456789199</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">role/aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">managed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Produ</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">CloudFormationExecutionR</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">17RL86055A01I</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PROD_ARTIFACTS_BUCKET</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">managed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">production</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pi</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">artifactsbucket</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">177nd7ab4h4bz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PROD_IMAGE_REPOSITORY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 123456789199.dkr.ecr.us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">east</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1.amazonaws.com/aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sam</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">managed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">production</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pipeline</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">resources</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">imagerepository</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">nhdrmzfnssnr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PROD_REGION</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">east</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          # trigger the tests here</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">build-and-deploy-feature</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">build-and-package</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">deploy-testing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">integration-test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">deploy-prod</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><br></div></code></pre></div></div>
<p>Before pushing the changes to the remote origin, add the IAM pipeline user credentials as secrets in GitHub.</p>
<p><img decoding="async" loading="lazy" alt="github-actions-secret.png" src="https://your-docusaurus-site.example.com/assets/images/github-actions-secret-db85cd99125ba55b8613ed860d344c3e.png" width="918" height="265" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-approvers">Adding Approvers<a href="https://your-docusaurus-site.example.com/blog/sam-pipelines-for-github#adding-approvers" class="hash-link" aria-label="Direct link to Adding Approvers" title="Direct link to Adding Approvers" translate="no">​</a></h2>
<p>The default pipeline does not have any approval mechanisms in place, so when pushing to <code>main</code>, the application goes directly to production. To add approvers, create <a href="https://docs.github.com/en/actions/reference/environments#creating-an-environment" target="_blank" rel="noopener noreferrer" class="">an environment</a> in GitHub and add approvers. Then, reference the environment in the pipeline YAML.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">.github/workflows/pipeline.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">deploy-prod</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">if</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> github.ref == 'refs/heads/main'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">needs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">integration</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">test</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-branch-environments">Feature Branch Environments<a href="https://your-docusaurus-site.example.com/blog/sam-pipelines-for-github#feature-branch-environments" class="hash-link" aria-label="Direct link to Feature Branch Environments" title="Direct link to Feature Branch Environments" translate="no">​</a></h2>
<p>For <a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow" target="_blank" rel="noopener noreferrer" class="">feature branches</a> (i.e., named <code>feature*</code>), the pipeline will create a new CloudFormation stack and deploy the branch automatically. This is powerful for quickly testing in a live environment outside of the two stages created by the pipeline.</p>
<p><img decoding="async" loading="lazy" alt="feature-branches-action.png" src="https://your-docusaurus-site.example.com/assets/images/feature-branches-action-3df355910cf45a79b4e3320522a94900.png" width="1654" height="532" class="img_ev3q"></p>
<p>Note that there is no functionality in the default pipeline to delete the CloudFormation stack when the feature branch is deleted.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[Exploring CDK for Terraform for .NET]]></title>
            <link>https://your-docusaurus-site.example.com/blog/cdktf-alpha-csharp-infrastructure</link>
            <guid>https://your-docusaurus-site.example.com/blog/cdktf-alpha-csharp-infrastructure</guid>
            <pubDate>Sat, 15 May 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Testing the alpha version of CDK for Terraform.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://your-docusaurus-site.example.com/blog/cdktf-alpha-csharp-infrastructure#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>Both AWS CDK and Terraform aim to solve a similar problem: alleviating some of the infrastructure management challenges with code. CDK supports several general-purpose languages, including C#, Python, and TypeScript, while Terraform uses its configuration language called HCL. While CDK can only create AWS resources, Terraform supports virtually every cloud provider, granting the ability to write code to deploy to multiple public clouds at once. Last year, <a href="https://www.hashicorp.com/blog/cdk-for-terraform-enabling-python-and-typescript-support" target="_blank" rel="noopener noreferrer" class="">Terraform and AWS announced a project called Terraform for CDK</a>, aiming to grant the best of both worlds (i.e., support for GPLs, multi-cloud, etc.).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nuances-and-limitations">Nuances and Limitations<a href="https://your-docusaurus-site.example.com/blog/cdktf-alpha-csharp-infrastructure#nuances-and-limitations" class="hash-link" aria-label="Direct link to Nuances and Limitations" title="Direct link to Nuances and Limitations" translate="no">​</a></h2>
<p>In addition to the programming language features of AWS CDK, there's a <a href="https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.html" target="_blank" rel="noopener noreferrer" class="">construct library</a> with three levels:</p>
<ul>
<li class="">L1 (level one) constructs are representations of CloudFormation resources</li>
<li class="">L2 (level two) constructs provide defaults and boilerplate to simplify the code</li>
<li class="">Patterns are the highest level and create many resources configured together wrapped in a single construct (e.g., <a href="https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-apigateway.LambdaRestApi.html" target="_blank" rel="noopener noreferrer" class="">Lambda RESTful API</a>)</li>
</ul>
<p>While CDK for Terraform utilizes the <a href="https://aws.amazon.com/blogs/developer/introducing-the-cloud-development-kit-for-terraform-preview/" target="_blank" rel="noopener noreferrer" class="">AWS construct programming model</a>, it does not share the same construct library as CDK. It's important to distinguish that CDK for Terraform stacks only support <a href="https://www.terraform.io/docs/language/providers/index.html" target="_blank" rel="noopener noreferrer" class="">Terraform providers</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-repository">GitHub Repository<a href="https://your-docusaurus-site.example.com/blog/cdktf-alpha-csharp-infrastructure#github-repository" class="hash-link" aria-label="Direct link to GitHub Repository" title="Direct link to GitHub Repository" translate="no">​</a></h2>
<p>You can find a complete working example <a href="https://github.com/scottenriquez/cdktf-alpha-csharp-testing" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-the-tools-and-scaffolding-the-net-solution">Installing the Tools and Scaffolding the .NET Solution<a href="https://your-docusaurus-site.example.com/blog/cdktf-alpha-csharp-infrastructure#installing-the-tools-and-scaffolding-the-net-solution" class="hash-link" aria-label="Direct link to Installing the Tools and Scaffolding the .NET Solution" title="Direct link to Installing the Tools and Scaffolding the .NET Solution" translate="no">​</a></h2>
<p>The following command line tools are required for getting started:</p>
<ul>
<li class="">Terraform (0.12+)</li>
<li class="">Node.js (12.16+)</li>
<li class="">AWS CLI (specifically the credentials)</li>
</ul>
<p>First, install the <code>cdktf</code> CLI:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> cdktf-cli</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 0.3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdktf </span><span class="token parameter variable" style="color:#36acaa">--version</span><br></div></code></pre></div></div>
<p>After that, create the .NET project using the <code>cdktf</code> CLI:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># the --local flag refers to local Terraform state management</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdktf init </span><span class="token parameter variable" style="color:#36acaa">--template</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">csharp </span><span class="token parameter variable" style="color:#36acaa">--local</span><br></div></code></pre></div></div>
<p>This action creates several files, including a <code>cdktf.json</code> file. Inside this configuration file, specify the AWS provider.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">resources/cdktf.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"language"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"csharp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"app"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dotnet run -p MyTerraformStack.csproj"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"terraformProviders"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"aws@~&gt; 2.0"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"terraformModules"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"context"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"excludeStackIdFromLogicalIds"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"allowSepCharsInLogicalIds"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>After adding the provider configuration, generate the provider objects using the following command:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cdktf get</span><br></div></code></pre></div></div>
<p>The generated objects are stored in the newly created <code>.gen/</code> folder. Add this as a reference:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Project</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Sdk</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Microsoft.NET.Sdk</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PropertyGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">OutputType</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Exe</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">OutputType</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">TargetFramework</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">netcoreapp3.1</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">TargetFramework</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">PropertyGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ItemGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">HashiCorp.Cdktf</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">0.3.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ItemGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ItemGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ProjectReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">.gen\aws\aws.csproj</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ItemGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Project</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>Lastly, initialize the <code>AwsProvider</code> object in the <code>Main.cs</code> file.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">resources/Main.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">System</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Constructs</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">HashiCorp</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Cdktf</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// AWS provider objects generated by cdktf get command</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">aws</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">MyCompany</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">MyApp</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">MyApp</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token type-list class-name">TerraformStack</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">MyApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Construct</span><span class="token plain"> scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">base</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// initialize the AWS provider</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// located in the .gen/ folder</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AwsProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AwsProviderConfig</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                Region </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token class-name punctuation" style="color:#393A34">[</span><span class="token class-name punctuation" style="color:#393A34">]</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">App</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">App</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">MyApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"resources"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Synth</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"App synth complete"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-resources">Adding Resources<a href="https://your-docusaurus-site.example.com/blog/cdktf-alpha-csharp-infrastructure#adding-resources" class="hash-link" aria-label="Direct link to Adding Resources" title="Direct link to Adding Resources" translate="no">​</a></h2>
<p>As noted above, the resources will be created using the Terraform AWS provider. There are corresponding C# classes for each of the <a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs" target="_blank" rel="noopener noreferrer" class="">AWS resources specified by the provider</a>. While writing code, the AWS provider documentation in conjunction with your IDE's autocomplete functionality is a powerful way to navigate the available resources. For this example, the code looks up the latest AMI for Ubuntu 20.04 and uses it to create an EC2 Instance. Below the <code>AwsProvider</code> constructor method call in the <code>MyApp</code> constructor method, add a data source and instance like so:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">resources/Main.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// initialize the AWS provider</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// located in the .gen/ folder</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AwsProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AwsProviderConfig</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Region </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">DataAwsAmi</span><span class="token plain"> dataAwsAmi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DataAwsAmi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws_ami_ubuntu"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DataAwsAmiConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    MostRecent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Filter </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DataAwsAmiFilter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            Values </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DataAwsAmiFilter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            Name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"virtualization-type"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            Values </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hvm"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Owners </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"099720109477"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Instance</span><span class="token plain"> ec2Instance </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Instance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws_ec2_instance"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">InstanceConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Ami </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> dataAwsAmi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ImageId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    InstanceType </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"t3.micro"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Note how this functionally behaves the same as the corresponding Terraform HCL with the power of a general-purpose programming language.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploying-and-managing-state">Deploying and Managing State<a href="https://your-docusaurus-site.example.com/blog/cdktf-alpha-csharp-infrastructure#deploying-and-managing-state" class="hash-link" aria-label="Direct link to Deploying and Managing State" title="Direct link to Deploying and Managing State" translate="no">​</a></h2>
<p>Once finished adding the data source and resource, the project can be built and deployed assuming that the AWS credentials are available (i.e., <code>aws configure</code> has been run).</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">dotnet build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdktf deploy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># when ready</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdktf destroy</span><br></div></code></pre></div></div>
<p>The state resides in <code>terraform.resources.tfstate</code>.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[.NET 5 Docker Lambda Function with API Gateway and Self-Mutating Pipeline Using CDK]]></title>
            <link>https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda</link>
            <guid>https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda</guid>
            <pubDate>Thu, 11 Feb 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[A step-by-step walkthrough for creating a multi-environment API using .NET 5, CDK, Docker, and Lambda.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deciding-on-which-technology-to-use">Deciding on Which Technology to Use<a href="https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda#deciding-on-which-technology-to-use" class="hash-link" aria-label="Direct link to Deciding on Which Technology to Use" title="Direct link to Deciding on Which Technology to Use" translate="no">​</a></h2>
<p>While infrastructure as code (IaC) has existed within the AWS ecosystem since 2011, adoption has exploded recently due
to the ability to manage large amounts of infrastructure at scale and standardize design across an organization. There
are almost too many options between CloudFormation (CFN), CDK, and Terraform for IaC and Serverless Application Model (
SAM) and Serverless Framework for
development. <a href="https://acloudguru.com/blog/engineering/cloudformation-terraform-or-cdk-guide-to-iac-on-aws" target="_blank" rel="noopener noreferrer" class="">This article</a>
from A Cloud Guru quickly sums up the pros and cons of each option. I choose this particular stack for some key reasons:</p>
<ul>
<li class="">CDK allows the infrastructure and the CI/CD pipeline to be described as C# instead of YAML, JSON,
or <a href="https://www.terraform.io/docs/language/syntax/configuration.html" target="_blank" rel="noopener noreferrer" class="">HCL</a></li>
<li class="">CDK provides the ability to inject more robust logic than intrinsic functions in CloudFormation and more modularity as
well while still being a native AWS offering</li>
<li class="">Docker ensures that the Lambda functions run consistently across local development, builds, and production
environments and simplifies dependency management</li>
<li class=""><a href="https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_pipelines.CdkPipeline.html" target="_blank" rel="noopener noreferrer" class="">CDK Pipelines</a> offer a higher
level construct with much less configuration than CodePipeline and streamline management of multiple environments</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-repository">GitHub Repository<a href="https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda#github-repository" class="hash-link" aria-label="Direct link to GitHub Repository" title="Direct link to GitHub Repository" translate="no">​</a></h2>
<p>You can find a complete working example <a href="https://github.com/scottenriquez/dotnet-5-lambda-api-cdk" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initializing-the-project">Initializing the Project<a href="https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda#initializing-the-project" class="hash-link" aria-label="Direct link to Initializing the Project" title="Direct link to Initializing the Project" translate="no">​</a></h2>
<p>Ensure that .NET 5 and the latest version of CDK are installed. To create a solution skeleton, run these commands in the
root directory:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># note that CDK uses this directory name as the solution name</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> LambdaApiSolution</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> LambdaApiSolution</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk init app </span><span class="token parameter variable" style="color:#36acaa">--language</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">csharp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># creates a CFN stack called CDKToolkit with an S3 bucket for staging purposes and configures IAM permissions for CI/CD</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk bootstrap --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk deploy</span><br></div></code></pre></div></div>
<p>In order to use CDK Pipelines later on, a specific flag needs to be added to <code>cdk.json</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/cdk.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"app"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dotnet run -p src/LambdaApiSolution/LambdaApiSolution.csproj"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"context"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ..</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@aws-cdk/core:newStyleStackSynthesis"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ..</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>At the time of writing, the generated CDK template uses .NET Core 3.1. Inside of the <code>.csproj</code> file, change the
<code>TargetFramework</code> tag to <code>net5.0</code>.</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution/LambdaApiSolution.csproj</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Project</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Sdk</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Microsoft.NET.Sdk</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PropertyGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">OutputType</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Exe</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">OutputType</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">TargetFramework</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">net5.0</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">TargetFramework</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">PropertyGroup</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Project</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>From the <code>/LambdaApiSolution</code> directory, run these commands to create the serverless skeleton:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># install the latest version of the .NET Lambda templates</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet new </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> Amazon.Lambda.Templates</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> src/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># create the function</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet new lambda.image.EmptyFunction </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> LambdaApiSolution.DockerFunction</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># add the projects to the solution file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet sln </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> LambdaApiSolution.DockerFunction/src/LambdaApiSolution.DockerFunction/LambdaApiSolution.DockerFunction.csproj</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet sln </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> LambdaApiSolution.DockerFunction/test/LambdaApiSolution.DockerFunction.Tests/LambdaApiSolution.DockerFunction.Tests.csproj</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># build the solution and run the sample unit test to verify that everything is wired up correctly</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dotnet </span><span class="token builtin class-name">test</span><span class="token plain"> LambdaApiSolution.sln</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-the-lambda-infrastructure-and-build">Creating the Lambda Infrastructure and Build<a href="https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda#creating-the-lambda-infrastructure-and-build" class="hash-link" aria-label="Direct link to Creating the Lambda Infrastructure and Build" title="Direct link to Creating the Lambda Infrastructure and Build" translate="no">​</a></h2>
<p>First, add the Lambda CDK NuGet package to the CDK project.</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Amazon.CDK.AWS.Lambda</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1.90.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></div></code></pre></div></div>
<p>Then, create the Docker image and Lambda function using CDK constructs in <code>LambdaApiSolutionStack.cs</code>:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution/LambdaApiSolutionStack.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">LambdaApiSolutionStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token type-list class-name">Stack</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">internal</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">LambdaApiSolutionStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Construct</span><span class="token plain"> scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">IStackProps</span><span class="token plain"> props </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">base</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// this path is relative to the directory where CDK commands are run</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// the directory must contain a Dockerfile</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">DockerImageCode</span><span class="token plain"> dockerImageCode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> DockerImageCode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromImageAsset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"src/LambdaApiSolution.DockerFunction/src/LambdaApiSolution.DockerFunction"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">DockerImageFunction</span><span class="token plain"> dockerImageFunction </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DockerImageFunction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LambdaFunction"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">DockerImageFunctionProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            Code </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> dockerImageCode</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            Description </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">".NET 5 Docker Lambda function"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Lastly, update the <code>Dockerfile</code> in the Lambda function project like so to build the C# code:</p>
<div class="language-dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution.DockerFunction/src/LambdaApiSolution.DockerFunction/Dockerfile</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> public.ecr.aws/lambda/dotnet:5.0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> mcr.microsoft.com/dotnet/sdk:5.0 </span><span class="token instruction keyword" style="color:#00009f">as</span><span class="token instruction"> build-image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">ARG</span><span class="token instruction"> FUNCTION_DIR=</span><span class="token instruction string" style="color:#e3116c">"/build"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">ARG</span><span class="token instruction"> CONFIGURATION=</span><span class="token instruction string" style="color:#e3116c">"release"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">ENV</span><span class="token instruction"> PATH=</span><span class="token instruction string" style="color:#e3116c">"/root/.dotnet/tools:${PATH}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> apt-get update &amp;&amp; apt-get -y install zip</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> mkdir </span><span class="token instruction variable" style="color:#36acaa">$FUNCTION_DIR</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">WORKDIR</span><span class="token instruction"> </span><span class="token instruction variable" style="color:#36acaa">$FUNCTION_DIR</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">COPY</span><span class="token instruction"> Function.cs LambdaApiSolution.DockerFunction.csproj aws-lambda-tools-defaults.json </span><span class="token instruction variable" style="color:#36acaa">$FUNCTION_DIR</span><span class="token instruction">/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> dotnet tool install -g Amazon.Lambda.Tools</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> mkdir -p build_artifacts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> if [ </span><span class="token instruction string" style="color:#e3116c">"$CONFIGURATION"</span><span class="token instruction"> = </span><span class="token instruction string" style="color:#e3116c">"debug"</span><span class="token instruction"> ]; then dotnet lambda package --configuration Debug --package-type zip; else dotnet lambda package --configuration Release --package-type zip; fi</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> if [ </span><span class="token instruction string" style="color:#e3116c">"$CONFIGURATION"</span><span class="token instruction"> = </span><span class="token instruction string" style="color:#e3116c">"debug"</span><span class="token instruction"> ]; then cp -r /build/bin/Debug/net5.0/publish/* /build/build_artifacts; else cp -r /build/bin/Release/net5.0/publish/* /build/build_artifacts; fi</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> public.ecr.aws/lambda/dotnet:5.0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">COPY</span><span class="token instruction"> </span><span class="token instruction options property" style="color:#36acaa">--from</span><span class="token instruction options punctuation" style="color:#393A34">=</span><span class="token instruction options string" style="color:#e3116c">build-image</span><span class="token instruction"> /build/build_artifacts/ /var/task/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">CMD</span><span class="token instruction"> [</span><span class="token instruction string" style="color:#e3116c">"LambdaApiSolution.DockerFunction::LambdaApiSolution.DockerFunction.Function::FunctionHandler"</span><span class="token instruction">]</span><br></div></code></pre></div></div>
<p>At this point, you can now deploy the changes with the <code>cdk deploy</code> command. The Lambda function can be tested via the
AWS Console. The easiest way to do so is to navigate to the CloudFormation stack, click on the function resource, and
then create a test event with the string <code>"hello"</code> as the input. Note that this should not be a JSON object because the
event handler's parameter currently accepts a single string.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integrating-api-gateway">Integrating API Gateway<a href="https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda#integrating-api-gateway" class="hash-link" aria-label="Direct link to Integrating API Gateway" title="Direct link to Integrating API Gateway" translate="no">​</a></h2>
<p>Add the following packages to the CDK project:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Amazon.CDK.AWS.APIGatewayv2</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1.90.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Amazon.CDK.AWS.APIGatewayv2.Integrations</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1.90.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></div></code></pre></div></div>
<p>Next, you can add the API Gateway resources to the stack immediately after the <code>DockerImageFunction</code> in
<code>LambdaApiSolutionStack.cs</code>:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution/LambdaApiSolutionStack.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token class-name">HttpApi</span><span class="token plain"> httpApi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">HttpApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"APIGatewayForLambda"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">HttpApiProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ApiName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"APIGatewayForLambda"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    CreateDefaultStage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    CorsPreflight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">CorsPreflightOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        AllowMethods </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> HttpMethod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GET </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        AllowOrigins </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        MaxAge </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Duration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Days</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Then, create a Lambda proxy integration and a route for the function:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution/LambdaApiSolutionStack.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token class-name">LambdaProxyIntegration</span><span class="token plain"> lambdaProxyIntegration </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">LambdaProxyIntegration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">LambdaProxyIntegrationProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Handler </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> dockerImageFunction</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    PayloadFormatVersion </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> PayloadFormatVersion</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">VERSION_2_0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">httpApi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddRoutes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AddRoutesOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/casing"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Integration </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> lambdaProxyIntegration</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Methods </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> HttpMethod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">POST </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>I used <code>/casing</code> for the path since the sample Lambda function returns an upper and lower case version of the input
string. Finally, it's helpful to display the endpoint URL using a CFN output for testing.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution/LambdaApiSolutionStack.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// adding entropy to prevent a name collision</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> guid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Guid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewGuid</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">CfnOutput</span><span class="token plain"> apiUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">CfnOutput</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"APIGatewayURLOutput"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">CfnOutputProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ExportName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:#e3116c">$"APIGatewayEndpointURL-</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">guid</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> httpApi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ApiEndpoint</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>With these changes to the resources, the Lambda function can be invoked by a <code>POST</code> request. The handler method
parameters in <code>Function.cs</code> need to be updated for the request body to be passed in.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution.DockerFunction/src/LambdaApiSolution.DockerFunction/Function.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// replace the string parameter with a proxy request parameter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token return-type class-name">Casing</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">FunctionHandler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">APIGatewayProxyRequest</span><span class="token plain"> apiGatewayProxyRequest</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ILambdaContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// update the input to use the proxy</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> apiGatewayProxyRequest</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Body</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Casing</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToLower</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToUpper</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>After successfully deploying the changes, the function can be tested in two ways. The first way is through an HTTP
client like Postman. Add a string to the body parameter of the <code>POST</code> request. This action tests the full integration
with API Gateway as well as the Lambda function. To test via the Lambda Console, update the test event from before to
match the <code>APIGatewayProxyRequest</code> parameter:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"body"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hello"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-cicd-using-cdk-pipelines">Adding CI/CD Using CDK Pipelines<a href="https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda#adding-cicd-using-cdk-pipelines" class="hash-link" aria-label="Direct link to Adding CI/CD Using CDK Pipelines" title="Direct link to Adding CI/CD Using CDK Pipelines" translate="no">​</a></h2>
<p>For this example, the source code resides in GitHub as opposed to CodeCommit. To grant the CI/CD pipeline access to the
repository, a personal access token with <code>repo</code> permissions must be created via GitHub and stored in Secrets Manager as
a plaintext format object. Note that for this codebase, I've named my secret <code>GitHub-Token</code>.</p>
<p><img decoding="async" loading="lazy" alt="GitHub Personal Access Token" src="https://your-docusaurus-site.example.com/assets/images/github-personal-access-token-5588004ebbfa53d00efee55e2a0a1103.png" width="3360" height="1198" class="img_ev3q"></p>
<p>Next, add the following packages to the CDK project:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Amazon.CDK.AWS.CodeBuild</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1.90.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Amazon.CDK.AWS.CodeDeploy</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1.90.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Amazon.CDK.AWS.CodePipeline</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1.90.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Amazon.CDK.AWS.CodePipeline.Actions</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1.90.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">PackageReference</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Include</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Amazon.CDK.Pipelines</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">Version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1.90.0</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></div></code></pre></div></div>
<p>With these dependencies loaded, create a class called <code>PipelineStack.cs</code>. The following code creates a self-mutating CDK
Pipeline, adds a GitHub source action to fetch the code using the token from Secrets Manager, and synthesizes the
solution's CDK:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution/PipelineStack.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Amazon</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CDK</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Amazon</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CDK</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">AWS</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CodeBuild</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Amazon</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CDK</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">AWS</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CodePipeline</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Amazon</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CDK</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">AWS</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CodePipeline</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Actions</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Amazon</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CDK</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Pipelines</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">LambdaApiSolution</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">PipelineStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token type-list class-name">Stack</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">internal</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">PipelineStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Construct</span><span class="token plain"> scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">IStackProps</span><span class="token plain"> props </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">base</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Artifact_</span><span class="token plain"> sourceArtifact </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Artifact_</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Artifact_</span><span class="token plain"> cloudAssemblyArtifact </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">Artifact_</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">CdkPipeline</span><span class="token plain"> pipeline </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">CdkPipeline</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LambdaApiSolutionPipeline"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">CdkPipelineProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                CloudAssemblyArtifact </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cloudAssemblyArtifact</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                PipelineName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LambdaApiSolutionPipeline"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                SourceAction </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">GitHubSourceAction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">GitHubSourceActionProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    ActionName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GitHubSource"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Output </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sourceArtifact</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    OauthToken </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> SecretValue</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SecretsManager</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GitHubTokenSecretsManagerId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic">// these values are in Constants.cs instead of being hardcoded</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Owner </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Repo </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RepositoryName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Branch </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Branch</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Trigger </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> GitHubTrigger</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">POLL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                SynthAction </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">SimpleSynthAction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">SimpleSynthActionProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Environment </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">BuildEnvironment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token comment" style="color:#999988;font-style:italic">// required for .NET 5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token comment" style="color:#999988;font-style:italic">// https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-available.html</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        BuildImage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> LinuxBuildImage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">STANDARD_5_0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    SourceArtifact </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sourceArtifact</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    CloudAssemblyArtifact </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cloudAssemblyArtifact</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic">// navigates to the proper subdirectory to simplify other commands</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Subdirectory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LambdaApiSolution"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    InstallCommands </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"npm install -g aws-cdk"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    BuildCommands </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dotnet build src/LambdaApiSolution.sln"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    SynthCommand </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cdk synth"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Remove the following line from <code>Program.cs</code> since the pipeline will deploy the API from now on:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">LambdaApiSolutionStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LambdaApiSolutionStack"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Delete the previous stack, commit the latest changes to the source code so that they'll be available when the pipeline
fetches the repo, and finally deploy the pipeline:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cdk destroy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token builtin class-name">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Adding source code to GitHub repository"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push origin main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cdk deploy LambdaApiSolutionPipelineStack</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-multiple-environments">Creating Multiple Environments<a href="https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda#creating-multiple-environments" class="hash-link" aria-label="Direct link to Creating Multiple Environments" title="Direct link to Creating Multiple Environments" translate="no">​</a></h2>
<p>From now on, the pipeline will manage changes instead of manual <code>cdk deploy</code> commands. By merely pushing changes to the
<code>main</code> branch, the pipeline will update itself and the other resources. The last feature in this example is adding
development, test, and production environments. Rather than creating more stacks, we can leverage stages instead. Each
environment will have a stage that makes a separate stack plus actions like approvals or integration testing. First, a
stage must be defined in code. For this example, a stage will only contain an API stack.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution/Program.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Amazon</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">CDK</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name">Construct</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Constructs</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Construct</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">LambdaApiSolution</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SolutionStage</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token type-list class-name">Stage</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SolutionStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Construct</span><span class="token plain"> scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">IStageProps</span><span class="token plain"> props </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">base</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scope</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">LambdaApiSolutionStack</span><span class="token plain"> lambdaApiSolutionStack </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">LambdaApiSolutionStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Solution"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>To implement the stages, navigate back to <code>PipelineStack.cs</code> and append the following code after the pipeline
declaration:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">LambdaApiSolution/src/LambdaApiSolution/PipelineStack.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token class-name">CdkStage</span><span class="token plain"> developmentStage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pipeline</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddApplicationStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">SolutionStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Development"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">CdkStage</span><span class="token plain"> testStage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pipeline</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddApplicationStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">SolutionStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Test"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">testStage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddManualApprovalAction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">AddManualApprovalOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ActionName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PromoteToProduction"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">CdkStage</span><span class="token plain"> productionStage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pipeline</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AddApplicationStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">SolutionStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Production"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next Steps<a href="https://your-docusaurus-site.example.com/blog/an-api-with-dotnet-lambda#next-steps" class="hash-link" aria-label="Direct link to Next Steps" title="Direct link to Next Steps" translate="no">​</a></h2>
<p>The Lambda function, API Gateway, and multi-environment CI/CD pipeline are now in place. More Lambda functions can be
added as separate C# projects. More stacks can be created and added to <code>SolutionStage.cs</code>.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[AWS re:Invent 2020]]></title>
            <link>https://your-docusaurus-site.example.com/blog/at-reinvent-2020</link>
            <guid>https://your-docusaurus-site.example.com/blog/at-reinvent-2020</guid>
            <pubDate>Tue, 01 Dec 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Thoughts and proofs-of-concepts from AWS re:Invent 2020.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contents">Contents<a href="https://your-docusaurus-site.example.com/blog/at-reinvent-2020#contents" class="hash-link" aria-label="Direct link to Contents" title="Direct link to Contents" translate="no">​</a></h2>
<ul>
<li class="">Container Support for Lambda</li>
<li class="">Introducing AWS Proton</li>
<li class="">EC2 macOS Instances</li>
<li class="">First-Class .NET 5 Support for Lambda</li>
<li class="">CloudShell</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="container-support-for-lambda">Container Support for Lambda<a href="https://your-docusaurus-site.example.com/blog/at-reinvent-2020#container-support-for-lambda" class="hash-link" aria-label="Direct link to Container Support for Lambda" title="Direct link to Container Support for Lambda" translate="no">​</a></h2>
<p>AWS Lambda supports Docker images up to 10GB in size. They've also provided base images for Lambda runtimes in the new <a href="https://gallery.ecr.aws/" target="_blank" rel="noopener noreferrer" class="">public ECR</a>. For reference, the <a href="https://gallery.ecr.aws/lambda/nodejs" target="_blank" rel="noopener noreferrer" class="">base Node.js 12 image</a> is ~450MB. The Serverless Application Model (SAM) CLI has already been updated for container support. Instead of specifying a <code>--runtime</code>, engineers can now use the <code>--base-image</code> flag.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sam </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 1.13.2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sam init --base-image amazon/nodejs12.x-base</span><br></div></code></pre></div></div>
<p>This creates a <code>Dockerfile</code> for the function.</p>
<div class="language-dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> public.ecr.aws/lambda/nodejs:12</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">COPY</span><span class="token instruction"> app.js package.json ./</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> npm install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">CMD</span><span class="token instruction"> [</span><span class="token instruction string" style="color:#e3116c">"app.lambdaHandler"</span><span class="token instruction">]</span><br></div></code></pre></div></div>
<p>The <code>deploy</code> command also includes container registry support via ECR. With a quick <code>--guided</code> deployment, I produced the following <code>samconfig</code>:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">version</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">default</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">default.deploy</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">default.deploy.parameters</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">stack_name</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sam-app-container-support"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">s3_bucket</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws-sam-cli-managed-default-samclisourcebucket-ENTROPY"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">s3_prefix</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sam-app-container-support"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">region</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">confirm_changeset</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">capabilities</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CAPABILITY_IAM"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key property" style="color:#36acaa">image_repository</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ACCOUNT_NUMBER.dkr.ecr.us-east-1.amazonaws.com/IMAGE_REPOSITORY"</span><br></div></code></pre></div></div>
<p>All of this made it seamless to deploy a container-based Lambda function with the same ease as <code>zip</code>-based ones. I haven't had the opportunity to do performance testing yet, but per <a href="https://www.reddit.com/r/aws/comments/k4p5dc/new_for_aws_lambda_container_image_support/geb5o18?utm_source=share&amp;utm_medium=web2x&amp;context=3" target="_blank" rel="noopener noreferrer" class="">/u/julianwood</a> from the Lambda team, it should be equivalent.</p>
<blockquote>
<p>Performance is on par with <code>zip</code> functions. We don't use Fargate. This is pure Lambda. We optimize the image when the function is created and cache the layers, so the startup time is pretty much the same as <code>zip</code> functions.</p>
</blockquote>
<p>A fully-functional example can be found in this <a href="https://github.com/scottenriquez/aws-reinvent-2020-samples/tree/main/sam-app-container-support" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introducing-aws-proton">Introducing AWS Proton<a href="https://your-docusaurus-site.example.com/blog/at-reinvent-2020#introducing-aws-proton" class="hash-link" aria-label="Direct link to Introducing AWS Proton" title="Direct link to Introducing AWS Proton" translate="no">​</a></h2>
<blockquote>
<p>AWS Proton is the first fully managed application deployment service for container and serverless applications. Platform engineering teams can use Proton to connect and coordinate all the different tools needed for infrastructure provisioning, code deployments, monitoring, and updates.</p>
</blockquote>
<p>During the announcement video, I wasn’t sure what the relationship between Proton and existing DevOps tools like CloudFormation and CodePipeline would be or even who the target audience is. To answer these questions, it makes sense to describe the problem that AWS is aiming to solve.</p>
<p>Per the <a href="https://www.youtube.com/watch?v=DZJ8F6lKFuA" target="_blank" rel="noopener noreferrer" class="">Containers from the Couch stream</a>, AWS understands that not all teams are able to staff with the requisite expertise on a single team (i.e., one team with software engineers, DevOps engineers, security, etc.). To mitigate this, companies often create leveraged teams to provide a specific set of services to other groups (i.e., a centralized platform team that serves multiple development teams). Leveraged teams have their own set of problems, including becoming resource bottlenecks, lack of adequate knowledge sharing mechanisms, and the inability to define and enforce standards.</p>
<p>Proton aims to bridge this gap by offering tooling to standardize environments and services in templates across an organization. It also supports versioning so that environments and services are appropriately maintained. The expectation is that centralized platform teams can support these templates instead of individual solutions with heavily nuanced CloudFormation templates and DevOps pipelines. In Proton, environments are defined as sets of shared resources that individual services are deployed into. At this time, it’s not possible to deploy services without environments. The configurations for environments and services are intended to be utilized throughout the organization (although cross-account sharing isn’t available yet). Changes to templates are published as major and minor versions that are applied to individual instances. Unfortunately, auto-updates are not yet available. Schemas are used within these templates to define inputs for consumers.</p>
<p>I haven’t been able to find much documentation on how to create templates other than <a href="https://github.com/aws-samples/aws-proton-sample-templates/tree/main/lambda-crud-svc" target="_blank" rel="noopener noreferrer" class="">this GitHub repository</a>. The Lambda example there gives insight into the general structure from the <code>/environment</code> and <code>/service</code> directories. Both types are comprised of schemas, manifests, infrastructure, and pipelines.</p>
<p>As mentioned above, schemas are used to capture inputs. In the sample from GitHub, the only shared environment resource is a DynamoDB table, and the time to live specification is parameterized.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/schema.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">format</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">openapi</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3.0.0'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment_input_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'EnvironmentInput'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">types</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">EnvironmentInput</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> object</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Input properties for my environment'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ttl_attribute</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Which attribute to use as the ttl attribute'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ttl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">minLength</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">maxLength</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><br></div></code></pre></div></div>
<p>Defining <code>/infrastructure</code> or <code>/pipeline</code> sections of the Proton template requires a manifest to describe how exactly to interpret the infrastructure as code. I can't find any documentation for the accepted values, but the template indicates that templating engines like <a href="https://jinja.palletsprojects.com/en/2.11.x/" target="_blank" rel="noopener noreferrer" class="">Jinja</a> are supported and other infrastructure as code options like CDK may be planned for the future.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/manifest.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">infrastructure</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">templates</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cloudformation.yaml'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">engine</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jinja</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">template_language</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cloudformation</span><br></div></code></pre></div></div>
<p>Lastly, a CloudFormation template is used to describe the infrastructure and DevOps automation like CodePipeline. Note the use of Jinja templating (specifically <code>environment.ttl_attribute</code>) to reference shared resources and input parameters.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/cloudformation.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">AWSTemplateFormatVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2010-09-09'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Transform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Serverless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token datetime number" style="color:#36acaa">2016-10-31</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> This environment holds a simple DDB table shared between services.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">AppTable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">DynamoDB</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Table</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">AttributeDefinitions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">AttributeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hk</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">AttributeType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> S</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">AttributeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rk</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">AttributeType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> S</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BillingMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PAY_PER_REQUEST</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">KeySchema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">AttributeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hk</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">KeyType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HASH</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">AttributeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rk</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">KeyType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RANGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">GlobalSecondaryIndexes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">IndexName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> reverse</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">KeySchema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">AttributeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rk</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">KeyType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HASH</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">AttributeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hk</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">KeyType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RANGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">Projection</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">ProjectionType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ALL </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% if environment.ttl_attribute</span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain">length %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">TimeToLiveSpecification</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">AttributeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{{ environment.ttl_attribute }}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></div></code></pre></div></div>
<p>When the template is finished, compress the source code, push to S3, create a template, and publish it.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># create an environment template</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws proton-preview create-environment-template </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token plain"> us-east-1 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --template-name </span><span class="token string" style="color:#e3116c">"crud-api"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --display-name </span><span class="token string" style="color:#e3116c">"CRUD Environment"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--description</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Environment with DDB Table"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># create a major version of the template (1)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws proton-preview create-environment-template-major-version </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token plain"> us-east-1 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --template-name </span><span class="token string" style="color:#e3116c">"crud-api"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--description</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Version 1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># compress local source code</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-zcvf</span><span class="token plain"> env-template.tar.gz environment/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># copy to S3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws s3 </span><span class="token function" style="color:#d73a49">cp</span><span class="token plain"> env-template.tar.gz s3://proton-cli-templates-</span><span class="token variable" style="color:#36acaa">${account_id}</span><span class="token plain">/env-template.tar.gz </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token plain"> us-east-1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># delete local artifact</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> env-template.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># create a minor version (0)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws proton-preview create-environment-template-minor-version </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token plain"> us-east-1 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --template-name </span><span class="token string" style="color:#e3116c">"crud-api"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--description</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Version 1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --major-version-id </span><span class="token string" style="color:#e3116c">"1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --source-s3-bucket proton-cli-templates-</span><span class="token variable" style="color:#36acaa">${account_id}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --source-s3-key env-template.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># publish for users</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws proton-preview update-environment-template-minor-version </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token plain"> us-east-1 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --template-name </span><span class="token string" style="color:#e3116c">"crud-api"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --major-version-id </span><span class="token string" style="color:#e3116c">"1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --minor-version-id </span><span class="token string" style="color:#e3116c">"0"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--status</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PUBLISHED"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># instantiate an environment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws proton-preview create-environment </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token plain"> us-east-1 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --environment-name </span><span class="token string" style="color:#e3116c">"crud-api-beta"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --environment-template-arn arn:aws:proton:us-east-1:</span><span class="token variable" style="color:#36acaa">${account_id}</span><span class="token plain">:environment-template/crud-api </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --template-major-version-id </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --proton-service-role-arn arn:aws:iam::</span><span class="token variable" style="color:#36acaa">${account_id}</span><span class="token plain">:role/ProtonServiceRole </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--spec</span><span class="token plain"> file://specs/env-spec.yaml</span><br></div></code></pre></div></div>
<p>The process for publishing and instantiating services is largely the same.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ec2-macos-instances">EC2 macOS Instances<a href="https://your-docusaurus-site.example.com/blog/at-reinvent-2020#ec2-macos-instances" class="hash-link" aria-label="Direct link to EC2 macOS Instances" title="Direct link to EC2 macOS Instances" translate="no">​</a></h2>
<p>The prospect of having macOS support for EC2 instances is exciting, but the current implementation has some severe limitations. First off, the instances are only available via <a href="https://aws.amazon.com/ec2/dedicated-hosts/" target="_blank" rel="noopener noreferrer" class="">dedicated hosts</a> with a minimum of a 24-hour tenancy. At an hourly rate of USD 1.083, it’s hard to imagine this being economically viable outside of particular use cases. The only AMIs available are 10.14 (Mojave) and 10.15 (Catalina), although 11.0 (Big Sur) is coming soon. There’s also no mention of support for AWS Workspaces yet, which I hope is a future addition given the popularity of macOS amongst engineers. Lastly, the new Apple M1 ARM-based chip isn’t available until next year.</p>
<p>Despite the cost, I still wanted to get my hands on an instance. I hit two roadblocks while getting started. First, I had to increase my service quota for <code>mac1</code> dedicated hosts. Second, I had to try several availability zones to find one with dedicated hosts available (<code>use1-az6</code>). I used the following CLI commands to provision a host and instance.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># create host and echo ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws ec2 allocate-hosts --instance-type mac1.metal </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --availability-zone us-east-1a --auto-placement on </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--quantity</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token plain"> us-east-1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># create an EC2 instance on the host</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws ec2 run-instances </span><span class="token parameter variable" style="color:#36acaa">--region</span><span class="token plain"> us-east-1 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --instance-type mac1.metal </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --image-id ami-0e813c305f63cecbd </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --key-name </span><span class="token variable" style="color:#36acaa">$KEY_PAIR</span><span class="token plain"> --associate-public-ip-address </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--placement</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'HostId=$HOST_ID'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --block-device-mappings </span><span class="token string" style="color:#e3116c">'DeviceName=/dev/sda1,Ebs={DeleteOnTermination=true,VolumeSize=250,VolumeType=gp2}'</span><br></div></code></pre></div></div>
<p>After that, I was able to SSH in and experience EC2 macOS in all its glory.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">             .:'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         __ :'__       __|  __|_  )</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      .'`  `-'  ``.    _|  (     /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     :          .-'   ___|\___|___|</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     :         :</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      :         `-;   Amazon EC2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       `.__.-.__.'    macOS Catalina 10.15.7</span><br></div></code></pre></div></div>
<p>Thanks to <a href="https://simple-minds-think-alike.hatenablog.com/entry/ec2-mac-instance" target="_blank" rel="noopener noreferrer" class="">this awesome blog post</a>, I was able to put together an EC2 user data script for remote access.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">su</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dscl </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-create</span><span class="token plain"> /Users/Scottie</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dscl </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-create</span><span class="token plain"> /Users/Scottie UserShell /bin/zsh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dscl </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-create</span><span class="token plain"> /Users/Scottie RealName </span><span class="token string" style="color:#e3116c">"Scottie Enriquez"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dscl </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-create</span><span class="token plain"> /Users/Scottie UniqueID </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dscl </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-create</span><span class="token plain"> /Users/Scottie PrimaryGroupID </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dscl </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-create</span><span class="token plain"> /Users/Scottie NFSHomeDirectory /Users/Scottie</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dscl </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-passwd</span><span class="token plain"> /Users/Scottie </span><span class="token variable" style="color:#36acaa">$USER_PASSWORD</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dscl </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-append</span><span class="token plain"> /Groups/admin GroupMembership Scottie</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token parameter variable" style="color:#36acaa">-activate</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-configure</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-access</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-on</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token parameter variable" style="color:#36acaa">-clientopts</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-setvnclegacy</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-vnclegacy</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">yes</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token parameter variable" style="color:#36acaa">-clientopts</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-setvncpw</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-vncpw</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$VNC_PASSWORD</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token parameter variable" style="color:#36acaa">-restart</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-agent</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-privs</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-all</span><br></div></code></pre></div></div>
<p>I then used <a href="https://www.realvnc.com/en/connect/download/viewer/" target="_blank" rel="noopener noreferrer" class="">VNC Viewer</a> to connect over port <code>5900</code>.</p>
<p><img decoding="async" loading="lazy" alt="macOS on EC2" src="https://your-docusaurus-site.example.com/assets/images/macOS-ec2-5fe7982c50d905f8b5e51a9febaf2123.png" width="2056" height="1606" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-class-net-5-support-for-lambda">First-Class .NET 5 Support for Lambda<a href="https://your-docusaurus-site.example.com/blog/at-reinvent-2020#first-class-net-5-support-for-lambda" class="hash-link" aria-label="Direct link to First-Class .NET 5 Support for Lambda" title="Direct link to First-Class .NET 5 Support for Lambda" translate="no">​</a></h2>
<p>According to <a href="https://aws.amazon.com/blogs/developer/net-5-aws-lambda-support-with-container-images/" target="_blank" rel="noopener noreferrer" class="">AWS</a>:</p>
<blockquote>
<p>.NET 5, which was released last month, is a major release towards the vision of a single .NET experience for .NET Core, .NET Framework, and Xamarin developers. .NET 5 is a “Current” release and is not a long term supported (LTS) version of .NET. The next LTS version will be .NET 6, which is currently scheduled to be released in November 2021. .NET 5 will be supported for 3 months after that date, which means that .NET 5 will be supported for about 15 months in total. In comparison, .NET 6 will have 3 years of support. Even though Lambda’s policy has always been to support LTS versions of language runtimes for managed runtimes, the new container image support makes .NET 5 a first-class platform for Lambda functions.</p>
</blockquote>
<p>While AWS has already released the <a href="https://gallery.ecr.aws/lambda/dotnet" target="_blank" rel="noopener noreferrer" class="">.NET 5 public ECR image</a>, SAM support as a <code>--base-image</code> hasn't been implemented yet as of version <code>1.13.2</code>. Porting from a .NET Core starter template is as easy as changing the <code>&lt;TargetFramework&gt;</code> in the <code>.csproj</code> file and updating the <code>Dockerfile</code>.</p>
<div class="language-Dockerfile language-dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> mcr.microsoft.com/dotnet/sdk:5.0 </span><span class="token instruction keyword" style="color:#00009f">as</span><span class="token instruction"> build-image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">ARG</span><span class="token instruction"> FUNCTION_DIR=</span><span class="token instruction string" style="color:#e3116c">"/build"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">ARG</span><span class="token instruction"> SAM_BUILD_MODE=</span><span class="token instruction string" style="color:#e3116c">"run"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">ENV</span><span class="token instruction"> PATH=</span><span class="token instruction string" style="color:#e3116c">"/root/.dotnet/tools:${PATH}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> apt-get update &amp;&amp; apt-get -y install zip</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> mkdir </span><span class="token instruction variable" style="color:#36acaa">$FUNCTION_DIR</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">WORKDIR</span><span class="token instruction"> </span><span class="token instruction variable" style="color:#36acaa">$FUNCTION_DIR</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">COPY</span><span class="token instruction"> Function.cs HelloWorld.csproj aws-lambda-tools-defaults.json </span><span class="token instruction variable" style="color:#36acaa">$FUNCTION_DIR</span><span class="token instruction">/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> dotnet tool install -g Amazon.Lambda.Tools</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> mkdir -p build_artifacts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> if [ </span><span class="token instruction string" style="color:#e3116c">"$SAM_BUILD_MODE"</span><span class="token instruction"> = </span><span class="token instruction string" style="color:#e3116c">"debug"</span><span class="token instruction"> ]; then dotnet lambda package --configuration Debug; else dotnet lambda package --configuration Release; fi</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">RUN</span><span class="token instruction"> if [ </span><span class="token instruction string" style="color:#e3116c">"$SAM_BUILD_MODE"</span><span class="token instruction"> = </span><span class="token instruction string" style="color:#e3116c">"debug"</span><span class="token instruction"> ]; then cp -r /build/bin/Debug/net5.0/publish/* /build/build_artifacts; else cp -r /build/bin/Release/net5.0/publish/* /build/build_artifacts; fi</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">FROM</span><span class="token instruction"> public.ecr.aws/lambda/dotnet:5.0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">COPY</span><span class="token instruction"> </span><span class="token instruction options property" style="color:#36acaa">--from</span><span class="token instruction options punctuation" style="color:#393A34">=</span><span class="token instruction options string" style="color:#e3116c">build-image</span><span class="token instruction"> /build/build_artifacts/ /var/task/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token instruction keyword" style="color:#00009f">CMD</span><span class="token instruction"> [</span><span class="token instruction string" style="color:#e3116c">"HelloWorld::HelloWorld.Function::FunctionHandler"</span><span class="token instruction">]</span><br></div></code></pre></div></div>
<p>A working example can be found <a href="https://github.com/scottenriquez/aws-reinvent-2020-samples/tree/main/dotnet5-lambda" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloudshell">CloudShell<a href="https://your-docusaurus-site.example.com/blog/at-reinvent-2020#cloudshell" class="hash-link" aria-label="Direct link to CloudShell" title="Direct link to CloudShell" translate="no">​</a></h2>
<p>Finally catching up with both Azure and Google Cloud, AWS announced the launch of CloudShell:</p>
<blockquote>
<p>AWS CloudShell is a browser-based shell that makes it easy to securely manage, explore, and interact with your AWS resources. CloudShell is pre-authenticated with your console credentials. Common development and operations tools are pre-installed, so no local installation or configuration is required. With CloudShell, you can quickly run scripts with the AWS Command Line Interface (AWS CLI), experiment with AWS service APIs using the AWS SDKs, or use a range of other tools to be productive. You can use CloudShell right from your browser and at no additional cost.</p>
</blockquote>
<p>Bash, Zsh, and PowerShell are available as shell options, and run commands can be customized in a typical <code>~/.bashrc</code> or <code>~/.zshrc</code> fashion. The free gigabyte of storage persists in the <code>$HOME</code> directory, making it easy to stash working files. While there are several runtimes like Node.js and Python installed alongside Vim, doing development in CloudShell is not as ergonomic as Cloud9 or a local machine. I can see this tool being useful when combined with something like container tabs in Firefox to interact with multiple AWS accounts from the browser instead of running commands in a local terminal with <code>--profile</code> flags.</p>]]></content:encoded>
            <category>Cloud</category>
        </item>
        <item>
            <title><![CDATA[Cloud9 IDE Configuration]]></title>
            <link>https://your-docusaurus-site.example.com/blog/cloud9-ide-configuration</link>
            <guid>https://your-docusaurus-site.example.com/blog/cloud9-ide-configuration</guid>
            <pubDate>Sun, 08 Nov 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Scripts for preparing a cloud-hosted IDE in AWS.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud9-overview-and-use-cases">Cloud9 Overview and Use Cases<a href="https://your-docusaurus-site.example.com/blog/cloud9-ide-configuration#cloud9-overview-and-use-cases" class="hash-link" aria-label="Direct link to Cloud9 Overview and Use Cases" title="Direct link to Cloud9 Overview and Use Cases" translate="no">​</a></h2>
<p><a href="https://aws.amazon.com/cloud9/" target="_blank" rel="noopener noreferrer" class="">Per AWS</a>, "Cloud9 is a cloud-based integrated development environment (IDE) that lets you write, run, and debug your code with just a browser. It includes a code editor, debugger, and terminal. Cloud9 comes prepackaged with essential tools like Docker and support for popular programming languages, including JavaScript, Python, PHP, and .NET." The AWS, Serverless Application Model (SAM), and Cloud Development Kit (CDK) CLIs are pre-installed as well. Users are abstracted from credential management (i.e., there's no need to provision an IAM user and run <code>aws configure</code>). Since the underlying compute is an EC2 instance, developers have a consistent experience across client devices.</p>
<p><img decoding="async" loading="lazy" alt="Cloud9" src="https://your-docusaurus-site.example.com/assets/images/cloud9-45cbff7d3104af0ebee13678d612499f.png" width="3360" height="1730" class="img_ev3q"></p>
<p>Cloud9 makes it easy to declare an environment using CloudFormation, specify Git repositories to clone during the provisioning process, and share various custom settings such as themes and keybindings with developers. It's also a cheap option since the EC2 instance shuts itself down after a set period of time (with a default of 30 minutes).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initial-setup">Initial Setup<a href="https://your-docusaurus-site.example.com/blog/cloud9-ide-configuration#initial-setup" class="hash-link" aria-label="Direct link to Initial Setup" title="Direct link to Initial Setup" translate="no">​</a></h2>
<p>The first deployment fails unless a Cloud9 environment has been created from the Console due to an IAM service role created in the process (<code>service-role/AWSCloud9SSMAccessRole</code>). See more information <a href="https://docs.aws.amazon.com/cloud9/latest/user-guide/ec2-ssm.html#access-ec2-session" target="_blank" rel="noopener noreferrer" class="">in the AWS documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws-resources-created">AWS Resources Created<a href="https://your-docusaurus-site.example.com/blog/cloud9-ide-configuration#aws-resources-created" class="hash-link" aria-label="Direct link to AWS Resources Created" title="Direct link to AWS Resources Created" translate="no">​</a></h2>
<ul>
<li class="">A Cloud9 environment with an <code>m5.large</code> instance EC2 instance</li>
<li class="">A CodeCommit repository for stashing work since the Cloud9 environment is considered transient</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloudformation-template">CloudFormation Template<a href="https://your-docusaurus-site.example.com/blog/cloud9-ide-configuration#cloudformation-template" class="hash-link" aria-label="Direct link to CloudFormation Template" title="Direct link to CloudFormation Template" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">Resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rCloud9Environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Cloud9</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EnvironmentEC2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">AutomaticStopTimeMinutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ConnectionType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CONNECT_SSM</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">based cloud development environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">InstanceType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> m5.large</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Cloud9Environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Repositories</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">PathComponent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /repos/codecommit</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">RepositoryUrl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!GetAtt</span><span class="token plain"> rCloud9WorkingRepository.CloneUrlHttp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">PathComponent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /repos/aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cloud9</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">RepositoryUrl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/scottenriquez/aws</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cloud9</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">environment.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rCloud9WorkingRepository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">CodeCommit</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Repository</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">RepositoryName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Cloud9WorkingRepository</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">RepositoryDescription</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> A CodeCommit repository for stashing work from the Cloud9 IDE</span><br></div></code></pre></div></div>
<p>This template can be deployed via the AWS Console or the AWS CLI.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initialization-script">Initialization Script<a href="https://your-docusaurus-site.example.com/blog/cloud9-ide-configuration#initialization-script" class="hash-link" aria-label="Direct link to Initialization Script" title="Direct link to Initialization Script" translate="no">​</a></h2>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://github.com/dotnet/core/files/2186067/openssl-libs-ami.spec.txt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rpmbuild </span><span class="token parameter variable" style="color:#36acaa">--bb</span><span class="token plain"> openssl-libs-ami.spec.txt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> /usr/src/rpm/RPMS/x86_64/openssl-libs-1.0.0-0.x86_64.rpm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">rpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-Uvh</span><span class="token plain"> https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> yum </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> dotnet-sdk-3.1 </span><span class="token function" style="color:#d73a49">zsh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> ec2-user</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">chsh </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> /bin/zsh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable function" style="color:#d73a49">curl</span><span class="token string variable" style="color:#36acaa"> </span><span class="token string variable parameter variable" style="color:#36acaa">-fsSL</span><span class="token string variable" style="color:#36acaa"> https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><br></div></code></pre></div></div>
<p>The <code>user-data.sh</code> script is intended to run when the Cloud9 instance spins up (mirroring the EC2 instance paramater of the same name). Unfortunately, this setup must be done manually since there isn't a parameter in the CloudFormation resource. To make this easier, I've added <a href="https://github.com/scottenriquez/aws-cloud9-environment" target="_blank" rel="noopener noreferrer" class="">this GitHub repository</a> to the list to clone on the instance.</p>
<p>The Bash script does the following:</p>
<ul>
<li class="">Installs .NET Core 3.1</li>
<li class="">Installs Zsh and Oh My Zsh</li>
<li class="">Resets the <code>ec2-user</code> password</li>
<li class="">Changes the default shell to Zsh</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="user-settings">User Settings<a href="https://your-docusaurus-site.example.com/blog/cloud9-ide-configuration#user-settings" class="hash-link" aria-label="Direct link to User Settings" title="Direct link to User Settings" translate="no">​</a></h2>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"ace"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@behavioursEnabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@fontSize"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">18</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@keyboardmode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"vim"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@showGutter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@showInvisibles"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@theme"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@c9/ide/plugins/c9.ide.theme.jett/ace.themes/jett"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"custom-types"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"json()"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"settings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"javascript"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"statusbar"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"@show"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"build"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@autobuild"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"collab"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@timeslider-visible"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"configurations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"debug"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@autoshow"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@pause"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"general"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@autosave"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"afterDelay"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@skin"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"jett-dark"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"key-bindings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@platform"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"auto"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"json()"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"openfiles"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@show"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"output"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"projecttree"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@showhidden"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"tabs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@show"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"terminal"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"@fontsize"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">18</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Much like the <code>user-data</code>, the user settings aren't parameterized in CloudFormation. These settings are included in the repository but must be manually configured.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[Using Former2 for Existing AWS Resources]]></title>
            <link>https://your-docusaurus-site.example.com/blog/templates-with-former2</link>
            <guid>https://your-docusaurus-site.example.com/blog/templates-with-former2</guid>
            <pubDate>Sat, 26 Sep 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Generating CloudFormation templates from existing AWS resources.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://your-docusaurus-site.example.com/blog/templates-with-former2#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>I've been making a concerted effort lately to use infrastructure as code via CloudFormation for all of my personal AWS-hosted projects. Writing these templates can feel a bit tedious, even with editor tooling and plugins. I thought it would be awesome to generate CloudFormation templates for existing resources and first found CloudFormer. I found blog posts about CloudFormer from as far back as 2013, but it was never advertised much.</p>
<p><strong>Update: <a href="https://github.com/iann0036/former2" target="_blank" rel="noopener noreferrer" class="">Former2</a> is the de facto standard now that <a href="https://twitter.com/iann0036/status/1314765292145274880?s=20" target="_blank" rel="noopener noreferrer" class="">CloudFormer has been deprecated</a>. I kept my notes on CloudFormer for posterity at the end of the post.</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started-with-former2">Getting Started with Former2<a href="https://your-docusaurus-site.example.com/blog/templates-with-former2#getting-started-with-former2" class="hash-link" aria-label="Direct link to Getting Started with Former2" title="Direct link to Getting Started with Former2" translate="no">​</a></h2>
<p>Former2 takes a client-side approach to infrastructure as code template generation and has support for <a href="https://www.terraform.io/" target="_blank" rel="noopener noreferrer" class="">Terraform</a> and <a href="https://aws.amazon.com/cdk/" target="_blank" rel="noopener noreferrer" class="">CDK</a>. Instead of an EC2 instance, it uses the JavaScript SDKs via your browser to make all requisite API calls. You can even use the static website hosted on the public internet. If you're not keen on the idea of passing read-only IAM credentials to a third-party website, <a href="https://github.com/iann0036/former2" target="_blank" rel="noopener noreferrer" class="">clone the repository</a> and run the web application locally via the file system or Docker. I've also created a CloudFormation template to run it on an EC2 instance:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">AWSTemplateFormatVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2010-09-09'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pAllowedIpCidr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> String</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">AllowedPattern</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'((\d{1,3})\.){3}\d{1,3}/\d{1,2}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'0.0.0.0/0'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pLatestAl2AmiId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">SSM</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Parameter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Value&lt;AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EC2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Id</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /aws/service/ami</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">amazon</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">linux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest/amzn2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ami</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hvm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">x86_64</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gp2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pVpcId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EC2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">VPC</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pSubnetId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EC2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Subnet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pKeyPairName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EC2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">KeyPair</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">KeyName</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> A self</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hosted instance of Former2 on EC2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rEc2SecurityGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EC2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">SecurityGroup</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">GroupDescription</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Former2 security group</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">GroupName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Former2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">VpcId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> pVpcId</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SecurityGroupIngress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">CidrIp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> pAllowedIpCidr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">IpProtocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tcp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">FromPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ToPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">443</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SecurityGroupEgress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">CidrIp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> pAllowedIpCidr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">IpProtocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tcp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">FromPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ToPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">443</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rEc2Instance</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">EC2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Instance</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">UserData</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Fn::Base64</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          #!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          yum update -y</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          yum install git httpd -y</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          systemctl start httpd</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          systemctl enable httpd</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          cd /var/www/html</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          git clone https://github.com/iann0036/former2.git .</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ImageId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> pLatestAl2AmiId</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">InstanceType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> t2.micro</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">KeyName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> pKeyPairName</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Tenancy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SubnetId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> pSubnetId</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">EbsOptimized</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SecurityGroupIds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Ref</span><span class="token plain"> rEc2SecurityGroup</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SourceDestCheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BlockDeviceMappings</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">DeviceName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /dev/xvda</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">Ebs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">Encrypted</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">VolumeSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">VolumeType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gp2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">DeleteOnTermination</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HibernationOptions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">Configured</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">Outputs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">PublicIp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Former2 EC2 instance public IP address</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!GetAtt</span><span class="token plain"> rEc2Instance.PublicIp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Export</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!Sub</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'${AWS::StackName}-PublicIp'</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-cases-for-generating-templates">Use Cases for Generating Templates<a href="https://your-docusaurus-site.example.com/blog/templates-with-former2#use-cases-for-generating-templates" class="hash-link" aria-label="Direct link to Use Cases for Generating Templates" title="Direct link to Use Cases for Generating Templates" translate="no">​</a></h2>
<p>Overall I’d argue that addressing the minor changes is easier than writing a template from scratch. With that being said, I don’t know that I’d ever spin up resources via the Console with the sole intent of creating CloudFormation templates. However, it could make migrating from a prototype to a productionized product easier if you’re willing to pay a small compute cost.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started-with-cloudformer-deprecated">Getting Started with CloudFormer (Deprecated)<a href="https://your-docusaurus-site.example.com/blog/templates-with-former2#getting-started-with-cloudformer-deprecated" class="hash-link" aria-label="Direct link to Getting Started with CloudFormer (Deprecated)" title="Direct link to Getting Started with CloudFormer (Deprecated)" translate="no">​</a></h2>
<p>Setting up CloudFormer is quite simple through CloudFormation. In fact, it's a sample template that creates a stack with several resources:</p>
<ul>
<li class=""><code>AWS::EC2::Instance</code></li>
<li class=""><code>AWS::EC2::SecurityGroup</code></li>
<li class=""><code>AWS::IAM::InstanceProfile</code></li>
<li class=""><code>AWS::IAM::Role</code></li>
<li class=""><code>AWS::IAM::Policy</code></li>
</ul>
<p>The template has a few parameters as well:</p>
<ul>
<li class="">Username</li>
<li class="">Password</li>
<li class="">VPC</li>
</ul>
<p>After creating the stack like any other CloudFormation template, a URL is outputted. The <code>t2.small</code> EC2 instance is a web server with a public IPv4 address and DNS configured behind the scenes. The security group allows all traffic (0.0.0.0/0) on port 443, but it's worth noting that I did have an SSL issue with my instance that threw a warning in my browser. The instance profile is used by the web server to assume the IAM role with an attached policy that allows for widespread reads across resources and writes to S3. Keep in mind that the CloudFormer stack should be deleted after to use to avoid unnecessary compute charges for the EC2 instance.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-cloudformer-web-server">Using the CloudFormer Web Server<a href="https://your-docusaurus-site.example.com/blog/templates-with-former2#using-the-cloudformer-web-server" class="hash-link" aria-label="Direct link to Using the CloudFormer Web Server" title="Direct link to Using the CloudFormer Web Server" translate="no">​</a></h2>
<p>Navigate to the URL from the output tab of the CloudFormation stack (something like <code>https://ec2-0-0-0-0.compute-1.amazonaws.com</code>) and enter the username and password that you specified as a parameter. Via the GUI, select the resources to reverse engineer across the following categories:</p>
<ul>
<li class="">DNS</li>
<li class="">VPC</li>
<li class="">VPC Network</li>
<li class="">VPC Security</li>
<li class="">Network</li>
<li class="">Managed</li>
<li class="">Services</li>
<li class="">Managed Config</li>
<li class="">Compute</li>
<li class="">Storage</li>
<li class="">Storage Config</li>
<li class="">App Services</li>
<li class="">Security</li>
<li class="">Operational</li>
</ul>
<p>The list is robust but not all-inclusive.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-template-for-a-cloudfront-distribution">Creating a Template for a CloudFront Distribution<a href="https://your-docusaurus-site.example.com/blog/templates-with-former2#creating-a-template-for-a-cloudfront-distribution" class="hash-link" aria-label="Direct link to Creating a Template for a CloudFront Distribution" title="Direct link to Creating a Template for a CloudFront Distribution" translate="no">​</a></h2>
<p>I have a public CDN in one of my AWS accounts for images on a JAMstack site hosted on Netlify. It uses a standard design: a private S3 bucket behind a CloudFront distribution with an Origin Access Identity. Through the CloudFormer workflow, I selected the individual components:</p>
<ul>
<li class="">CloudFront distribution</li>
<li class="">S3 bucket</li>
<li class="">Bucket policy</li>
</ul>
<p>Sadly, there's no support for YAML as of right now. The web server generated a JSON template, which I converted to YAML via the Designer.</p>
<p>I plugged the template back into CloudFormation, and everything provisioned successfully. Digging deeper into the template, I noticed a few minor changes to make. First of all, the logical names are based on specifics of the existing resources (e.g., <code>distd1yqxti3jheii7cloudfrontnet</code> came from the URL of the CDN). However, these can easily be refactored. Since CloudFormer doesn't support creating an OAI, the existing identity is hardcoded. I added a resource for that to the template and converted the hardcoded value to a reference.</p>]]></content:encoded>
            <category>Cloud</category>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[Fantasy Football Power Rankings Markdown Generator]]></title>
            <link>https://your-docusaurus-site.example.com/blog/fantasy-football-power-rankings</link>
            <guid>https://your-docusaurus-site.example.com/blog/fantasy-football-power-rankings</guid>
            <pubDate>Fri, 21 Aug 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[A CLI for creating posts for my league's fantasy football site.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://your-docusaurus-site.example.com/blog/fantasy-football-power-rankings#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p><code>spr</code> is a CLI tool for generating Markdown pages in the <a href="https://www.thewinnerisatryhard.org/" target="_blank" rel="noopener noreferrer" class="">league Gatsby site</a> for power rankings posts with Sleeper data injected. The source code is hosted on <a href="https://github.com/the-winner-is-a-tryhard/power-rankings-markdown-cli" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-status">Build Status<a href="https://your-docusaurus-site.example.com/blog/fantasy-football-power-rankings#build-status" class="hash-link" aria-label="Direct link to Build Status" title="Direct link to Build Status" translate="no">​</a></h2>
<p><a href="https://dev.azure.com/scottenriquez/Sleeper%20Power%20Rankings%20Markdown%20CLI/_build/latest?definitionId=5&amp;branchName=master" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" src="https://dev.azure.com/scottenriquez/Sleeper%20Power%20Rankings%20Markdown%20CLI/_apis/build/status/the-winner-is-a-tryhard.power-rankings-markdown-cli?branchName=master" alt="Azure Pipelines" class="img_ev3q"></a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-and-dependencies">Installation and Dependencies<a href="https://your-docusaurus-site.example.com/blog/fantasy-football-power-rankings#installation-and-dependencies" class="hash-link" aria-label="Direct link to Installation and Dependencies" title="Direct link to Installation and Dependencies" translate="no">​</a></h2>
<p>Clone the repository, install NPM dependencies, and create a symlink in the global folder.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone git@github.com:the-winner-is-a-twiath/power-rankings-markdown-cli.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> power-rankings-markdown-cli</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">link</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">spr </span><span class="token parameter variable" style="color:#36acaa">--version</span><br></div></code></pre></div></div>
<p>The CLI source code doesn't store any secrets, so ensure that the AWS CLI is installed and that the credentials are configured at <code>~/.aws/credentials</code>.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">default</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">aws_access_key_id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">AKIAIOSFODNN7EXAMPLE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">aws_secret_access_key</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY</span><br></div></code></pre></div></div>
<p>If not, run <code>aws configure</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage">Usage<a href="https://your-docusaurus-site.example.com/blog/fantasy-football-power-rankings#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage" translate="no">​</a></h2>
<p>Navigate to the root folder of the league's Gatsby site, and run <code>spr add &lt;WEEK_NUMBER&gt; &lt;AUTHOR_FIRST_NAME&gt;</code>. The alias for <code>add</code> is <code>a</code>. Open the generated <code>index.md</code> file in the newly created directory (<code>&lt;FIRST_NAME&gt;-week-&lt;WEEK_NUMBER&gt;-power-rankings/</code>) to enter the power rankings text for the new post.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="functionality">Functionality<a href="https://your-docusaurus-site.example.com/blog/fantasy-football-power-rankings#functionality" class="hash-link" aria-label="Direct link to Functionality" title="Direct link to Functionality" translate="no">​</a></h2>
<ul>
<li class="">Validates the week number and author first name</li>
<li class="">Checks the current Git branch to ensure that the user has created a non-main branch</li>
<li class="">Verifies that the present working directory contains a Gatsby configuration file to standardize the relative paths</li>
<li class="">Fetches the league members and rosters from the Sleeper API</li>
<li class="">Fetches the current avatar for each league member and copies to a CDN hosted in AWS</li>
<li class="">Generates Markdown power rankings with the member's latest stats neatly formatted</li>
<li class="">Creates a new directory for the post in the Gatsby website and writes the <code>index.md</code> file</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://your-docusaurus-site.example.com/blog/fantasy-football-power-rankings#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no">​</a></h2>
<p>The league-specific details exist in various JavaScript configuration files to maximize reusability. While the CLI is tightly-coupled with Gatsby, there's still much that can be reconfigured for other leagues.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/lib/config/gatsby.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> gatsby </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// used to determine if the user created a new branch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">mainBranchName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'master'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// used to determine if the user is in the root Gatsby directory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">configFileName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'gatsby-config.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// used to support any changes to the default blog path for vanity URLs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">postPath</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/content/blog/posts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// used to defer image styling for the avatar to the Gatsby site</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">avatarHTMLClass</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sleeper-avatar'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/lib/config/aws.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> awsConfig </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// S3 bucket</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">bucketName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'twiath-site-cdn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// URL base to be used for source in &lt;img&gt; tag</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">cdnURLBase</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://d1yqxti3jheii7.cloudfront.net'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/lib/config/league.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> league </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Sleeper league ID number</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'541384381865115648'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/lib/config/validAuthors.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> authors </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Scottie</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Scottie Enriquez'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Callen</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Callen Trail'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Logan</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Logan Richardson'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Carl</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Carl Meziere'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Andrew</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Andrew Carlough'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">John</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'John Yarrow'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Matt</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Matt Kniowski'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Chris</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Chris Ramsey'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Caleb</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Caleb Trantow'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Travis</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Travis James'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Trond</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Trond Liu'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">Mark</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Mark Hamilton'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/lib/config/validWeeks.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> weeks </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">0</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'zero'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">1</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'one'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">2</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'two'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">3</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'three'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">4</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'four'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">5</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'five'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">6</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'six'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">7</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'seven'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">8</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eight'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">9</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'nine'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">10</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ten'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">11</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eleven'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">12</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'twelve'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">13</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'thirteen'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">14</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fourteen'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">15</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fifteen'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">16</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sixteen'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token number" style="color:#36acaa">17</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'seventeen'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Programming</category>
        </item>
        <item>
            <title><![CDATA[Continuous Integration for Swift Packages in Azure DevOps]]></title>
            <link>https://your-docusaurus-site.example.com/blog/continuous-integration-for-swift-packges-on-azure-devops</link>
            <guid>https://your-docusaurus-site.example.com/blog/continuous-integration-for-swift-packges-on-azure-devops</guid>
            <pubDate>Tue, 04 Aug 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Building CI for Swift packages using Azure Pipelines.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="https://your-docusaurus-site.example.com/blog/continuous-integration-for-swift-packges-on-azure-devops#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
<p>I use Azure DevOps for building CI/CD pipelines for professional projects. Given the GitHub integration and broader feature set, I've started using it instead of Travis CI for my open-source projects too. For most technology areas, there's a wide set of pre-built tasks that can be leveraged to build robust pipelines quickly. There are several tasks for compiling and publishing iOS applications using Xcode on transient macOS virtual machines.</p>
<p>However, in the spirit of using Swift like a general-purpose language, I wanted to use a Linux build server, a more industry-standard approach for CI/CD. <a class="" href="https://your-docusaurus-site.example.com/blog/swift-executables-with-unit-tests">In my previous post</a>, I described how I set up a Swift executable package to be more testable. This pipeline provides continuous integration for it. Azure Pipelines, which powers CI/CD in Azure DevOps, is scripted in YAML. It also supports integrating shell commands to be run on the virtual machine.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adding-a-trigger">Adding a Trigger<a href="https://your-docusaurus-site.example.com/blog/continuous-integration-for-swift-packges-on-azure-devops#adding-a-trigger" class="hash-link" aria-label="Direct link to Adding a Trigger" title="Direct link to Adding a Trigger" translate="no">​</a></h2>
<p>The first thing to specify in the YAML is a trigger. The trigger denotes which branches in the Git repository the build should be run for. For example, to run the build only for master, the trigger would be as follows:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> master</span><br></div></code></pre></div></div>
<p>In general, I want CI to run on all branches, so I use the following YAML instead:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">include</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*'</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="specifying-a-virtual-machine-image">Specifying a Virtual Machine Image<a href="https://your-docusaurus-site.example.com/blog/continuous-integration-for-swift-packges-on-azure-devops#specifying-a-virtual-machine-image" class="hash-link" aria-label="Direct link to Specifying a Virtual Machine Image" title="Direct link to Specifying a Virtual Machine Image" translate="no">​</a></h2>
<p>After specifying the trigger, Azure Pipelines needs to know what type of infrastructure to run the build on. At the time of writing, 5.2 is the latest stable version of Swift. Swift is not currently available in APT, Ubuntu's package manager. The binaries from the Swift download page target a specific LTS version of Ubuntu. The most recent version listed is 18.04, even though 20.04 released in April. Because of these specific requirements, I opted to target a specific version of Ubuntu in my YAML instead of <code>ubuntu-latest</code>. <code>ubuntu-latest</code> will be updated to 20.04 at some point, but this is outside my control.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">pool</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">vmImage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ubuntu-18.04'</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-swift-programmatically">Installing Swift Programmatically<a href="https://your-docusaurus-site.example.com/blog/continuous-integration-for-swift-packges-on-azure-devops#installing-swift-programmatically" class="hash-link" aria-label="Direct link to Installing Swift Programmatically" title="Direct link to Installing Swift Programmatically" translate="no">​</a></h2>
<p>With a product like Azure Pipelines that utilizes transient virtual machines, the customer pays for the server time. In short, the longer your builds take, the more expensive they are. Because of this and performance reasons, it doesn't make sense to compile Swift from source each time the build runs (i.e., when a developer commits). The best practice is to fetch dependencies via the distro's package manager for easier versioning and simple installation. With that not being an option for Swift on Ubuntu, the next best option is to fetch the binaries.</p>
<p>Azure Pipelines supports steps, which are logical sections of the build for human readability and organization. At a high level, the process is to:</p>
<ul>
<li class="">Install dependencies for running Swift that aren't shipped with Ubuntu</li>
<li class="">Make a working directory</li>
<li class="">Fetch the Swift binaries</li>
<li class="">Unzip the binaries</li>
<li class="">Add the binaries to the <code>PATH</code> so that <code>swift</code> can be used as a shell command</li>
<li class="">Echo the version to ensure that it's working properly</li>
</ul>
<p>In the pipeline script, the steps above are written as Bash commands and wrapped in a <code>script</code> YAML statement.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      sudo apt-get install clang libicu-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      mkdir swift-install</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      cd swift-install</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      wget https://swift.org/builds/swift-5.2.4-release/ubuntu1804/swift-5.2.4-RELEASE/swift-5.2.4-RELEASE-ubuntu18.04.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      tar -xvzf swift-5.2.4-RELEASE*</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      export PATH=$PATH:$(pwd)/swift-5.2.4-RELEASE-ubuntu18.04</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      swift -version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Install Swift'</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="additional-steps">Additional Steps<a href="https://your-docusaurus-site.example.com/blog/continuous-integration-for-swift-packges-on-azure-devops#additional-steps" class="hash-link" aria-label="Direct link to Additional Steps" title="Direct link to Additional Steps" translate="no">​</a></h2>
<p>With Swift successfully installed, the remainder of the build steps is scripted in additional <code>steps</code>. This commonly entails compiling, running unit tests, and static code analysis. For the sake of a simple executable package, this could be merely running <code>swift test</code> like below. Putting it all together, this YAML script is a solid base for many Swift package CI jobs.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">include</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'*'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">pool</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">vmImage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ubuntu-18.04'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      sudo apt-get install clang libicu-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      mkdir swift-install</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      cd swift-install</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      wget https://swift.org/builds/swift-5.2.4-release/ubuntu1804/swift-5.2.4-RELEASE/swift-5.2.4-RELEASE-ubuntu18.04.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      tar -xvzf swift-5.2.4-RELEASE*</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      export PATH=$PATH:$(pwd)/swift-5.2.4-RELEASE-ubuntu18.04</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      swift -version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Install Swift'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      swift test</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Run unit tests'</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Programming</category>
        </item>
    </channel>
</rss>