I’m trying to create a responsive design where a sections section is always flush to the bottom edge of an image.
The section is a grid divided into three grid-areas:
“section1 section3”
“section2 section3"
I want the bottom of section1 to always align with the bottom of a responsive 3/2 image.
The closest I’ve been able to get to achieve what I’m looking for is by applying padding-bottom: min(50px, 3.5vw);
img{
object-fit: contain;
/* aspect-ratio: 3/2;*/
width: 100%;
padding-bottom: min(50px, 3.5vw);
}
div section{
position: absolute;
bottom: 0;
}
What I’m looking for is something like calc(heightOfTheContainer + XXpx)
I know I can do this in JavaScript document.getElementById("myImg").offsetHeight + XXpx;
Can I achieve what I want with just CSS using calc() minmax() or ??.
main{
height:100%;
width: 100%;
padding: 3.5vh;
}
div{
position: relative;
max-width: 800px;
margin: 0 auto;
}
img{
object-fit: contain;
/* aspect-ratio: 3/2;*/
width: 100%;
padding-bottom: min(50px, 3.5vw);
}
div section{
position: absolute;
display: grid;
grid-template-columns: 30% 70%;
grid-template-rows: 50% 50%;
grid-template-areas:
"section1 section3"
"section2 section3";
bottom: 0;
height:8vw;
width:100%;
}
.section1, .section2, .section3{
width:100%;
height:100%;
font-size: 20px;
font-weight:bold;
color:black;
}
.section1{
grid-area: section1;
background-color: red;
}
.section2{
grid-area: section2;
background-color: blue;
}
.section3{
grid-area: section3;
background-color: green;
opacity: .5;
}
<main>
<div>
<img src="../../images/portfolio/mainbnw.jpg" />
<section>
<div class="section1">
section 1
</div>
<div class="section2">
section 2
</div>
<div class="section3">
section 3
</div>
</section>
</div>
</main>
If you remove any bottom padding from the main and position the grid element relative rather than absolute it will end up immediately below the image.
So then translate it upwards by 50% of its height and the bottom of the first cell will always be aligned with the bottom of the image (whatever height you give the cell).
main {
height: 100%;
width: 100%;
padding: 3.5vh;
}
div {
position: relative;
max-width: 800px;
margin: 0 auto;
}
img {
object-fit: contain;
/* aspect-ratio: 3/2;*/
width: 100%;
}
div section {
position: relative;
transform: translateY(-50%);
display: grid;
grid-template-columns: 30% 70%;
grid-template-rows: 50% 50%;
grid-template-areas: "section1 section3" "section2 section3";
bottom: 0;
height: 8vw;
width: 100%;
}
.section1,
.section2,
.section3 {
width: 100%;
height: 100%;
font-size: 20px;
font-weight: bold;
color: black;
}
.section1 {
grid-area: section1;
background-color: red;
}
.section2 {
grid-area: section2;
background-color: blue;
}
.section3 {
grid-area: section3;
background-color: green;
opacity: .5;
}
<main>
<div>
<img src="https://picsum.photos/id/1015/600/400" />
<section>
<div class="section1">
section 1
</div>
<div class="section2">
section 2
</div>
<div class="section3">
section 3
</div>
</section>
</div>
</main>
If you use grid, you can a set few elements inside the same cell without the need of absolute.
here is an example made of 3 rows to show the idea:
img {
object-fit: contain;
aspect-ratio: 3/2;
}
.section1,
.section2,
.section3 {
font-size: 20px;
font-weight: bold;
color: black;
}
section {
display: grid;
grid-template-columns: 30% 70%;
grid-template-rows: 8fr auto auto;
grid-template-areas: "img img" "sec1 sec3" " sec2 sec3"
}
img {
grid-column: 1/3;
grid-row: 1/3;
width: 100%;
}
.section1 {
grid-area: sec1;
background-color: red;
}
.section2 {
grid-area: sec2;
background-color: blue;
}
.section3 {
grid-area: sec3;
background-color: rgba(0,128,0,0.5);
}
<section>
<img src="https://picsum.photos/id/1015/300/200" />
<div class="section1">
section 1
</div>
<div class="section2">
section 2
</div>
<div class="section3">
section 3
</div>
</section>
Related
I need to build a card with two scrolling areas. Initial idea was to use flexbox so I came up with this:
.card {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 50%;
min-width: 100px;
min-height: 0;
max-width: 80%;
max-height: 80%;
border: solid 1px black;
padding: 10px;
}
.photo {
background-color: silver;
margin-bottom: 10px;
aspect-ratio: 3;
}
.body {
display: flex;
}
.content {
flex: 1;
display: flex;
flex-direction: column;
margin-right: 10px;
}
.title {
background-color: silver;
margin-bottom: 10px;
}
.text {
flex: 1;
background-color: cyan;
min-height: 0;
overflow: auto;
}
.photos {
width: 100px;
min-height: 0;
overflow: auto;
}
.photos * ~ * {
margin-top: 10px;
}
.thumbnail {
background-color: lightgreen;
aspect-ratio: 3;
}
<div class="card">
<div class="photo">Photo</div>
<div class="body">
<div class="content">
<div class="title">Title</div>
<div class="text" contenteditable>
Full text<br>
Can be multiline and with vertical scroll
</div>
</div>
<div class="photos">
<div class="thumbnail">Thumbnail</div>
<div class="thumbnail">Thumbnail</div>
<div class="thumbnail">Thumbnail</div>
<div class="thumbnail">Thumbnail</div>
</div>
</div>
</div>
link to fiddle: https://jsfiddle.net/SkyLight/jxobz8qn/
The card has maximum width and height and Full text section (cyan one) can have pretty long content so that it should have scroll when needed. Thumbnails section can also have big amount of items so will also need to have scroll.
I know that overflow needs block to have height set in order to work but I can't figure out how to set it properly because the content should be limited mainly by Card's max size.
So can it be achieved with flexbox only or I'll need some other stuff? Would like to achieve the result with pure css.
Make the card element a flexbox container then use flex:1 on the body:
.card {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 50%;
min-width: 100px;
min-height: 0;
max-width: 80%;
max-height: 80%;
border: solid 1px black;
padding: 10px;
/* added */
display: flex;
flex-direction: column;
/**/
}
.photo {
background-color: silver;
margin-bottom: 10px;
aspect-ratio: 3;
}
.body {
display: flex;
flex:1; /* added */
min-height:0; /* added to make sure the content will shrink */
}
.content {
flex: 1;
display: flex;
flex-direction: column;
margin-right: 10px;
}
.title {
background-color: silver;
margin-bottom: 10px;
}
.text {
flex: 1;
background-color: cyan;
min-height: 0;
overflow: auto;
}
.photos {
width: 100px;
min-height: 0;
overflow: auto;
}
.photos * ~ * {
margin-top: 10px;
}
.thumbnail {
background-color: lightgreen;
aspect-ratio: 3;
}
<div class="card">
<div class="photo">Photo</div>
<div class="body">
<div class="content">
<div class="title">Title</div>
<div class="text" contenteditable>
Full text<br>
Can be multiline and with vertical scroll
</div>
</div>
<div class="photos">
<div class="thumbnail">Thumbnail</div>
<div class="thumbnail">Thumbnail</div>
<div class="thumbnail">Thumbnail</div>
<div class="thumbnail">Thumbnail</div>
</div>
</div>
</div>
My question is similar to this one: I'm trying to contain an aspect-ratio element within its parent element. One difference though, this aspect-ratio element has siblings—a header and a footer—and all this nice family should be center-aligned and share a common width.
Images are worth a thousand words:
GIFs are worth a thousand images:
I'm close to that result, but I'm not quite there yet:
body {
height: 100%;
margin: 0;
}
html {
background-color: lightgrey;
height: 100%;
}
#footer,
#header {
background-color: blue;
height: 50px;
}
#paper {
aspect-ratio: 1;
background-color: red;
margin: auto;
max-height: 100%;
overflow: hidden;
width: 100%;
}
#wrapper {
align-content: center;
display: grid;
height: 100%;
}
<div id="wrapper">
<div id="header"></div>
<div id="paper"></div>
<div id="footer"></div>
</div>
Any CSS wizard to help me out?
Not sure if you can get all the requirements but here is the best I could do (seems to work on chrome only)
body {
background-color: lightgrey;
margin: 0;
}
#footer,
#header {
background-color: blue;
height: 50px;
}
#paper {
aspect-ratio: 1;
background-color: red;
max-height: 100%;
max-width: 100vw;
}
#wrapper {
place-content: center;
display: grid;
height: 100vmin;
margin-block: max(0px,50vh - 50vmin);
grid-template-rows: auto minmax(0, 1fr) auto;
}
<div id="wrapper">
<div id="header"></div>
<div id="paper"></div>
<div id="footer"></div>
</div>
If the 50px is known you can do like below:
body {
background-color: lightgrey;
margin: 0;
--h: 50px; /* the fixed height */
}
#footer,
#header {
background-color: blue;
height: var(--h);
}
#paper {
aspect-ratio: 1;
background-color: red;
width: min(100vw,100vh - 2*var(--h));
}
#wrapper {
place-content: center;
display: grid;
height: min(100vh, 100vw + 2*var(--h));
margin-block: max(0px, (100vh - 100vw - 2*var(--h))/2);
grid-template-rows: auto minmax(0, 1fr) auto;
}
<div id="wrapper">
<div id="header"></div>
<div id="paper"></div>
<div id="footer"></div>
</div>
Try this solution, all the magic happens in grid-template-columns and grid-template-rows.
html {
background-color: lightgrey;
height: 100%;
}
body {
height: 100%;
margin: 0;
}
#wrapper {
--footer-header-height: 50px;
align-content: center;
display: grid;
height: 100vh;
grid-template-columns: 1fr minmax(auto, calc(100vh - var(--footer-header-height) * 2)) 1fr;
grid-template-rows: auto minmax(auto, 100vw) auto;
}
#footer,
#header {
grid-column: 2;
background-color: blue;
height: var(--footer-header-height);
}
#paper {
grid-column: 2;
aspect-ratio: 1 / 1;
background-color: red;
}
<div id="wrapper">
<div id="header"></div>
<div id="paper"></div>
<div id="footer"></div>
</div>
Actually Container Queries enable us to solve this kind of problems elegantly.
Support for this feature is currently very bad (see here), but it's part of Interop 2022 so I guess it'll look different by the end of the year.
I post this as an answer as it might help someone in the future 👽👋
Note that you currently need to turn on a flag on Chrome to be able to test it.
body {
container-type: size;
height: 100%;
margin: 0;
}
html {
background-color: lightgrey;
height: 100%;
}
#footer,
#header {
background-color: blue;
}
#paper {
background-color: red;
}
#wrapper {
align-content: center;
display: grid;
grid-template-columns: min(100cqi, (100cqb - 100px));
grid-template-rows: 50px min(100cqb - 100px, 100cqi) 50px;
justify-content: center;
}
<div id="wrapper">
<div id="header"></div>
<div id="paper"></div>
<div id="footer"></div>
</div>
Here's the same code but relying on viewport units (works in all browsers):
body {
height: 100%;
margin: 0;
}
html {
background-color: lightgrey;
height: 100%;
}
#footer,
#header {
background-color: blue;
}
#paper {
background-color: red;
}
#wrapper {
align-content: center;
display: grid;
grid-template-columns: min(100vw, (100vh - 100px));
grid-template-rows: 50px min(100vh - 100px, 100vw) 50px;
height: 100%;
justify-content: center;
}
<div id="wrapper">
<div id="header"></div>
<div id="paper"></div>
<div id="footer"></div>
</div>
I have 8 items in my grid; items 1 and 8 are the header and footer respectively, and items 2-7 are parts of the main body.
Items 2-7 are in a two-column format. The problem I am encountering is that when I expand the height of my header (item 1) the rest of the items shrink accordingly; I am stuck and would love some help. Thank you.
Here is my code:
html,
body {
max-width: 100%;
margin: 0 auto;
background-color: white;
overflow-x: hidden;
padding: 0px;
height: 100%;
}
.container {
width: 100vw;
height: 100vh;
display: grid;
grid-template-columns: 40% 60%;
grid-template-rows: 50% 50%;
justify-items: stretch;
}
.item1 {
grid-column-start: span 2;
background-color: blue;
}
.item2 {
background-color: pink;
}
.item3 {
background-color: yellow;
}
.item4 {
background-color: orange;
}
.item5 {
background-color: black;
}
.item6 {
background-color: purple;
}
.item7 {
background-color: brown;
}
.item8 {
background-color: green;
grid-column-start: span 2;
}
<div class="container">
<div class="item1">A</div>
<div class="item2">B</div>
<div class="item3">C</div>
<div class="item4">D</div>
<div class="item5">E</div>
<div class="item6">F</div>
<div class="item7">G</div>
<div class="item8">H</div>
</div>
removed the html tag, updated the styling to the body and .container
body {
max-width: 100vw;
margin: 0px;
background-color: white;
padding: 0px;
}
.container {
width: 100%;
height: 100vh;
display: grid;
grid-template-columns: 40% 60%;
grid-template-rows: 81% 50% 30% auto 30%;
justify-items: stretch;
}
The original code only defined the first 2 rows' height, I put in some random values for the other rows. auto also works to define row height
So... How I do something like this with CSS only? Watch red element, it scales not scrolls:
Currently it works via JS, I catch onscroll and update size of the element according to calculated free space.
This is how it works now:
https://codepen.io/bswan-the-decoder/pen/OJPVxZj
<div class="header">
Header
</div>
<div class="header-spacer">
</div>
<div class="content">
<div class="sidebar">
</div>
<div class="page">
</div>
</div>
<div class="footer">
Footer
</div>
body {
background-color: black;
}
.header {
position: fixed;
width: 100%;
top: 0px;
left: 0px;
min-height: 80px;
background-color: #FFF;
z-index: 500;
}
.footer {
min-height: 50px;
bottom: 0px;
background-color: #FFF;
left: 0px;
}
.page {
min-height: 1000px;
width: 50%;
margin: 15px;
margin-left: auto;
margin-right: auto;
background-color: #AAA;
}
.sidebar {
position: fixed;
background-color: #F66;
left: 10px;
top: 105px;
width: 100px;
height: 200px;
}
let header = document.querySelector('.header');
let footer = document.querySelector('.footer');
let sidebar = document.querySelector('.sidebar');
let header_spacer = document.querySelector('.header-spacer');
header_spacer.style.height = header.clientHeight+'px';
document.addEventListener('scroll',(event)=>{
let height = window.innerHeight - header.clientHeight - 35;
let scroll = this.scrollY;
if(scroll+window.innerHeight+footer.clientHeight>=document.body.clientHeight)
{
height = (height - (
(scroll+window.innerHeight+footer.clientHeight)
- document.body.clientHeight));
}
sidebar.style.height = height+'px';
});
This my new layout:
https://codepen.io/bswan-the-decoder/pen/wvBapvV
<body>
<div class="header">
</div>
<div class="content">
<div class="sidebar_holder">
<div class="sidebar"></div>
</div>
<div class="page_holder">
<div class="page"></div>
</div>
</div>
<div class="footer">
</div>
</body>
body{
display: grid;
grid-template-rows: min-content auto min-content;
grid-template-columns: auto;
grid-template-areas: "header" "content" "footer";
background-color: #000;
min-height: 100vh;
}
.header{
grid-area: header;
background-color: #FFF;
min-height: 80px;
position: sticky;
top: 0px;
z-index: 5;
}
.footer{
grid-area: footer;
background-color: #FFF;
min-height: 40px;
}
.content{
grid-area: content;
display: grid;
grid-template-rows: auto;
grid-template-columns: min-content auto;
grid-template-areas: "sidebar page";
}
.sidebar_holder {
grid-area: sidebar;
}
.page_holder {
grid-area: page;
}
.sidebar {
width: 100px;
position: sticky;
top: 105px; /*how to make it (header height+20px) ?*/
height: 100px; /*How to make it (100vh - header height - visible height of footer)?*/
background-color: #F66;
}
.page {
height: 1000px;
width: 50%;
background-color: #AAA;
margin: 25px;
margin-left:auto;
margin-right:auto;
}
Update:
#Roddy - I tried but my knowledge is lacking so there was nothing of use pruduced by me.
To fill out the whole space with a div, you can use ViewHeight and ViewWidth units like:
vw and vh takes the percentage of the screensize and applies it,
100vw means 100% of the width
.whole-area {
height: 100vh;
width: 100vw;
background: orange;
}
<div class="whole-area">
<span>Text</span>
</div>
wrote a jsbin here
https://jsbin.com/famuyodeye/2/edit?html,output
<style>
.grid-container {
display: grid;
grid:100%/1fr 1fr;
grid-gap: 10px;
margin: 10px;
}
.grid-item {
overflow: hidden;
width: 100%;
}
img{
width: 100%;
height: 100%;
object-fit: cover;
}
</style>
<div class="grid-container" style="height:400px;">
<div class="grid-item">
<img src="./a.jpg">
</div>
<div class="grid-item">
<img src="./b.jpg">
</div>
</div>
suppose i placed a simple 2 columns grid and placed 2 images into it
i want to add a mouse hover interactive, when mouse over the gap area, there is a divider button displayed, and later i can add some drag function to resize the grid width.
i maybe can achieve that by a lot of JS, but is there a smart way, i mean better use less js, only with css to make that happen?
yes, you can do it with just css, also Take look at this working codebox:- code for drag bar to show on hover
Edited code: Edited code
<style>
.grid-container {
color: white;
display: grid;
grid:100%/1fr 1fr;
/* grid-gap: 10px; */
margin: 10px;
/* position: relative; */
}
.grid-item {
position: relative;
color: white;
overflow: hidden;
width: calc(100% + 10px);
/* margin-right: 10px; */
/* padding-right: 10px; */
}
.drag-bar{
/* width: 200px; */
position: absolute;
left: 0;
top:50%;
width: 20px;
height: 50px;
z-index: 9999999;
visibility: hidden;
}
.hover-bar{
color: blue;
position: absolute;
right:0;
top:0%;
z-index: 9999999;
height: 400px;
width:8px;
border: 1px solid blue;
}
.hover-bar:hover > .drag-bar{
opacity: 1;
visibility: visible;
border: 2px solid blue;
}
img{
width: calc(100% - 20px);
height: 100%;
object-fit: cover;
}
</style>
<div class="grid-container" style="height:400px;">
<div class="grid-item">
<img src="data:image/png;base64,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">
<div class="hover-bar"><div class="drag-bar" ><img style="width:100%;" src="data:image/jpeg;base64,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"></div></div>
</div>
<div class="grid-item">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAD8CAMAAAAFbRsXAAAA1VBMVEX////29vba2to6Rk1tbW3hNjre3t49PT3CwsJISEj7+/sxPkaLkZQgMTrv8PDV1dUiLjUAFiDGycpmZmZCTlWysrJXV1eTmJuMjIxOTk7p6elCQkKFhYU2NjYqOUG6vb99fX2nqqxfX1+dnZ3dKzDgJCngHCKioqIvLy91dXXXzs7fFBvz3d0jIyPkVlnvvL3tq6zlYmXmcnXphYcSIirXsrProaPXrK3rmpwMHyjXvLztsLHqj5FeZ2wACBcZKzTYiYpSXGLaYWPrxsfXxMTmb3Lof4CgCQsIAAAJyElEQVR4nO3da3ejuB0GcIRtDHJiMjgQcwm+xXXcmd3Z3Um7zbaZ6bTd/f4fqcI2WFwMEpIs5ayeF3NyEuzoNyDxRyjYMHR0dHR0dHR0dHR0dHR0rhDgbfbrMAxniW/KbgtDvL0Tx2EYBEHoxE64m8puUL+469gJZsNTZusgjjdAdqPoA5NxuB6WE8ShLbtdtIkCp8o4UMYb2S2jixWHDYzsCIsT2W2jSTQOmh3vTALDiw6UeCW7fcRZtjmGw7Elu4GE8eJWBxqJZbeQMOeTx7HdKGVJuJDdRKLYpQFrNtz4i1WyLllC2W0kSvm/3wYQBUQb/LQSuLIbSZApvkOWEQTHwAUmmb2HIXiB75HMAaGRaQwf+0Egu5UEmZ/bO7OR4PjdDLTEIO9gBMb2x94ARbkLAfRwoswmkuXcFWYr1Pri++jown70DgZgrLXoyDp/H329x4zyGkgaDOJdhuzkNZAwgGyPqA+xMMiu3Eem2JlkLrGJZLHx0wgsjVr4j9SvG/eYo3IeKf3Ik9vMzrjlivFQoWS1FgLtykWY7Ja2B1YuqfaWcSq1oF92BEp3dzCrTZ34EdohBnCTyjXJ0PFlt/ZyvKA+dzLbz3erh2WVgRInas48RvYwbr5Wr10hnr7thA9q1Y4gsrzdPhiHje1tSeA4s7lnRbD7d3BMZLkLf7PbJXl28+zf5X64Dpxx7ARNM4sdmQWhM84miJfJfFfOxl7YphXxniye7mboV8ZZnDzFV2EYrGl3xtmyDsLw8Hb1ION6yfWE44XHuwPrWupTJL00s1n9rYPsdgT671v2PfKmJh7XdU07Dji0tqdx7ewPjcBDMkaAh/v0Nj3n28vLqyONcUhw9/Lycos16nby1nnARd/TQSmTNJ1IZWQS1PhKq24fOiDfJ/jmKHd3d6lsyDprRDrBmza4bb9YXqU4Y3+zWt2gIVY2ZI8GelQe3JSOlrR1DLjHNryxgAEN1/NsuV1kOExQG6aoYpva9+e9krbtEvAN2+4wRwhd25YOWXq2HR1aM30rJJObFsj0tnD4x/pbLQiA4DsdZPKWX0eoBUHtuaWCpB5UEwKM71SQWwAUhcDVhAZybygLWaQaoiEaIgACTNte9LiI5Zo9gkxZIQDtkQsLZK6VdeLZJmCGTD1vSD0/wjGzdezbFmCHAGDZa3TJLitOPHenkAsEHV3zw0IMKVmuPPfsYIV4MoMdWIyQyJYaD/CCAMuT6HABPwjaKdIyBVwhykRDVIuGqBYNUS0aolo0RLX86SFTZcIGMQJpV4aVrH3IBHl2FMmYEeIEiiRkgyjUR6ZsnV25aIhq0RDVoiGqRUNUS1+IeYXkk7sQnG4fRG7DVhETxPhhLDzPpyoKfPn98/Gr6fqxvtVK9ep3bJ9+14/bp48nCRjGtc0Yq99lIjqF42k0GhWSeXWzpc1W/bZszCkQc5wl9XV++XIlxUetkwPbJxeiOKRwdErUhmCOLonSkJKjQ6IypOJolygMqTlaJepCGhxtEmUhjY4WSe+FZ2LS5UCS/8Ly72eDGMlcRJZWl2P09GM2kQV3+UsSthJFTNFY1LuXHaOn/1hIYuzz6pG1aHxu+Bsu1jzm6+5bHKPRX01zCozib8ge2cp46AqISeSw0MXUFPv9bBdWQjo7IHVkEk6dXVyIHNnRVX2dYpBWx1PhqEsUgxA7ahK1IBSOqkQpCJWjIlEJAn+mcpQlCkGoHSWJOpAeDlzCeTqo1LKWNzwHUjisegDjdNCFKdNHbG00nD8TzIv+kJdKJA77sR7WKdPHpmX3ToRf9RgP486V+kWdSOZoqjQZIXHTzfuTIz9ejE3Yebef3GF6Y6fhvyLesPWRy1Uf/DT6+MW4vFHTS8j6eUMXyXLs8dxHLfhpOxpt/6AZ3XqNV9Wxizfk4KCTMDsOEs6Qk4NGAn/etjj+R+LIJHwhhYNcwsWRXWnxhGAOUgknh2kCjpCSg0wCf+fkMC2fG6TiIJHwc5jWihek5kCSLx1dip+jN6Q++fGpYRDFJLUXkDkunARLJ0QWCPQXeY5Tlo0OTGKdX+BHFA5v1xXbYoGcZxofdwdIs+MsgUn+iucdpHCM60sEKgsGNrwgx8dZXGxULjHm41O1apA7UN3euT6CDQJXfp7sQIGf/3KxUcU+OW5uk+8P09oQZMEEqd6f+PTxcrO25Vr4+PUvBA6irs7Y2WsD6WcCCbY5meMaw29N8s82yb8M0Q5+J0QKiQgHzzM7qUSIgyOEVNLu+K2ngyeETCLIwRVCIhHl4AvplED4hyBHb0h9m5Pk8il+tP3lp9Z5ht9I612OJ0QjrD6Ycw+6JU9bAocXdk3rlef4GIvGx+rN/phE0pLCcXrGK/HNeUZIfVrXYZLk/cNzagti2zNmgzT9jVXxXKWf6CVFP++zzkDAqNVXwjReiYNQSzg4xEAoJTwcgiBUEi4OURAKCR+HMAixhJNDHIRQ8vQ3Pg6BECIJNwePKdPLtwb/3iXJHdSFYq1m7D2v1XG2BUSSk8NyF/2fsrXwmCD1orFcQS5JJIUjpKsTuRaNHctlxwSS3OE5nfOiLWGFLDuWIid+Vz8p+keyXzJk77NVvy0bH1MslrkgOY9XLD2d+QqRIs0SfuMu4/DLKOHuuAakQcLfcRVITSLAcR1IRSLCcSUIgP84S55+FeC4FgSTiHFcDVJIBDnEnRCxQEySO1jPgrxOiFR/Y7Up9sl2++upTmSpSsphK1Go/sZqnJz2yed/n+ZF3YChTORbNFI9KuE5r4Wj42HgOc8NK3j7hXHBAOXDK9x86fdRwvVxx2wXVr0T8e7qjJe6rBL+uTpElOT6EEESCRAxEhkQIRIpEBESORABEkkQyF3SF8L8HP4+tz0F3AytLxigDs2qgLYFA7vrVb8XEitR/fJ4TC6XncK4R/g8lNXi10VkjVr5kCF/1FJOIhnCTyIbwk0iHcJLIh/CSaIAhI9EBQgXiRIQHhI1IBwklJCBqGc+MEto94ggB7vEovtc3UHU3SQ5EmtHB3Frj1HiFrYbQNYD3Scd2/UHQqkhcW8oIZ6p5tHl0x1aqet7aDfy+BjApvR3LBZ0h1bq277d9IhtufF836T7WPPBm7XwfYYFb0Li+76bP2CAFJLuLNtXLgvXvB/QQQbpynJlflJoQzzXct8mtJBBmnhcb51xiLm6LxzkkMFk8nbzoFBulvcp3jxiSEZRK+XGtUGib4N3k0nSAgEfZDePPK0Q427S/Q6K5HXRBll9fS+S9Gv7s+8Gr2n3m8jP5O5r6w5BvST98HKnfL69ft20O1Bu7l4/qJ6Xe7fTgWJK/Vh5kkQkDB0dHR0dHR0dHR0dHZ0/Z/4P0fNxuRItTJ0AAAAASUVORK5CYII=">
</div>
</div>