<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[2439] sites/trunk: Translate: Add child pages to plugin projects to show contributors and language packs, first pass.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://meta.trac.wordpress.org/changeset/2439">2439</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/2439","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>ocean90</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-01-31 22:58:15 +0000 (Sun, 31 Jan 2016)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Translate: Add child pages to plugin projects to show contributors and language packs, first pass.

See <a href="http://meta.trac.wordpress.org/ticket/1388">#1388</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewhelperfunctionsphp">sites/trunk/translate.wordpress.org/public_html/gp-templates-new/helper-functions.php</a></li>
<li><a href="#sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewprojectswppluginsphp">sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins.php</a></li>
<li><a href="#sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewstylecss">sites/trunk/translate.wordpress.org/public_html/gp-templates-new/style.css</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggproutesrouteswppluginsphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/routes/wp-plugins.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggprouteswporggproutesphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/wporg-gp-routes.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>sites/trunk/translate.wordpress.org/public_html/gp-templates-new/css/</li>
<li><a href="#sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewcsschartistmincss">sites/trunk/translate.wordpress.org/public_html/gp-templates-new/css/chartist.min.css</a></li>
<li>sites/trunk/translate.wordpress.org/public_html/gp-templates-new/js/</li>
<li><a href="#sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewjschartistminjs">sites/trunk/translate.wordpress.org/public_html/gp-templates-new/js/chartist.min.js</a></li>
<li><a href="#sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewprojectswppluginscontributorsphp">sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins-contributors.php</a></li>
<li><a href="#sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewprojectswppluginslanguagepacksphp">sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins-language-packs.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewcsschartistmincss"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/translate.wordpress.org/public_html/gp-templates-new/css/chartist.min.css</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/translate.wordpress.org/public_html/gp-templates-new/css/chartist.min.css                             (rev 0)
+++ sites/trunk/translate.wordpress.org/public_html/gp-templates-new/css/chartist.min.css       2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+.ct-double-octave:after,.ct-major-eleventh:after,.ct-major-second:after,.ct-major-seventh:after,.ct-major-sixth:after,.ct-major-tenth:after,.ct-major-third:after,.ct-major-twelfth:after,.ct-minor-second:after,.ct-minor-seventh:after,.ct-minor-sixth:after,.ct-minor-third:after,.ct-octave:after,.ct-perfect-fifth:after,.ct-perfect-fourth:after,.ct-square:after{content:"";clear:both}.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-an
 chor:start}.ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-vertical.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-en
 d;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-
 start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-
 point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-
 series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-pie{fil
 l:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:100%}.ct-square:after{display:table}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{display:table}.ct-minor-second
 >svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:88.8888888889%}.ct-major-second:after{display:table}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:83.3333333333%}.ct-minor-third:after{display:table}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:80%}.ct-major-third:after{display:table}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;c
 ontent:"";width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{display:table}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.6666666667%}.ct-perfect-fifth:after{display:table}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{display:table}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.804697157%}.ct-golden-section:after{content:"";display:table;clear:both}.ct-golden-section>s
 vg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{display:table}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{display:table}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:53.3333333333%}.ct-major-seventh:after{display:table}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;content:"&quo
 t;;width:0;height:0;padding-bottom:50%}.ct-octave:after{display:table}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{display:table}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{display:table}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:33.3333333333%}.ct-major-twelfth:after{display:table}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:b
 lock;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:25%}.ct-double-octave:after{display:table}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0}
