Giter VIP home page Giter VIP logo

trianglify's Introduction

Trianglify Build Status

Trianglify is a library that I wrote to generate nice SVG background images like this one:

Contents

๐Ÿ“ฆ Getting Trianglify
๐ŸŽ Quickstart
โš–๏ธ Licensing
๐Ÿ“– API
๐ŸŽจ Configuration

๐Ÿ“ฆ Getting Trianglify

You can grab Trianglify with npm/yarn (recommended):

npm install --save trianglify

Include it in your application via the unpkg CDN:

<script src='https://unpkg.com/trianglify@^4/dist/trianglify.bundle.js'></script>

Or download a .zip from the releases page.

๐ŸŽ Quickstart

Browsers

<script src='https://unpkg.com/trianglify@^4/dist/trianglify.bundle.js'></script>
<script>
  const pattern = trianglify({
    width: window.innerWidth,
    height: window.innerHeight
  })
  document.body.appendChild(pattern.toCanvas())
</script>

Node

const trianglify = require('trianglify')
const fs = require('fs')

const canvas = trianglify({
  width: 1920,
  height: 1080
}).toCanvas()

const file = fs.createWriteStream('trianglify.png')
canvas.createPNGStream().pipe(file)

You can see the examples/ folder for more usage examples.

The https://trianglify.io/ GUI is a good place to play around with the various configuration parameters and see their effect on the generated output, live.

โš–๏ธ Licensing

The source code of Trianglify is licensed under version 3 of the GNU General Public License (GPLv3). This means that any websites, apps, or other projects that include the Trianglify javascript library need to be released under a compatible open-source license. If you are interested in using Trianglify in a closed-source project, please email [email protected] to purchase a commercial license.

However, it's worth noting that you own the copyright to the output image files which you create using Trianglify, just like you own the copyright to an image created using something like GIMP. If you just want to use an image file that was generated using Trianglify in your project, and do not plan to distribute the Trianglify source code or compiled versions of it, you do not need to worry about the license restrictions described above.

๐Ÿ“– API

Trianglify is primarily used by calling the trianglify function, which returns a trianglify.Pattern object.

// load the library, either via a window global (browsers) or require call (node)
// in es-module environments, you can `import trianglify from 'trianglify'` as well
const trianglify = window.trianglify || require('trianglify')

const options = { height: 400, width: 600 }
const pattern = trianglify(options)
console.log(pattern instanceof trianglify.Pattern) // true

pattern

This object holds the generated geometry and colors, and exposes a number of methods for rendering this geometry to the DOM or a Canvas.

pattern.opts

Object containing the options used to generate the pattern.

pattern.points

The pseudo-random point grid used for the pattern geometry, in the following format:

[
  [x, y],
  [x, y],
  [x, y],
  // and so on...
]

pattern.polys

The array of colored polygons that make up the pattern, in the following format:

// {x, y} center of the first polygon in the pattern
pattern.polys[0].centroid

// [i, i, i] three indexes into the pattern.points array, 
// defining the shape corners
pattern.polys[0].vertexIndices

// Chroma.js color object defining the color of the polygon
pattern.polys[0].color

pattern.toSVG(destSVG?, svgOpts?)

Rendering function for SVG. In browser or browser-like (e.g. JSDOM) environments, this will return a SVGElement DOM node. In node environments, this will return a lightweight node tree structure that can be serialized to a valid SVG string using the toString() function.

If an existing svg element is passed as the destSVG, this function will render the pattern to the pre-existing element instead of creating a new one.

The svgOpts option allows for some svg-specific customizations to the output:

const svgOpts = {
  // Include or exclude the xmlns='http://www.w3.org/2000/svg' attribute on
  // the root <svg> tag. See https://github.com/qrohlf/trianglify/issues/41
  // for additional details on why this is sometimes important
  includeNamespace: true,
  // Controls how many decimals to round coordinate values to.
  // You can set this to -1 to disable rounding. Default is 1.
  coordinateDecimals: 1
}

pattern.toSVGTree(svgOpts?)

Alternate rendering function for SVG. Returns a lightweight node tree structure that can be seralized to a valid SVG string using the toString() function. In node environments, this is an alias for pattern.toSVG().

pattern.toCanvas(destCanvas?, canvasOpts?)

Rendering function for canvas. In browser and browser-like environments, returns a Canvas HTMLElement node. In node environments, this will return a node-canvas object which follows a superset of the Web Canvas API.

If an existing canvas element is passed as the destCanvas, this function will render the pattern to the pre-existing element instead of creating a new one.

To use this in a node.js environment, the optional dependency node-canvas needs to be installed as a dependency of your project npm install -save canvas.

The canvasOpts option allows for some canvas-specific customizations to the output:

const canvasOpts = {
  // determines how the canvas is rendered on high-DPI (aka "retina") devices.
  // - 'auto' will automatically render the canvas at the appropriate scale ratio
  //   for pixel-perfect display.
  // - a numeric value will render the canvas at that specific scale factor
  //   for example, 2.0 will render it at 2x resolution, wheras 0.5 will render
  //   at half resolution
  // - 'false' will disable scaling, and the canvas will be rendered at the 
  //   exact resolution specified by `width, height`
  scaling: 'auto',
  // if the canvas is rendered at a different resolution than the {width, height}
  // trianglify will apply some inline style attributes to scale it back to
  // the requested {width, height} options. Set applyCssScaling to false to 
  // disable this behavior.
  applyCssScaling: true
}

๐ŸŽจ Configuration

Trianglify is configured by an options object passed in as the only argument. The following option keys are supported, see below for a complete description of what each option does.

const defaultOptions = {
  width: 600,
  height: 400,
  cellSize: 75,
  variance: 0.75,
  seed: null,
  xColors: 'random',
  yColors: 'match',
  fill: true,
  palette: trianglify.colorbrewer,
  colorSpace: 'lab',
  colorFunction: trianglify.colorFunctions.interpolateLinear(0.5),
  strokeWidth: 0,
  points: null
}

width

Integer, defaults to 600. Specify the width in pixels of the pattern to generate.

height

Integer, defaults to 400. Specify the height in pixels of the pattern to generate.

cellSize

Integer, defaults to 75. Specify the size in pixels of the mesh used to generate triangles. Larger values will result in coarser patterns, smaller values will result in finer patterns. Note that very small values may dramatically increase the runtime of Trianglify.

variance

Decimal value between 0 and 1 (inclusive), defaults to 0.75. Specify the amount of randomness used when generating triangles. You may set this higher than 1, but doing so may result in patterns that include "gaps" at the edges.

seed

String, defaults to null. Seeds the random number generator to create repeatable patterns. When set to null, the RNG will be seeded with random values from the environment. An example usage would be passing in blog post titles as the seed to generate unique but consistient trianglify patterns for every post on a blog site.

xColors

False, string, or array of CSS-formatted colors, default is 'random'. Specify the color gradient used on the x axis.

Valid string values are 'random', or the name of a colorbrewer palette (i.e. 'YlGnBu' or 'RdBu'). When set to 'random', a gradient will be randomly selected from the colorbrewer library.

Valid array values should specify the color stops in any CSS format (i.e. ['#000000', '#4CAFE8', '#FFFFFF']).

yColors

False, string or array of CSS-formatted colors, default is 'match'. When set to 'match' the x-axis color gradient will be used on both axes. Otherwise, accepts the same options as xColors.

palette

The array of color combinations to pick from when using random for the xColors or yColors. See src/utils/colorbrewer.js for the format of this data.

colorSpace

String, defaults to 'lab'. Set the color space used for generating gradients. Supported values are rgb, hsv, hsl, hsi, lab and hcl. See this blog post for some background on why this matters.

colorFunction

Specify a custom function for coloring triangles, defaults to null. Accepts a function to override the standard gradient coloring, which is passed a variety of data about the pattern and each polygon and must return a Chroma.js color object.

See examples/color-function-example.html and src/utils/colorFunctions.js for more information about the built-in color functions, and how to write custom color functions.

fill

Boolean, defaults to true. Specifies whether the polygons generated by Trianglify should be filled in.

strokeWidth

Number, defaults to 0. Specify the width of the strokes used to outline the polygons. This can be used in conjunction with fill: false to generate weblike patterns.

points

Array of points ([x, y]) to triangulate, defaults to null. When not specified an array randomised points is generated filling the space. Points must be within the coordinate space defined by width and height. See examples/custom-points-example.html for a demonstration of how this option can be used to generate circular trianglify patterns.

trianglify's People

Contributors

alexnisnevich avatar allidylls avatar alssndro avatar arimgibson avatar dependabot[bot] avatar enzuguri avatar fmauneko avatar hosein2398 avatar jhwohlgemuth avatar kkirsche avatar mpreziuso avatar qrohlf avatar saucistophe avatar tdhsmith avatar timgates42 avatar tobaco avatar tomepsilon avatar vikpe avatar yansenlei avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

trianglify's Issues

v0.2.0 dependency on node-canvas problematic

Because v0.2.0 depends on node-canvas, I'm probably going to get some confused folks having trouble installing it because of the cairo dependency.

Possible solutions: make node-canvas an optional dependency, eliminate the node-canvas dependency (how?), include documentation on how to install cairo for node-canvas with the whole

PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig npm install

thing.

Need to think about how to handle this one.

Export to SVG

First of all: This looks like an amazing library! Thank you.

How would I export the result into SVG (so that I could import it into paper.js)?
Currently, if I try to run (on node.js):

// Trianglify
var pattern = trianglify({
        width: 300,
        height: 200
 });
var pattern_as_svg = pattern.svg({includeNamespace: true});

// Paper.js - Import SVG from string
var icon_item = paper.project.importSVG(pattern_as_svg); // end import SVG

I run into errors:

Error: TypeError: First argument to Node.prototype.insertBefore must be a Node

Rendering with limited radius

Is it possible to render angular shape instead of cropped rectangular canvas? I mean I'd like to render something like angular rectangle with shattered edges on transparent background not perfect rectangle. If it's not exposed but relatively quick patch I could probably patch it locally bc I'm a bit in rush.

RGB vs LAB color space

Right now the v0.2.0 branch is using the chroma-js LAB color space for interpolation. This issue is a TODO for me to do some comparisons between Trianglify output using d3 ordinal scales (which I think use RGB interpolation) versus output using LAB from the v0.2.0 branch.

Use trianglify with ionic2/typescript

I was trying to use this lib in a ionic2 project. Ionic2 uses angular2, so the language used is typescript.

I searched the types but couldn't found any. Can someone explain me how can I use this lib with typescript?

Thank you.

.canvas() API Performance

Code:

let Trianglify = require('trianglify');
let t = new Trianglify({
  width: 1200,
  height: 1200,
  cell_size: 150,
  variance: 15,
  x_colors: ['#000000', '#0C8DCE', '#FFFFFF']
});
console.time('perf');
let canvas = t.canvas();
console.timeEnd('perf');

3 performance result examples:

perf: 176.996ms
perf: 169.336ms
perf: 175.662ms

Any ideas for improving the performance of the .canvas() call?

Tests

It would be nice to have some actual test coverage in the form of Mocha unit tests. One of these weekends...

sanity check on cell_size

The current sanity checks for cell_size are not sufficient, it is still possible to create an infinite loop by passing in a string (i.e. "40" instead of 40) for cell_size.

Oops.

Animation?

Any chance for animation for this?

  • Movement
  • Color changes.

Create Seamless pattern

Is there any way to create a seamless pattern that can be tiled horizontally? What will I need to change? Thanks

[suggestion] Submission to cdnjs

That's a really awesome plugin you have made there, thanks for all the effort and the spotless documentation.

I am wondering if you are interested in submitting it to cdnjs? That will make your script CDN-hosted and widely available to those who are unable to host the script themselves.

Possible new feature: Color Controls

I'd really like the ability to modify the colors used when generating a new background, if this is something you could look at that would be great!

minimum custom D3 build for trianglify to depend on

Hi,

