Unverified Commit 2cc30af9 authored by Isis Lovecruft's avatar Isis Lovecruft
Browse files

Merge branch 'master' into develop

parents e059d918 b9a0ad5a
......@@ -132,20 +132,28 @@ def getClientIP(request, useForwardedHeader=False):
return ip
def replaceErrorPage(error, template_name=None):
def replaceErrorPage(request, error, template_name=None, html=True):
"""Create a general error page for displaying in place of tracebacks.
Log the error to BridgeDB's logger, and then display a very plain "Sorry!
Something went wrong!" page to the client.
:type request: :api:`twisted.web.http.Request`
:param request: A ``Request`` object containing the HTTP method, full
URI, and any URL/POST arguments and headers present.
:type error: :exc:`Exception`
:param error: Any exeption which has occurred while attempting to retrieve
a template, render a page, or retrieve a resource.
a template, render a page, or retrieve a resource.
:param str template_name: A string describing which template/page/resource
was being used when the exception occurred,
i.e. ``'index.html'``.
:returns: A string containing HTML to serve to the client (rather than
serving a traceback).
was being used when the exception occurred, i.e. ``'index.html'``.
:param bool html: If ``True``, return one of two HTML error pages. First,
we attempt to render a fancier error page. If that rendering failed,
or if **html** is ``False``, then we return a very simple HTML page
(without CSS, Javascript, images, etc.) which simply says
``"Sorry! Something went wrong with your request."``
:rtype: str
:returns: A string containing some content to serve to the client (rather
than serving a Twisted traceback).
"""
logging.error("Error while attempting to render %s: %s"
% (template_name or 'template',
......@@ -164,16 +172,16 @@ def replaceErrorPage(error, template_name=None):
# "Tor"
# "Tor Browser"
#
errmsg = _("Sorry! Something went wrong with your request.")
rendered = """<html>
<head>
<link href="/assets/bootstrap.min.css" rel="stylesheet">
<link href="/assets/custom.css" rel="stylesheet">
</head>
<body>
<p>{0}</p>
</body>
</html>""".format(errmsg)
errorMessage = _("Sorry! Something went wrong with your request.")
if not html:
return bytes(errorMessage)
try:
rendered = resource500.render(request)
except Exception as err:
logging.exception(err)
rendered = bytes(errorMessage)
return rendered
......@@ -299,7 +307,49 @@ class CSPResource(resource.Resource):
return redirectTo(request.uri, request)
class TranslatedTemplateResource(CSPResource):
class ErrorResource(CSPResource):
"""A resource which explains that BridgeDB is undergoing maintenance, or
that some other (unexpected) error has occured.
"""
isLeaf = True
def __init__(self, template=None, code=200):
"""Create a :api:`twisted.web.resource.Resource` for an error page."""
CSPResource.__init__(self)
self.template = template
self.code = code
def render_GET(self, request):
self.setCSPHeader(request)
request.setHeader("Content-Type", "text/html; charset=utf-8")
request.setResponseCode(self.code)
try:
template = lookup.get_template(self.template)
rendered = template.render()
except Exception as err:
rendered = replaceErrorPage(request, err, html=False)
return rendered
render_POST = render_GET
resource404 = ErrorResource('error-404.html', code=404)
resource500 = ErrorResource('error-500.html', code=500)
maintenance = ErrorResource('error-503.html', code=503)
class CustomErrorHandlingResource(resource.Resource):
"""A :api:`twisted.web.resource.Resource` which wraps the
:api:`twisted.web.resource.Resource.getChild` method in order to use
custom error handling pages.
"""
def getChild(self, path, request):
logging.debug("[404] %s" % request.uri)
return resource404
class TranslatedTemplateResource(CustomErrorHandlingResource, CSPResource):
"""A generalised resource which uses gettext translations and Mako
templates.
"""
......@@ -322,7 +372,7 @@ class TranslatedTemplateResource(CSPResource):
template = lookup.get_template(self.template)
rendered = template.render(strings, rtl=rtl, lang=langs[0])
except Exception as err: # pragma: no cover
rendered = replaceErrorPage(err)
rendered = replaceErrorPage(request, err)
request.setHeader("Content-Type", "text/html; charset=utf-8")
return rendered
......@@ -354,7 +404,7 @@ class HowtoResource(TranslatedTemplateResource):
TranslatedTemplateResource.__init__(self, 'howto.html')
class CaptchaProtectedResource(CSPResource):
class CaptchaProtectedResource(CustomErrorHandlingResource, CSPResource):
"""A general resource protected by some form of CAPTCHA."""
isLeaf = True
......@@ -447,7 +497,7 @@ class CaptchaProtectedResource(CSPResource):
imgstr=imgstr,
challenge_field=challenge)
except Exception as err:
rendered = replaceErrorPage(err, 'captcha.html')
rendered = replaceErrorPage(request, err, 'captcha.html')
request.setHeader("Content-Type", "text/html; charset=utf-8")
return rendered
......@@ -476,7 +526,7 @@ class CaptchaProtectedResource(CSPResource):
try:
rendered = self.resource.render(request)
except Exception as err:
rendered = replaceErrorPage(err)
rendered = replaceErrorPage(request, err)
return rendered
logging.debug("Client failed a CAPTCHA; returning redirect to %s"
......@@ -638,7 +688,7 @@ class ReCaptchaProtectedResource(CaptchaProtectedResource):
try:
rendered = self.resource.render(request)
except Exception as err: # pragma: no cover
rendered = replaceErrorPage(err)
rendered = replaceErrorPage(request, err)
else:
logging.info("Client failed a CAPTCHA; redirecting to %s"
% request.uri)
......@@ -780,7 +830,7 @@ class ReCaptchaProtectedResource(CaptchaProtectedResource):
return NOT_DONE_YET
class BridgesResource(CSPResource):
class BridgesResource(CustomErrorHandlingResource, CSPResource):
"""This resource displays bridge lines in response to a request."""
isLeaf = True
......@@ -930,7 +980,7 @@ class BridgesResource(CSPResource):
try:
rendered = bytes('\n'.join(bridgeLines))
except Exception as err:
rendered = replaceErrorPage(err)
rendered = replaceErrorPage(request, err, html=False)
else:
request.setHeader("Content-Type", "text/html; charset=utf-8")
qrcode = None
......@@ -948,7 +998,7 @@ class BridgesResource(CSPResource):
answer=bridgeLines,
qrcode=qrcode)
except Exception as err:
rendered = replaceErrorPage(err)
rendered = replaceErrorPage(request, err)
return rendered
......@@ -1008,13 +1058,15 @@ def addWebServer(config, distributor):
reportViolations=config.CSP_REPORT_ONLY,
useForwardedHeader=fwdHeaders)
root = resource.Resource()
root = CustomErrorHandlingResource()
root.putChild('', index)
root.putChild('robots.txt', robots)
root.putChild('keys', keys)
root.putChild('assets', assets)
root.putChild('options', options)
root.putChild('howto', howto)
root.putChild('maintenance', maintenance)
root.putChild('error', resource500)
root.putChild(CSPResource.reportURI, csp)
if config.RECAPTCHA_ENABLED:
......
.application,
.application>.error,
.application>.error>.main {
/*min-height: 100vh*/
}
.error,
.maintenance {
height: 100%;
overflow: hidden
}
.error .full-size,
.maintenance .full-size {
position: absolute;
top: 0;
height: 100%;
width: 100%;
overflow: hidden;
background-repeat: no-repeat
}
.main--error {
min-height: 100%;
overflow: hidden
}
.error-text,
.maintenance-text {
position: absolute;
top: 6%;
left: 0;
right: 0;
z-index: 10
}
.error-text h1,
.maintenance-text h1 {
margin: 1em 0 .4em;
font-weight: 600;
/*color: #357389;*/
font-size: 40px;
line-height: 1;
text-align: center
}
@media only screen and (min-width: 50.063em) {
.error-text h1,
.maintenance-text h1 {
margin: 1.5em 0 .4em;
font-size: 70px
}
}
.error-text p,
.maintenance-text p {
padding: 0 1em;
/*color: #9d9fa1;*/
font-size: 18px;
text-align: center
}
.error-text a,
.maintenance-text a {
/*color: #9d9fa1*/
}
.error-text a:focus,
.error-text a:hover,
.maintenance-text a:focus,
.maintenance-text a:hover {
/*color: #9d9fa1;*/
/*text-decoration: underline*/
}
.error500 .error-bg {
background: -webkit-linear-gradient(90deg, #dcc682, #dcc682 38.9%, #ccebf7 39%, #fff 60%, #fff);
background: linear-gradient(0deg, #dcc682, #dcc682 38.9%, #ccebf7 39%, #fff 60%, #fff)
}
.error500 .hill-left {
background-image: url("/assets/images/500-hills-left.svg");
background-size: auto 10vh;
background-position: 0 58%
}
@media only screen and (min-width: 50.063em) {
.error500 .hill-left {
background-size: 38vw auto;
background-position: 0 58%
}
}
.error500 .hill-right {
background-image: url("/assets/images/500-hills-right.svg");
background-size: 38vw auto;
background-position: 99% 59%;
display: none
}
@media only screen and (min-width: 50.063em) {
.error500 .hill-right {
display: block
}
}
.error500 .shadow-left {
background-image: url("/assets/images/500-hills-left-shade.svg");
background-size: 24vw auto;
background-position: 6% 72%
}
.error500 .shadow-right {
background-image: url("/assets/images/500-hills-right-shade.svg");
background-size: 17vw auto;
background-position: 95% 79%
}
.error500 .road {
background-image: url("/assets/images/500-road.svg");
background-size: auto 27vh;
background-position: 42% 78%
}
@media only screen and (min-width: 50.063em) {
.error500 .road {
background-size: auto 40vh;
background-position: 42% 91.3%
}
}
.error404 .top {
position: absolute;
top: 0;
width: 100%;
z-index: 5
}
.error404 .error-bg {
background: -webkit-linear-gradient(90deg, #bbcac6, #bbcac6 38.9%, #ccebf7 39%, #fff 60%, #fff);
background: linear-gradient(0deg, #bbcac6, #bbcac6 38.9%, #ccebf7 39%, #fff 60%, #fff)
}
.error404 .hill-left {
display: none;
background-image: url("/assets/images/404-hills-left.svg");
background-size: 30vw auto;
background-position: 0 58%
}
@media only screen and (min-width: 50.063em) {
.error404 .hill-left {
display: block
}
}
.error404 .hill-right {
background-image: url("/assets/images/404-hills-right.svg");
background-size: auto 30vw;
background-position: 99% 58%
}
@media only screen and (min-width: 50.063em) {
.error404 .hill-right {
background-size: 50vw auto;
background-position: 99% 58%
}
}
@media only screen and (min-width: 64.063em) {
.error404 .hill-right {
background-size: 50vw auto;
background-position: 99% 54%
}
}
.error404 .error-excavator {
background-image: url("/assets/images/404-excavator.svg");
background-size: auto 25vh;
background-position: 71% 83%
}
.maintenance .maintenance-bg {
background: -webkit-linear-gradient(90deg, #8cad7d, #8cad7d 38.9%, #ccebf7 39%, #fff 60%, #fff);
background: linear-gradient(0deg, #8cad7d, #8cad7d 38.9%, #ccebf7 39%, #fff 60%, #fff)
}
.maintenance .hill-left {
background-image: url("/assets/images/maintenance-hills-left.svg");
background-size: 80vw auto;
background-position: 0 58%
}
@media only screen and (min-width: 50.063em) {
.maintenance .hill-left {
background-size: 58vw auto;
background-position: 0 58%
}
}
@media only screen and (min-width: 64.063em) {
.maintenance .hill-left {
background-size: 50vw auto;
background-position: 0 56%
}
}
.maintenance .hill-right {
background-image: url("/assets/images/maintenance-hills-right.svg");
background-size: 38vw auto;
background-position: 99% 59%;
display: none
}
@media only screen and (min-width: 50.063em) {
.maintenance .hill-right {
display: block
}
}
.maintenance .shadow-left {
background-image: url("/assets/images/maintenance-hills-left-shade.svg");
background-size: 24vw auto;
background-position: 6% 72%
}
.maintenance .shadow-right {
background-image: url("/assets/images/maintenance-hills-right-shade.svg");
background-size: 17vw auto;
background-position: 95% 79%
}
.maintenance .maintenance-tractor {
background-image: url("/assets/images/maintenance-tractor.svg");
background-size: 87vw auto;
background-position: 63% 87%
}
@media only screen and (min-width: 50.063em) {
.maintenance .maintenance-tractor {
background-size: auto 44vh;
background-position: 63% 83%
}
}
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="281.52px" height="112.055px" viewBox="0 0 281.52 112.055" enable-background="new 0 0 281.52 112.055"
xml:space="preserve">
<g>
<image overflow="visible" opacity="0.1" width="1173" height="495" xlink:href="BEFA45F0C4EFA63F.png" transform="matrix(0.24 0 0 0.24 0 0)">
</image>
<g>
<polyline fill="#BBCAC6" points="275.011,102.099 245.136,64.12 231.537,64.12 185.894,6.48 106.606,6.48 83.963,41.12
56.652,41.12 6.48,102.099 6.48,112.106 275.011,112.106 275.011,102.099 "/>
</g>
</g>
<polygon fill="#B4C0BF" points="101.003,30.779 90.214,49.96 64.831,49.96 41.867,81.083 118.687,81.083 132.261,64.343
102.193,64.343 118.981,30.776 "/>
<polygon fill="#CAD8D7" points="106.605,6.48 99.325,17.594 178.144,17.594 224.897,76.345 237.25,76.345 260.021,102.099
275.011,101.977 245.136,64.12 231.537,64.12 185.894,6.48 "/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="397.299px" height="119.108px" viewBox="0 0 397.299 119.108" enable-background="new 0 0 397.299 119.108"
xml:space="preserve">
<g>
<image overflow="visible" opacity="0.1" width="1333" height="602" xlink:href="392229F0603DFEAA.png" transform="matrix(0.24 0 0 0.24 -12.6143 -12.6143)">
</image>
<g>
<g>
<polygon fill="#BBCAC6" points="294.665,109.152 228.193,40.046 209.505,40.046 177.47,0 117.4,0 0,109.152 0,119.16
294.665,119.16 "/>
<g>
<polygon fill="#CAD8D7" points="263.641,77.142 228.193,40.046 209.505,40.046 177.47,0 117.4,0 108.58,8.013 169.454,8.013
201.49,48.06 221.179,48.06 255.625,85.158 254.624,109.152 263.641,109.152 "/>
</g>
</g>
</g>
</g>
<g>
<image overflow="visible" opacity="0.1" width="867" height="309" xlink:href="392229F0603DFEAE.png" transform="matrix(0.24 0 0 0.24 189.2192 51.5386)">
</image>
<g>
<polygon fill="#BBCAC6" points="195.699,109.152 281.896,58.019 326.86,58.019 350.841,87.996 364.83,87.996 390.81,109.152
390.81,119.16 195.699,119.16 "/>
</g>
</g>
<polygon fill="#B4C0BF" points="233.388,109.152 210.191,109.152 267.733,72.18 290.93,72.18 "/>
<polygon fill="#CAD8D7" points="323.482,63.788 346.859,93.758 363.043,93.758 381.624,109.152 390.77,109.152 364.83,87.996
350.841,87.996 326.86,58.019 281.896,58.019 272.146,63.788 "/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="202.271px" height="25.842px" viewBox="0 0 202.271 25.842" enable-background="new 0 0 202.271 25.842"
xml:space="preserve">
<polygon fill="#D6BA6B" points="176.225,0 51.492,0 21.469,11.69 6.005,11.69 -0.001,25.842 202.271,25.842 "/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="331.68px" height="128.235px" viewBox="0 0 331.68 128.235" enable-background="new 0 0 331.68 128.235"
xml:space="preserve">
<g>
<g>
<image overflow="visible" opacity="0.1" width="1382" height="561" xlink:href="6AB008E8BA7227E6.png" transform="matrix(0.24 0 0 0.24 0 0)">
</image>
<g>
<polygon fill="#DDC782" points="325.052,117.99 275.16,64.12 241.545,64.12 185.894,6.48 96.599,6.48 73.956,41.12 46.645,41.12
6.48,118.112 6.48,128.12 325.052,128.12 "/>
</g>
</g>
</g>
<polygon fill="#E2D5A8" points="95.996,6.48 88.886,17.594 178.145,17.594 234.905,76.345 267.272,76.345 307.058,118.301
325.052,117.99 275.16,64.12 241.545,64.12 185.894,6.48 "/>
<polygon fill="#D6BA6B" points="90.997,34.783 80.208,53.964 52.821,53.964 17.847,117.112 94.667,117.112 114.246,68.347
93.186,68.347 108.974,34.78 "/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="202.271px" height="25.842px" viewBox="0 0 202.271 25.842" enable-background="new 0 0 202.271 25.842"
xml:space="preserve">
<polygon fill="#D6BA6B" points="186.234,11.69 176.226,0 51.494,0 0,25.842 202.272,25.842 202.272,11.69 "/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="364.08px" height="99.524px" viewBox="0 0 364.08 99.524" enable-background="new 0 0 364.08 99.524" xml:space="preserve">
<g>
<g>
<g>
<image overflow="visible" opacity="0.1" width="973" height="390" xlink:href="423B8197D66693F1.png" transform="matrix(0.24 0 0 0.24 127.1021 0)">
</image>
<g>
<polygon fill="#DDC782" points="357.594,90.549 274.083,3 210.635,3 182.937,36.624 164.445,36.624 130.102,90.549 "/>
</g>
</g>
<polygon fill="#D6BA6B" points="231.917,22.801 206.431,22.801 187.94,47.95 171.654,47.206 145.282,88.371 168.425,88.371
182.449,63.548 199.237,63.572 "/>
<g>
<polygon fill="#E2D5A8" points="274.083,3 210.654,3 204.371,10.625 267.201,10.625 344.072,90.549 357.594,90.549 "/>
</g>
</g>
<g>
<image overflow="visible" opacity="0.1" width="1517" height="309" xlink:href="423B8197D66693F3.png" transform="matrix(0.24 0 0 0.24 0 32.2876)">
</image>
<g>
<polygon fill="#DDC782" points="189.581,89.523 163.601,68.745 149.612,68.745 125.631,38.768 80.667,38.768 6.48,89.779
6.48,99.787 357.594,99.787 357.594,89.523 "/>
</g>
</g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="270.4526" y1="86.5244" x2="270.4526" y2="89.5244">
<stop offset="0" style="stop-color:#B5A339;stop-opacity:0"/>
<stop offset="0.4085" style="stop-color:#C2AC4D;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#D6BA6B"/>
</linearGradient>
<polygon fill="url(#SVGID_1_)" points="352.266,86.524 183.286,86.524 183.286,89.524 357.62,89.524 "/>
<polygon fill="#E2D5A8" points="122.253,44.537 145.63,74.507 161.814,74.507 180.395,89.492 189.541,89.492 163.601,68.745
149.612,68.745 125.631,38.768 80.667,38.768 72.039,44.537 "/>
<polygon fill="#D6BA6B" points="42.167,89.492 18.97,89.492 69.507,52.929 92.704,52.929 "/>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="432.973px" height="305.408px" viewBox="0 0 432.973 305.408" enable-background="new 0 0 432.973 305.408"
xml:space="preserve">
<g>
<polygon fill="#56524F" points="362.724,165.068 404.552,48.501 250.935,48.501 107.346,105.933 49.844,231.263 114.297,268.895
389.082,268.895 407.378,232.175 "/>
</g>
<g>
<g>
<polygon fill="#FFFFFF" points="308.927,60.146 304.964,59.876 314.111,52.344 318.259,52.311 "/>
</g>
<g>
<path fill="#FFFFFF" d="M269.763,257.904l-23.545-42.796l7.771-0.163l24.545,43.797L269.763,257.904z M239.668,200.162
L223,166.075l7.982,0.34l16.457,33.584L239.668,200.162z M228.845,154.631l-6.869-0.887l10.46-27.177l5.869,0.887L228.845,154.631
z M243.781,117.623l-5.965-0.27l14.85-11.64l5.963,0.271L243.781,117.623z M267.365,97.261l-5.965-0.27l17.854-13.642l4.963,0.27
L267.365,97.261z M289.949,76.897l-3.963-0.27l13.729-10.752l3.963,0.27L289.949,76.897z"/>
</g>
</g>
<g>
<g>
<path fill="#FFFFFF" d="M111.666,304.173c-4.279,1.647-11.282,1.647-15.562,0L3.111,268.366c-4.279-1.647-4.125-3.842,0.343-4.875
l92.308-21.353c4.468-1.033,11.778-1.033,16.246,0l92.306,21.353c4.468,1.033,4.622,3.228,0.342,4.875L111.666,304.173z"/>
</g>
<polygon fill="#D25031" points="179.687,74.322 106.597,85.136 106.597,17.599 179.687,29.491 160.061,51.613 "/>
<path fill="#FFFFFF" d="M110.097,12.992c-0.011-3.069-2.511-5.549-5.581-5.538c-3.069,0.013-5.548,2.511-5.537,5.578
c0.007,1.555,1.485,2.956,2.518,3.962v135.272l6.112-0.03V16.993C108.633,15.981,110.101,14.548,110.097,12.992z"/>
<g>
<path fill="#CD6632" d="M175.843,261.758c-2.501-5.839-63.367-143.689-63.367-143.689s-1.186-3.058-3.056-3.058
c-2.189,0-7.214,0-9.402,0c-1.964,0-3.057,3.058-3.057,3.058S36.096,255.919,33.594,261.758c-2.502,5.835,1.111,6.112,1.111,6.112
c42.475,19.179,104.313,15.982,140.027,0C174.732,267.87,178.343,267.593,175.843,261.758z"/>
<path fill="#FFFFFF" d="M165.442,238.104c-3.729-8.463-8.184-18.562-12.902-29.261c-16.927,3.859-35.25,6.054-49.863,6.121
c-19.318,0.091-35.643-2.262-46.023-5.569c-4.623,10.482-8.985,20.371-12.649,28.681c8.834,2.624,29.308,10.009,58.882,9.849
C120.642,247.83,141.678,243.415,165.442,238.104z"/>
<path fill="#FFFFFF" d="M82.841,150.052c-3.585,8.122-7.609,17.241-11.774,26.674c8.936,1.415,19.597,2.471,31.82,2.413
c10.549-0.048,22.264-1.415,35.013-3.473c-4.11-9.316-8.075-18.298-11.602-26.285c-8.365,0.867-16.44,1.339-23.621,1.369
C95.615,150.779,88.959,150.522,82.841,150.052z"/>
</g>
</g>
<g>
<g>
<path fill="#FFFFFF" d="M384.685,177.18c-2.205,0.688-5.812,0.688-8.018,0l-46.656-14.549c-2.205-0.688-2.168-1.676,0.082-2.196