</ins></span></pre></div>
<a id="sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewhelperfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/translate.wordpress.org/public_html/gp-templates-new/helper-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/translate.wordpress.org/public_html/gp-templates-new/helper-functions.php     2016-01-30 22:00:38 UTC (rev 2438)
+++ sites/trunk/translate.wordpress.org/public_html/gp-templates-new/helper-functions.php       2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2,6 +2,10 @@
</span><span class="cx" style="display: block; padding: 0 10px"> wp_register_style( 'wporg-translate', 'https://wordpress.org/translate/gp-templates-new/style.css', array( 'base' ), '20151123' );
</span><span class="cx" style="display: block; padding: 0 10px"> gp_enqueue_style( 'wporg-translate' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+wp_register_style( 'chartist', 'https://wordpress.org/translate/gp-templates-new/css/chartist.min.css', array(), '0.9.5' );
+wp_register_script( 'chartist', 'https://wordpress.org/translate/gp-templates-new/js/chartist.min.js', array(), '0.9.5' );
+
+
</ins><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px">  * Adds custom classes to the array of body classes.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span></span></pre></div>
<a id="sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewjschartistminjs"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/translate.wordpress.org/public_html/gp-templates-new/js/chartist.min.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/translate.wordpress.org/public_html/gp-templates-new/js/chartist.min.js                               (rev 0)
+++ sites/trunk/translate.wordpress.org/public_html/gp-templates-new/js/chartist.min.js 2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,13 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/* Chartist.js 0.9.5
+ * Copyright © 2015 Gion Kunz
+ * Free to use under the WTFPL license.
+ * http://www.wtfpl.net/
+ */
+!function(a,b){"function"==typeof define&&define.amd?define([],function(){return a.Chartist=b()}):"object"==typeof exports?module.exports=b():a.Chartist=b()}(this,function(){var a={version:"0.9.5"};return function(a,b,c){"use strict";c.noop=function(a){return a},c.alphaNumerate=function(a){return String.fromCharCode(97+a%26)},c.extend=function(a){a=a||{};var b=Array.prototype.slice.call(arguments,1);return b.forEach(function(b){for(var d in b)"object"!=typeof b[d]||null===b[d]||b[d]instanceof Array?a[d]=b[d]:a[d]=c.extend({},a[d],b[d])}),a},c.replaceAll=function(a,b,c){return a.replace(new RegExp(b,"g"),c)},c.ensureUnit=function(a,b){return"number"==typeof a&&(a+=b),a},c.quantity=function(a){if("string"==typeof a){var b=/^(\d+)\s*(.*)$/g.exec(a);return{value:+b[1],unit:b[2]||void 0}}return{value:a}},c.querySelector=function(a){return a instanceof Node?a:b.querySelector(a)},c.times=functio
 n(a){return Array.apply(null,new Array(a))},c.sum=function(a,b){return a+(b?b:0)},c.mapMultiply=function(a){return function(b){return b*a}},c.mapAdd=function(a){return function(b){return b+a}},c.serialMap=function(a,b){var d=[],e=Math.max.apply(null,a.map(function(a){return a.length}));return c.times(e).forEach(function(c,e){var f=a.map(function(a){return a[e]});d[e]=b.apply(null,f)}),d},c.roundWithPrecision=function(a,b){var d=Math.pow(10,b||c.precision);return Math.round(a*d)/d},c.precision=8,c.escapingMap={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"},c.serialize=function(a){return null===a||void 0===a?a:("number"==typeof a?a=""+a:"object"==typeof a&&(a=JSON.stringify({data:a})),Object.keys(c.escapingMap).reduce(function(a,b){return c.replaceAll(a,b,c.escapingMap[b])},a))},c.deserialize=function(a){if(&qu
 ot;string"!=typeof a)return a;a=Object.keys(c.escapingMap).reduce(function(a,b){return c.replaceAll(a,c.escapingMap[b],b)},a);try{a=JSON.parse(a),a=void 0!==a.data?a.data:a}catch(b){}return a},c.createSvg=function(a,b,d,e){var f;return b=b||"100%",d=d||"100%",Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS("http://www.w3.org/2000/xmlns/",c.xmlNs.prefix)}).forEach(function(b){a.removeChild(b)}),f=new c.Svg("svg").attr({width:b,height:d}).addClass(e).attr({style:"width: "+b+"; height: "+d+";"}),a.appendChild(f._node),f},c.reverseData=function(a){a.labels.reverse(),a.series.reverse();for(var b=0;b<a.series.length;b++)"object"==typeof a.series[b]&&void 0!==a.series[b].data?a.series[b].data.reverse():a.series[b]instanceof Array&&a.series[b].reverse()},c.getDataArray=function(a,b,d){function e(a){if(!c.isFalseyButZero(a)){if((a.
 data||a)instanceof Array)return(a.data||a).map(e);if(a.hasOwnProperty("value"))return e(a.value);if(d){var b={};return"string"==typeof d?b[d]=c.getNumberOrUndefined(a):b.y=c.getNumberOrUndefined(a),b.x=a.hasOwnProperty("x")?c.getNumberOrUndefined(a.x):b.x,b.y=a.hasOwnProperty("y")?c.getNumberOrUndefined(a.y):b.y,b}return c.getNumberOrUndefined(a)}}return(b&&!a.reversed||!b&&a.reversed)&&(c.reverseData(a),a.reversed=!a.reversed),a.series.map(e)},c.normalizePadding=function(a,b){return b=b||0,"number"==typeof a?{top:a,right:a,bottom:a,left:a}:{top:"number"==typeof a.top?a.top:b,right:"number"==typeof a.right?a.right:b,bottom:"number"==typeof a.bottom?a.bottom:b,left:"number"==typeof a.left?a.left:b}},c.getMetaData=function(a,b){var d=a.data?a.data[b]:a[b];return d?c.serialize(d.meta):void 0},c.orderOfMagnitude=function(a){return Math.floor(Math.log(Math.abs(a))/Math.LN10)}
 ,c.projectLength=function(a,b,c){return b/c.range*a},c.getAvailableHeight=function(a,b){return Math.max((c.quantity(b.height).value||a.height())-(b.chartPadding.top+b.chartPadding.bottom)-b.axisX.offset,0)},c.getHighLow=function(a,b,d){function e(a){if(void 0!==a)if(a instanceof Array)for(var b=0;b<a.length;b++)e(a[b]);else{var c=d?+a[d]:+a;g&&c>f.high&&(f.high=c),h&&c<f.low&&(f.low=c)}}b=c.extend({},b,d?b["axis"+d.toUpperCase()]:{});var f={high:void 0===b.high?-Number.MAX_VALUE:+b.high,low:void 0===b.low?Number.MAX_VALUE:+b.low},g=void 0===b.high,h=void 0===b.low;return(g||h)&&e(a),(b.referenceValue||0===b.referenceValue)&&(f.high=Math.max(b.referenceValue,f.high),f.low=Math.min(b.referenceValue,f.low)),f.high<=f.low&&(0===f.low?f.high=1:f.low<0?f.high=0:f.low=0),f},c.isNum=function(a){return!isNaN(a)&&isFinite(a)},c.isFalseyButZero=function(a){return!a&&0!==a},c.getNumberOrUndefined=fu
 nction(a){return isNaN(+a)?void 0:+a},c.getMultiValue=function(a,b){return c.isNum(a)?+a:a?a[b||"y"]||0:0},c.rho=function(a){function b(a,c){return a%c===0?c:b(c,a%c)}function c(a){return a*a+1}if(1===a)return a;var d,e=2,f=2;if(a%2===0)return 2;do e=c(e)%a,f=c(c(f))%a,d=b(Math.abs(e-f),a);while(1===d);return d},c.getBounds=function(a,b,d,e){var f,g,h,i=0,j={high:b.high,low:b.low};j.valueRange=j.high-j.low,j.oom=c.orderOfMagnitude(j.valueRange),j.step=Math.pow(10,j.oom),j.min=Math.floor(j.low/j.step)*j.step,j.max=Math.ceil(j.high/j.step)*j.step,j.range=j.max-j.min,j.numberOfSteps=Math.round(j.range/j.step);var k=c.projectLength(a,j.step,j),l=d>k,m=e?c.rho(j.range):0;if(e&&c.projectLength(a,1,j)>=d)j.step=1;else if(e&&m<j.step&&c.projectLength(a,m,j)>=d)j.step=m;else for(;;){if(l&&c.projectLength(a,j.step,j)<=d)j.step*=2;else{if(l||!(c.projectLength(a,j.step/2,j)>=d))break;if(j.step/=2,e&&j.step%1!==0){j.step*=2;brea
 k}}if(i++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}for(g=j.min,h=j.max;g+j.step<=j.low;)g+=j.step;for(;h-j.step>=j.high;)h-=j.step;for(j.min=g,j.max=h,j.range=j.max-j.min,j.values=[],f=j.min;f<=j.max;f+=j.step)j.values.push(c.roundWithPrecision(f));return j},c.polarToCartesian=function(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}},c.createChartRect=function(a,b,d){var e=!(!b.axisX&&!b.axisY),f=e?b.axisY.offset:0,g=e?b.axisX.offset:0,h=a.width()||c.quantity(b.width).value||0,i=a.height()||c.quantity(b.height).value||0,j=c.normalizePadding(b.chartPadding,d);h=Math.max(h,f+j.left+j.right),i=Math.max(i,g+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return e?("start"===b.axisX.position?(k.y2=j.top+g,k.y1=Math.max(i-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(i-j.bottom-g,k.y2+1)),"start"
 ===b.axisY.position?(k.x1=j.left+f,k.x2=Math.max(h-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(h-j.right-f,k.x1+1))):(k.x1=j.left,k.x2=Math.max(h-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(i-j.bottom,k.y2+1)),k},c.createGrid=function(a,b,d,e,f,g,h,i){var j={};j[d.units.pos+"1"]=a,j[d.units.pos+"2"]=a,j[d.counterUnits.pos+"1"]=e,j[d.counterUnits.pos+"2"]=e+f;var k=g.elem("line",j,h.join(" "));i.emit("draw",c.extend({type:"grid",axis:d,index:b,group:g,element:k},j))},c.createLabel=function(a,b,d,e,f,g,h,i,j,k,l){var m,n={};if(n[f.units.pos]=a+h[f.units.pos],n[f.counterUnits.pos]=h[f.counterUnits.pos],n[f.units.len]=b,n[f.counterUnits.len]=g-10,k){var o='<span class="'+j.join(" ")+'" style="'+f.units.len+": "+Math.round(n[f.units.len])+"px; "+f.counterUnits.len+": "+Math.round(n[f.counterUnits.len])+'px">'+e[d]+"</span>";m=i.for
 eignObject(o,c.extend({style:"overflow: visible;"},n))}else m=i.elem("text",n,j.join(" ")).text(e[d]);l.emit("draw",c.extend({type:"label",axis:f,index:d,group:i,element:m,text:e[d]},n))},c.getSeriesOption=function(a,b,c){if(a.name&&b.series&&b.series[a.name]){var d=b.series[a.name];return d.hasOwnProperty(c)?d[c]:b[c]}return b[c]},c.optionsProvider=function(b,d,e){function f(b){var f=h;if(h=c.extend({},j),d)for(i=0;i<d.length;i++){var g=a.matchMedia(d[i][0]);g.matches&&(h=c.extend(h,d[i][1]))}e&&!b&&e.emit("optionsChanged",{previousOptions:f,currentOptions:h})}function g(){k.forEach(function(a){a.removeListener(f)})}var h,i,j=c.extend({},b),k=[];if(!a.matchMedia)throw"window.matchMedia not found! Make sure you're using a polyfill.";if(d)for(i=0;i<d.length;i++){var l=a.matchMedia(d[i][0]);l.addListener(f),k.push(l)}return f(!0),{removeMediaQueryListeners:g,getCurrentOp
 tions:function(){return c.extend({},h)}}}}(window,document,a),function(a,b,c){"use strict";c.Interpolation={},c.Interpolation.none=function(a){var b={fillHoles:!1};return a=c.extend({},b,a),function(b,d){for(var e=new c.Svg.Path,f=!0,g=0;g<b.length;g+=2){var h=b[g],i=b[g+1],j=d[g/2];void 0!==j.value?(f?e.move(h,i,!1,j):e.line(h,i,!1,j),f=!1):a.fillHoles||(f=!0)}return e}},c.Interpolation.simple=function(a){var b={divisor:2,fillHoles:!1};a=c.extend({},b,a);var d=1/Math.max(1,a.divisor);return function(b,e){for(var f,g,h,i=new c.Svg.Path,j=0;j<b.length;j+=2){var k=b[j],l=b[j+1],m=(k-f)*d,n=e[j/2];void 0!==n.value?(void 0===h?i.move(k,l,!1,n):i.curve(f+m,g,k-m,l,k,l,!1,n),f=k,g=l,h=n):a.fillHoles||(f=k=h=void 0)}return i}},c.Interpolation.cardinal=function(a){function b(b,c){for(var d=[],e=!0,f=0;f<b.length;f+=2)void 0===c[f/2].value?a.fillHoles||(e=!0):(e&&(d.push({pathCoordinates:[],valueData:[]}),e=!1),d[d.length-1].pathCoordinates.push(b[f],b[f+1]),d[d.le
 ngth-1].valueData.push(c[f/2]));return d}var d={tension:1,fillHoles:!1};a=c.extend({},d,a);var e=Math.min(1,Math.max(0,a.tension)),f=1-e;return function g(a,d){var h=b(a,d);if(h.length>1){var i=[];return h.forEach(function(a){i.push(g(a.pathCoordinates,a.valueData))}),c.Svg.Path.join(i)}if(a=h[0].pathCoordinates,d=h[0].valueData,a.length<=4)return c.Interpolation.none()(a,d);for(var j,k=(new c.Svg.Path).move(a[0],a[1],!1,d[0]),l=0,m=a.length;m-2*!j>l;l+=2){var n=[{x:+a[l-2],y:+a[l-1]},{x:+a[l],y:+a[l+1]},{x:+a[l+2],y:+a[l+3]},{x:+a[l+4],y:+a[l+5]}];j?l?m-4===l?n[3]={x:+a[0],y:+a[1]}:m-2===l&&(n[2]={x:+a[0],y:+a[1]},n[3]={x:+a[2],y:+a[3]}):n[0]={x:+a[m-2],y:+a[m-1]}:m-4===l?n[3]=n[2]:l||(n[0]={x:+a[l],y:+a[l+1]}),k.curve(e*(-n[0].x+6*n[1].x+n[2].x)/6+f*n[2].x,e*(-n[0].y+6*n[1].y+n[2].y)/6+f*n[2].y,e*(n[1].x+6*n[2].x-n[3].x)/6+f*n[2].x,e*(n[1].y+6*n[2].y-n[3].y)/6+f*n[2].y,n[2].x,n[2].y,!1,d[(l+2)/2])}return k}},c.Interpolation.step=function(a){var b={postpone:!0,fill
 Holes:!1};return a=c.extend({},b,a),function(b,d){for(var e,f,g,h=new c.Svg.Path,i=0;i<b.length;i+=2){var j=b[i],k=b[i+1],l=d[i/2];void 0!==l.value?(void 0===g?h.move(j,k,!1,l):(a.postpone?h.line(j,f,!1,g):h.line(e,k,!1,l),h.line(j,k,!1,l)),e=j,f=k,g=l):a.fillHoles||(e=f=g=void 0)}return h}}}(window,document,a),function(a,b,c){"use strict";c.EventEmitter=function(){function a(a,b){d[a]=d[a]||[],d[a].push(b)}function b(a,b){d[a]&&(b?(d[a].splice(d[a].indexOf(b),1),0===d[a].length&&delete d[a]):delete d[a])}function c(a,b){d[a]&&d[a].forEach(function(a){a(b)}),d["*"]&&d["*"].forEach(function(c){c(a,b)})}var d=[];return{addEventHandler:a,removeEventHandler:b,emit:c}}}(window,document,a),function(a,b,c){"use strict";function d(a){var b=[];if(a.length)for(var c=0;c<a.length;c++)b.push(a[c]);return b}function e(a,b){var d=b||this.prototype||c.Class,e=Object.create(d);c.Class.cloneDefinitions(e,a);var f=function(
 ){var a,b=e.constructor||function(){};return a=this===c?Object.create(e):this,b.apply(a,Array.prototype.slice.call(arguments,0)),a};return f.prototype=e,f["super"]=d,f.extend=this.extend,f}function f(){var a=d(arguments),b=a[0];return a.splice(1,a.length-1).forEach(function(a){Object.getOwnPropertyNames(a).forEach(function(c){delete b[c],Object.defineProperty(b,c,Object.getOwnPropertyDescriptor(a,c))})}),b}c.Class={extend:e,cloneDefinitions:f}}(window,document,a),function(a,b,c){"use strict";function d(a,b,d){return a&&(this.data=a,this.eventEmitter.emit("data",{type:"update",data:this.data})),b&&(this.options=c.extend({},d?this.options:this.defaultOptions,b),this.initializeTimeoutId||(this.optionsProvider.removeMediaQueryListeners(),this.optionsProvider=c.optionsProvider(this.options,this.responsiveOptions,this.eventEmitter))),this.initializeTimeoutId||this.createChart(this.optionsProvider.getCurrentOptions()),this}function e(
 ){return this.initializeTimeoutId?a.clearTimeout(this.initializeTimeoutId):(a.removeEventListener("resize",this.resizeListener),this.optionsProvider.removeMediaQueryListeners()),this}function f(a,b){return this.eventEmitter.addEventHandler(a,b),this}function g(a,b){return this.eventEmitter.removeEventHandler(a,b),this}function h(){a.addEventListener("resize",this.resizeListener),this.optionsProvider=c.optionsProvider(this.options,this.responsiveOptions,this.eventEmitter),this.eventEmitter.addEventHandler("optionsChanged",function(){this.update()}.bind(this)),this.options.plugins&&this.options.plugins.forEach(function(a){a instanceof Array?a[0](this,a[1]):a(this)}.bind(this)),this.eventEmitter.emit("data",{type:"initial",data:this.data}),this.createChart(this.optionsProvider.getCurrentOptions()),this.initializeTimeoutId=void 0}function i(a,b,d,e,f){this.container=c.querySelector(a),this.data=b,this.defaultOptions=d,this.option
 s=e,this.responsiveOptions=f,this.eventEmitter=c.EventEmitter(),this.supportsForeignObject=c.Svg.isSupported("Extensibility"),this.supportsAnimations=c.Svg.isSupported("AnimationEventsAttribute"),this.resizeListener=function(){this.update()}.bind(this),this.container&&(this.container.__chartist__&&this.container.__chartist__.detach(),this.container.__chartist__=this),this.initializeTimeoutId=setTimeout(h.bind(this),0)}c.Base=c.Class.extend({constructor:i,optionsProvider:void 0,container:void 0,svg:void 0,eventEmitter:void 0,createChart:function(){throw new Error("Base chart type can't be instantiated!")},update:d,detach:e,on:f,off:g,version:c.version,supportsForeignObject:!1})}(window,document,a),function(a,b,c){"use strict";function d(a,d,e,f,g){a instanceof Element?this._node=a:(this._node=b.createElementNS(z,a),"svg"===a&&this._node.setAttributeNS(A,c.xmlNs.qualifiedName,c.xmlNs.uri)),d&&this.attr(d
 ),e&&this.addClass(e),f&&(g&&f._node.firstChild?f._node.insertBefore(this._node,f._node.firstChild):f._node.appendChild(this._node))}function e(a,b){return"string"==typeof a?b?this._node.getAttributeNS(b,a):this._node.getAttribute(a):(Object.keys(a).forEach(function(d){void 0!==a[d]&&(b?this._node.setAttributeNS(b,[c.xmlNs.prefix,":",d].join(""),a[d]):this._node.setAttribute(d,a[d]))}.bind(this)),this)}function f(a,b,d,e){return new c.Svg(a,b,d,this,e)}function g(){return this._node.parentNode instanceof SVGElement?new c.Svg(this._node.parentNode):null}function h(){for(var a=this._node;"svg"!==a.nodeName;)a=a.parentNode;return new c.Svg(a)}function i(a){var b=this._node.querySelector(a);return b?new c.Svg(b):null}function j(a){var b=this._node.querySelectorAll(a);return b.length?new c.Svg.List(b):null}function k(a,c,d,e){if("string"==typeof a){var f=b.createElement("div");f.innerHTML=a,a=f.fi
 rstChild}a.setAttribute("xmlns",B);var g=this.elem("foreignObject",c,d,e);return g._node.appendChild(a),g}function l(a){return this._node.appendChild(b.createTextNode(a)),this}function m(){for(;this._node.firstChild;)this._node.removeChild(this._node.firstChild);return this}function n(){return this._node.parentNode.removeChild(this._node),this.parent()}function o(a){return this._node.parentNode.replaceChild(a._node,this._node),a}function p(a,b){return b&&this._node.firstChild?this._node.insertBefore(a._node,this._node.firstChild):this._node.appendChild(a._node),this}function q(){return this._node.getAttribute("class")?this._node.getAttribute("class").trim().split(/\s+/):[]}function r(a){return this._node.setAttribute("class",this.classes(this._node).concat(a.trim().split(/\s+/)).filter(function(a,b,c){return c.indexOf(a)===b}).join(" ")),this}function s(a){var b=a.trim().split(/\s+/);return this._node.setAttribute(&
 quot;class",this.classes(this._node).filter(function(a){return-1===b.indexOf(a)}).join(" ")),this}function t(){return this._node.setAttribute("class",""),this}function u(a,b){try{return a.getBBox()[b]}catch(c){}return 0}function v(){return this._node.clientHeight||Math.round(u(this._node,"height"))||this._node.parentNode.clientHeight}function w(){return this._node.clientWidth||Math.round(u(this._node,"width"))||this._node.parentNode.clientWidth}function x(a,b,d){return void 0===b&&(b=!0),Object.keys(a).forEach(function(e){function f(a,b){var f,g,h,i={};a.easing&&(h=a.easing instanceof Array?a.easing:c.Svg.Easing[a.easing],delete a.easing),a.begin=c.ensureUnit(a.begin,"ms"),a.dur=c.ensureUnit(a.dur,"ms"),h&&(a.calcMode="spline",a.keySplines=h.join(" "),a.keyTimes="0;1"),b&&(a.fill="freeze",i[e]=a.from,this.attr(i),g=c.quantity(a.begin||0).
 value,a.begin="indefinite"),f=this.elem("animate",c.extend({attributeName:e},a)),b&&setTimeout(function(){try{f._node.beginElement()}catch(b){i[e]=a.to,this.attr(i),f.remove()}}.bind(this),g),d&&f._node.addEventListener("beginEvent",function(){d.emit("animationBegin",{element:this,animate:f._node,params:a})}.bind(this)),f._node.addEventListener("endEvent",function(){d&&d.emit("animationEnd",{element:this,animate:f._node,params:a}),b&&(i[e]=a.to,this.attr(i),f.remove())}.bind(this))}a[e]instanceof Array?a[e].forEach(function(a){f.bind(this)(a,!1)}.bind(this)):f.bind(this)(a[e],b)}.bind(this)),this}function y(a){var b=this;this.svgElements=[];for(var d=0;d<a.length;d++)this.svgElements.push(new c.Svg(a[d]));Object.keys(c.Svg.prototype).filter(function(a){return-1===["constructor","parent","querySelector","querySelectorAll","replace","app
 end","classes","height","width"].indexOf(a)}).forEach(function(a){b[a]=function(){var d=Array.prototype.slice.call(arguments,0);return b.svgElements.forEach(function(b){c.Svg.prototype[a].apply(b,d)}),b}})}var z="http://www.w3.org/2000/svg",A="http://www.w3.org/2000/xmlns/",B="http://www.w3.org/1999/xhtml";c.xmlNs={qualifiedName:"xmlns:ct",prefix:"ct",uri:"http://gionkunz.github.com/chartist-js/ct"},c.Svg=c.Class.extend({constructor:d,attr:e,elem:f,parent:g,root:h,querySelector:i,querySelectorAll:j,foreignObject:k,text:l,empty:m,remove:n,replace:o,append:p,classes:q,addClass:r,removeClass:s,removeAllClasses:t,height:v,width:w,animate:x}),c.Svg.isSupported=function(a){return b.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#"+a,"1.1")};var C={easeInSine:[.47,0,.745,.715],easeOutSine:[.39,.575,.565,1],easeInOutSine:[.445,.05,.55,.95],easeInQuad:[.55,.085,.68
 ,.53],easeOutQuad:[.25,.46,.45,.94],easeInOutQuad:[.455,.03,.515,.955],easeInCubic:[.55,.055,.675,.19],easeOutCubic:[.215,.61,.355,1],easeInOutCubic:[.645,.045,.355,1],easeInQuart:[.895,.03,.685,.22],easeOutQuart:[.165,.84,.44,1],easeInOutQuart:[.77,0,.175,1],easeInQuint:[.755,.05,.855,.06],easeOutQuint:[.23,1,.32,1],easeInOutQuint:[.86,0,.07,1],easeInExpo:[.95,.05,.795,.035],easeOutExpo:[.19,1,.22,1],easeInOutExpo:[1,0,0,1],easeInCirc:[.6,.04,.98,.335],easeOutCirc:[.075,.82,.165,1],easeInOutCirc:[.785,.135,.15,.86],easeInBack:[.6,-.28,.735,.045],easeOutBack:[.175,.885,.32,1.275],easeInOutBack:[.68,-.55,.265,1.55]};c.Svg.Easing=C,c.Svg.List=c.Class.extend({constructor:y})}(window,document,a),function(a,b,c){"use strict";function d(a,b,d,e,f,g){var h=c.extend({command:f?a.toLowerCase():a.toUpperCase()},b,g?{data:g}:{});d.splice(e,0,h)}function e(a,b){a.forEach(function(c,d){u[c.command.toLowerCase()].forEach(function(e,f){b(c,e,d,f,a)})})}function f(a,b){this.pathElements=[
 ],this.pos=0,this.close=a,this.options=c.extend({},v,b)}function g(a){return void 0!==a?(this.pos=Math.max(0,Math.min(this.pathElements.length,a)),this):this.pos}function h(a){return this.pathElements.splice(this.pos,a),this}function i(a,b,c,e){return d("M",{x:+a,y:+b},this.pathElements,this.pos++,c,e),this}function j(a,b,c,e){return d("L",{x:+a,y:+b},this.pathElements,this.pos++,c,e),this}function k(a,b,c,e,f,g,h,i){return d("C",{x1:+a,y1:+b,x2:+c,y2:+e,x:+f,y:+g},this.pathElements,this.pos++,h,i),this}function l(a,b,c,e,f,g,h,i,j){return d("A",{rx:+a,ry:+b,xAr:+c,lAf:+e,sf:+f,x:+g,y:+h},this.pathElements,this.pos++,i,j),this}function m(a){var b=a.replace(/([A-Za-z])([0-9])/g,"$1 $2").replace(/([0-9])([A-Za-z])/g,"$1 $2").split(/[\s,]+/).reduce(function(a,b){return b.match(/[A-Za-z]/)&&a.push([]),a[a.length-1].push(b),a},[]);"Z"===b[b.length-1][0].toUpperCase()&&b.pop();var d=b.map(function(a){var
  b=a.shift(),d=u[b.toLowerCase()];return c.extend({command:b},d.reduce(function(b,c,d){return b[c]=+a[d],b},{}))}),e=[this.pos,0];return Array.prototype.push.apply(e,d),Array.prototype.splice.apply(this.pathElements,e),this.pos+=d.length,this}function n(){var a=Math.pow(10,this.options.accuracy);return this.pathElements.reduce(function(b,c){var d=u[c.command.toLowerCase()].map(function(b){return this.options.accuracy?Math.round(c[b]*a)/a:c[b]}.bind(this));return b+c.command+d.join(",")}.bind(this),"")+(this.close?"Z":"")}function o(a,b){return e(this.pathElements,function(c,d){c[d]*="x"===d[0]?a:b}),this}function p(a,b){return e(this.pathElements,function(c,d){c[d]+="x"===d[0]?a:b}),this}function q(a){return e(this.pathElements,function(b,c,d,e,f){var g=a(b,c,d,e,f);(g||0===g)&&(b[c]=g)}),this}function r(a){var b=new c.Svg.Path(a||this.close);return b.pos=this.pos,b.pathElements=this.pathElements.slice().map(functio
 n(a){return c.extend({},a)}),b.options=c.extend({},this.options),b}function s(a){var b=[new c.Svg.Path];return this.pathElements.forEach(function(d){d.command===a.toUpperCase()&&0!==b[b.length-1].pathElements.length&&b.push(new c.Svg.Path),b[b.length-1].pathElements.push(d)}),b}function t(a,b,d){for(var e=new c.Svg.Path(b,d),f=0;f<a.length;f++)for(var g=a[f],h=0;h<g.pathElements.length;h++)e.pathElements.push(g.pathElements[h]);return e}var u={m:["x","y"],l:["x","y"],c:["x1","y1","x2","y2","x","y"],a:["rx","ry","xAr","lAf","sf","x","y"]},v={accuracy:3};c.Svg.Path=c.Class.extend({constructor:f,position:g,remove:h,move:i,line:j,curve:k,arc:l,scale:o,translate:p,transform:q,parse:m,stringify:n,clone:r,splitByCommand:s}),c.Svg.Path.elementDescriptions=u,c.Svg.Path.join=t}(window,document,a),functio
 n(a,b,c){"use strict";function d(a,b,c,d){this.units=a,this.counterUnits=a===f.x?f.y:f.x,this.chartRect=b,this.axisLength=b[a.rectEnd]-b[a.rectStart],this.gridOffset=b[a.rectOffset],this.ticks=c,this.options=d}function e(a,b,d,e,f){var g=e["axis"+this.units.pos.toUpperCase()],h=this.ticks.map(this.projectValue.bind(this)),i=this.ticks.map(g.labelInterpolationFnc);h.forEach(function(j,k){var l,m={x:0,y:0};l=h[k+1]?h[k+1]-j:Math.max(this.axisLength-j,30),(i[k]||0===i[k])&&("x"===this.units.pos?(j=this.chartRect.x1+j,m.x=e.axisX.labelOffset.x,"start"===e.axisX.position?m.y=this.chartRect.padding.top+e.axisX.labelOffset.y+(d?5:20):m.y=this.chartRect.y1+e.axisX.labelOffset.y+(d?5:20)):(j=this.chartRect.y1-j,m.y=e.axisY.labelOffset.y-(d?l:0),"start"===e.axisY.position?m.x=d?this.chartRect.padding.left+e.axisY.labelOffset.x:this.chartRect.x1-10:m.x=this.chartRect.x2+e.axisY.labelOffset.x+10),g.showGrid&&c.createGrid(j,k,this
 ,this.gridOffset,this.chartRect[this.counterUnits.len](),a,[e.classNames.grid,e.classNames[this.units.dir]],f),g.showLabel&&c.createLabel(j,l,k,i,this,g.offset,m,b,[e.classNames.label,e.classNames[this.units.dir],e.classNames[g.position]],d,f))}.bind(this))}var f={x:{pos:"x",len:"width",dir:"horizontal",rectStart:"x1",rectEnd:"x2",rectOffset:"y2"},y:{pos:"y",len:"height",dir:"vertical",rectStart:"y2",rectEnd:"y1",rectOffset:"x1"}};c.Axis=c.Class.extend({constructor:d,createGridAndLabels:e,projectValue:function(a,b,c){throw new Error("Base axis can't be instantiated!")}}),c.Axis.units=f}(window,document,a),function(a,b,c){"use strict";function d(a,b,d,e){var f=e.highLow||c.getHighLow(b.normalized,e,a.pos);this.bounds=c.getBounds(d[a.rectEnd]-d[a.rectStart],f,e.scaleMinSpace||20,e.onlyInteger),this.range={min:this.bounds.min,max:this.bound
 s.max},c.AutoScaleAxis["super"].constructor.call(this,a,d,this.bounds.values,e)}function e(a){return this.axisLength*(+c.getMultiValue(a,this.units.pos)-this.bounds.min)/this.bounds.range}c.AutoScaleAxis=c.Axis.extend({constructor:d,projectValue:e})}(window,document,a),function(a,b,c){"use strict";function d(a,b,d,e){var f=e.highLow||c.getHighLow(b.normalized,e,a.pos);this.divisor=e.divisor||1,this.ticks=e.ticks||c.times(this.divisor).map(function(a,b){return f.low+(f.high-f.low)/this.divisor*b}.bind(this)),this.ticks.sort(function(a,b){return a-b}),this.range={min:f.low,max:f.high},c.FixedScaleAxis["super"].constructor.call(this,a,d,this.ticks,e),this.stepLength=this.axisLength/this.divisor}function e(a){return this.axisLength*(+c.getMultiValue(a,this.units.pos)-this.range.min)/(this.range.max-this.range.min)}c.FixedScaleAxis=c.Axis.extend({constructor:d,projectValue:e})}(window,document,a),function(a,b,c){"use strict";function d(a,b,d,e){c.S
 tepAxis["super"].constructor.call(this,a,d,e.ticks,e),this.stepLength=this.axisLength/(e.ticks.length-(e.stretch?1:0))}function e(a,b){return this.stepLength*b}c.StepAxis=c.Axis.extend({constructor:d,projectValue:e})}(window,document,a),function(a,b,c){"use strict";function d(a){var b={raw:this.data,normalized:c.getDataArray(this.data,a.reverseData,!0)};this.svg=c.createSvg(this.container,a.width,a.height,a.classNames.chart);var d,e,g=this.svg.elem("g").addClass(a.classNames.gridGroup),h=this.svg.elem("g"),i=this.svg.elem("g").addClass(a.classNames.labelGroup),j=c.createChartRect(this.svg,a,f.padding);d=void 0===a.axisX.type?new c.StepAxis(c.Axis.units.x,b,j,c.extend({},a.axisX,{ticks:b.raw.labels,stretch:a.fullWidth})):a.axisX.type.call(c,c.Axis.units.x,b,j,a.axisX),e=void 0===a.axisY.type?new c.AutoScaleAxis(c.Axis.units.y,b,j,c.extend({},a.axisY,{high:c.isNum(a.high)?a.high:a.axisY.high,low:c.isNum(a.low)?a.low:a.axisY.low})):a.ax
 isY.type.call(c,c.Axis.units.y,b,j,a.axisY),d.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),e.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),b.raw.series.forEach(function(f,g){var i=h.elem("g");i.attr({"series-name":f.name,meta:c.serialize(f.meta)},c.xmlNs.uri),i.addClass([a.classNames.series,f.className||a.classNames.series+"-"+c.alphaNumerate(g)].join(" "));var k=[],l=[];b.normalized[g].forEach(function(a,h){var i={x:j.x1+d.projectValue(a,h,b.normalized[g]),y:j.y1-e.projectValue(a,h,b.normalized[g])};k.push(i.x,i.y),l.push({value:a,valueIndex:h,meta:c.getMetaData(f,h)})}.bind(this));var m={lineSmooth:c.getSeriesOption(f,a,"lineSmooth"),showPoint:c.getSeriesOption(f,a,"showPoint"),showLine:c.getSeriesOption(f,a,"showLine"),showArea:c.getSeriesOption(f,a,"showArea"),areaBase:c.getSeriesOption(f,a,"areaBase")},n="function"==typeof m.li
 neSmooth?m.lineSmooth:m.lineSmooth?c.Interpolation.cardinal():c.Interpolation.none(),o=n(k,l);if(m.showPoint&&o.pathElements.forEach(function(b){var h=i.elem("line",{x1:b.x,y1:b.y,x2:b.x+.01,y2:b.y},a.classNames.point).attr({value:[b.data.value.x,b.data.value.y].filter(function(a){return a}).join(","),meta:b.data.meta},c.xmlNs.uri);this.eventEmitter.emit("draw",{type:"point",value:b.data.value,index:b.data.valueIndex,meta:b.data.meta,series:f,seriesIndex:g,axisX:d,axisY:e,group:i,element:h,x:b.x,y:b.y})}.bind(this)),m.showLine){var p=i.elem("path",{d:o.stringify()},a.classNames.line,!0);this.eventEmitter.emit("draw",{type:"line",values:b.normalized[g],path:o.clone(),chartRect:j,index:g,series:f,seriesIndex:g,axisX:d,axisY:e,group:i,element:p})}if(m.showArea&&e.range){var q=Math.max(Math.min(m.areaBase,e.range.max),e.range.min),r=j.y1-e.projectValue(q);o.splitByCommand("M").filter(function
 (a){return a.pathElements.length>1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,r).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,r)}).forEach(function(h){var k=i.elem("path",{d:h.stringify()},a.classNames.area,!0).attr({values:b.normalized[g]},c.xmlNs.uri);this.eventEmitter.emit("draw",{type:"area",values:b.normalized[g],path:h.clone(),series:f,seriesIndex:g,axisX:d,axisY:e,chartRect:j,index:g,group:i,element:k})}.bind(this))}}.bind(this)),this.eventEmitter.emit("created",{bounds:e.bounds,chartRect:j,axisX:d,axisY:e,svg:this.svg,options:a})}function e(a,b,d,e){c.Line["super"].constructor.call(this,a,b,f,c.extend({},f,d),e)}var f={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,type:void 0},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel
 :!0,showGrid:!0,labelInterpolationFnc:c.noop,type:void 0,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,showLine:!0,showPoint:!0,showArea:!1,areaBase:0,lineSmooth:!0,low:void 0,high:void 0,chartPadding:{top:15,right:15,bottom:5,left:10},fullWidth:!1,reverseData:!1,classNames:{chart:"ct-chart-line",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",line:"ct-line",point:"ct-point",area:"ct-area",grid:"ct-grid",gridGroup:"ct-grids",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};c.Line=c.Base.extend({constructor:e,createChart:d})}(window,document,a),function(a,b,c){"use strict";function d(a){var b,d={raw:this.data,normalized:a.distributeSeries?c.getDataArray(this.data,a.reverseData,a.horizontalBars?"x":"y").map(function(a){return[a]}):c.getDataArray(this.data,a.reverseData,a
 .horizontalBars?"x":"y")};this.svg=c.createSvg(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var e=this.svg.elem("g").addClass(a.classNames.gridGroup),g=this.svg.elem("g"),h=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars){var i=c.serialMap(d.normalized,function(){return Array.prototype.slice.call(arguments).map(function(a){return a}).reduce(function(a,b){return{x:a.x+b.x||0,y:a.y+b.y||0}},{x:0,y:0})});b=c.getHighLow([i],c.extend({},a,{referenceValue:0}),a.horizontalBars?"x":"y")}else b=c.getHighLow(d.normalized,c.extend({},a,{referenceValue:0}),a.horizontalBars?"x":"y");b.high=+a.high||(0===a.high?0:b.high),b.low=+a.low||(0===a.low?0:b.low);var j,k,l,m,n,o=c.createChartRect(this.svg,a,f.padding);k=a.distributeSeries&&a.stackBars?d.raw.labels.slice(0,1):d.raw.labels,a.horizontalBars?(j=m=
 void 0===a.axisX.type?new c.AutoScaleAxis(c.Axis.units.x,d,o,c.extend({},a.axisX,{highLow:b,referenceValue:0})):a.axisX.type.call(c,c.Axis.units.x,d,o,c.extend({},a.axisX,{highLow:b,referenceValue:0})),l=n=void 0===a.axisY.type?new c.StepAxis(c.Axis.units.y,d,o,{ticks:k}):a.axisY.type.call(c,c.Axis.units.y,d,o,a.axisY)):(l=m=void 0===a.axisX.type?new c.StepAxis(c.Axis.units.x,d,o,{ticks:k}):a.axisX.type.call(c,c.Axis.units.x,d,o,a.axisX),j=n=void 0===a.axisY.type?new c.AutoScaleAxis(c.Axis.units.y,d,o,c.extend({},a.axisY,{highLow:b,referenceValue:0})):a.axisY.type.call(c,c.Axis.units.y,d,o,c.extend({},a.axisY,{highLow:b,referenceValue:0})));var p=a.horizontalBars?o.x1+j.projectValue(0):o.y1-j.projectValue(0),q=[];l.createGridAndLabels(e,h,this.supportsForeignObject,a,this.eventEmitter),j.createGridAndLabels(e,h,this.supportsForeignObject,a,this.eventEmitter),d.raw.series.forEach(function(b,e){var f,h,i=e-(d.raw.series.length-1)/2;f=a.distributeSeries&&!a.stackBars?l.axisLeng
 th/d.normalized.length/2:a.distributeSeries&&a.stackBars?l.axisLength/2:l.axisLength/d.normalized[e].length/2,h=g.elem("g"),h.attr({"series-name":b.name,meta:c.serialize(b.meta)},c.xmlNs.uri),h.addClass([a.classNames.series,b.className||a.classNames.series+"-"+c.alphaNumerate(e)].join(" ")),d.normalized[e].forEach(function(g,k){var r,s,t,u;if(u=a.distributeSeries&&!a.stackBars?e:a.distributeSeries&&a.stackBars?0:k,r=a.horizontalBars?{x:o.x1+j.projectValue(g&&g.x?g.x:0,k,d.normalized[e]),y:o.y1-l.projectValue(g&&g.y?g.y:0,u,d.normalized[e])}:{x:o.x1+l.projectValue(g&&g.x?g.x:0,u,d.normalized[e]),y:o.y1-j.projectValue(g&&g.y?g.y:0,k,d.normalized[e])},l instanceof c.StepAxis&&(l.options.stretch||(r[l.units.pos]+=f*(a.horizontalBars?-1:1)),r[l.units.pos]+=a.stackBars||a.distributeSeries?0:i*a.seriesBarDistance*(a.horizontalBars?-1:1)),t=q[k]||p,q[k]=t-(p-r[l.counterUnits.pos]),void 0!
 ==g){var v={};v[l.units.pos+"1"]=r[l.units.pos],v[l.units.pos+"2"]=r[l.units.pos],!a.stackBars||"accumulate"!==a.stackMode&&a.stackMode?(v[l.counterUnits.pos+"1"]=p,v[l.counterUnits.pos+"2"]=r[l.counterUnits.pos]):(v[l.counterUnits.pos+"1"]=t,v[l.counterUnits.pos+"2"]=q[k]),v.x1=Math.min(Math.max(v.x1,o.x1),o.x2),
+v.x2=Math.min(Math.max(v.x2,o.x1),o.x2),v.y1=Math.min(Math.max(v.y1,o.y2),o.y1),v.y2=Math.min(Math.max(v.y2,o.y2),o.y1),s=h.elem("line",v,a.classNames.bar).attr({value:[g.x,g.y].filter(function(a){return a}).join(","),meta:c.getMetaData(b,k)},c.xmlNs.uri),this.eventEmitter.emit("draw",c.extend({type:"bar",value:g,index:k,meta:c.getMetaData(b,k),series:b,seriesIndex:e,axisX:m,axisY:n,chartRect:o,group:h,element:s},v))}}.bind(this))}.bind(this)),this.eventEmitter.emit("created",{bounds:j.bounds,chartRect:o,axisX:m,axisY:n,svg:this.svg,options:a})}function e(a,b,d,e){c.Bar["super"].constructor.call(this,a,b,f,c.extend({},f,d),e)}var f={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,scaleMinSpace:20,onlyInte
 ger:!1},width:void 0,height:void 0,high:void 0,low:void 0,onlyInteger:!1,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};c.Bar=c.Base.extend({constructor:e,createChart:d})}(window,document,a),function(a,b,c){"use strict";function d(a,b,c){var d=b.x>a.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}function e(a){var b,e,f,h,i,
 j=[],k=a.startAngle,l=c.getDataArray(this.data,a.reverseData);this.svg=c.createSvg(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie),e=c.createChartRect(this.svg,a,g.padding),f=Math.min(e.width()/2,e.height()/2),i=a.total||l.reduce(function(a,b){return a+b},0);var m=c.quantity(a.donutWidth);"%"===m.unit&&(m.value*=f/100),f-=a.donut?m.value/2:0,h="outside"===a.labelPosition||a.donut?f:"center"===a.labelPosition?0:f/2,h+=a.labelOffset;var n={x:e.x1+e.width()/2,y:e.y2+e.height()/2},o=1===this.data.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;a.showLabel&&(b=this.svg.elem("g",null,null,!0));for(var p=0;p<this.data.series.length;p++){var q=this.data.series[p];j[p]=this.svg.elem("g",null,null,!0),j[p].attr({"series-name":q.name},c.xmlNs.uri),j[p].addClass([a.classNames.series,q.className||a.classNames.series+"-"+c.
 alphaNumerate(p)].join(" "));var r=k+l[p]/i*360;r-k===360&&(r-=.01);var s=c.polarToCartesian(n.x,n.y,f,k-(0===p||o?0:.2)),t=c.polarToCartesian(n.x,n.y,f,r),u=new c.Svg.Path(!a.donut).move(t.x,t.y).arc(f,f,0,r-k>180,0,s.x,s.y);a.donut||u.line(n.x,n.y);var v=j[p].elem("path",{d:u.stringify()},a.donut?a.classNames.sliceDonut:a.classNames.slicePie);if(v.attr({value:l[p],meta:c.serialize(q.meta)},c.xmlNs.uri),a.donut&&v.attr({style:"stroke-width: "+m.value+"px"}),this.eventEmitter.emit("draw",{type:"slice",value:l[p],totalDataSum:i,index:p,meta:q.meta,series:q,group:j[p],element:v,path:u.clone(),center:n,radius:f,startAngle:k,endAngle:r}),a.showLabel){var w=c.polarToCartesian(n.x,n.y,h,k+(r-k)/2),x=a.labelInterpolationFnc(this.data.labels?this.data.labels[p]:l[p],p);if(x||0===x){var y=b.elem("text",{dx:w.x,dy:w.y,"text-anchor":d(n,w,a.labelDirection)},a.classNames.label).text(""+x
 );this.eventEmitter.emit("draw",{type:"label",index:p,group:b,element:y,text:""+x,x:w.x,y:w.y})}}k=r}this.eventEmitter.emit("created",{chartRect:e,svg:this.svg,options:a})}function f(a,b,d,e){c.Pie["super"].constructor.call(this,a,b,g,c.extend({},g,d),e)}var g={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:c.noop,labelDirection:"neutral",reverseData:!1};c.Pie=c.Base.extend({constructor:f,createChart:e,determineAnchorPosition:d})}(window,document,a),a});