Really loving trianglify, thanks for making it! Do you know what the minimum build of D3 needs to be to make it work with trianglify? Right now I've identified the modules:

  • core
  • selection
  • scale
  • interpolate
  • geom

Would be a nice feature to list or even provide the minimum D3 build required to run trianglify, as the lib progresses I'd imagine the custom build may change.

Thanks,
/t

Responsive width

What is the easiest way to have this scale full screen and update on resize

Display as PNG

Hi, it would be really useful if you could make an example how to display as PNG in-page, something like <img src="">

Gaps between polygons

Due to antialiasing/SVG rendering/??? lines show up in between polygons on some browsers. Might be due to non-integer values for vertex coordinates - maybe rounding the coordinates to integer values would fix it? (It also would probably lower the size of the generated svg!)

Having cellpadding half of the cellsize breaks render

Thanks for an awesome library! Having issues with a certain options that breaks the render.

screen shot 2014-04-13 at 11 06 46

So the options I have that breaks on Chrome 33 for Mac OSX:
Noise: 0.0
Cellsize: 40
Cellpadding: 20

Clicking on "Click for new pattern" changes the colors but the rendering is still broken.

Is there a way to update settings on an object?

I want to change the cell_size property dynamically and redraw the canvas but don't want to regenerate as that will create a completely different design... is that possible?

In the demos on your site you seem to have called a setState function but I don't seem to have that...

jQuery

HTML
<canvas id="canvas"></canvas>
Javascript
pattern.canvas($('#canvas'))

Error:
Uncaught TypeError: o.setAttribute is not a function

Why not have support for jQuery?

Deprecate CDNJS published version

This will make it possible to remove the /dist folder from source control, and also prevent me from having to remember to version-bump the CDNJS link in the README and provide support for it.

See #68 for an example of issues caused by CDNJS (in this case, min/non-min version issues)

Any way to manipulate a PNG to change on refresh?

Hi, I want to know how to take a png with a set name (background.png) and have it change every time you reload. Is this possible? If it's not, here's another question for you: How would I be able to manipulate this so it's a "dynamic image" for something like a signature on a forum or whatever?

Thank you to anyone willing to give help ;)

v0.2.0 post-release checklist

  • check CDNJS to make sure it updated properly
  • push changes to NPM and update the docs page to pull in the latest NPM version
  • push changes to bower and make sure things are still behaving properly

React Native support

Probably taking a long shot here, but would anybody have an idea of what it would take to support this module in a React Native environment? I have used this module successfully in server-side node environments, and there are projects like rn-nodeify to make React Native act more like a server-side NodeJS environment by polyfilling some things.

I tried bringing this module into a React Native project and tried to use rn-nodeify and using jsdom to simulate the DOM, but to no avail. I ended up getting weird webpack errors. Wish I would've captured those errors to share here, but I have since backed that experiment out of my RN project and didn't stash it.

Alternatively, if anyone is aware of a similar module made for RN, I'd be open to using that. Thanks.

trianglify generated image as a div's background?

Hi,
is it possible to make trianglify generated image as a div's background? If yes, how? Code similar to:

<div class="fullscreen background" style="background-image:url('http://www.minimit.com/images/picjumbo.com_IMG_6648.jpg');" data-img-width="1600" data-img-height="1064">

Color generated

Hi guys, amazing script.
I'm attempting to use this as a design background, and all the colors like being a extension of the colors that the background has each generation.

Like Ubuntu Unity. If the background is black, the toolbar is dark, if it's green, the toolbar takes the most used color to achieve a better mix.

I imagine how to do this, the problem is.. How can I get the generated colors (or most used, or a color inbetween) the background has used?

How to include a "Download current background" link?

I'd like to know how to include a pattern created on the example website. When I click "Download current background" it give me a link with data:image/svg+xml;base64, as the beginning of the url. How would I include this as a background for an element?

Here's the exact one I want to use:

data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTM2NiIgaGVpZ2h0PSI2MTciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGc+PHBhdGggZD0iTS00OC42NTU1NzU0MTU3MTE1NSwtMjEuMzk3MTMyNzU2OTM4MTA2TC0xMDguNTMxMTU2MjA5MTU4NzUsNDMuMzQyMzIyMDQ4NTQyNDRMMTIwLjc0NjYyNDM5ODUxOTYzLDgzLjA5ODI1NTQzMDg4Mjg5WiIgZmlsbD0iI2M5MzEzOSIgc3Ryb2tlPSIjYzkzMTM5Ii8+PHBhdGggZD0iTS00OC42NTU1NzU0MTU3MTE1NSwtMjEuMzk3MTMyNzU2OTM4MTA2TDEyMC43NDY2MjQzOTg1MTk2Myw4My4wOTgyNTU0MzA4ODI4OUw1OS4zNTk3MDgxNjc1NDM0OTUsLTEyNC40OTQ5NTg2NDY5MTkwNloiIGZpbGw9IiNjNTFjMmUiIHN0cm9rZT0iI2M1MWMyZSIvPjxwYXRoIGQ9Ik01OS4zNTk3MDgxNjc1NDM0OTUsLTEyNC40OTQ5NTg2NDY5MTkwNkwxMjAuNzQ2NjI0Mzk4NTE5NjMsODMuMDk4MjU1NDMwODgyODlMMjEyLjQ1MzQ5Mjg2MDkyMTAyLC04MS40NjIzODg1MDE5ODI3M1oiIGZpbGw9IiNjYzJkMzIiIHN0cm9rZT0iI2NjMmQzMiIvPjxwYXRoIGQ9Ik01OS4zNTk3MDgxNjc1NDM0OTUsLTEyNC40OTQ5NTg2NDY5MTkwNkwyMTIuNDUzNDkyODYwOTIxMDIsLTgxLjQ2MjM4ODUwMTk4MjczTDM3OS4yOTg0OTM2NzQyODEsLTczLjE5NTc2NjgzMzkxNTYzWiIgZmlsbD0iI2NkNDMzMCIgc3Ryb2tlPSIjY2Q0MzMwIi8+PHBhdGggZD0iTTU5LjM1OTcwODE2NzU0MzQ5NSwtMTI0LjQ5NDk1ODY0NjkxOTA2TDM3OS4yOTg0OTM2NzQyODEsLTczLjE5NTc2NjgzMzkxNTYzTDU3MC4zNjg0NzI1MDIwODkzLC02OS43ODE0MzI3NTIzNTMwMVoiIGZpbGw9IiNkMzU5NDkiIHN0cm9rZT0iI2QzNTk0OSIvPjxwYXRoIGQ9Ik01OS4zNTk3MDgxNjc1NDM0OTUsLTEyNC40OTQ5NTg2NDY5MTkwNkw1NzAuMzY4NDcyNTAyMDg5MywtNjkuNzgxNDMyNzUyMzUzMDFMMTA2NS40MTc0MTU5NTAzODQ2LC0xMDguOTc1NDI4ODM3NzIyOTdaIiBmaWxsPSIjYzk3MDZlIiBzdHJva2U9IiNjOTcwNmUiLz48cGF0aCBkPSJNMjEyLjQ1MzQ5Mjg2MDkyMTAyLC04MS40NjIzODg1MDE5ODI3M0wxMjAuNzQ2NjI0Mzk4NTE5NjMsODMuMDk4MjU1NDMwODgyODlMMjYzLjE3MDYwMjQyMjk4MzE3LDY4LjUxMDgwMDg3OTc3Nzk2WiIgZmlsbD0iI2UzNWU0ZiIgc3Ryb2tlPSIjZTM1ZTRmIi8+PHBhdGggZD0iTTIxMi40NTM0OTI4NjA5MjEwMiwtODEuNDYyMzg4NTAxOTgyNzNMMjYzLjE3MDYwMjQyMjk4MzE3LDY4LjUxMDgwMDg3OTc3Nzk2TDM3OS4yOTg0OTM2NzQyODEsLTczLjE5NTc2NjgzMzkxNTYzWiIgZmlsbD0iI2RlNGY0ZSIgc3Ryb2tlPSIjZGU0ZjRlIi8+PHBhdGggZD0iTTM3OS4yOTg0OTM2NzQyODEsLTczLjE5NTc2NjgzMzkxNTYzTDI2My4xNzA2MDI0MjI5ODMxNyw2OC41MTA4MDA4Nzk3Nzc5NkwzNTguMTUyMzEzNDY0Nzc4OSwxMjAuMDM5NDU0NzkyMDE0MzFaIiBmaWxsPSIjZWQ4MjZmIiBzdHJva2U9IiNlZDgyNmYiLz48cGF0aCBkPSJNMzc5LjI5ODQ5MzY3NDI4MSwtNzMuMTk1NzY2ODMzOTE1NjNMMzU4LjE1MjMxMzQ2NDc3ODksMTIwLjAzOTQ1NDc5MjAxNDMxTDQ3MS43NDA2Mzg5ODAxMjc4NywyMS4xMzI3NDk5MjM4MDg0NTRaIiBmaWxsPSIjZWM4NDc5IiBzdHJva2U9IiNlYzg0NzkiLz48cGF0aCBkPSJNMzc5LjI5ODQ5MzY3NDI4MSwtNzMuMTk1NzY2ODMzOTE1NjNMNDcxLjc0MDYzODk4MDEyNzg3LDIxLjEzMjc0OTkyMzgwODQ1NEw1NzAuMzY4NDcyNTAyMDg5MywtNjkuNzgxNDMyNzUyMzUzMDFaIiBmaWxsPSIjZGU2ZTcyIiBzdHJva2U9IiNkZTZlNzIiLz48cGF0aCBkPSJNNTcwLjM2ODQ3MjUwMjA4OTMsLTY5Ljc4MTQzMjc1MjM1MzAxTDQ3MS43NDA2Mzg5ODAxMjc4NywyMS4xMzI3NDk5MjM4MDg0NTRMNjU0LjQ2NjY0NjIyMjc5NTgsLTI3LjIwNzc3MDQyNDM4ODg1NVoiIGZpbGw9IiNkOTcyN2YiIHN0cm9rZT0iI2Q5NzI3ZiIvPjxwYXRoIGQ9Ik01NzAuMzY4NDcyNTAyMDg5MywtNjkuNzgxNDMyNzUyMzUzMDFMNjU0LjQ2NjY0NjIyMjc5NTgsLTI3LjIwNzc3MDQyNDM4ODg1NUw4NDQuMjk1NjMzOTMxMjQ5NywtNjcuMTM1ODEyNjQ2NjY0NDNaIiBmaWxsPSIjYzY3MjgwIiBzdHJva2U9IiNjNjcyODAiLz48cGF0aCBkPSJNNTcwLjM2ODQ3MjUwMjA4OTMsLTY5Ljc4MTQzMjc1MjM1MzAxTDg0NC4yOTU2MzM5MzEyNDk3LC02Ny4xMzU4MTI2NDY2NjQ0M0w5NjIuMjc3MjIzNzU4MTYyNywtODkuNjE5OTg4MjMwOTM5MzNaIiBmaWxsPSIjYTk2NDcyIiBzdHJva2U9IiNhOTY0NzIiLz48cGF0aCBkPSJNNTcwLjM2ODQ3MjUwMjA4OTMsLTY5Ljc4MTQzMjc1MjM1MzAxTDk2Mi4yNzcyMjM3NTgxNjI3LC04OS42MTk5ODgyMzA5MzkzM0wxMDY1LjQxNzQxNTk1MDM4NDYsLTEwOC45NzU0Mjg4Mzc3MjI5N1oiIGZpbGw9IiM5NjViNmIiIHN0cm9rZT0iIzk2NWI2YiIvPjxwYXRoIGQ9Ik02NTQuNDY2NjQ2MjIyNzk1OCwtMjcuMjA3NzcwNDI0Mzg4ODU1TDQ3MS43NDA2Mzg5ODAxMjc4NywyMS4xMzI3NDk5MjM4MDg0NTRMNjg2LjM1NzcwOTEyODA5MjQsNzQuNDkwOTQ2Mjk5MTc2NThaIiBmaWxsPSIjZGY5MTkyIiBzdHJva2U9IiNkZjkxOTIiLz48cGF0aCBkPSJNNjU0LjQ2NjY0NjIyMjc5NTgsLTI3LjIwNzc3MDQyNDM4ODg1NUw2ODYuMzU3NzA5MTI4MDkyNCw3NC40OTA5NDYyOTkxNzY1OEw4NDQuMjk1NjMzOTMxMjQ5NywtNjcuMTM1ODEyNjQ2NjY0NDNaIiBmaWxsPSIjYzc3YThjIiBzdHJva2U9IiNjNzdhOGMiLz48cGF0aCBkPSJNODQ0LjI5NTYzMzkzMTI0OTcsLTY3LjEzNTgxMjY0NjY2NDQzTDY4Ni4zNTc3MDkxMjgwOTI0LDc0LjQ5MDk0NjI5OTE3NjU4TDg1OS4wNTQ4NDcxMjU3ODc4LDQ1LjQ1MzMwODIwMjczOTA0NVoiIGZpbGw9IiNiYzgwOGYiIHN0cm9rZT0iI2JjODA4ZiIvPjxwYXRoIGQ9Ik04NDQuMjk1NjMzOTMxMjQ5NywtNjcuMTM1ODEyNjQ2NjY0NDNMODU5LjA1NDg0NzEyNTc4NzgsNDUuNDUzMzA4MjAyNzM5MDQ1TDk1OC4wOTYwNDgxOTM1ODIyLDI5LjYwMTQwNjQyOTQ0Njk2WiIgZmlsbD0iI2E0NmI4NCIgc3Ryb2tlPSIjYTQ2Yjg0Ii8+PHBhdGggZD0iTTg0NC4yOTU2MzM5MzEyNDk3LC02Ny4xMzU4MTI2NDY2NjQ0M0w5NTguMDk2MDQ4MTkzNTgyMiwyOS42MDE0MDY0Mjk0NDY5Nkw5NjIuMjc3MjIzNzU4MTYyNywtODkuNjE5OTg4MjMwOTM5MzNaIiBmaWxsPSIjOTM1MzczIiBzdHJva2U9IiM5MzUzNzMiLz48cGF0aCBkPSJNOTYyLjI3NzIyMzc1ODE2MjcsLTg5LjYxOTk4ODIzMDkzOTMzTDk1OC4wOTYwNDgxOTM1ODIyLDI5LjYwMTQwNjQyOTQ0Njk2TDEwNjUuNDE3NDE1OTUwMzg0NiwtMTA4Ljk3NTQyODgzNzcyMjk3WiIgZmlsbD0iIzg1NDg2OSIgc3Ryb2tlPSIjODU0ODY5Ii8+PHBhdGggZD0iTTEwNjUuNDE3NDE1OTUwMzg0NiwtMTA4Ljk3NTQyODgzNzcyMjk3TDk1OC4wOTYwNDgxOTM1ODIyLDI5LjYwMTQwNjQyOTQ0Njk2TDExMjYuNDQ1MzY1ODA3NDc2NSwxMDAuNDM3Mzc0NzM3NzM0MloiIGZpbGw9IiM4YTU2NzkiIHN0cm9rZT0iIzhhNTY3OSIvPjxwYXRoIGQ9Ik0xMDY1LjQxNzQxNTk1MDM4NDYsLTEwOC45NzU0Mjg4Mzc3MjI5N0wxMTI2LjQ0NTM2NTgwNzQ3NjUsMTAwLjQzNzM3NDczNzczNDJMMTI3Ni4yNDg4NTA2ODY0NTUsMTguODAyMTYxNzAyMDk3MzcyWiIgZmlsbD0iIzc5NDQ2ZiIgc3Ryb2tlPSIjNzk0NDZmIi8+PHBhdGggZD0iTTEwNjUuNDE3NDE1OTUwMzg0NiwtMTA4Ljk3NTQyODgzNzcyMjk3TDEyNzYuMjQ4ODUwNjg2NDU1LDE4LjgwMjE2MTcwMjA5NzM3MkwxMzE1LjkzODYwMzI5MjA5ODYsLTk4LjkxMDUwODg4MzQ5OTM4WiIgZmlsbD0iIzYxMjc1NiIgc3Ryb2tlPSIjNjEyNzU2Ii8+PHBhdGggZD0iTTEzMTUuOTM4NjAzMjkyMDk4NiwtOTguOTEwNTA4ODgzNDk5MzhMMTI3Ni4yNDg4NTA2ODY0NTUsMTguODAyMTYxNzAyMDk3MzcyTDE0MzEuMjIxMzU5NzU1MjUxLC03Ni4zNDEzMTEyOTk0NTAxNVoiIGZpbGw9IiM1ZjE1NTAiIHN0cm9rZT0iIzVmMTU1MCIvPjxwYXRoIGQ9Ik0xMzE1LjkzODYwMzI5MjA5ODYsLTk4LjkxMDUwODg4MzQ5OTM4TDE0MzEuMjIxMzU5NzU1MjUxLC03Ni4zNDEzMTEyOTk0NTAxNUwxNTU3Ljc0MjUwODk1ODM4NDYsLTczLjg2MDc3NTcwMDgyNTUzWiIgZmlsbD0iIzU5MDgzZiIgc3Ryb2tlPSIjNTkwODNmIi8+PHBhdGggZD0iTTE0MzEuMjIxMzU5NzU1MjUxLC03Ni4zNDEzMTEyOTk0NTAxNUwxMjc2LjI0ODg1MDY4NjQ1NSwxOC44MDIxNjE3MDIwOTczNzJMMTQzMS43MTYzNTEzOTU2NTQ4LDg5LjI4NTc2OTI2NDY0OTE5WiIgZmlsbD0iIzZjMjg2MSIgc3Ryb2tlPSIjNmMyODYxIi8+PHBhdGggZD0iTTE0MzEuMjIxMzU5NzU1MjUxLC03Ni4zNDEzMTEyOTk0NTAxNUwxNDMxLjcxNjM1MTM5NTY1NDgsODkuMjg1NzY5MjY0NjQ5MTlMMTUxNi44NTMyNzgxNjgyODg5LDIyLjg2NjI1NjYxOTY5MTEyWiIgZmlsbD0iIzZkMWQ1YiIgc3Ryb2tlPSIjNmQxZDViIi8+PHBhdGggZD0iTTE0MzEuMjIxMzU5NzU1MjUxLC03Ni4zNDEzMTEyOTk0NTAxNUwxNTE2Ljg1MzI3ODE2ODI4ODksMjIuODY2MjU2NjE5NjkxMTJMMTU1Ny43NDI1MDg5NTgzODQ2LC03My44NjA3NzU3MDA4MjU1M1oiIGZpbGw9IiM2MTAwNDYiIHN0cm9rZT0iIzYxMDA0NiIvPjxwYXRoIGQ9Ik0xNTU3Ljc0MjUwODk1ODM4NDYsLTczLjg2MDc3NTcwMDgyNTUzTDE1MTYuODUzMjc4MTY4Mjg4OSwyMi44NjYyNTY2MTk2OTExMkwxNTQzLjQ4MjYwNzY1MTA4NCwxNjguNzQ5NTE0ODM2MTU0NVoiIGZpbGw9IiM3MjJhNWQiIHN0cm9rZT0iIzcyMmE1ZCIvPjxwYXRoIGQ9Ik0xNTU3Ljc0MjUwODk1ODM4NDYsLTczLjg2MDc3NTcwMDgyNTUzTDE1NDMuNDgyNjA3NjUxMDg0LDE2OC43NDk1MTQ4MzYxNTQ1TDE2MjYuMDQyMDAzNDU0MDE3Nyw1NzIuNTU3NDg2NTk0MTg2M1oiIGZpbGw9IiM3ZjgwYWQiIHN0cm9rZT0iIzdmODBhZCIvPjxwYXRoIGQ9Ik0tMTA4LjUzMTE1NjIwOTE1ODc1LDQzLjM0MjMyMjA0ODU0MjQ0TC0xMjAuMTMyMzQ5MDkxMTc1MjksNjczLjcxMjM4MzY5NTMyOTFMLTg1LjkyODQ3Nzc2Mjc2MTUzLDI0My44ODkyMTY4MDE2NjE5MloiIGZpbGw9IiNjMTdkODgiIHN0cm9rZT0iI2MxN2Q4OCIvPjxwYXRoIGQ9Ik0tMTA4LjUzMTE1NjIwOTE1ODc1LDQzLjM0MjMyMjA0ODU0MjQ0TC04NS45Mjg0Nzc3NjI3NjE1MywyNDMuODg5MjE2ODAxNjYxOTJMNzEuNTAyNTg4NDgxNjAxNjUsMjM5LjYzMTg0MTA5OTU4OFoiIGZpbGw9IiNkMzc0NzYiIHN0cm9rZT0iI2QzNzQ3NiIvPjxwYXRoIGQ9Ik0tMTA4LjUzMTE1NjIwOTE1ODc1LDQzLjM0MjMyMjA0ODU0MjQ0TDcxLjUwMjU4ODQ4MTYwMTY1LDIzOS42MzE4NDEwOTk1ODhMMTIwLjc0NjYyNDM5ODUxOTYzLDgzLjA5ODI1NTQzMDg4Mjg5WiIgZmlsbD0iI2RjNmU1ZiIgc3Ryb2tlPSIjZGM2ZTVmIi8+PHBhdGggZD0iTTEyMC43NDY2MjQzOTg1MTk2Myw4My4wOTgyNTU0MzA4ODI4OUw3MS41MDI1ODg0ODE2MDE2NSwyMzkuNjMxODQxMDk5NTg4TDE5OS4zOTg2MDUxMDk2NTcyLDE3MC4zMjczNzc4NTU2OTMzNloiIGZpbGw9IiNlYTlhODQiIHN0cm9rZT0iI2VhOWE4NCIvPjxwYXRoIGQ9Ik0xMjAuNzQ2NjI0Mzk4NTE5NjMsODMuMDk4MjU1NDMwODgyODlMMTk5LjM5ODYwNTEwOTY1NzIsMTcwLjMyNzM3Nzg1NTY5MzM2TDI2My4xNzA2MDI0MjI5ODMxNyw2OC41MTA4MDA4Nzk3Nzc5NloiIGZpbGw9IiNmMzkxNmEiIHN0cm9rZT0iI2YzOTE2YSIvPjxwYXRoIGQ9Ik0yNjMuMTcwNjAyNDIyOTgzMTcsNjguNTEwODAwODc5Nzc3OTZMMTk5LjM5ODYwNTEwOTY1NzIsMTcwLjMyNzM3Nzg1NTY5MzM2TDM1OC4xNTIzMTM0NjQ3Nzg5LDEyMC4wMzk0NTQ3OTIwMTQzMVoiIGZpbGw9IiNmOWE3ODAiIHN0cm9rZT0iI2Y5YTc4MCIvPjxwYXRoIGQ9Ik0zNTguMTUyMzEzNDY0Nzc4OSwxMjAuMDM5NDU0NzkyMDE0MzFMMTk5LjM5ODYwNTEwOTY1NzIsMTcwLjMyNzM3Nzg1NTY5MzM2TDQyNC43NjgzNjQ1MTY2MDkyNywyMTYuNzc0MzQ2NjE0OTczOVoiIGZpbGw9IiNmYWM2YTgiIHN0cm9rZT0iI2ZhYzZhOCIvPjxwYXRoIGQ9Ik0zNTguMTUyMzEzNDY0Nzc4OSwxMjAuMDM5NDU0NzkyMDE0MzFMNDI0Ljc2ODM2NDUxNjYwOTI3LDIxNi43NzQzNDY2MTQ5NzM5TDQ4MC42NjAzNzE2ODQ0NDc3LDIxMy41MTIyODg1MTA0MDU1NFoiIGZpbGw9IiNmZGRkYzYiIHN0cm9rZT0iI2ZkZGRjNiIvPjxwYXRoIGQ9Ik0zNTguMTUyMzEzNDY0Nzc4OSwxMjAuMDM5NDU0NzkyMDE0MzFMNDgwLjY2MDM3MTY4NDQ0NzcsMjEzLjUxMjI4ODUxMDQwNTU0TDQ3MS43NDA2Mzg5ODAxMjc4NywyMS4xMzI3NDk5MjM4MDg0NTRaIiBmaWxsPSIjZmVjM2EzIiBzdHJva2U9IiNmZWMzYTMiLz48cGF0aCBkPSJNNDcxLjc0MDYzODk4MDEyNzg3LDIxLjEzMjc0OTkyMzgwODQ1NEw0ODAuNjYwMzcxNjg0NDQ3NywyMTMuNTEyMjg4NTEwNDA1NTRMNjg2LjM1NzcwOTEyODA5MjQsNzQuNDkwOTQ2Mjk5MTc2NThaIiBmaWxsPSIjZjVjMmE2IiBzdHJva2U9IiNmNWMyYTYiLz48cGF0aCBkPSJNNjg2LjM1NzcwOTEyODA5MjQsNzQuNDkwOTQ2Mjk5MTc2NThMNDgwLjY2MDM3MTY4NDQ0NzcsMjEzLjUxMjI4ODUxMDQwNTU0TDY3MS40NTI4OTkwOTAxMzA1LDIxMS44NzkyMTk1NDU5NDA5N1oiIGZpbGw9IiNlZmRmZDEiIHN0cm9rZT0iI2VmZGZkMSIvPjxwYXRoIGQ9Ik02ODYuMzU3NzA5MTI4MDkyNCw3NC40OTA5NDYyOTkxNzY1OEw2NzEuNDUyODk5MDkwMTMwNSwyMTEuODc5MjE5NTQ1OTQwOTdMODU5LjA1NDg0NzEyNTc4NzgsNDUuNDUzMzA4MjAyNzM5MDQ1WiIgZmlsbD0iI2RiYzFiMyIgc3Ryb2tlPSIjZGJjMWIzIi8+PHBhdGggZD0iTTg1OS4wNTQ4NDcxMjU3ODc4LDQ1LjQ1MzMwODIwMjczOTA0NUw2NzEuNDUyODk5MDkwMTMwNSwyMTEuODc5MjE5NTQ1OTQwOTdMODU0LjE5Njc1MjA2OTQ3MzYsMjg0LjgxNzc1NTgxODk2MDZaIiBmaWxsPSIjY2VkOWQ4IiBzdHJva2U9IiNjZWQ5ZDgiLz48cGF0aCBkPSJNODU5LjA1NDg0NzEyNTc4NzgsNDUuNDUzMzA4MjAyNzM5MDQ1TDg1NC4xOTY3NTIwNjk0NzM2LDI4NC44MTc3NTU4MTg5NjA2TDk5MS40MDk3MzI5NDgwNDg0LDE3MS42ODQwNTI3MDgyNTQxNFoiIGZpbGw9IiNiNWM0YzgiIHN0cm9rZT0iI2I1YzRjOCIvPjxwYXRoIGQ9Ik04NTkuMDU0ODQ3MTI1Nzg3OCw0NS40NTMzMDgyMDI3MzkwNDVMOTkxLjQwOTczMjk0ODA0ODQsMTcxLjY4NDA1MjcwODI1NDE0TDk1OC4wOTYwNDgxOTM1ODIyLDI5LjYwMTQwNjQyOTQ0Njk2WiIgZmlsbD0iI2FiOTY5YSIgc3Ryb2tlPSIjYWI5NjlhIi8+PHBhdGggZD0iTTk1OC4wOTYwNDgxOTM1ODIyLDI5LjYwMTQwNjQyOTQ0Njk2TDk5MS40MDk3MzI5NDgwNDg0LDE3MS42ODQwNTI3MDgyNTQxNEwxMTI2LjQ0NTM2NTgwNzQ3NjUsMTAwLjQzNzM3NDczNzczNDJaIiBmaWxsPSIjYTE5NDk5IiBzdHJva2U9IiNhMTk0OTkiLz48cGF0aCBkPSJNMTEyNi40NDUzNjU4MDc0NzY1LDEwMC40MzczNzQ3Mzc3MzQyTDk5MS40MDk3MzI5NDgwNDg0LDE3MS42ODQwNTI3MDgyNTQxNEwxMDgyLjU0NzE1MzA0MDk5NSwyNzYuMDI4NDIzNzYxNjEwMloiIGZpbGw9IiM5YmIzYzUiIHN0cm9rZT0iIzliYjNjNSIvPjxwYXRoIGQ9Ik0xMTI2LjQ0NTM2NTgwNzQ3NjUsMTAwLjQzNzM3NDczNzczNDJMMTA4Mi41NDcxNTMwNDA5OTUsMjc2LjAyODQyMzc2MTYxMDJMMTMxNi4zNTAwODgxOTA3MjA1LDIyMy43MjYyNjMwMjAyMDExNVoiIGZpbGw9IiM4YmFiYzYiIHN0cm9rZT0iIzhiYWJjNiIvPjxwYXRoIGQ9Ik0xMTI2LjQ0NTM2NTgwNzQ3NjUsMTAwLjQzNzM3NDczNzczNDJMMTMxNi4zNTAwODgxOTA3MjA1LDIyMy43MjYyNjMwMjAyMDExNUwxMjc2LjI0ODg1MDY4NjQ1NSwxOC44MDIxNjE3MDIwOTczNzJaIiBmaWxsPSIjODE3YjhmIiBzdHJva2U9IiM4MTdiOGYiLz48cGF0aCBkPSJNMTI3Ni4yNDg4NTA2ODY0NTUsMTguODAyMTYxNzAyMDk3MzcyTDEzMTYuMzUwMDg4MTkwNzIwNSwyMjMuNzI2MjYzMDIwMjAxMTVMMTQzMS43MTYzNTEzOTU2NTQ4LDg5LjI4NTc2OTI2NDY0OTE5WiIgZmlsbD0iIzgwNmI4NiIgc3Ryb2tlPSIjODA2Yjg2Ii8+PHBhdGggZD0iTTE0MzEuNzE2MzUxMzk1NjU0OCw4OS4yODU3NjkyNjQ2NDkxOUwxMzE2LjM1MDA4ODE5MDcyMDUsMjIzLjcyNjI2MzAyMDIwMTE1TDE0NDcuOTU2NzYyMzYyMzUxNiwxOTYuMTg0NDg3MjMzNjQxNzZaIiBmaWxsPSIjODA3Y2E0IiBzdHJva2U9IiM4MDdjYTQiLz48cGF0aCBkPSJNMTQzMS43MTYzNTEzOTU2NTQ4LDg5LjI4NTc2OTI2NDY0OTE5TDE0NDcuOTU2NzYyMzYyMzUxNiwxOTYuMTg0NDg3MjMzNjQxNzZMMTU0My40ODI2MDc2NTEwODQsMTY4Ljc0OTUxNDgzNjE1NDVaIiBmaWxsPSIjODA2OTkzIiBzdHJva2U9IiM4MDY5OTMiLz48cGF0aCBkPSJNMTQzMS43MTYzNTEzOTU2NTQ4LDg5LjI4NTc2OTI2NDY0OTE5TDE1NDMuNDgyNjA3NjUxMDg0LDE2OC43NDk1MTQ4MzYxNTQ1TDE1MTYuODUzMjc4MTY4Mjg4OSwyMi44NjYyNTY2MTk2OTExMloiIGZpbGw9IiM3ZTRjNzIiIHN0cm9rZT0iIzdlNGM3MiIvPjxwYXRoIGQ9Ik0tODUuOTI4NDc3NzYyNzYxNTMsMjQzLjg4OTIxNjgwMTY2MTkyTC0xMjAuMTMyMzQ5MDkxMTc1MjksNjczLjcxMjM4MzY5NTMyOTFMLTIxLjk2NDYwMTUyMDM4Njg1LDQwNC44OTAxNDI5MTYyODk3M1oiIGZpbGw9IiM4MTU5ODIiIHN0cm9rZT0iIzgxNTk4MiIvPjxwYXRoIGQ9Ik0tODUuOTI4NDc3NzYyNzYxNTMsMjQzLjg4OTIxNjgwMTY2MTkyTC0yMS45NjQ2MDE1MjAzODY4NSw0MDQuODkwMTQyOTE2Mjg5NzNMNzUuMDEzNTAyMDYzNzMwMzcsMzQxLjA4OTM5OTYwMzMwNjdaIiBmaWxsPSIjYzc4NDkzIiBzdHJva2U9IiNjNzg0OTMiLz48cGF0aCBkPSJNLTg1LjkyODQ3Nzc2Mjc2MTUzLDI0My44ODkyMTY4MDE2NjE5Mkw3NS4wMTM1MDIwNjM3MzAzNywzNDEuMDg5Mzk5NjAzMzA2N0w3MS41MDI1ODg0ODE2MDE2NSwyMzkuNjMxODQxMDk5NTg4WiIgZmlsbD0iI2Q5OTE5NSIgc3Ryb2tlPSIjZDk5MTk1Ii8+PHBhdGggZD0iTTcxLjUwMjU4ODQ4MTYwMTY1LDIzOS42MzE4NDEwOTk1ODhMNzUuMDEzNTAyMDYzNzMwMzcsMzQxLjA4OTM5OTYwMzMwNjdMMTk5LjM5ODYwNTEwOTY1NzIsMTcwLjMyNzM3Nzg1NTY5MzM2WiIgZmlsbD0iI2U3YTk5ZSIgc3Ryb2tlPSIjZTdhOTllIi8+PHBhdGggZD0iTTE5OS4zOTg2MDUxMDk2NTcyLDE3MC4zMjczNzc4NTU2OTMzNkw3NS4wMTM1MDIwNjM3MzAzNywzNDEuMDg5Mzk5NjAzMzA2N0wyNjYuMDkyMDYyOTAyNDkwMDYsMzg2LjM5NjA1NzEyMTg5NzIzWiIgZmlsbD0iI2VlYjlhYSIgc3Ryb2tlPSIjZWViOWFhIi8+PHBhdGggZD0iTTE5OS4zOTg2MDUxMDk2NTcyLDE3MC4zMjczNzc4NTU2OTMzNkwyNjYuMDkyMDYyOTAyNDkwMDYsMzg2LjM5NjA1NzEyMTg5NzIzTDQyNC43NjgzNjQ1MTY2MDkyNywyMTYuNzc0MzQ2NjE0OTczOVoiIGZpbGw9IiNmOGQxYmMiIHN0cm9rZT0iI2Y4ZDFiYyIvPjxwYXRoIGQ9Ik00MjQuNzY4MzY0NTE2NjA5MjcsMjE2Ljc3NDM0NjYxNDk3MzlMMjY2LjA5MjA2MjkwMjQ5MDA2LDM4Ni4zOTYwNTcxMjE4OTcyM0w0MzAuNDYzODgwMTIyNzE3OCwzNzYuODc2MDEzMzAzMTk2OFoiIGZpbGw9IiNlZWRhZDEiIHN0cm9rZT0iI2VlZGFkMSIvPjxwYXRoIGQ9Ik00MjQuNzY4MzY0NTE2NjA5MjcsMjE2Ljc3NDM0NjYxNDk3MzlMNDMwLjQ2Mzg4MDEyMjcxNzgsMzc2Ljg3NjAxMzMwMzE5NjhMNDkzLjQ3MzA4NTQzMzYzMjE1LDMyMy4yNTgzOTI4NTQxOTI2NloiIGZpbGw9IiNmYmVjZTEiIHN0cm9rZT0iI2ZiZWNlMSIvPjxwYXRoIGQ9Ik00MjQuNzY4MzY0NTE2NjA5MjcsMjE2Ljc3NDM0NjYxNDk3MzlMNDkzLjQ3MzA4NTQzMzYzMjE1LDMyMy4yNTgzOTI4NTQxOTI2Nkw0ODAuNjYwMzcxNjg0NDQ3NywyMTMuNTEyMjg4NTEwNDA1NTRaIiBmaWxsPSIjZmNlZGRmIiBzdHJva2U9IiNmY2VkZGYiLz48cGF0aCBkPSJNNDgwLjY2MDM3MTY4NDQ0NzcsMjEzLjUxMjI4ODUxMDQwNTU0TDQ5My40NzMwODU0MzM2MzIxNSwzMjMuMjU4MzkyODU0MTkyNjZMNjcxLjQ1Mjg5OTA5MDEzMDUsMjExLjg3OTIxOTU0NTk0MDk3WiIgZmlsbD0iI2Y0ZWZlNyIgc3Ryb2tlPSIjZjRlZmU3Ii8+PHBhdGggZD0iTTY3MS40NTI4OTkwOTAxMzA1LDIxMS44NzkyMTk1NDU5NDA5N0w0OTMuNDczMDg1NDMzNjMyMTUsMzIzLjI1ODM5Mjg1NDE5MjY2TDYzMC40NDA3NjUwNTAwNjksNDA2LjI1ODIyOTI1ODE1WiIgZmlsbD0iI2VhZWZmMCIgc3Ryb2tlPSIjZWFlZmYwIi8+PHBhdGggZD0iTTY3MS40NTI4OTkwOTAxMzA1LDIxMS44NzkyMTk1NDU5NDA5N0w2MzAuNDQwNzY1MDUwMDY5LDQwNi4yNTgyMjkyNTgxNUw4MDkuNzg2NDI1MTkzOTU3MywzMzYuNjE5MDIyODMzNjU3WiIgZmlsbD0iI2RhZWRmNiIgc3Ryb2tlPSIjZGFlZGY2Ii8+PHBhdGggZD0iTTY3MS40NTI4OTkwOTAxMzA1LDIxMS44NzkyMTk1NDU5NDA5N0w4MDkuNzg2NDI1MTkzOTU3MywzMzYuNjE5MDIyODMzNjU3TDg1NC4xOTY3NTIwNjk0NzM2LDI4NC44MTc3NTU4MTg5NjA2WiIgZmlsbD0iI2QwZTZlZSIgc3Ryb2tlPSIjZDBlNmVlIi8+PHBhdGggZD0iTTg1NC4xOTY3NTIwNjk0NzM2LDI4NC44MTc3NTU4MTg5NjA2TDgwOS43ODY0MjUxOTM5NTczLDMzNi42MTkwMjI4MzM2NTdMOTQ1LjkyNzkxMTYzNjI0MzMsMzM1Ljk3MTczNjUwOTcwODNaIiBmaWxsPSIjYjNkN2VhIiBzdHJva2U9IiNiM2Q3ZWEiLz48cGF0aCBkPSJNODU0LjE5Njc1MjA2OTQ3MzYsMjg0LjgxNzc1NTgxODk2MDZMOTQ1LjkyNzkxMTYzNjI0MzMsMzM1Ljk3MTczNjUwOTcwODNMOTkxLjQwOTczMjk0ODA0ODQsMTcxLjY4NDA1MjcwODI1NDE0WiIgZmlsbD0iI2FmZDFlMiIgc3Ryb2tlPSIjYWZkMWUyIi8+PHBhdGggZD0iTTk5MS40MDk3MzI5NDgwNDg0LDE3MS42ODQwNTI3MDgyNTQxNEw5NDUuOTI3OTExNjM2MjQzMywzMzUuOTcxNzM2NTA5NzA4M0wxMDgyLjU0NzE1MzA0MDk5NSwyNzYuMDI4NDIzNzYxNjEwMloiIGZpbGw9IiNhM2M2ZGMiIHN0cm9rZT0iI2EzYzZkYyIvPjxwYXRoIGQ9Ik0xMDgyLjU0NzE1MzA0MDk5NSwyNzYuMDI4NDIzNzYxNjEwMkw5NDUuOTI3OTExNjM2MjQzMywzMzUuOTcxNzM2NTA5NzA4M0wxMTM5LjE5OTQwODYwNjA5MzEsMzYyLjE0MzgyNTA5ODg4NzI1WiIgZmlsbD0iIzkwYmFkYyIgc3Ryb2tlPSIjOTBiYWRjIi8+PHBhdGggZD0iTTEwODIuNTQ3MTUzMDQwOTk1LDI3Ni4wMjg0MjM3NjE2MTAyTDExMzkuMTk5NDA4NjA2MDkzMSwzNjIuMTQzODI1MDk4ODg3MjVMMTMxNi4zNTAwODgxOTA3MjA1LDIyMy43MjYyNjMwMjAyMDExNVoiIGZpbGw9IiM4N2FkZDEiIHN0cm9rZT0iIzg3YWRkMSIvPjxwYXRoIGQ9Ik0xMzE2LjM1MDA4ODE5MDcyMDUsMjIzLjcyNjI2MzAyMDIwMTE1TDExMzkuMTk5NDA4NjA2MDkzMSwzNjIuMTQzODI1MDk4ODg3MjVMMTI4Ni4zNDIzMjY2OTk1MTE3LDM5Mi40NDAwMTg3OTczOTAzNFoiIGZpbGw9IiM3MjllY2QiIHN0cm9rZT0iIzcyOWVjZCIvPjxwYXRoIGQ9Ik0xMzE2LjM1MDA4ODE5MDcyMDUsMjIzLjcyNjI2MzAyMDIwMTE1TDEyODYuMzQyMzI2Njk5NTExNywzOTIuNDQwMDE4Nzk3MzkwMzRMMTM5Ny4wNTE4MDI1MTQ5MzksMzY2LjM5ODEwOTAyMzkyMDk0WiIgZmlsbD0iIzcxOTFjNiIgc3Ryb2tlPSIjNzE5MWM2Ii8+PHBhdGggZD0iTTEzMTYuMzUwMDg4MTkwNzIwNSwyMjMuNzI2MjYzMDIwMjAxMTVMMTM5Ny4wNTE4MDI1MTQ5MzksMzY2LjM5ODEwOTAyMzkyMDk0TDE0NDcuOTU2NzYyMzYyMzUxNiwxOTYuMTg0NDg3MjMzNjQxNzZaIiBmaWxsPSIjN2U4ZWJmIiBzdHJva2U9IiM3ZThlYmYiLz48cGF0aCBkPSJNMTQ0Ny45NTY3NjIzNjIzNTE2LDE5Ni4xODQ0ODcyMzM2NDE3NkwxMzk3LjA1MTgwMjUxNDkzOSwzNjYuMzk4MTA5MDIzOTIwOTRMMTU2Mi41MzE5OTMzOTgyNTM1LDM3My4yMTQ2Nzk0MzY1MjFaIiBmaWxsPSIjN2I4MWJjIiBzdHJva2U9IiM3YjgxYmMiLz48cGF0aCBkPSJNMTQ0Ny45NTY3NjIzNjIzNTE2LDE5Ni4xODQ0ODcyMzM2NDE3NkwxNTYyLjUzMTk5MzM5ODI1MzUsMzczLjIxNDY3OTQzNjUyMUwxNTQzLjQ4MjYwNzY1MTA4NCwxNjguNzQ5NTE0ODM2MTU0NVoiIGZpbGw9IiM3ZjgwYjMiIHN0cm9rZT0iIzdmODBiMyIvPjxwYXRoIGQ9Ik0xNTQzLjQ4MjYwNzY1MTA4NCwxNjguNzQ5NTE0ODM2MTU0NUwxNTYyLjUzMTk5MzM5ODI1MzUsMzczLjIxNDY3OTQzNjUyMUwxNjI2LjA0MjAwMzQ1NDAxNzcsNTcyLjU1NzQ4NjU5NDE4NjNaIiBmaWxsPSIjNTY2ZmIyIiBzdHJva2U9IiM1NjZmYjIiLz48cGF0aCBkPSJNLTIxLjk2NDYwMTUyMDM4Njg1LDQwNC44OTAxNDI5MTYyODk3M0wtMTIwLjEzMjM0OTA5MTE3NTI5LDY3My43MTIzODM2OTUzMjkxTC0xOS4xNjkwODk5NzA5MTMxMiw1MjcuOTMwNDAyMzkyMzg0WiIgZmlsbD0iIzVkMzQ3MSIgc3Ryb2tlPSIjNWQzNDcxIi8+PHBhdGggZD0iTS0yMS45NjQ2MDE1MjAzODY4NSw0MDQuODkwMTQyOTE2Mjg5NzNMLTE5LjE2OTA4OTk3MDkxMzEyLDUyNy45MzA0MDIzOTIzODRMMTI3LjU3MDAzNjYyNDUxNjk5LDQ5NS45Mjg3MDE0NTIwNTYxNVoiIGZpbGw9IiM4MDVlODciIHN0cm9rZT0iIzgwNWU4NyIvPjxwYXRoIGQ9Ik0tMjEuOTY0NjAxNTIwMzg2ODUsNDA0Ljg5MDE0MjkxNjI4OTczTDEyNy41NzAwMzY2MjQ1MTY5OSw0OTUuOTI4NzAxNDUyMDU2MTVMNzUuMDEzNTAyMDYzNzMwMzcsMzQxLjA4OTM5OTYwMzMwNjdaIiBmaWxsPSIjOWU3Zjk4IiBzdHJva2U9IiM5ZTdmOTgiLz48cGF0aCBkPSJNNzUuMDEzNTAyMDYzNzMwMzcsMzQxLjA4OTM5OTYwMzMwNjdMMTI3LjU3MDAzNjYyNDUxNjk5LDQ5NS45Mjg3MDE0NTIwNTYxNUwyNjYuMDkyMDYyOTAyNDkwMDYsMzg2LjM5NjA1NzEyMTg5NzIzWiIgZmlsbD0iI2FlOTlhNCIgc3Ryb2tlPSIjYWU5OWE0Ii8+PHBhdGggZD0iTTI2Ni4wOTIwNjI5MDI0OTAwNiwzODYuMzk2MDU3MTIxODk3MjNMMTI3LjU3MDAzNjYyNDUxNjk5LDQ5NS45Mjg3MDE0NTIwNTYxNUwyODMuMTA5OTM0MzM5ODk3Miw0ODAuNTc4MDI2NjYwNjYwNFoiIGZpbGw9IiNhMzk5YTMiIHN0cm9rZT0iI2EzOTlhMyIvPjxwYXRoIGQ9Ik0yNjYuMDkyMDYyOTAyNDkwMDYsMzg2LjM5NjA1NzEyMTg5NzIzTDI4My4xMDk5MzQzMzk4OTcyLDQ4MC41NzgwMjY2NjA2NjA0TDM0OC42MzAyNDI1MzcxMjk3LDUwOS4wNTM0MTg0NTEwNDI1NVoiIGZpbGw9IiNhNGE0YjMiIHN0cm9rZT0iI2E0YTRiMyIvPjxwYXRoIGQ9Ik0yNjYuMDkyMDYyOTAyNDkwMDYsMzg2LjM5NjA1NzEyMTg5NzIzTDM0OC42MzAyNDI1MzcxMjk3LDUwOS4wNTM0MTg0NTEwNDI1NUw0MzAuNDYzODgwMTIyNzE3OCwzNzYuODc2MDEzMzAzMTk2OFoiIGZpbGw9IiNiNGJhYzUiIHN0cm9rZT0iI2I0YmFjNSIvPjxwYXRoIGQ9Ik00MzAuNDYzODgwMTIyNzE3OCwzNzYuODc2MDEzMzAzMTk2OEwzNDguNjMwMjQyNTM3MTI5Nyw1MDkuMDUzNDE4NDUxMDQyNTVMNTAxLjM1NTcwNTY0MTIxMzA0LDU3My41MDAwOTQxNDc3ODA0WiIgZmlsbD0iIzlkYjBjOSIgc3Ryb2tlPSIjOWRiMGM5Ii8+PHBhdGggZD0iTTQzMC40NjM4ODAxMjI3MTc4LDM3Ni44NzYwMTMzMDMxOTY4TDUwMS4zNTU3MDU2NDEyMTMwNCw1NzMuNTAwMDk0MTQ3NzgwNEw2MzAuNDQwNzY1MDUwMDY5LDQwNi4yNTgyMjkyNTgxNVoiIGZpbGw9IiNhNWM0ZGQiIHN0cm9rZT0iI2E1YzRkZCIvPjxwYXRoIGQ9Ik00MzAuNDYzODgwMTIyNzE3OCwzNzYuODc2MDEzMzAzMTk2OEw2MzAuNDQwNzY1MDUwMDY5LDQwNi4yNTgyMjkyNTgxNUw0OTMuNDczMDg1NDMzNjMyMTUsMzIzLjI1ODM5Mjg1NDE5MjY2WiIgZmlsbD0iI2QwZGZlNiIgc3Ryb2tlPSIjZDBkZmU2Ii8+PHBhdGggZD0iTTYzMC40NDA3NjUwNTAwNjksNDA2LjI1ODIyOTI1ODE1TDUwMS4zNTU3MDU2NDEyMTMwNCw1NzMuNTAwMDk0MTQ3NzgwNEw2OTcuNDA4NTIyNzQzMDkzNiw0NjcuNjE3MTMzMDg3NTE4NFoiIGZpbGw9IiM5MGJhZGYiIHN0cm9rZT0iIzkwYmFkZiIvPjxwYXRoIGQ9Ik02MzAuNDQwNzY1MDUwMDY5LDQwNi4yNTgyMjkyNTgxNUw2OTcuNDA4NTIyNzQzMDkzNiw0NjcuNjE3MTMzMDg3NTE4NEw4MDkuNzg2NDI1MTkzOTU3MywzMzYuNjE5MDIyODMzNjU3WiIgZmlsbD0iI2E0ZDVmMiIgc3Ryb2tlPSIjYTRkNWYyIi8+PHBhdGggZD0iTTgwOS43ODY0MjUxOTM5NTczLDMzNi42MTkwMjI4MzM2NTdMNjk3LjQwODUyMjc0MzA5MzYsNDY3LjYxNzEzMzA4NzUxODRMNzkwLjU2NjM4Nzg0NzY5MTEsNDczLjE4NTcxNTAyNDUxNzdaIiBmaWxsPSIjOGRjN2ViIiBzdHJva2U9IiM4ZGM3ZWIiLz48cGF0aCBkPSJNODA5Ljc4NjQyNTE5Mzk1NzMsMzM2LjYxOTAyMjgzMzY1N0w3OTAuNTY2Mzg3ODQ3NjkxMSw0NzMuMTg1NzE1MDI0NTE3N0w5NDUuOTI3OTExNjM2MjQzMywzMzUuOTcxNzM2NTA5NzA4M1oiIGZpbGw9IiM5MmM5ZTkiIHN0cm9rZT0iIzkyYzllOSIvPjxwYXRoIGQ9Ik05NDUuOTI3OTExNjM2MjQzMywzMzUuOTcxNzM2NTA5NzA4M0w3OTAuNTY2Mzg3ODQ3NjkxMSw0NzMuMTg1NzE1MDI0NTE3N0w5NDQuNDg0NjM3NDEwNDMzMiw1NjkuNjYwNTQ5NTczNTEyWiIgZmlsbD0iIzYyYThkYSIgc3Ryb2tlPSIjNjJhOGRhIi8+PHBhdGggZD0iTTk0NS45Mjc5MTE2MzYyNDMzLDMzNS45NzE3MzY1MDk3MDgzTDk0NC40ODQ2Mzc0MTA0MzMyLDU2OS42NjA1NDk1NzM1MTJMMTEzOS4xOTk0MDg2MDYwOTMxLDM2Mi4xNDM4MjUwOTg4ODcyNVoiIGZpbGw9IiM1ZGE2ZDkiIHN0cm9rZT0iIzVkYTZkOSIvPjxwYXRoIGQ9Ik0xMTM5LjE5OTQwODYwNjA5MzEsMzYyLjE0MzgyNTA5ODg4NzI1TDk0NC40ODQ2Mzc0MTA0MzMyLDU2OS42NjA1NDk1NzM1MTJMMTE3OS41MDQ1NzU5MDgzMjQxLDUzNy4xNzczOTMwNDUyMTY1WiIgZmlsbD0iIzM2ODFjNiIgc3Ryb2tlPSIjMzY4MWM2Ii8+PHBhdGggZD0iTTExMzkuMTk5NDA4NjA2MDkzMSwzNjIuMTQzODI1MDk4ODg3MjVMMTE3OS41MDQ1NzU5MDgzMjQxLDUzNy4xNzczOTMwNDUyMTY1TDEyNjQuNjk4MTA0MzM3ODE1LDQ3NS41NzEzNjI5MjQ4Njk2WiIgZmlsbD0iIzMzN2RjNCIgc3Ryb2tlPSIjMzM3ZGM0Ii8+PHBhdGggZD0iTTExMzkuMTk5NDA4NjA2MDkzMSwzNjIuMTQzODI1MDk4ODg3MjVMMTI2NC42OTgxMDQzMzc4MTUsNDc1LjU3MTM2MjkyNDg2OTZMMTI4Ni4zNDIzMjY2OTk1MTE3LDM5Mi40NDAwMTg3OTczOTAzNFoiIGZpbGw9IiM0MThiY2IiIHN0cm9rZT0iIzQxOGJjYiIvPjxwYXRoIGQ9Ik0xMjg2LjM0MjMyNjY5OTUxMTcsMzkyLjQ0MDAxODc5NzM5MDM0TDEyNjQuNjk4MTA0MzM3ODE1LDQ3NS41NzEzNjI5MjQ4Njk2TDEzOTcuMDUxODAyNTE0OTM5LDM2Ni4zOTgxMDkwMjM5MjA5NFoiIGZpbGw9IiMzZTdlYzQiIHN0cm9rZT0iIzNlN2VjNCIvPjxwYXRoIGQ9Ik0xMzk3LjA1MTgwMjUxNDkzOSwzNjYuMzk4MTA5MDIzOTIwOTRMMTI2NC42OTgxMDQzMzc4MTUsNDc1LjU3MTM2MjkyNDg2OTZMMTQ0OS44NDU4NzMxMDc3MDQsNTI3LjQ5MTgxMzM5Njg5MTlaIiBmaWxsPSIjMmI2NGI3IiBzdHJva2U9IiMyYjY0YjciLz48cGF0aCBkPSJNMTM5Ny4wNTE4MDI1MTQ5MzksMzY2LjM5ODEwOTAyMzkyMDk0TDE0NDkuODQ1ODczMTA3NzA0LDUyNy40OTE4MTMzOTY4OTE5TDE1NjIuNTMxOTkzMzk4MjUzNSwzNzMuMjE0Njc5NDM2NTIxWiIgZmlsbD0iIzM5NjJiNiIgc3Ryb2tlPSIjMzk2MmI2Ii8+PHBhdGggZD0iTTE1NjIuNTMxOTkzMzk4MjUzNSwzNzMuMjE0Njc5NDM2NTIxTDE0NDkuODQ1ODczMTA3NzA0LDUyNy40OTE4MTMzOTY4OTE5TDE2MjYuMDQyMDAzNDU0MDE3Nyw1NzIuNTU3NDg2NTk0MTg2M1oiIGZpbGw9IiMxZDQ2YTIiIHN0cm9rZT0iIzFkNDZhMiIvPjxwYXRoIGQ9Ik0tMTkuMTY5MDg5OTcwOTEzMTIsNTI3LjkzMDQwMjM5MjM4NEwtMTIwLjEzMjM0OTA5MTE3NTI5LDY3My43MTIzODM2OTUzMjkxTDEwMy43NTgwMDM5OTE2MjQ4Myw2OTAuMzg1Njc3MDcyNzc3MloiIGZpbGw9IiM1ODE4NjMiIHN0cm9rZT0iIzU4MTg2MyIvPjxwYXRoIGQ9Ik0tMTkuMTY5MDg5OTcwOTEzMTIsNTI3LjkzMDQwMjM5MjM4NEwxMDMuNzU4MDAzOTkxNjI0ODMsNjkwLjM4NTY3NzA3Mjc3NzJMMTI3LjU3MDAzNjYyNDUxNjk5LDQ5NS45Mjg3MDE0NTIwNTYxNVoiIGZpbGw9IiM2MzQ0NzkiIHN0cm9rZT0iIzYzNDQ3OSIvPjxwYXRoIGQ9Ik0xMjcuNTcwMDM2NjI0NTE2OTksNDk1LjkyODcwMTQ1MjA1NjE1TDEwMy43NTgwMDM5OTE2MjQ4Myw2OTAuMzg1Njc3MDcyNzc3MkwyMjAuMzU3NTA2MjYyMzc2MTUsNjUxLjQ3MDA0Nzk4NjU2MDRaIiBmaWxsPSIjNmQ0ODdhIiBzdHJva2U9IiM2ZDQ4N2EiLz48cGF0aCBkPSJNMTI3LjU3MDAzNjYyNDUxNjk5LDQ5NS45Mjg3MDE0NTIwNTYxNUwyMjAuMzU3NTA2MjYyMzc2MTUsNjUxLjQ3MDA0Nzk4NjU2MDRMMjgzLjEwOTkzNDMzOTg5NzIsNDgwLjU3ODAyNjY2MDY2MDRaIiBmaWxsPSIjN2Q3MjkwIiBzdHJva2U9IiM3ZDcyOTAiLz48cGF0aCBkPSJNMjgzLjEwOTkzNDMzOTg5NzIsNDgwLjU3ODAyNjY2MDY2MDRMMjIwLjM1NzUwNjI2MjM3NjE1LDY1MS40NzAwNDc5ODY1NjA0TDM0OC42MzAyNDI1MzcxMjk3LDUwOS4wNTM0MTg0NTEwNDI1NVoiIGZpbGw9IiM3ZjdmOWUiIHN0cm9rZT0iIzdmN2Y5ZSIvPjxwYXRoIGQ9Ik0zNDguNjMwMjQyNTM3MTI5Nyw1MDkuMDUzNDE4NDUxMDQyNTVMMjIwLjM1NzUwNjI2MjM3NjE1LDY1MS40NzAwNDc5ODY1NjA0TDM3NC4yNDU2NDMyMjU1MTgxLDYzMi4xMjk0MTI0Mzg3NjI1WiIgZmlsbD0iIzdhNzE5YSIgc3Ryb2tlPSIjN2E3MTlhIi8+PHBhdGggZD0iTTM0OC42MzAyNDI1MzcxMjk3LDUwOS4wNTM0MTg0NTEwNDI1NUwzNzQuMjQ1NjQzMjI1NTE4MSw2MzIuMTI5NDEyNDM4NzYyNUw1MDEuMzU1NzA1NjQxMjEzMDQsNTczLjUwMDA5NDE0Nzc4MDRaIiBmaWxsPSIjN2Q4YmI0IiBzdHJva2U9IiM3ZDhiYjQiLz48cGF0aCBkPSJNNTAxLjM1NTcwNTY0MTIxMzA0LDU3My41MDAwOTQxNDc3ODA0TDM3NC4yNDU2NDMyMjU1MTgxLDYzMi4xMjk0MTI0Mzg3NjI1TDUwMC4yMjU0NjE4NzkwMzY0Niw2NjEuNTIxMTY4MDU1MTM1N1oiIGZpbGw9IiM3ZTgwYjUiIHN0cm9rZT0iIzdlODBiNSIvPjxwYXRoIGQ9Ik01MDEuMzU1NzA1NjQxMjEzMDQsNTczLjUwMDA5NDE0Nzc4MDRMNTAwLjIyNTQ2MTg3OTAzNjQ2LDY2MS41MjExNjgwNTUxMzU3TDY0MC4wNzg2MDMyMzg1ODAxLDYyNS4wMzcxMzQyODI4NDkxWiIgZmlsbD0iIzc2ODNiZCIgc3Ryb2tlPSIjNzY4M2JkIi8+PHBhdGggZD0iTTUwMS4zNTU3MDU2NDEyMTMwNCw1NzMuNTAwMDk0MTQ3NzgwNEw2NDAuMDc4NjAzMjM4NTgwMSw2MjUuMDM3MTM0MjgyODQ5MUw2OTcuNDA4NTIyNzQzMDkzNiw0NjcuNjE3MTMzMDg3NTE4NFoiIGZpbGw9IiM3MjllZDAiIHN0cm9rZT0iIzcyOWVkMCIvPjxwYXRoIGQ9Ik02OTcuNDA4NTIyNzQzMDkzNiw0NjcuNjE3MTMzMDg3NTE4NEw2NDAuMDc4NjAzMjM4NTgwMSw2MjUuMDM3MTM0MjgyODQ5MUw3OTAuNTY2Mzg3ODQ3NjkxMSw0NzMuMTg1NzE1MDI0NTE3N1oiIGZpbGw9IiM3M2E5ZGIiIHN0cm9rZT0iIzczYTlkYiIvPjxwYXRoIGQ9Ik03OTAuNTY2Mzg3ODQ3NjkxMSw0NzMuMTg1NzE1MDI0NTE3N0w2NDAuMDc4NjAzMjM4NTgwMSw2MjUuMDM3MTM0MjgyODQ5MUw4NTIuODU4ODIyNDI5NDcyMiw2NDcuODczMzQzNDczNjM3OFoiIGZpbGw9IiM1NzhhY2IiIHN0cm9rZT0iIzU3OGFjYiIvPjxwYXRoIGQ9Ik03OTAuNTY2Mzg3ODQ3NjkxMSw0NzMuMTg1NzE1MDI0NTE3N0w4NTIuODU4ODIyNDI5NDcyMiw2NDcuODczMzQzNDczNjM3OEw5NDQuNDg0NjM3NDEwNDMzMiw1NjkuNjYwNTQ5NTczNTEyWiIgZmlsbD0iIzNmODVjOCIgc3Ryb2tlPSIjM2Y4NWM4Ii8+PHBhdGggZD0iTTk0NC40ODQ2Mzc0MTA0MzMyLDU2OS42NjA1NDk1NzM1MTJMODUyLjg1ODgyMjQyOTQ3MjIsNjQ3Ljg3MzM0MzQ3MzYzNzhMMTAxNy44NTAzODg3ODQ0NTU1LDcxMS43NDkxMDk2NzcwNzQzWiIgZmlsbD0iIzJmNWJiMiIgc3Ryb2tlPSIjMmY1YmIyIi8+PHBhdGggZD0iTTk0NC40ODQ2Mzc0MTA0MzMyLDU2OS42NjA1NDk1NzM1MTJMMTAxNy44NTAzODg3ODQ0NTU1LDcxMS43NDkxMDk2NzcwNzQzTDEwNzEuNTYzMDkyMzIyMTEsNjQwLjQwMjM0MTg2MzY3NzZaIiBmaWxsPSIjMjQ1MWFkIiBzdHJva2U9IiMyNDUxYWQiLz48cGF0aCBkPSJNOTQ0LjQ4NDYzNzQxMDQzMzIsNTY5LjY2MDU0OTU3MzUxMkwxMDcxLjU2MzA5MjMyMjExLDY0MC40MDIzNDE4NjM2Nzc2TDExNzkuNTA0NTc1OTA4MzI0MSw1MzcuMTc3MzkzMDQ1MjE2NVoiIGZpbGw9IiMxYzYwYjQiIHN0cm9rZT0iIzFjNjBiNCIvPjxwYXRoIGQ9Ik0xMTc5LjUwNDU3NTkwODMyNDEsNTM3LjE3NzM5MzA0NTIxNjVMMTA3MS41NjMwOTIzMjIxMSw2NDAuNDAyMzQxODYzNjc3NkwxMzA0Ljc1MTQ4NzIxNDcwNzQsNzMwLjk1ODM3NjM3MzQ2MzhaIiBmaWxsPSIjMGEzOWEwIiBzdHJva2U9IiMwYTM5YTAiLz48cGF0aCBkPSJNMTE3OS41MDQ1NzU5MDgzMjQxLDUzNy4xNzczOTMwNDUyMTY1TDEzMDQuNzUxNDg3MjE0NzA3NCw3MzAuOTU4Mzc2MzczNDYzOEwxMjY0LjY5ODEwNDMzNzgxNSw0NzUuNTcxMzYyOTI0ODY5NloiIGZpbGw9IiMwMDQ1YTciIHN0cm9rZT0iIzAwNDVhNyIvPjxwYXRoIGQ9Ik0xMjY0LjY5ODEwNDMzNzgxNSw0NzUuNTcxMzYyOTI0ODY5NkwxMzA0Ljc1MTQ4NzIxNDcwNzQsNzMwLjk1ODM3NjM3MzQ2MzhMMTQ0My40ODcyNTQ2NjM3NTMyLDY2OC4xNDUzNzk1ODk3MzM5WiIgZmlsbD0iIzAwMjc5NyIgc3Ryb2tlPSIjMDAyNzk3Ii8+PHBhdGggZD0iTTEyNjQuNjk4MTA0MzM3ODE1LDQ3NS41NzEzNjI5MjQ4Njk2TDE0NDMuNDg3MjU0NjYzNzUzMiw2NjguMTQ1Mzc5NTg5NzMzOUwxNDQ5Ljg0NTg3MzEwNzcwNCw1MjcuNDkxODEzMzk2ODkxOVoiIGZpbGw9IiMwMjNiYTEiIHN0cm9rZT0iIzAyM2JhMSIvPjxwYXRoIGQ9Ik0xNDQ5Ljg0NTg3MzEwNzcwNCw1MjcuNDkxODEzMzk2ODkxOUwxNDQzLjQ4NzI1NDY2Mzc1MzIsNjY4LjE0NTM3OTU4OTczMzlMMTYyNi4wNDIwMDM0NTQwMTc3LDU3Mi41NTc0ODY1OTQxODYzWiIgZmlsbD0iIzAwMWY5MSIgc3Ryb2tlPSIjMDAxZjkxIi8+PHBhdGggZD0iTTE2MjYuMDQyMDAzNDU0MDE3Nyw1NzIuNTU3NDg2NTk0MTg2M0wxNDQzLjQ4NzI1NDY2Mzc1MzIsNjY4LjE0NTM3OTU4OTczMzlMMTU4Ny43MDk4MzE3NTI0MjMsNjk5LjIyODQyODcwMzY1NjJaIiBmaWxsPSIjMDAwOTgyIiBzdHJva2U9IiMwMDA5ODIiLz48cGF0aCBkPSJNMTYyNi4wNDIwMDM0NTQwMTc3LDU3Mi41NTc0ODY1OTQxODYzTDE1ODcuNzA5ODMxNzUyNDIzLDY5OS4yMjg0Mjg3MDM2NTYyTDE1NTIuOTYxMDQ5NDg0MjQ4Miw4NDMuMDU4MzgxNTY5NTEzNFoiIGZpbGw9IiMwMDAwNzMiIHN0cm9rZT0iIzAwMDA3MyIvPjxwYXRoIGQ9Ik0tMTIwLjEzMjM0OTA5MTE3NTI5LDY3My43MTIzODM2OTUzMjkxTC0xMDMuNzYzODEyNzM1MDUxMzIsODEzLjk0ODMwODAwNjg5MzJMOTAuNjA2MDI1ODI5MzI5MTEsNzcyLjA0NzQ1MTUxMDU2MjdaIiBmaWxsPSIjNTMwMTQ2IiBzdHJva2U9IiM1MzAxNDYiLz48cGF0aCBkPSJNLTEyMC4xMzIzNDkwOTExNzUyOSw2NzMuNzEyMzgzNjk1MzI5MUw5MC42MDYwMjU4MjkzMjkxMSw3NzIuMDQ3NDUxNTEwNTYyN0wxMDMuNzU4MDAzOTkxNjI0ODMsNjkwLjM4NTY3NzA3Mjc3NzJaIiBmaWxsPSIjNWQxMjU3IiBzdHJva2U9IiM1ZDEyNTciLz48cGF0aCBkPSJNMTAzLjc1ODAwMzk5MTYyNDgzLDY5MC4zODU2NzcwNzI3NzcyTDkwLjYwNjAyNTgyOTMyOTExLDc3Mi4wNDc0NTE1MTA1NjI3TDIxOS45Mjc4NjU1MDIyMDIwOCw3NzkuMzg2MzMxNDgxNjEyNFoiIGZpbGw9IiM2YzJmNWQiIHN0cm9rZT0iIzZjMmY1ZCIvPjxwYXRoIGQ9Ik0xMDMuNzU4MDAzOTkxNjI0ODMsNjkwLjM4NTY3NzA3Mjc3NzJMMjE5LjkyNzg2NTUwMjIwMjA4LDc3OS4zODYzMzE0ODE2MTI0TDIyMC4zNTc1MDYyNjIzNzYxNSw2NTEuNDcwMDQ3OTg2NTYwNFoiIGZpbGw9IiM3MjNhNmIiIHN0cm9rZT0iIzcyM2E2YiIvPjxwYXRoIGQ9Ik0yMjAuMzU3NTA2MjYyMzc2MTUsNjUxLjQ3MDA0Nzk4NjU2MDRMMjE5LjkyNzg2NTUwMjIwMjA4LDc3OS4zODYzMzE0ODE2MTI0TDM3NC4yNDU2NDMyMjU1MTgxLDYzMi4xMjk0MTI0Mzg3NjI1WiIgZmlsbD0iIzc5NGQ3ZSIgc3Ryb2tlPSIjNzk0ZDdlIi8+PHBhdGggZD0iTTM3NC4yNDU2NDMyMjU1MTgxLDYzMi4xMjk0MTI0Mzg3NjI1TDIxOS45Mjc4NjU1MDIyMDIwOCw3NzkuMzg2MzMxNDgxNjEyNEw0MTAuNTA0NDY3MTc0MzE1NjYsODYyLjMxNjE0ODk4OTUxMTZaIiBmaWxsPSIjN2I1ODdlIiBzdHJva2U9IiM3YjU4N2UiLz48cGF0aCBkPSJNMzc0LjI0NTY0MzIyNTUxODEsNjMyLjEyOTQxMjQzODc2MjVMNDEwLjUwNDQ2NzE3NDMxNTY2LDg2Mi4zMTYxNDg5ODk1MTE2TDUwMC4yMjU0NjE4NzkwMzY0Niw2NjEuNTIxMTY4MDU1MTM1N1oiIGZpbGw9IiM3ZTY5OWEiIHN0cm9rZT0iIzdlNjk5YSIvPjxwYXRoIGQ9Ik01MDAuMjI1NDYxODc5MDM2NDYsNjYxLjUyMTE2ODA1NTEzNTdMNDEwLjUwNDQ2NzE3NDMxNTY2LDg2Mi4zMTYxNDg5ODk1MTE2TDUzOS43NTc1NjM2MDEzOTIxLDc5MC44NzAxNTA1ODMzNDc1WiIgZmlsbD0iIzdjNmU5OCIgc3Ryb2tlPSIjN2M2ZTk4Ii8+PHBhdGggZD0iTTUwMC4yMjU0NjE4NzkwMzY0Niw2NjEuNTIxMTY4MDU1MTM1N0w1MzkuNzU3NTYzNjAxMzkyMSw3OTAuODcwMTUwNTgzMzQ3NUw2MzMuMDIxMjcxNjEwNzU2LDc3OC4zMzMzODM2MTY1Mjc0WiIgZmlsbD0iIzc1NzBhNCIgc3Ryb2tlPSIjNzU3MGE0Ii8+PHBhdGggZD0iTTUwMC4yMjU0NjE4NzkwMzY0Niw2NjEuNTIxMTY4MDU1MTM1N0w2MzMuMDIxMjcxNjEwNzU2LDc3OC4zMzMzODM2MTY1Mjc0TDY0MC4wNzg2MDMyMzg1ODAxLDYyNS4wMzcxMzQyODI4NDkxWiIgZmlsbD0iIzcyNzFiMyIgc3Ryb2tlPSIjNzI3MWIzIi8+PHBhdGggZD0iTTY0MC4wNzg2MDMyMzg1ODAxLDYyNS4wMzcxMzQyODI4NDkxTDYzMy4wMjEyNzE2MTA3NTYsNzc4LjMzMzM4MzYxNjUyNzRMODUyLjg1ODgyMjQyOTQ3MjIsNjQ3Ljg3MzM0MzQ3MzYzNzhaIiBmaWxsPSIjNjM2ZmJhIiBzdHJva2U9IiM2MzZmYmEiLz48cGF0aCBkPSJNODUyLjg1ODgyMjQyOTQ3MjIsNjQ3Ljg3MzM0MzQ3MzYzNzhMNjMzLjAyMTI3MTYxMDc1Niw3NzguMzMzMzgzNjE2NTI3NEw4MzAuMTg2MDE5NzE2MzA5OSw4NTMuNTkxNTc3NzU2MTU3WiIgZmlsbD0iIzU0NjdhNiIgc3Ryb2tlPSIjNTQ2N2E2Ii8+PHBhdGggZD0iTTg1Mi44NTg4MjI0Mjk0NzIyLDY0Ny44NzMzNDM0NzM2Mzc4TDgzMC4xODYwMTk3MTYzMDk5LDg1My41OTE1Nzc3NTYxNTdMMTAxNy44NTAzODg3ODQ0NTU1LDcxMS43NDkxMDk2NzcwNzQzWiIgZmlsbD0iIzM2NTZhMiIgc3Ryb2tlPSIjMzY1NmEyIi8+PHBhdGggZD0iTTEwMTcuODUwMzg4Nzg0NDU1NSw3MTEuNzQ5MTA5Njc3MDc0M0w4MzAuMTg2MDE5NzE2MzA5OSw4NTMuNTkxNTc3NzU2MTU3TDEwMTkuODc5NDkzMTEzMDIzOCw4MjAuOTYwOTY5NTgxOTM0M1oiIGZpbGw9IiMyZDRlOTEiIHN0cm9rZT0iIzJkNGU5MSIvPjxwYXRoIGQ9Ik0xMDE3Ljg1MDM4ODc4NDQ1NTUsNzExLjc0OTEwOTY3NzA3NDNMMTAxOS44Nzk0OTMxMTMwMjM4LDgyMC45NjA5Njk1ODE5MzQzTDEwODEuNjczMTgxMDAwMTkyMiw4MjkuNDU0ODUxMTA5OTQyNloiIGZpbGw9IiMyMDQyOGMiIHN0cm9rZT0iIzIwNDI4YyIvPjxwYXRoIGQ9Ik0xMDE3Ljg1MDM4ODc4NDQ1NTUsNzExLjc0OTEwOTY3NzA3NDNMMTA4MS42NzMxODEwMDAxOTIyLDgyOS40NTQ4NTExMDk5NDI2TDEwNzEuNTYzMDkyMzIyMTEsNjQwLjQwMjM0MTg2MzY3NzZaIiBmaWxsPSIjMWQzZjk3IiBzdHJva2U9IiMxZDNmOTciLz48cGF0aCBkPSJNMTA3MS41NjMwOTIzMjIxMSw2NDAuNDAyMzQxODYzNjc3NkwxMDgxLjY3MzE4MTAwMDE5MjIsODI5LjQ1NDg1MTEwOTk0MjZMMTI2OC4zODE4NzQzNjEwMDQ1LDgxMS4wMTYyODA2MzM4ODkxWiIgZmlsbD0iIzEwMzM4YSIgc3Ryb2tlPSIjMTAzMzhhIi8+PHBhdGggZD0iTTEwNzEuNTYzMDkyMzIyMTEsNjQwLjQwMjM0MTg2MzY3NzZMMTI2OC4zODE4NzQzNjEwMDQ1LDgxMS4wMTYyODA2MzM4ODkxTDEzMDQuNzUxNDg3MjE0NzA3NCw3MzAuOTU4Mzc2MzczNDYzOFoiIGZpbGw9IiMwNTI4OGIiIHN0cm9rZT0iIzA1Mjg4YiIvPjxwYXRoIGQ9Ik0xMzA0Ljc1MTQ4NzIxNDcwNzQsNzMwLjk1ODM3NjM3MzQ2MzhMMTI2OC4zODE4NzQzNjEwMDQ1LDgxMS4wMTYyODA2MzM4ODkxTDE0NzQuNDMzODQyOTEwMTAxNSw3OTguMzgyMTAzMzMxMDM5MloiIGZpbGw9IiMwMDE0NzYiIHN0cm9rZT0iIzAwMTQ3NiIvPjxwYXRoIGQ9Ik0xMzA0Ljc1MTQ4NzIxNDcwNzQsNzMwLjk1ODM3NjM3MzQ2MzhMMTQ3NC40MzM4NDI5MTAxMDE1LDc5OC4zODIxMDMzMzEwMzkyTDE0NDMuNDg3MjU0NjYzNzUzMiw2NjguMTQ1Mzc5NTg5NzMzOVoiIGZpbGw9IiMwMDBjN2MiIHN0cm9rZT0iIzAwMGM3YyIvPjxwYXRoIGQ9Ik0xNDQzLjQ4NzI1NDY2Mzc1MzIsNjY4LjE0NTM3OTU4OTczMzlMMTQ3NC40MzM4NDI5MTAxMDE1LDc5OC4zODIxMDMzMzEwMzkyTDE1ODcuNzA5ODMxNzUyNDIzLDY5OS4yMjg0Mjg3MDM2NTYyWiIgZmlsbD0iIzAwMDA3NiIgc3Ryb2tlPSIjMDAwMDc2Ii8+PHBhdGggZD0iTTE1ODcuNzA5ODMxNzUyNDIzLDY5OS4yMjg0Mjg3MDM2NTYyTDE0NzQuNDMzODQyOTEwMTAxNSw3OTguMzgyMTAzMzMxMDM5MkwxNTUyLjk2MTA0OTQ4NDI0ODIsODQzLjA1ODM4MTU2OTUxMzRaIiBmaWxsPSIjMDAwMDY4IiBzdHJva2U9IiMwMDAwNjgiLz48cGF0aCBkPSJNLTEwMy43NjM4MTI3MzUwNTEzMiw4MTMuOTQ4MzA4MDA2ODkzMkw0MTAuNTA0NDY3MTc0MzE1NjYsODYyLjMxNjE0ODk4OTUxMTZMOTAuNjA2MDI1ODI5MzI5MTEsNzcyLjA0NzQ1MTUxMDU2MjdaIiBmaWxsPSIjNmIyZDRmIiBzdHJva2U9IiM2YjJkNGYiLz48cGF0aCBkPSJNOTAuNjA2MDI1ODI5MzI5MTEsNzcyLjA0NzQ1MTUxMDU2MjdMNDEwLjUwNDQ2NzE3NDMxNTY2LDg2Mi4zMTYxNDg5ODk1MTE2TDIxOS45Mjc4NjU1MDIyMDIwOCw3NzkuMzg2MzMxNDgxNjEyNFoiIGZpbGw9IiM3ODQ4NWYiIHN0cm9rZT0iIzc4NDg1ZiIvPjxwYXRoIGQ9Ik00MTAuNTA0NDY3MTc0MzE1NjYsODYyLjMxNjE0ODk4OTUxMTZMMTU1Mi45NjEwNDk0ODQyNDgyLDg0My4wNTgzODE1Njk1MTM0TDgzMC4xODYwMTk3MTYzMDk5LDg1My41OTE1Nzc3NTYxNTdaIiBmaWxsPSIjMzE1Mjg4IiBzdHJva2U9IiMzMTUyODgiLz48cGF0aCBkPSJNNDEwLjUwNDQ2NzE3NDMxNTY2LDg2Mi4zMTYxNDg5ODk1MTE2TDgzMC4xODYwMTk3MTYzMDk5LDg1My41OTE1Nzc3NTYxNTdMNTM5Ljc1NzU2MzYwMTM5MjEsNzkwLjg3MDE1MDU4MzM0NzVaIiBmaWxsPSIjNzE3MTk1IiBzdHJva2U9IiM3MTcxOTUiLz48cGF0aCBkPSJNNTM5Ljc1NzU2MzYwMTM5MjEsNzkwLjg3MDE1MDU4MzM0NzVMODMwLjE4NjAxOTcxNjMwOTksODUzLjU5MTU3Nzc1NjE1N0w2MzMuMDIxMjcxNjEwNzU2LDc3OC4zMzMzODM2MTY1Mjc0WiIgZmlsbD0iIzZhNzJhMSIgc3Ryb2tlPSIjNmE3MmExIi8+PHBhdGggZD0iTTgzMC4xODYwMTk3MTYzMDk5LDg1My41OTE1Nzc3NTYxNTdMMTU1Mi45NjEwNDk0ODQyNDgyLDg0My4wNTgzODE1Njk1MTM0TDEwODEuNjczMTgxMDAwMTkyMiw4MjkuNDU0ODUxMTA5OTQyNloiIGZpbGw9IiMwZTMxNzgiIHN0cm9rZT0iIzBlMzE3OCIvPjxwYXRoIGQ9Ik04MzAuMTg2MDE5NzE2MzA5OSw4NTMuNTkxNTc3NzU2MTU3TDEwODEuNjczMTgxMDAwMTkyMiw4MjkuNDU0ODUxMTA5OTQyNkwxMDE5Ljg3OTQ5MzExMzAyMzgsODIwLjk2MDk2OTU4MTkzNDNaIiBmaWxsPSIjMmE0Yjg4IiBzdHJva2U9IiMyYTRiODgiLz48cGF0aCBkPSJNMTA4MS42NzMxODEwMDAxOTIyLDgyOS40NTQ4NTExMDk5NDI2TDE1NTIuOTYxMDQ5NDg0MjQ4Miw4NDMuMDU4MzgxNTY5NTEzNEwxMjY4LjM4MTg3NDM2MTAwNDUsODExLjAxNjI4MDYzMzg4OTFaIiBmaWxsPSIjMDAxYjcwIiBzdHJva2U9IiMwMDFiNzAiLz48cGF0aCBkPSJNMTI2OC4zODE4NzQzNjEwMDQ1LDgxMS4wMTYyODA2MzM4ODkxTDE1NTIuOTYxMDQ5NDg0MjQ4Miw4NDMuMDU4MzgxNTY5NTEzNEwxNDc0LjQzMzg0MjkxMDEwMTUsNzk4LjM4MjEwMzMzMTAzOTJaIiBmaWxsPSIjMDAwODY4IiBzdHJva2U9IiMwMDA4NjgiLz48L2c+PC9zdmc+

Proposal: Node.js friendly version

With node.js friendly version one could use this to generate backgrounds on server side or on desktop.

D3 is already in NPM so it should not be that hard.

I tried to do it myself but I do not really now node.js that well

Typos in example

Love the package! Minor typo on the landing page example missing two commas:

var defaults = {
cell_size: 75,
variance: 0.75,
x_colors: 'random',
y_colors: 'match_x'
palette: Trianglify.colorbrewer,
color_space: 'lab'
color_function: false,
stroke_width: 1.51,
width: 600,
height: 400,
seed: null
};

should be:

var defaults = {
cell_size: 75,
variance: 0.75,
x_colors: 'random',
y_colors: 'match_x',
palette: Trianglify.colorbrewer,
color_space: 'lab',
color_function: false,
stroke_width: 1.51,
width: 600,
height: 400,
seed: null
};

make option names more consistent

Currently, the options are a mix of camel case, snake case, and lowercase names. I'm planning on standardizing all of them for 1.0 (and hopefully using a less hackish way to merge the options with their defaults).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.