+
+/*
+ * Legend plugin for Chartist.js
+ * https://github.com/CodeYellowBV/chartist-plugin-legend
+ */
+(function(a,b){if(typeof define==="function"&&define.amd){define(["chartist"],function(c){return(a.returnExportsGlobal=b(c));});}else{if(typeof exports==="object"){module.exports=b(require("chartist"));}else{a["Chartist.plugins.legend"]=b(a.Chartist);}}}(this,function(b){var a={className:"",legendNames:false,clickable:true};b.plugins=b.plugins||{};b.plugins.legend=function(c){c=b.extend({},a,c);return function d(g){var h=g.container.querySelector(".ct-legend");if(h){h.remove();}if(c.clickable){g.data.series.forEach(function(l,k){if(typeof l!=="object"){l={data:l};}l.className=l.className||g.options.classNames.series+"-"+b.alphaNumerate(k);});}var f=document.createElement("ul");f.className="ct-legend";if(g instanceof b.Pie){f.classList.add("ct-legend-inside");}if(typeof c.className==="string"&&c.className.length>0){f.classList.add(c.clas
 sName);}var j=[],e=g.data.series.slice(0);var i=g.data.series;if(g instanceof b.Pie){i=g.data.labels;}i=c.legendNames||i;i.forEach(function(m,l){var k=document.createElement("li");k.className="ct-series-"+l;k.setAttribute("data-legend",l);k.textContent=m.name||m;f.appendChild(k);});g.container.appendChild(f);if(c.clickable){f.addEventListener("click",function(n){var k=n.target;if(k.parentNode!==f||!k.hasAttribute("data-legend")){return;}n.preventDefault();var l=parseInt(k.getAttribute("data-legend")),o=j.indexOf(l);if(o>-1){j.splice(o,1);k.classList.remove("inactive");}else{if(g.data.series.length>1){j.push(l);k.classList.add("inactive");}}var m=e.slice(0);j.sort().reverse();j.forEach(function(p){m.splice(p,1);});g.data.series=m;g.update();});}};};return b.plugins.legend;}));
</ins></span></pre></div>
<a id="sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewprojectswppluginscontributorsphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins-contributors.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins-contributors.php                             (rev 0)
+++ sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins-contributors.php       2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,169 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+$edit_link = gp_link_project_edit_get( $project, __( '(edit)' ) );
+gp_title( sprintf( __( '%s &lt; GlotPress' ), esc_html( $project->name ) ) );
+gp_breadcrumb( array(
+       gp_project_links_from_root( $project ),
+       'Editors &amp; Contributors',
+) );
+
+
+gp_enqueue_script( 'common' );
+gp_enqueue_style( 'chartist' );
+gp_enqueue_script( 'chartist' );
+
+gp_tmpl_header();
+?>
+<div class="project-header">
+       <p class="project-description"><?php echo apply_filters( 'project_description', $project->description, $project ); ?></p>
+
+       <div class="project-box">
+               <div class="project-box-header">
+                       <div class="project-icon">
+                               <?php echo $project->icon; ?>
+                       </div>
+
+                       <ul class="project-meta">
+                               <li class="project-name"><?php echo $project->name; ?> <?php echo $edit_link; ?></li>
+                       </ul>
+               </div>
+
+               <div class="project-box-footer">
+                       <ul class="projects-dropdown">
+                               <li><span>Contributors</span>
+                                       <ul>
+                                               <li><a href="<?php echo gp_url_project( $project ); ?>">Projects</a></li>
+                                               <li><a href="<?php echo gp_url_join( gp_url_project( $project ), 'language-packs' ); ?>">Language Packs</a></li>
+                                       </ul>
+                               </li>
+                       </ul>
+               </div>
+       </div>
+</div>
+
+<div class="project-sub-page">
+
+       <h3>Activity</h3>
+       <p>The graph shows the recent activity of your contributors. It's updated once per day.</p>
+
+       <div class="ct-chart ct-chart-contributors"></div>
+
+       <h3>Teams</h3>
+       <p>For each locale a plugin can have translation editors and contributors. If a locale has no editor yet then you should probably <a href="https://make.wordpress.org/polyglots/handbook/rosetta/theme-plugin-directories/#translating-themes-plugins">make a request</a>.</p>
+       <?php
+       if ( $contributors_by_locale ) {
+               echo '<div class="contributors-list-search"><input type="search" placeholder="Filter teams&hellip;" id="contributors-list-search"></div>';
+               echo '<div id="contributors-list" class="contributors-list">';
+               foreach ( $contributors_by_locale as $locale_slug => $data ) {
+                       $locale = GP_Locales::by_slug( $locale_slug );
+
+                       $editors_list = array();
+                       foreach ( $data['editors'] as $editor ) {
+                               $editors_list[] = sprintf(
+                                       '<a href="https://profiles.wordpress.org/%s/">%s</a>',
+                                       $editor->nicename,
+                                       $editor->display_name ? $editor->display_name : $editor->nicename
+                               );
+                       }
+
+                       if ( ! $editors_list ) {
+                               $editors_list[] = 'None';
+                       }
+
+                       $contributor_list = array();
+                       foreach ( $data['contributors'] as $contributor ) {
+                               $contributor_list[] = sprintf(
+                                       '<a href="https://profiles.wordpress.org/%s/">%s</a>',
+                                       $contributor->nicename,
+                                       $contributor->display_name ? $contributor->display_name : $contributor->nicename
+                               );
+                       }
+
+                       if ( ! $contributor_list ) {
+                               $contributor_list[] = 'None';
+                       }
+
+                       printf(
+                               '<div class="contributors-list-box">
+                                       <h4><span class="locale-name">%s<span> <span class="contributors-count">%s</span> <span class="locale-code">#%s</span></h4>
+                                       <p><strong>Editors:</strong> %s</p>
+                                       <p><strong>Contributors:</strong> %s</p>
+                               </div>',
+                               $locale->english_name,
+                               sprintf( _n( '%s person', '%s persons', $data['count'] ), number_format_i18n( $data['count'] ) ),
+                               $locale->wp_locale,
+                               wp_sprintf( '%l', $editors_list ),
+                               wp_sprintf( '%l', $contributor_list )
+                       );
+               }
+               echo '</div>';
+       } else {
+               echo '<p>The plugin has no contributors, yet.</p>';
+       }
+       ?>
+</div>
+
+<script type="text/javascript">
+jQuery( function( $ ) {
+       $( '.projects-dropdown > li' ).on( 'click', function() {
+               $( this ).parent( '.projects-dropdown' ).toggleClass( 'open' );
+       });
+
+       $rows = $( '#contributors-list' ).find( '.contributors-list-box' );
+       $( '#contributors-list-search' ).on( 'input keyup',function() {
+               var words = this.value.toLowerCase().split( ' ' );
+
+               if ( '' === this.value.trim() ) {
+                       $rows.show();
+               } else {
+                       $rows.hide();
+                       $rows.filter( function( i, v ) {
+                               var $t = $(this).find( '.locale-name' );
+                               for ( var d = 0; d < words.length; ++d ) {
+                                       if ( $t.text().toLowerCase().indexOf( words[d] ) != -1 ) {
+                                               return true;
+                                       }
+                               }
+                               return false;
+                       }).show();
+               }
+       });
+});
+
+new Chartist.Line('.ct-chart-contributors', {
+       labels: <?php echo json_encode( $chart_data['labels'] ); ?>,
+       series: <?php echo json_encode( $chart_data['series'] ); ?>
+}, {
+       lineSmooth: Chartist.Interpolation.simple({
+               divisor: 2
+       }),
+       low: 0,
+       showPoint: false,
+       showLine: false,
+       showArea: true,
+       fullWidth: true,
+       axisX: {
+               showGrid: false,
+       },
+       axisY: {
+               onlyInteger: true,
+               offset: 30
+       },
+       chartPadding: {
+               right: 0,
+               left: 0
+       },
+       plugins: [
+               Chartist.plugins.legend()
+       ]
+}, [
+       ['screen and (max-width: 500px)', {
+               axisX: {
+                       labelInterpolationFnc: function( value, index ) {
+                               return index % 2 === 0 ? value : null;
+                       }
+               }
+       }]
+]);
+</script>
+
+<?php gp_tmpl_footer();
</ins></span></pre></div>
<a id="sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewprojectswppluginslanguagepacksphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins-language-packs.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins-language-packs.php                           (rev 0)
+++ sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins-language-packs.php     2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,74 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+$edit_link = gp_link_project_edit_get( $project, __( '(edit)' ) );
+gp_title( sprintf( __( '%s &lt; GlotPress' ), esc_html( $project->name ) ) );
+gp_breadcrumb( array(
+       gp_project_links_from_root( $project ),
+       'Language Packs',
+) );
+
+
+gp_enqueue_script( 'common' );
+
+gp_tmpl_header();
+?>
+
+<div class="project-header">
+       <p class="project-description"><?php echo apply_filters( 'project_description', $project->description, $project ); ?></p>
+
+       <div class="project-box">
+               <div class="project-box-header">
+                       <div class="project-icon">
+                               <?php echo $project->icon; ?>
+                       </div>
+
+                       <ul class="project-meta">
+                               <li class="project-name"><?php echo $project->name; ?> <?php echo $edit_link; ?></li>
+                       </ul>
+               </div>
+
+               <div class="project-box-footer">
+                       <ul class="projects-dropdown">
+                               <li><span>Language Packs</span>
+                                       <ul>
+                                               <li><a href="<?php echo gp_url_project( $project ); ?>">Projects</a></li>
+                                               <li><a href="<?php echo gp_url_join( gp_url_project( $project ), 'contributors' ); ?>">Contributors</a></li>
+                                       </ul>
+                               </li>
+                       </ul>
+               </div>
+       </div>
+</div>
+
+<div class="project-sub-page">
+       <h3>Language Packs</h3>
+
+       <p>Language packs are installed automatically if they are available. If no secent</p>
+
+       <?php
+       if ( isset( $language_packs->translations ) && $language_packs->translations ) {
+               echo '<ul class="language-packs-list">';
+               foreach ( $language_packs->translations as $language_pack ) {
+                       printf(
+                               '<li><strong>%s:</strong> Last updated %s for version %s (<a href="%s">zip</a>)</li>',
+                               $language_pack->english_name,
+                               $language_pack->updated,
+                               $language_pack->version,
+                               $language_pack->package
+                       );
+               }
+               echo '</ul>';
+       } else {
+               echo '<p>The are no language packs yet.</p>';
+       }
+       ?>
+</div>
+
+<script type="text/javascript">
+jQuery( function( $ ) {
+       $( '.projects-dropdown > li' ).on( 'click', function() {
+               $( this ).parent( '.projects-dropdown' ).toggleClass( 'open' );
+       });
+});
+</script>
+
+<?php gp_tmpl_footer();
</ins></span></pre></div>
<a id="sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewprojectswppluginsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins.php  2016-01-30 22:00:38 UTC (rev 2438)
+++ sites/trunk/translate.wordpress.org/public_html/gp-templates-new/projects-wp-plugins.php    2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -31,6 +31,17 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                <li class="project-name"><?php echo $project->name; ?> <?php echo $edit_link; ?></li>
</span><span class="cx" style="display: block; padding: 0 10px">                        </ul>
</span><span class="cx" style="display: block; padding: 0 10px">                </div>
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+               <div class="project-box-footer">
+                       <ul class="projects-dropdown">
+                               <li><span>Projects</span>
+                                       <ul>
+                                               <li><a href="<?php echo gp_url_join( gp_url_project( $project ), 'contributors' ); ?>">Contributors</a></li>
+                                               <li><a href="<?php echo gp_url_join( gp_url_project( $project ), 'language-packs' ); ?>">Language Packs</a></li>
+                                       </ul>
+                               </li>
+                       </ul>
+               </div>
</ins><span class="cx" style="display: block; padding: 0 10px">         </div>
</span><span class="cx" style="display: block; padding: 0 10px"> </div>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -127,6 +138,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return ( undefined !== sortValue ) ? sortValue : cellValue;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        });
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       $( '.projects-dropdown > li' ).on( 'click', function() {
+               $( this ).parent( '.projects-dropdown' ).toggleClass( 'open' );
+       });
</ins><span class="cx" style="display: block; padding: 0 10px"> });
</span><span class="cx" style="display: block; padding: 0 10px"> </script>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="sitestrunktranslatewordpressorgpublic_htmlgptemplatesnewstylecss"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/translate.wordpress.org/public_html/gp-templates-new/style.css</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/translate.wordpress.org/public_html/gp-templates-new/style.css        2016-01-30 22:00:38 UTC (rev 2438)
+++ sites/trunk/translate.wordpress.org/public_html/gp-templates-new/style.css  2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -733,6 +733,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">        background: #f9f9f9;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ul.projects-dropdown {
+       border-top: 1px solid #ccc;
+}
+
+.project-status-progress + .project-box-footer > ul.projects-dropdown {
+       border-top: 0;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> ul.projects-dropdown,
</span><span class="cx" style="display: block; padding: 0 10px"> ul.projects-dropdown ul {
</span><span class="cx" style="display: block; padding: 0 10px">        padding: 0;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -763,6 +771,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        -webkit-box-shadow: 1px 1px 1px 0 rgba(0,0,0,0.04);
</span><span class="cx" style="display: block; padding: 0 10px">        box-shadow: 1px 1px 1px 0 rgba(0,0,0,0.04);
</span><span class="cx" style="display: block; padding: 0 10px">        display: none;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        z-index: 10;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> ul.projects-dropdown.open ul {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1050,3 +1059,177 @@
</span><span class="cx" style="display: block; padding: 0 10px">        border: 1px solid #dfdfdf;
</span><span class="cx" style="display: block; padding: 0 10px">        border-top: none;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+.project-sub-page h3 {
+       margin: 30px 0 10px;
+       font-size: 1.2em;
+}
+
+.project-sub-page p {
+       margin-bottom: 1em;
+}
+
+ul.contributors-list,
+ul.language-packs-list {
+       margin: 30px 0;
+       padding: 0;
+       list-style: none;
+}
+
+.contributors-list li,
+.language-packs-list li {
+       margin: 10px 0 10px 30px;
+}
+
+.contributors-list li strong,
+.language-packs-list li strong {
+       display: block;
+       margin-left: -30px;
+}
+
+.ct-chart-contributors {
+       position: relative;
+}
+
+.ct-chart-contributors .ct-series-a .ct-area { /* current */
+       fill: #c1e1b9;
+       fill-opacity: .5;
+}
+
+.ct-chart-contributors .ct-series-b .ct-area { /* waiting */
+       fill: #ffe399;
+       fill-opacity: .5;
+}
+
+.ct-chart-contributors .ct-series-c .ct-area { /* rejected */
+       fill: #f1adad;
+       fill-opacity: .5;
+}
+
+ul.ct-legend {
+       position: absolute;
+       right: 0;
+       top: -15px;
+       padding: 0;
+       list-style: none;
+       z-index: 5;
+}
+
+.ct-legend li {
+       position: relative;
+       display: inline-block;
+       padding-left: 23px;
+       margin-right: 3px;
+       cursor: pointer;
+}
+
+.ct-legend li:before {
+       content: '';
+       position: absolute;
+       top: 2px;
+       left: 0;
+       width: 12px;
+       height: 12px;
+       border: 3px solid transparent;
+       border-radius: 2px;
+}
+
+.ct-legend li.inactive:before {
+       background: transparent;
+}
+
+.ct-legend .ct-series-0:before { /* current */
+       background-color: #c1e1b9;
+       border-color: #c1e1b9;
+}
+
+.ct-legend .ct-series-1:before { /* waiting */
+       background-color: #ffe399;
+       border-color: #ffe399;
+}
+
+.ct-legend .ct-series-2:before { /* rejected */
+       background-color: #f1adad;
+       border-color: #f1adad;
+}
+
+@media (min-width: 600px) {
+       .contributors-list {
+               -webkit-column-count: 2;
+               -webkit-column-gap: 3%;
+               -moz-column-count: 2;
+               -moz-column-gap: 3%;
+               column-count: 2;
+               column-gap: 3%;
+       }
+}
+
+.contributors-list-box {
+       display: inline-block;
+       width: 100%;
+       margin-bottom: 20px;
+       padding-bottom: 10px;
+       border: 1px solid #ccc;
+       background: #fff;
+       -webkit-box-sizing: border-box;
+       box-sizing: border-box;
+       -webkit-column-break-inside: avoid;
+       page-break-inside: avoid;
+       break-inside: avoid;
+}
+
+.contributors-list-box h4 {
+       position: relative;
+       display: block;
+       padding: 5px 8px;
+       margin-bottom: 10px;
+       background: #f9f9f9;
+       border-bottom: 1px solid #ccc;
+       font-size: 14px;
+}
+
+.contributors-list-box .contributors-count {
+       font-size: 11px;
+       color: #82878c;
+       padding-left: 3px;
+}
+
+.contributors-list-box .locale-code {
+       position: absolute;
+       top: 1px;
+       right: 5px;
+       font-size: 10px;
+       color: #b4b9be;
+}
+
+.contributors-list-box p {
+       margin-bottom: .5em;
+       padding: 0 8px;
+}
+
+.contributors-list-box p:last-child {
+       margin-bottom: 0;
+}
+
+.contributors-list-search {
+       margin: 15px 0 10px;
+       text-align: right;
+}
+
+.contributors-list-search input {
+       margin: 0;
+       padding: 2px 4px;
+       width: 280px;
+       font-size: 13px;
+       font-weight: 300;
+       border: 1px solid #ddd;
+       -webkit-box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 );
+       box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 );
+       background-color: #fff;
+       color: #333;
+       outline: none;
+       -webkit-border-radius: 0;
+       border-radius: 0;
+       -webkit-appearance: textfield;
+}
+
</ins></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggproutesrouteswppluginsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/routes/wp-plugins.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/routes/wp-plugins.php    2016-01-30 22:00:38 UTC (rev 2438)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/routes/wp-plugins.php      2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2,6 +2,11 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> class WPorg_GP_Route_WP_Plugins extends GP_Route {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Prints stats about sub-project of a specific project.
+        *
+        * @param string $project_slug Slug of a project.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function get_plugin_projects( $project_slug ) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wpdb;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -96,4 +101,245 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->tmpl( 'projects-wp-plugins', get_defined_vars() );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * Prints stats about contributors of a specific project.
+        *
+        * @param string $project_slug Slug of a project.
+        */
+       public function get_plugin_contributors( $project_slug ) {
+               global $wpdb;
+
+               $project_path = 'wp-plugins/' . $project_slug;
+               $project = GP::$project->by_path( $project_path );
+               if ( ! $project ) {
+                       return $this->die_with_404();
+               }
+
+               if ( function_exists( 'wporg_get_plugin_icon' ) ) {
+                       $project->icon = wporg_get_plugin_icon( $project->slug, 64 );
+               } else {
+                       $project->icon = '<div class="default-icon"><span class="dashicons dashicons-admin-plugins"></span></div>';
+               }
+
+               $contributors_by_locale = array();
+               $default_value = array(
+                       'count' => 0,
+                       'editors' => array(),
+                       'contributors' => array(),
+               );
+
+               $translation_editors = $wpdb->get_results( $wpdb->prepare( "
+                       SELECT
+                               `user_id`, `locale`
+                       FROM {$wpdb->wporg_translation_editors}
+                       WHERE `project_id` = %d
+               ", $project->id ), OBJECT );
+
+               foreach ( $translation_editors as $translation_editor ) {
+                       if ( ! isset( $contributors_by_locale[ $translation_editor->locale ] ) ) {
+                               $contributors_by_locale[ $translation_editor->locale ] = $default_value;
+                       }
+
+                       $user = get_user_by( 'id', $translation_editor->user_id );
+                       if ( ! $user ) {
+                               continue;
+                       }
+
+                       $contributors_by_locale[ $translation_editor->locale ]['editors'][ $translation_editor->user_id ] = (object) array(
+                               'nicename'     => $user->user_nicename,
+                               'display_name' => $this->_encode( $user->display_name ),
+                       );
+
+                       $contributors_by_locale[ $translation_editor->locale ]['count']++;
+               }
+
+               unset( $translation_editors );
+
+               $sub_projects = $wpdb->get_col( $wpdb->prepare( "
+                       SELECT id
+                       FROM {$wpdb->gp_projects}
+                       WHERE parent_project_id = %d
+               ", $project->id ) );
+
+               foreach ( $sub_projects as $sub_project ) {
+                       foreach( $this->get_translation_contributors_by_locale( $sub_project ) as $row ) {
+                               if ( ! isset( $contributors_by_locale[ $row->locale ] ) ) {
+                                       $contributors_by_locale[ $row->locale ] = $default_value;
+                               }
+
+                               if ( isset( $contributors_by_locale[ $row->locale ]['editors'][ $row->user_id ] ) ) {
+                                       continue;
+                               }
+
+                               if ( isset( $contributors_by_locale[ $row->locale ]['contributors'][ $row->user_id ] ) ) {
+                                       continue;
+                               }
+
+                               $user = get_user_by( 'id', $row->user_id );
+                               if ( ! $user ) {
+                                       continue;
+                               }
+
+                               $contributors_by_locale[ $row->locale ]['contributors'][ $row->user_id ] = (object) array(
+                                       'nicename'     => $user->user_nicename,
+                                       'display_name' => $this->_encode( $user->display_name ),
+                               );
+
+                               $contributors_by_locale[ $row->locale ]['count']++;
+                       }
+               }
+
+               $chart_data = $this->get_plugin_contributors_chart_data( $project->id, $sub_projects );
+
+               $this->tmpl( 'projects-wp-plugins-contributors', get_defined_vars() );
+       }
+
+       /**
+        * Generates the chart data for contributors activity.
+        *
+        * @param  int    $project_id   The ID of a project. Used to store data as meta.
+        * @param  array $sub_projects Optional. IDs of sub-projects.
+        * @return array The data to build a chart via Chartist.js.
+        */
+       private function get_plugin_contributors_chart_data( $project_id, $sub_projects = null ) {
+               $chart_data = gp_get_meta( 'wp-plugins', $project_id, 'contributors-chart-data' );
+               if ( $chart_data ) {
+                       if ( $chart_data['last_updated'] + DAY_IN_SECONDS > time() ) {
+                               return $chart_data;
+                       }
+               }
+
+               global $wpdb;
+
+               if ( ! $sub_projects ) {
+                       $sub_projects = $wpdb->get_col( $wpdb->prepare( "
+                               SELECT id
+                               FROM {$wpdb->gp_projects}
+                               WHERE parent_project_id = %d
+                       ", $$project_id ) );
+               }
+
+               $translation_set_ids = $wpdb->get_col( "
+                       SELECT `id` FROM {$wpdb->gp_translation_sets} WHERE `project_id` IN (" . implode( ',', $sub_projects ) . ")
+               " );
+
+               if ( ! $translation_set_ids ) {
+                       return array();
+               }
+
+               $date_begin = new DateTime( '-6 day' );
+               $date_end = new DateTime( 'NOW' );
+               $date_interval = new DateInterval( 'P1D' );
+               $date_range = new DatePeriod( $date_begin, $date_interval, $date_end );
+
+               $days = array();
+               foreach( $date_range as $date ) {
+                       $days[] = $date->format( 'Y-m-d' );
+               }
+               $days[] = $date_end->format( 'Y-m-d' );
+
+               $counts = $wpdb->get_results( "
+                       SELECT
+                               DATE(date_modified) AS `day`, COUNT(*) AS `count`, `status`
+                       FROM {$wpdb->gp_translations}
+                       WHERE
+                               `translation_set_id` IN (" . implode( ',', $translation_set_ids ) . ")
+                               AND date_modified >= ( CURDATE() - INTERVAL 7 DAY )
+                       GROUP BY `status`, `day`
+                       ORDER BY `day` DESC
+               " );
+
+               $status = array( 'current', 'waiting', 'rejected' );
+               $data = [];
+               foreach ( $days as $day ) {
+                       $data[ $day ] = array( 'current' => 0, 'waiting' => 0, 'rejected' => 0 );
+                       foreach ( $counts as $count ) {
+                               if ( $count->day !== $day || ! in_array( $count->status, $status ) ) {
+                                       continue;
+                               }
+
+                               $data[ $day ][ $count->status ] = (int) $count->count;
+                       }
+               }
+
+
+               $labels = array_keys( $data );
+               array_pop( $labels );
+               $labels[] = ''; // Don't show a label for today
+
+               $series = array();
+               $series_data = array_values( $data );
+               foreach ( $status as $stati ) {
+                       $series[] = (object) array(
+                               'name' => $stati,
+                               'data' => wp_list_pluck( $series_data, $stati ),
+                       );
+               }
+
+               $last_updated = time();
+               $chart_data = compact( 'labels', 'series', 'last_updated' );
+
+               gp_update_meta( $project_id, 'contributors-chart-data', $chart_data, 'wp-plugins' );
+
+               return $chart_data;
+       }
+
+       /**
+        * Prints stats about language packs of a specific project.
+        *
+        * @param string $project_slug Slug of a project.
+        */
+       public function get_plugin_language_packs( $project_slug ) {
+               $project_path = 'wp-plugins/' . $project_slug;
+               $project = GP::$project->by_path( $project_path );
+               if ( ! $project ) {
+                       return $this->die_with_404();
+               }
+
+               if ( function_exists( 'wporg_get_plugin_icon' ) ) {
+                       $project->icon = wporg_get_plugin_icon( $project->slug, 64 );
+               } else {
+                       $project->icon = '<div class="default-icon"><span class="dashicons dashicons-admin-plugins"></span></div>';
+               }
+
+               $http_context = stream_context_create( array(
+                       'http' => array(
+                               'user_agent' => 'WordPress.org Translate',
+                       ),
+               ) );
+               $json = file_get_contents( "https://api.wordpress.org/translations/plugins/1.0/?slug={$project_slug}", null, $http_context );
+               $language_packs = $json && '{' == $json[0] ? json_decode( $json ) : null;
+
+
+               $this->tmpl( 'projects-wp-plugins-language-packs', get_defined_vars() );
+       }
+
+       /**
+        * Retrieves translators of a specific project.
+        *
+        * @param int $project_id Project ID.
+        * @return object Translators of the project.
+        */
+       private function get_translation_contributors_by_locale( $project_id ) {
+               global $wpdb;
+
+               $sql = $wpdb->prepare( "
+                       SELECT ts.`locale`, ts.`slug` AS `locale_slug`, t.`user_id`
+                       FROM `{$wpdb->gp_translations}` t, `{$wpdb->gp_translation_sets}` ts
+                       WHERE t.`translation_set_id` = ts.`id`
+                           AND t.`user_id` IS NOT NULL AND t.`user_id` != 0
+                           AND t.`date_modified` > %s
+                           AND ts.`project_id` = %d
+                           AND t.`status` <> 'rejected'
+                       GROUP BY ts.`locale`, ts.`slug`, t.`user_id`
+               ", date( 'Y-m-d', time() - YEAR_IN_SECONDS ), $project_id );
+
+               return $wpdb->get_results( $sql );
+       }
+
+       private function _encode( $raw ) {
+               $raw = mb_convert_encoding( $raw, 'UTF-8', 'ASCII, JIS, UTF-8, Windows-1252, ISO-8859-1' );
+               return ent2ncr( htmlspecialchars_decode( htmlentities( $raw, ENT_NOQUOTES, 'UTF-8' ), ENT_NOQUOTES ) );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggprouteswporggproutesphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/wporg-gp-routes.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/wporg-gp-routes.php      2016-01-30 22:00:38 UTC (rev 2438)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-routes/wporg-gp-routes.php        2016-01-31 22:58:15 UTC (rev 2439)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -42,6 +42,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *  - /locale/$locale/$path/$path/$path
</span><span class="cx" style="display: block; padding: 0 10px">         *  - /stats/?
</span><span class="cx" style="display: block; padding: 0 10px">         *  - /projects/wp-plugins/$project
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *  - /projects/wp-plugins/$project/contributors
+        *  - /projects/wp-plugins/$project/language-packs
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        public function register_routes() {
</span><span class="cx" style="display: block; padding: 0 10px">                $request_uri = GP::$router->request_uri();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -70,6 +72,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        GP::$router->prepend( '/stats/?', array( 'WPorg_GP_Route_Stats', 'get_stats_overview' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        $project = '([^/]*)/?';
</span><span class="cx" style="display: block; padding: 0 10px">                        GP::$router->prepend( "/projects/wp-plugins/$project", array( 'WPorg_GP_Route_WP_Plugins', 'get_plugin_projects' ) );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        GP::$router->prepend( "/projects/wp-plugins/$project/contributors", array( 'WPorg_GP_Route_WP_Plugins', 'get_plugin_contributors' ) );
+                       GP::$router->prepend( "/projects/wp-plugins/$project/language-packs", array( 'WPorg_GP_Route_WP_Plugins', 'get_plugin_language_packs' ) );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre>
</div>
</div>

</body>
</html>