Sales Report (React)

This example shows an advanced implementation of the Calendar Group Strategy in which a sales report is presented on a calendar in order to visualize daily sales.

This example uses React.

This example shows an advanced implementation of the Calendar Group Strategy in which a sales report is presented on a calendar in order to visualize daily sales. Group information can by displayed by clicking the details button. To learn how the Calendar Group Strategy works, see the Calendar demo. This demo shows three key things: calendargrouping.js and GridLayout.js are used together to create a calendar view. Group headers are used to show data summaries. A dialog is used to show group data.
<!DOCTYPE html> <html lang="en"> <head> <base href="/dataviewsjs/demos/en/sample/DataViews/Calendar/SalesReport/react/" /> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="keywords" content="grouping, calendar" /> <meta name="description" content="This example shows an advanced implementation of the Calendar Group Strategy in which a sales report is presented on a calendar in order to visualize daily sales." /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sales Report | Data Views | GrapeCity DataViewsJS React Demos</title> <link href="/dataviewsjs/demos/node_modules/normalize.css/normalize.css" rel="stylesheet" type="text/css" /> <link href="/dataviewsjs/demos/static/css/base.css" rel="stylesheet" type="text/css" /> <link href="/dataviewsjs/demos/static/css/bootstrap-snippet.min.css" rel="stylesheet" type="text/css" /> <link href="/dataviewsjs/demos/static/dataviews/gc.dataviews.core.min.css" rel="stylesheet" type="text/css" /> <link href="/dataviewsjs/demos/static/dataviews/gc.dataviews.grid.min.css" rel="stylesheet" type="text/css" /> <link href="/dataviewsjs/demos/static/dataviews/gc.dataviews.calendar.min.css" rel="stylesheet" type="text/css" /> <link href="styles.css" rel="stylesheet" type="text/css" /> <script src="/dataviewsjs/demos/static/js/app-polyfills.min.js" type="text/javascript"></script> <script type="text/javascript"> window.process = { env: { NODE_ENV: 'production', USE_NPM: false, USE_CDN: false, SITE_ROOT: '/dataviewsjs/demos', FRAMEWORK: 'react', DVJS_LICENSE_KEY: 'GrapeCity-Internal-Use-Only,GrapeCity,E195393772372914#B0KV4Ny56Vr5Wb7w6buJWeGRWb4NXUnNXRlFWWXl6SoN5VzVkYslmQ95WTENkTllVQzd4QhpEejdDNJZlWOp6M7oERQNnWspkaaB5QMhnR7dmUkRnVJR4L5cHTKNkZZdDbRBzZIxmSSR6NrpVQaVUQrBlc6ImYysSd4UlUEZGbw2kMl9UOzQVMId6ZXtUN83CO5RzaZt4VY5kM5pkUGpUUUV7UExUeGpUdTV5dFJ4bPhTc8pGeXJHWrkzNlFzdUtWTr5UQDdVckdGbSVUWr2yMPNzctZVRxEEW9lEbsZHUKJnVaRXT5p6Z0tWMqJGVrtSTIZnaopGSWZXbVNjY0hzQB5We4dnUr3ER8MkI0IyUiwiIGZUNwEkN5MjI0ICSiwSM9ETO6czNygTM0IicfJye#4Xfd5nIZRVV9IiOiMkIsISM6ByUKN7dllmVhRXYEJiOi8kI1tlOiQmcQJCLiEDMzATOwAyMwgDMwIDMyIiOiQncDJCLiI7au26YukHdpNWZwFmcn9iKsAnau26YukHdpNWZwFmcn9iKs86Yu46bj9Se4l6YlBXYydmLqwSbvNmL6VGZ9RXajVGchJ7ZuoCLt36YukHdpNWZwFmcn9iKiojIz5GRiwiI9RXaDVGchJ7RiojIh94QiwSZ5JHd0ICb6VkIsICNxkjM7MjM7czM9MTN9EjI0ICZJJye0ICRiwiI34zZN3yZGNlUnJDe5wkQPVlcBh7SppmUNBlU9dWS7J4ZMRES4MTZkRXTxM7Uq5GeQdHcyFHVup6dQd6ZDpEVrNDSh9kbNdzZrl4dwdPQ', SJS_LICENSE_KEY: '*.grapecity.com,E613631884219496#B0qRgJHWSJ7NyBlc8BjNMRHW7g7YldTZXFTQuFnW4hVOCplVSlVV09ERlhEZuVTVKlTazE4Q6VGSw2CdWZUWSVmbjVXbrxmWFVWR8ZzQro7U84WMGdlbuVHb73kS5kjUTN4NvFVdLdXWVR4Nox6Z7UUSysEcXJEMsN6bDN4TxMDVwVmWBRzKxhkTzAXTaJmdD3CRFJTd8R4R6M5RklWa6oUaLlXMwR4R8ZUdtRWVxUUaQh6VXNDdEhlZ7FHR6QXTPJTVvkWcyZnbSdHRtZHcYF6TKN4axYGcZNjTDF7TvFTTr24VqZjVHVjcLd7QkRmdNxkI0IyUiwiI5gDOEF4QGVjI0ICSiwiMzkTO9kTOyMTM0IicfJye35XX3JSSGljQiojIDJCLiITMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiI4MDMyEDMgkDM8ATOxAjMiojI4J7QiwiIt36YukHdpNWZwFmcn9iKiojIz5GRiwiIj9WagkHdpNUZwFmcHJiOiEmTDJCLlVnc4pjIsZXRiwiI6kDN9EjM4gDOxMjNzEjNiojIklkIs4XZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TQ72kNBV6YXpXdGxGWxdHcol4MyUGUHJVbQVHRx44Sw84YxRkS4QnZadDNmhWWxV5QxFlTlZEbBJ5N8gUNQlDb7J6Kl36YHVnb4NGN92UMFdlNORFU8VDSaFlQSVlS4EHTrA5Ohh', }, }; </script> <script src="/dataviewsjs/demos/node_modules/lodash/lodash.min.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/static/js/license.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/node_modules/systemjs/dist/system.js" type="text/javascript"></script> <script src="systemjs.config.js" type="text/javascript"></script> </head> <body class="theme-default"> <noscript>You need to enable JavaScript to run this app.</noscript> <div id="root"></div> <script type="text/javascript"> System.import('./app.js'); </script> </body> </html>
import _ from 'lodash'; import React from 'react'; import ReactDOM from 'react-dom'; import DataView from '@grapecity/dataviews.react'; import { GridLayout } from '@grapecity/dataviews.grid'; import CalendarGrouping from '@grapecity/dataviews.calendar'; import { data } from './data'; import Nav, { getDay } from './calnav'; const { useState } = React; const currencyFormat = '#,##'; const cols = [ { id: 'salesDate', caption: 'salesDate', dataField: 'salesDate', format: 'yyyy/MM/dd', }, { id: 'salesperson', caption: 'Salesperson', dataField: 'salesperson' }, { id: 'productName', caption: 'Product Name', dataField: 'productName' }, { id: 'unitPrice', caption: 'Unit Price', dataField: 'unitPrice', format: '$#,##0', }, { id: 'quantity', caption: 'Quantity', dataField: 'quantity' }, { id: 'subTotal', dataField: '=[quantity]*[unitPrice]', format: currencyFormat, }, { id: 'maxValue', dataField: '=maxx(group.current(),[subTotal])' }, { id: 'minValue', dataField: '=minx(group.current(),[subTotal])' }, ]; const headerTemplate = '<div class="summaryCell">' + '<div class="incomeContainer"><span class="incomeText">summary</span><div class="income">${{=it.eval("=sum([subTotal])", "#,##")}}</div></div>' + '<div><span class="percent">{{=it.eval("=sum([subTotal])/sumx(group.parent(),[subTotal])", "0.0%")}}</span></div>' + '</div>'; const rowTemplate = '<div class="{{? it.subTotal === it.maxValue}}maxValueClass{{?? it.subTotal === it.minValue}}minValueClass{{?}}"><div class="personName">{{=it.salesperson}}</div><div class="personSale">{{=it.subTotal}}</div></div>'; _.each(data, (rec) => { _.each(rec, (val, prop) => { if (prop === 'salesDate') { rec[prop] = new Date(val); } }); }); const calendar = new CalendarGrouping({ viewMode: 'Month', startDate: new Date(2014, 9, 1, 8, 0, 0), }); const layout = new GridLayout({ grouping: { field: 'salesDate', header: { visible: true, template: headerTemplate, }, converter(field) { return field.toDateString(); }, }, rowTemplate, groupStrategy: calendar, }); function formatTitle(options) { const date = options.startDate; if (options.viewMode === 'Month') { const formatter = new GC.DataViews.GeneralFormatter('mmmm yyyy'); return formatter.format(date); } else { const formatter = new GC.DataViews.GeneralFormatter('d mmm yyyy'); return `${formatter.format(date)}-${formatter.format(getDay(date, options.displayingDays))}`; } } const App = () => { const [options, setOptions] = useState({ startDate: calendar.options.startDate, viewMode: calendar.options.viewMode, }); return ( <div className="main-container"> <div className="button-container"> <div id="title">{formatTitle(options)}</div> <Nav options={options} setOptions={setOptions} /> </div> <DataView id="grid" className="grid" data={data} cols={cols} layout={layout} groupingOptions={options} /> </div> ); }; ReactDOM.render(<App />, document.getElementById('root'));
import _ from 'lodash'; import React from 'react'; export function getDay(date, daysCount) { const result = new Date(date); const timeSpan = 1000 * 60 * 60 * 24 * (daysCount || 1); result.setTime(result.getTime() + timeSpan); return result; } export function getMonth(currentDate, monthCount) { let year = currentDate.getFullYear(); let month = currentDate.getMonth() + monthCount; const day = currentDate.getDate(); if (month === 12) { month = 0; year += 1; } else if (month === -1) { month = 11; year -= 1; } return new Date(year, month, day, 0, 0, 0); } const Nav = ({ options, setOptions }) => { const prevMonth = () => { let currentDate = options.startDate; const view = options.viewMode || 'Month'; if (view === 'Month') { currentDate = getMonth(currentDate, -1); } else if (view === 'Week') { currentDate = getDay(currentDate, -7); } else { currentDate = getDay(currentDate, -1); } const newOptions = _.assign({}, options, { startDate: currentDate }); setOptions(newOptions); }; const nextMonth = () => { let currentDate = options.startDate; const view = options.viewMode || 'Month'; if (view === 'Month') { currentDate = getMonth(currentDate, 1); } else if (view === 'Week') { currentDate = getDay(currentDate, 7); } else { currentDate = getDay(currentDate, 1); } const newOptions = _.assign({}, options, { startDate: currentDate }); setOptions(newOptions); }; return ( <div className="btn-group flex0" role="group"> <div className="btn btn-default app-prev" onClick={prevMonth}> <i className="demo-icon icon-left-big" /> </div> <div className="btn btn-default app-next" onClick={nextMonth}> <i className="demo-icon icon-right-big" /> </div> </div> ); }; export default Nav;
export const data = [ { productName: 'iPad Air 2', quantity: 16, salesDate: 1412035200000, salesperson: 'Alice', total: 7984, unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 17, salesDate: 1412121600000, salesperson: 'Bob', total: 6783, unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 18, salesDate: 1412208000000, salesperson: 'John', total: 8982, unitPrice: 499, }, { productName: 'iPhone5s', quantity: 11, salesDate: 1412294400000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 8, salesDate: 1412380800000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 3, salesDate: 1412467200000, salesperson: 'Alex', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 19, salesDate: 1412553600000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPhone6', quantity: 18, salesDate: 1412640000000, salesperson: 'Chris', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 12, salesDate: 1412726400000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6', quantity: 3, salesDate: 1412812800000, salesperson: 'Lucy', unitPrice: 199, }, { productName: 'iPhone6', quantity: 18, salesDate: 1412899200000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPhone6', quantity: 14, salesDate: 1412985600000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPhone6', quantity: 16, salesDate: 1413072000000, salesperson: 'Lucy', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 17, salesDate: 1413158400000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 8, salesDate: 1413244800000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 14, salesDate: 1413331200000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 8, salesDate: 1413244800000, salesperson: 'Chris', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 14, salesDate: 1413331200000, salesperson: 'Chris', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 12, salesDate: 1413417600000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 11, salesDate: 1413504000000, salesperson: 'Chris', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 12, salesDate: 1413417600000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 11, salesDate: 1413504000000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 16, salesDate: 1413590400000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 17, salesDate: 1413676800000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 12, salesDate: 1413763200000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 3, salesDate: 1413849600000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 15, salesDate: 1413936000000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 17, salesDate: 1414022400000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 7, salesDate: 1414108800000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 13, salesDate: 1414195200000, salesperson: 'Alex', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 16, salesDate: 1414281600000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 3, salesDate: 1414368000000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 5, salesDate: 1414454400000, salesperson: 'Chris', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1414540800000, salesperson: 'Lucy', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 15, salesDate: 1412035200000, salesperson: 'Alex', total: 7485, unitPrice: 499, }, { productName: 'iPhone5s', quantity: 13, salesDate: 1412121600000, salesperson: 'Alice', total: 1287, unitPrice: 99, }, { productName: 'iPhone6', quantity: 14, salesDate: 1412208000000, salesperson: 'Alex', total: 2786, unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 4, salesDate: 1412294400000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 17, salesDate: 1412380800000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 17, salesDate: 1412467200000, salesperson: 'Alex', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 8, salesDate: 1412553600000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPhone6', quantity: 18, salesDate: 1412640000000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 7, salesDate: 1412726400000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 18, salesDate: 1412812800000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 6, salesDate: 1412899200000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 13, salesDate: 1412985600000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6', quantity: 1, salesDate: 1413072000000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPhone6 plus', quantity: 16, salesDate: 1413158400000, salesperson: 'Alex', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 1, salesDate: 1413244800000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 15, salesDate: 1413331200000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 1, salesDate: 1413417600000, salesperson: 'Chris', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 19, salesDate: 1413504000000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 7, salesDate: 1413590400000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 6, salesDate: 1413676800000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPhone6', quantity: 15, salesDate: 1413763200000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPad mini 3', quantity: 12, salesDate: 1413849600000, salesperson: 'Chris', unitPrice: 399, }, { productName: 'iPhone6', quantity: 8, salesDate: 1413936000000, salesperson: 'Lucy', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 17, salesDate: 1414022400000, salesperson: 'Alex', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 14, salesDate: 1414108800000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 0, salesDate: 1414195200000, salesperson: 'Alex', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 19, salesDate: 1414281600000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 7, salesDate: 1414368000000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 5, salesDate: 1414454400000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPhone6', quantity: 16, salesDate: 1414540800000, salesperson: 'Chris', unitPrice: 199, }, { productName: 'iPad mini 3', quantity: 16, salesDate: 1412035200000, salesperson: 'John', total: 6384, unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 12, salesDate: 1412121600000, salesperson: 'Alex', total: 5988, unitPrice: 499, }, { productName: 'iPhone5s', quantity: 10, salesDate: 1412208000000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 8, salesDate: 1412294400000, salesperson: 'John', unitPrice: 499, }, { productName: 'iPhone6', quantity: 2, salesDate: 1412380800000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPhone6 plus', quantity: 12, salesDate: 1412467200000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 0, salesDate: 1412553600000, salesperson: 'Lucy', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 19, salesDate: 1412640000000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 14, salesDate: 1412726400000, salesperson: 'John', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 15, salesDate: 1412812800000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 15, salesDate: 1412899200000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 12, salesDate: 1412985600000, salesperson: 'Lucy', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 8, salesDate: 1413072000000, salesperson: 'Lucy', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 6, salesDate: 1413158400000, salesperson: 'Alex', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 2, salesDate: 1413244800000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 15, salesDate: 1413331200000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPhone6', quantity: 3, salesDate: 1413417600000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 12, salesDate: 1413504000000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 18, salesDate: 1413590400000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 3, salesDate: 1413676800000, salesperson: 'Alex', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 4, salesDate: 1413763200000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 1, salesDate: 1413849600000, salesperson: 'Alex', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 10, salesDate: 1413936000000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 13, salesDate: 1414022400000, salesperson: 'Alex', unitPrice: 499, }, { productName: 'iPhone6', quantity: 3, salesDate: 1414108800000, salesperson: 'Bob', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 11, salesDate: 1414195200000, salesperson: 'John', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 4, salesDate: 1414281600000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPhone6', quantity: 12, salesDate: 1414368000000, salesperson: 'Bob', unitPrice: 199, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1414454400000, salesperson: 'Lucy', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 12, salesDate: 1414540800000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 6, salesDate: 1412035200000, salesperson: 'Chris', total: 2994, unitPrice: 499, }, { productName: 'iPhone6', quantity: 0, salesDate: 1412121600000, salesperson: 'Chris', total: 0, unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 2, salesDate: 1412208000000, salesperson: 'John', total: 998, unitPrice: 499, }, { productName: 'iPhone5s', quantity: 4, salesDate: 1412294400000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 4, salesDate: 1412380800000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 13, salesDate: 1412467200000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1412553600000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 1, salesDate: 1412640000000, salesperson: 'Lucy', unitPrice: 399, }, { productName: 'iPhone6', quantity: 1, salesDate: 1412726400000, salesperson: 'Bob', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 4, salesDate: 1412812800000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPhone6', quantity: 17, salesDate: 1412899200000, salesperson: 'Lucy', unitPrice: 199, }, { productName: 'iPhone6', quantity: 12, salesDate: 1412985600000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 11, salesDate: 1413072000000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 10, salesDate: 1413158400000, salesperson: 'Lucy', unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 18, salesDate: 1413244800000, salesperson: 'Lucy', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 6, salesDate: 1413331200000, salesperson: 'John', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 6, salesDate: 1413417600000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 18, salesDate: 1413504000000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 14, salesDate: 1413590400000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 13, salesDate: 1413676800000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 17, salesDate: 1413763200000, salesperson: 'Lucy', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 9, salesDate: 1413849600000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 10, salesDate: 1413936000000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 18, salesDate: 1414022400000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1414108800000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 2, salesDate: 1414195200000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone6', quantity: 3, salesDate: 1414281600000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPhone6 plus', quantity: 10, salesDate: 1414368000000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 4, salesDate: 1414454400000, salesperson: 'Chris', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 17, salesDate: 1414540800000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 16, salesDate: 1412035200000, salesperson: 'Alice', total: 6384, unitPrice: 399, }, { productName: 'iPhone5s', quantity: 16, salesDate: 1412121600000, salesperson: 'Alex', total: 1584, unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 11, salesDate: 1412208000000, salesperson: 'Alex', unitPrice: 399, }, { productName: 'iPhone6', quantity: 15, salesDate: 1412294400000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPhone6', quantity: 14, salesDate: 1412380800000, salesperson: 'Bob', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 15, salesDate: 1412467200000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPhone6', quantity: 0, salesDate: 1412553600000, salesperson: 'Chris', unitPrice: 199, }, { productName: 'iPad mini 3', quantity: 19, salesDate: 1412640000000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 19, salesDate: 1412726400000, salesperson: 'Alex', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 13, salesDate: 1412812800000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 8, salesDate: 1412899200000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 14, salesDate: 1412985600000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 16, salesDate: 1413072000000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 16, salesDate: 1413158400000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1413244800000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPhone6', quantity: 12, salesDate: 1413331200000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 2, salesDate: 1413417600000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 15, salesDate: 1413504000000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 9, salesDate: 1413590400000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 5, salesDate: 1413676800000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 13, salesDate: 1413763200000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 8, salesDate: 1413849600000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 2, salesDate: 1413936000000, salesperson: 'Lucy', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 2, salesDate: 1414022400000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 8, salesDate: 1414108800000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 18, salesDate: 1414195200000, salesperson: 'Lucy', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 7, salesDate: 1414281600000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 2, salesDate: 1414368000000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 11, salesDate: 1414454400000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPhone6', quantity: 7, salesDate: 1414540800000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 13, salesDate: 1412035200000, salesperson: 'Alex', total: 1287, unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 6, salesDate: 1412121600000, salesperson: 'John', total: 2394, unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 19, salesDate: 1412208000000, salesperson: 'Lucy', total: 9481, unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 3, salesDate: 1412294400000, salesperson: 'Chris', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 12, salesDate: 1412380800000, salesperson: 'Alex', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 8, salesDate: 1412467200000, salesperson: 'Chris', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 12, salesDate: 1412553600000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 12, salesDate: 1412640000000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 11, salesDate: 1412726400000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 11, salesDate: 1412812800000, salesperson: 'Lucy', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1412899200000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 2, salesDate: 1412985600000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1413072000000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 2, salesDate: 1413158400000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPhone6', quantity: 7, salesDate: 1413244800000, salesperson: 'Bob', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 19, salesDate: 1413331200000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 10, salesDate: 1413417600000, salesperson: 'Lucy', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 4, salesDate: 1413504000000, salesperson: 'Alex', unitPrice: 299, }, { productName: 'iPhone6', quantity: 7, salesDate: 1413590400000, salesperson: 'Alice', unitPrice: 199, }, { productName: 'iPad mini 3', quantity: 1, salesDate: 1413676800000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 14, salesDate: 1413763200000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1413849600000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 13, salesDate: 1413936000000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPhone6', quantity: 5, salesDate: 1414022400000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPad mini 3', quantity: 15, salesDate: 1414108800000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 8, salesDate: 1414195200000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 6, salesDate: 1414281600000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 11, salesDate: 1414368000000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 1, salesDate: 1414454400000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPhone6', quantity: 18, salesDate: 1414540800000, salesperson: 'Bob', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 1, salesDate: 1412035200000, salesperson: 'Lucy', total: 499, unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 10, salesDate: 1412121600000, salesperson: 'John', total: 4990, unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 18, salesDate: 1412208000000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 3, salesDate: 1412294400000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 7, salesDate: 1412380800000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 10, salesDate: 1412467200000, salesperson: 'Chris', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 15, salesDate: 1412553600000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPhone6', quantity: 19, salesDate: 1412640000000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPad mini 3', quantity: 15, salesDate: 1412726400000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 19, salesDate: 1412812800000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 6, salesDate: 1412899200000, salesperson: 'John', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 5, salesDate: 1412985600000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 16, salesDate: 1413072000000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 5, salesDate: 1413158400000, salesperson: 'Lucy', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 15, salesDate: 1413244800000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 17, salesDate: 1413331200000, salesperson: 'John', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 6, salesDate: 1413417600000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 16, salesDate: 1413504000000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 19, salesDate: 1413590400000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPhone5s', quantity: 8, salesDate: 1413676800000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 14, salesDate: 1413763200000, salesperson: 'Lucy', unitPrice: 99, }, { productName: 'iPhone6', quantity: 17, salesDate: 1413849600000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 12, salesDate: 1413936000000, salesperson: 'Alex', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 18, salesDate: 1414022400000, salesperson: 'Lucy', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 17, salesDate: 1414108800000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 0, salesDate: 1414195200000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 16, salesDate: 1414281600000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 2, salesDate: 1414368000000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 5, salesDate: 1414454400000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone6', quantity: 12, salesDate: 1414540800000, salesperson: 'Chris', unitPrice: 199, }, { productName: 'iPhone6 plus', quantity: 12, salesDate: 1412035200000, salesperson: 'John', total: 3588, unitPrice: 299, }, { productName: 'iPhone5s', quantity: 4, salesDate: 1412121600000, salesperson: 'Alice', total: 396, unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 2, salesDate: 1412208000000, salesperson: 'Lucy', unitPrice: 499, }, { productName: 'iPhone6', quantity: 1, salesDate: 1412294400000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 13, salesDate: 1412380800000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 12, salesDate: 1412467200000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 18, salesDate: 1412553600000, salesperson: 'John', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 16, salesDate: 1412640000000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 3, salesDate: 1412726400000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 19, salesDate: 1412812800000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6', quantity: 3, salesDate: 1412899200000, salesperson: 'Alice', unitPrice: 199, }, { productName: 'iPad mini 3', quantity: 5, salesDate: 1412985600000, salesperson: 'Lucy', unitPrice: 399, }, { productName: 'iPhone6', quantity: 3, salesDate: 1413072000000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 5, salesDate: 1413158400000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 3, salesDate: 1413244800000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 0, salesDate: 1413331200000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 2, salesDate: 1413417600000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 5, salesDate: 1413504000000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 3, salesDate: 1413590400000, salesperson: 'Lucy', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 9, salesDate: 1413676800000, salesperson: 'Lucy', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 11, salesDate: 1413763200000, salesperson: 'Alex', unitPrice: 399, }, { productName: 'iPhone6', quantity: 14, salesDate: 1413849600000, salesperson: 'Bob', unitPrice: 199, }, { productName: 'iPad mini 3', quantity: 1, salesDate: 1413936000000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 13, salesDate: 1414022400000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 9, salesDate: 1414108800000, salesperson: 'Alex', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 13, salesDate: 1414195200000, salesperson: 'John', unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 17, salesDate: 1414281600000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 19, salesDate: 1414368000000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 18, salesDate: 1414454400000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6', quantity: 1, salesDate: 1414540800000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPhone6 plus', quantity: 3, salesDate: 1412035200000, salesperson: 'Alice', total: 897, unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 11, salesDate: 1412121600000, salesperson: 'John', total: 5489, unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 2, salesDate: 1412208000000, salesperson: 'Bob', total: 998, unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 10, salesDate: 1412294400000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 19, salesDate: 1412380800000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 19, salesDate: 1412467200000, salesperson: 'Alex', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 17, salesDate: 1412553600000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 2, salesDate: 1412640000000, salesperson: 'Lucy', unitPrice: 399, }, { productName: 'iPhone6 plus', quantity: 0, salesDate: 1412726400000, salesperson: 'Alex', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 13, salesDate: 1412812800000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 8, salesDate: 1412899200000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 3, salesDate: 1412985600000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 3, salesDate: 1413072000000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 15, salesDate: 1413158400000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 9, salesDate: 1413244800000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPhone6', quantity: 5, salesDate: 1413331200000, salesperson: 'Alice', unitPrice: 199, }, { productName: 'iPhone6', quantity: 19, salesDate: 1413417600000, salesperson: 'Alice', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 7, salesDate: 1413504000000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 12, salesDate: 1413590400000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 19, salesDate: 1413676800000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 7, salesDate: 1413763200000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPhone6', quantity: 11, salesDate: 1413849600000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPad Air 2', quantity: 11, salesDate: 1413936000000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 15, salesDate: 1414022400000, salesperson: 'Lucy', unitPrice: 299, }, { productName: 'iPad Air 2', quantity: 5, salesDate: 1414108800000, salesperson: 'Alice', unitPrice: 499, }, { productName: 'iPhone6 plus', quantity: 19, salesDate: 1414195200000, salesperson: 'Bob', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 9, salesDate: 1414281600000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPhone6', quantity: 9, salesDate: 1414368000000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 4, salesDate: 1414454400000, salesperson: 'Alex', unitPrice: 99, }, { productName: 'iPad mini 3', quantity: 15, salesDate: 1414540800000, salesperson: 'John', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 10, salesDate: 1412035200000, salesperson: 'Alice', total: 3990, unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 8, salesDate: 1412121600000, salesperson: 'Alex', total: 3192, unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 3, salesDate: 1412208000000, salesperson: 'Lucy', total: 1497, unitPrice: 499, }, { productName: 'iPad Air 2', quantity: 6, salesDate: 1412294400000, salesperson: 'Chris', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 9, salesDate: 1412380800000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 2, salesDate: 1412467200000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 7, salesDate: 1412553600000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPhone6', quantity: 7, salesDate: 1412640000000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 13, salesDate: 1412726400000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPhone6', quantity: 9, salesDate: 1412812800000, salesperson: 'Lucy', unitPrice: 199, }, { productName: 'iPhone6 plus', quantity: 4, salesDate: 1412899200000, salesperson: 'Alex', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 4, salesDate: 1412985600000, salesperson: 'Alex', unitPrice: 399, }, { productName: 'iPhone5s', quantity: 15, salesDate: 1413072000000, salesperson: 'Alice', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 5, salesDate: 1413158400000, salesperson: 'Bob', unitPrice: 499, }, { productName: 'iPad mini 3', quantity: 5, salesDate: 1413244800000, salesperson: 'Alice', unitPrice: 399, }, { productName: 'iPhone6', quantity: 7, salesDate: 1413331200000, salesperson: 'Chris', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 8, salesDate: 1413417600000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPhone6', quantity: 6, salesDate: 1413504000000, salesperson: 'John', unitPrice: 199, }, { productName: 'iPhone6 plus', quantity: 16, salesDate: 1413590400000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPhone6', quantity: 17, salesDate: 1413676800000, salesperson: 'Alex', unitPrice: 199, }, { productName: 'iPhone6', quantity: 4, salesDate: 1413763200000, salesperson: 'Alice', unitPrice: 199, }, { productName: 'iPhone5s', quantity: 9, salesDate: 1413849600000, salesperson: 'Bob', unitPrice: 99, }, { productName: 'iPad Air 2', quantity: 8, salesDate: 1413936000000, salesperson: 'Alex', unitPrice: 499, }, { productName: 'iPhone5s', quantity: 3, salesDate: 1414022400000, salesperson: 'John', unitPrice: 99, }, { productName: 'iPhone5s', quantity: 9, salesDate: 1414108800000, salesperson: 'Chris', unitPrice: 99, }, { productName: 'iPhone6 plus', quantity: 7, salesDate: 1414195200000, salesperson: 'Alice', unitPrice: 299, }, { productName: 'iPhone6 plus', quantity: 5, salesDate: 1414281600000, salesperson: 'Chris', unitPrice: 299, }, { productName: 'iPad mini 3', quantity: 14, salesDate: 1414368000000, salesperson: 'Bob', unitPrice: 399, }, { productName: 'iPad mini 3', quantity: 11, salesDate: 1414454400000, salesperson: 'Alex', unitPrice: 399, }, { productName: 'iPad Air 2', quantity: 13, salesDate: 1414540800000, salesperson: 'John', unitPrice: 499, }, ];
@charset "UTF-8"; @font-face { font-family: "spreadview-demo-icon"; src: url(data:application/font-woff;base64,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) format("woff"); } .demo-icon { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; display: inline-block; font-family: "spreadview-demo-icon"; font-style: normal; font-variant: normal; text-align: center; text-transform: none; } .icon-left-big:before { content: ""; } /* '' */ .icon-right-big:before { content: ""; } /* '' */ .main-container { display: flex; flex-direction: column; width: 100%; height: 100%; overflow: auto; } .button-container { display: flex; align-items: center; flex-grow: 0; flex-shrink: 0; } .button-container #title { display: flex; align-items: center; justify-content: center; flex-grow: 1; flex-shrink: 1; } .button-container .btn { display: flex; align-items: center; justify-content: center; height: 32px; } .grid { width: 100%; height: 700px; min-height: 700px; min-width: 860px; flex-grow: 0; flex-shrink: 0; position: relative; } .flex0 { flex-grow: 0; flex-shrink: 0; } .gc-grid { border: 1px solid #cecece; } .calendar-grouping .linkBtn { cursor: pointer; display: inline-block; font-size: 12px; padding: 6px; } .calendar-grouping .popover-dialog { width: 160px; } .calendar-grouping .popover-dialog .group-content { font-size: 12px; } .calendar-grouping .gc-calendar-cell-text { font-family: sans-serif; font-size: 35px; font-weight: bold; margin-top: 0; } .maxValueClass { background-color: #5a54c4; border-radius: 5px; color: #fff; font-size: 15px; } .minValueClass { background-color: #53917e; border-radius: 5px; color: #fff; font-size: 15px; } .personName { display: inline-block; margin-left: 5px; width: 40px; } .personSale { display: inline-block; margin-left: 25px; } .income { font-family: monospace; font-size: 18px; font-weight: bold; } .summaryCell { border-radius: 2px; bottom: 0; padding: 0.4em; position: absolute; right: 0; text-align: right; width: 100%; } .incomeContainer { color: #777; } .percent { background-color: #5a54c4; color: #fff; display: block; font-size: 13px; font-weight: bold; padding-left: 8px; padding-right: 8px; } .popover-dialog:before { content: ""; display: block; position: fixed; width: 100%; height: 100vh; top: 0; left: 0; } /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFWaWV3cy9DYWxlbmRhci9TYWxlc1JlcG9ydC9yZWFjdC9zdHlsZXMuY3NzIiwiRGF0YVZpZXdzL0NhbGVuZGFyL1NhbGVzUmVwb3J0L3JlYWN0L3N0eWxlcy5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQjtBQ0FoQjtFQUNFLG1DQUFBO0VBQ0EsbTJMQUFBO0FERUY7QUNFQTtFQUNFLGtDQUFBO0VBQ0EsbUNBQUE7RUFDQSxxQkFBQTtFQUNBLG1DQUFBO0VBQ0Esa0JBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0Esb0JBQUE7QURBRjs7QUNHQTtFQUNFLFlBQUE7QURBRjs7QUNDRSxRQUFBO0FBRUY7RUFDRSxZQUFBO0FEQ0Y7O0FDQUUsUUFBQTtBQUVGO0VBQ0UsYUFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0FERUY7O0FDQ0E7RUFDRSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsY0FBQTtBREVGO0FDQUU7RUFDRSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0FERUo7QUNDRTtFQUNFLGFBQUE7RUFDQSxtQkFBQTtFQUNBLHVCQUFBO0VBQ0EsWUFBQTtBRENKOztBQ0dBO0VBQ0UsV0FBQTtFQUNBLGFBQUE7RUFDQSxpQkFBQTtFQUNBLGdCQUFBO0VBQ0EsWUFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtBREFGOztBQ0dBO0VBQ0UsWUFBQTtFQUNBLGNBQUE7QURBRjs7QUNHQTtFQUNFLHlCQUFBO0FEQUY7O0FDSUU7RUFDRSxlQUFBO0VBQ0EscUJBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtBRERKO0FDSUU7RUFDRSxZQUFBO0FERko7QUNLRTtFQUNFLGVBQUE7QURISjtBQ01FO0VBQ0UsdUJBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7RUFDQSxhQUFBO0FESko7O0FDUUE7RUFDRSx5QkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7QURMRjs7QUNRQTtFQUNFLHlCQUFBO0VBQ0Esa0JBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtBRExGOztBQ1FBO0VBQ0UscUJBQUE7RUFDQSxnQkFBQTtFQUNBLFdBQUE7QURMRjs7QUNRQTtFQUNFLHFCQUFBO0VBQ0EsaUJBQUE7QURMRjs7QUNRQTtFQUNFLHNCQUFBO0VBQ0EsZUFBQTtFQUNBLGlCQUFBO0FETEY7O0FDUUE7RUFDRSxrQkFBQTtFQUNBLFNBQUE7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSxRQUFBO0VBQ0EsaUJBQUE7RUFDQSxXQUFBO0FETEY7O0FDUUE7RUFDRSxXQUFBO0FETEY7O0FDUUE7RUFDRSx5QkFBQTtFQUNBLFdBQUE7RUFDQSxjQUFBO0VBQ0EsZUFBQTtFQUNBLGlCQUFBO0VBQ0EsaUJBQUE7RUFDQSxrQkFBQTtBRExGOztBQ1FBO0VBQ0UsV0FBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsV0FBQTtFQUNBLGFBQUE7RUFDQSxNQUFBO0VBQ0EsT0FBQTtBRExGIiwiZmlsZSI6IkRhdGFWaWV3cy9DYWxlbmRhci9TYWxlc1JlcG9ydC9yZWFjdC9zdHlsZXMuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiQGNoYXJzZXQgXCJVVEYtOFwiO1xuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiBcInNwcmVhZHZpZXctZGVtby1pY29uXCI7XG4gIHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2Jhc2U2NCxkMDlHUmdBQkFBQUFBQkZjQUE4QUFBQUFIZHdBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkhVMVZDQUFBQldBQUFBRE1BQUFCQ3NQNno3VTlUTHpJQUFBR01BQUFBUXdBQUFGWStJVWt5WTIxaGNBQUFBZEFBQUFCMkFBQUI3Z2xQN1ExamRuUWdBQUFDU0FBQUFCTUFBQUFnQnRYL0FtWndaMjBBQUFKY0FBQUZrQUFBQzNDS2taQlpaMkZ6Y0FBQUIrd0FBQUFJQUFBQUNBQUFBQkJuYkhsbUFBQUg5QUFBQm1ZQUFBb1VMcHF5bEdobFlXUUFBQTVjQUFBQU1BQUFBRFlKb3FmWWFHaGxZUUFBRG93QUFBQWRBQUFBSkFjOUExMW9iWFI0QUFBT3JBQUFBQmdBQUFBc0o1MEFBR3h2WTJFQUFBN0VBQUFBR0FBQUFCZ05NQTlNYldGNGNBQUFEdHdBQUFBZ0FBQUFJQUVoRERadVlXMWxBQUFPL0FBQUFYY0FBQUxOekowY0huQnZjM1FBQUJCMEFBQUFiQUFBQUpDOHQ5bWhjSEpsY0FBQUVPQUFBQUI2QUFBQWh1VkJLN3g0bkdOZ1pHQmc0R0tRWTlCaFlIUng4d2xoNEdCZ1lZQUFrQXhqVG1aNklsQU15Z1BLc1lCcERpQm1nNGdDQUlvakEwOEFlSnhqWUdTZXhUaUJnWldCZ2FtS2FROERBME1QaEdaOHdHREl5QVFVWldCbFpzQUtBdEpjVXhnY1hqQzg0R1FPK3AvRkVNVWN4REFkS013SWtnTUE4Y2dMMFFCNG5PMlIwUTNDUUF4RDM5RlE2S21qOE1sQWZERUxvMmFMMWtrOUJwR2VwVmk1KzdDQk83Q0lsd2dZWHdZMUg3bWovWVhaZnZEdW15Zy90K09RVXFvOVdtKzZEZjI0OHVESjF1OVcvck8zL3J6Tnl1MmlrelJLanpUVlNKcktOazIxbFVZcGswWjVrMGJKazBZZHFLa0w1Z2wzWHh0TkFBQjRuR05nUUFNU0VNZ2M5RDhUaEFFU1pnUGJBSGljclZacGQ5TkdGQjE1U1p5RUxDVUxMV3BoeE1ScHNFWW1iTUdBQ1VHeVl5QmRuSzJWb0lzVU8rbSs4WW5mNEYvelpOcHo2RGQrV3U4Ykx5U1F0T2R3bXBPamQrZk4xY3piWlJKYWt0Z0w2NUdVbXkvRjFOWW1qZXc4Q2VtR1RjdFJmQ2c3ZXlGbGlzbmZCVkVRclpiYXR4MkhSRVFpVUxXdXNFUVEreDVabW1SODZGRkd5N2FrVjAzS0xUM3BMbHZqUWIxVjMzNGFPc3F4TzZHa1pqTjBhRDJ5SlZVWVZhSklwajFTMHFabHFQb3JTU3U4djhMTVY4MVF3b2hPSW1tOEdjYlFTTjRiWjdUS2FEVzI0eWlLYkxMY0tGSWttdUZCRkhtVTFSTG41SW9KRE1vSHpaRHl5cWNSNWNQOGlLellvNXhXc0V1MjAveStMM21uZHprL3NWOXZVYmJrUUIvSWp1emc3SFFsWDRSYlcySGN0SlB0S0ZRUmR0ZDNRbXpaN0ZUL1pvL3lta1lEdHlzeXZkQ01ZS2w4aFJBclA2SE0vaUZaTFp4UCtaSkhvMXF5a1JOQjYyVk83RXMrZ2RiamlDbHh6UmhaME4zUkNSSFUvWkl6RFBhWVBoNzg4ZDRwbGdzVEFuZ2N5M3BISlp3SUV5bGhjelJKMmpCeVlDVmxpeXFwOWE2WU9PVjFXc1Jid243dDJ0R1h6bWpqVUhkaVBGc1BIVnM1VWNueGFGS25tVXlkMmtuTm95a05vcFIwSm5qTXJ3TW9QNkpKWG0xak5ZbVZSOU00WnNhRVJDSUNMZHhMVTBFc083R2tLUVROb3htOXVSdW11WFl0V3FUSkEvWGNvL2YwNWxhNHVkTlQyZzcwczBaL1ZxZGlPdGdMMCtscDVDL3hhZHJsSWtYcCt1a1pma3ppUWRZQ01wRXROc09VZ3dkdi9RN1N5OWVXSElYWEJ0anU3Zk1ycUgzV1JQQ2tBZnNiMEI1UDFTa0pUSVdZVlloV1FHS3RhMW1XeWRXc0ZxbkkxSGREbWxhK3JOTUVpbkljRjhlK2pISDlYek16bHBnU3Z0K0owN01qTGoxejdVc0kweHg4bTNVOW10ZXB4WElCY1daNVRxZFpsdS9yTk1meUE1M21XWjdYNlFoTFc2ZWpMRC9VYVlIbFJ6b2RZM2xCQzVwMDM4R1FpekRrQWc2UU1JU2xBME5ZWG9JaExCVU1ZYmtJUTFnV1lRakxKUmpDOG1NWXduSVpockM4ckdYVjFGTko0OXFaV0Fac1FtQmlqaDY1ekVYbGFpcTVWRUs3YUZScVE1NFNicFZVRk0rcWYyV2dYanp5aGptd0ZraVh5SnBmTWM2VmowYmwrTllWTFc4YU8xZkFzZXB2SDQ3Mk9mRlMxb3VGUHdYLzFkWlVKYjFpemNPVHEvQWJocDVzSjZvMnFYaDBUWmZQVlQyNi9sOVVWRmdMOUJ0SWhWZ295ckpzY0djaWhJODZuWVpxb0pWRHpHek1QTFRyZGN1YW44UDlOekZDRmxEOStEY1VHZ3ZjZzA1WlNWbnQ0S3pWMTl1eTNEdURjamdUTEVreE4vUDZWdmdpSTdQU2ZwRlp5cDZQZkI1d0JZeEtaZGhxQTYwVnZOa25NUStaM2lUUEJIRmJVVFpJMnRqT0JJa05IUE9BZWZPZEJDWmg2cW9ONUU3aGhnMzRCV0Z1d1hrblhLSjZveXlIN2tYczh5aWsvRnVuNGtUMnFHaU13TFBaRzJHdjcwTEtiM0VNSkRUNXBYNE1WQldocVJnMUZkQTBVbTZvQmwvRzJicHRRc1lPOUNNcWRzT3lyT0xEeHhiM2xaSnRHWVI4cElqVm82T2YxbDZpVHFyY2ZtWVVsKytkdmdYQklEVXhmM3ZmZEhHUXlydGF5VEpIYlFOVHR4cVZVOWVhUStOVmgrcm1VZlc5NCt3VE9XdWFicm9uSG5wZjA2cmJ3Y1ZjTExEMmJRN1NVaVlYMVBWaGhRMml5OFdsVU9wbE5FbnZ1QWNZRmhqUTcxQ0tqZityK3RoOG5pdFZoZEZ4Sk45TzFMZlI1MkFNL0EvWWYwZjFBOUQzWStoeURTN1A5NW9UbjI3MDRXeVpycUlYNjZmb056QnJyYmxadWdiYzBIUUQ0aUZIclk2NHlnMThwd1p4ZXFTNUhPa2g0R1BkRmVJQndDYUF4ZUFUM2JXTTVsTUFvL21NT1Q3QTU4eGgwR1FPZ3kzbU1OaG16aHJBRG5NWTdES0h3UjV6R0h6Qm5IV0FMNW5ESUdRT2c0ZzVESjR3SndCNHlod0dYekdId2RmTVlmQU5jKzREZk1zY0JqRnpHQ1RNWWJDdjZkWXd6QzFlMEYyZ3RrRlZvQU5UVDFqY3crSlFVMlhJL280WGh2MjlRY3ord1NDbS9xanA5cEQ2RXk4TTlXZURtUHFMUVV6OVZkT2RJZlUzWGhqcTd3WXg5UStEbVBwTXZ4akxaUWEvakh5WENnZVVYV3crNSsrSjl3L2J4VUM1QUFFQUFmLy9BQTk0bktWVldXOGIxeFUrNTk3Wk9CeXVtb1d5eURFM2NXeFNrRnl1aXF4U2xCZlFrdWtGdHBEUVNhVFFqcXkya0czSkRlQ2c2UGFnd0xYUkpnS3lGS2hiQkFpc3h3YXQrdEtYQUgxb243b0FiWDVDSHdJWlJaR25QclNJeGoyWFloVTdpYnFnUTg2OTU3dm56TXk1NXp2blhBZ0FQUDQ3MytGQmlNQmhtSUFadUFBdndScDhGemJoUXFzVEN6RTFhakNGcTBvdkVtQThyREdHblBXQ01rTUFYQkF6UWxlWEdDQjAzdmorM1kzdmZQUE9LN2RXVjE1ZWV1SFp5K2ZQMWdaWEpTNm5TcU9XcWFpNWJNR3JWZXRPcFd6SENIc0QzQ0NNbjlFTFhNSTlmQnozOEJmWmZ4bi92YjNRQy91aGdWN2d2dDVOMjc5d1hLVFJUajhoNHZWOTRMaitUdzdTNE1xbkR6NWg5YlRpaVpjL3VHRVR0RzdRYTF4VVZzWGtyQW9ML3c5UGFGaCtWZGlMd2YvOS8ycUUydjQ2QUNoZnlPMTA2NWtncWpyMk9RMGcxN0RQcUl4OVFta2lQaVVVZEg2R1F1Ty9wVEF6MEdjT29HU2diMlQyS01rTmNDVnpNQ1hzdDJsNzkxRWZNY2R4ZHhzSDYvQXA5UDhGL2VsNFVvQWUzK05YMkY4aEJmbFdCaGhuYTdTSTY4QUIrQUp3RGwwU29GTnc3SndrSjByWTM1MWpteEZVc2g0V3FnMnNsdytqd0xSWGZpV2Y4bC9kc3F5aWRkenkzelpOdkdGTjJVWEwyc0w3cVR3dXRkM2lsamx0bGdZS1hCV1dVL2JXRWRqM3BVYSt1SDFmT09OclluVWRxQ0RaQWxDWmRvR1k3ZGlqQmJQdmk2bVNFeFBreEF4bUJqV1Q4UVNxbHgyMGVjMzAzN0ducktKdFAvUmZUZVh6S2J6LzBMYUwvUStiT09XYXdzT2lOVzA5TExya0dXNVowd1F0L3gyejc4djNLTTlxTUFSZUs2OVRCbUU3Z0hBNlNNNmNJcThRRm9UTFhSR3NUcjdBWkx0a1ZadHlwUmJBV0RZc0h6dHpwL2YyeFpQNGl2LzZ5clVIODlmS1k5L1kvUE9iSytWRDB0LzhIL2l2bzhIaTJWUFhmdGovenRmNER2czFGQ0RaR2g2aHQyRTdoSEJLdkpkMkR5djViSTdKRnUwMWpMbXNwNmowbzlRcTFBdTB5eGxzc2hrY1I2L2FaSld5aTN6bjdrZjN2T0t0dDBieWVwZ3ppWEZEQ3BtcUdWVWozV1c4K05vSHkvYyt1b3RMVjdkNjB0V0NKcUdoSTlNa0hwSER0cFpNRGhYTGJ5N012ZGFiN0cwSjloOXY4K2Y1SmRDZ0NiZmdYR3QrYnJiQnVZeHRrQ2xKWkg0VGRBQ21RNDhzbUt5eEpYcEdsYmphQXdrVVNYbVJOaExvUWlCZzROek4xWlhsMFVveldmL1NZYXNVcEpKclZNZFJNZTBtWXJYZzVhcDFqNll3VTVVSWhobmQ2T1ZpdEIzSnNhbSthbFd2aVZXdlhpT2JKalpNMWJiMjdrRVZGc1JZaTRsYXJEZnFqU1pyMUVVb3lJQnFkOU5PMnZSbkcyUEozOVF4MndpSFRTZmtob0xoaEc0YnBoNlBxM1k0YVNUWm5ibVRxeXhxNmlrOUVFKzBSMlFMTTczelorcGZQVDFydkpjcUZsTS9NcDlKSjBPR25iQ1RFL05IUnE1TlBic2NNVm5pVUlLWmVERlZ4UFRYMDQwcVJrN01KMEtGV0RpYURnenBCdm8vWm9xaUtlem9ZaVFhS0I2Sko3MVFYc095VlQ0YU4wc0Z3NWdzblgvK2tPTVVVM2pkTFlibWltNzRSTWUyOHVkbks1TWl0eWlPZ29OejdERjFQUk9HSVE5M1cxVEJURTdaWVlvMEc2WUNBUzZhbTlRKysvUDR4VzdMSTI3a3RiMGlKdFZhUDA5ZlZoQWxDUy9SaE5KeklLRjBkcVJWK0x3bHJIM2U4RW9yRHBCSko1eG9KS0NSRzRxcFVpNDZEVSsxS2haV2Mxa3FRTXVzbEtrSmVBN21ha2h0d0d2MEc4THZ5aHVWTS9pU0lVdituNlNRTE9FRWQzZjhZenY4bkxtNHMyZ2V0emVJb1kzS2RKc3BodVIvS05HSTQ5THRIWC9pRVQ1SVdZdVBYclNzRFJzR1BYK2J4L2Q3L25FNENWK0I1ZGJWNTA0elJUdWFHWTRGVUtIRzBKWTVJMEZCdUNreEJxb0M2aXFFSWFDRkE3MUlpR21HemhUVWxDVlFnMEYxQVZRMTJJV2dHdXhjWDc2NjlNS1Z5NWN1ZE9iYXN6Tm0zaXlJS3hlbFJNWFlYcGJ0NVZmWmR2NERIb3BsWXFhTDFQWXB0eXNlSmJkQ0FSTTJzY0doRU12OTY3QnVVRFpUaWg1R2NjYTR1cGJYOVA2dythbjRocTd1aWFwK3hqYzBqZUVmbWFiNTkvOHhJc25iaW9SLzBiVjZkZFEvTmxyRm1yRDdxUmNZbytOalRQUGUxM1Q4cGY4cnNZaXpZanhBOXBkWmJQZGpLZ1hkWk5kbjZhU1VMOU1YZHo4ZVAzVmluQTMxblZpMGt1aWFpM3FmaDNmNUprK0pTb2NnUkNrblhaaHZ0VVVYNHdpaUExQmpvRTRnZzZUSTBwSnVhRnhSVldXaEx5aHFOeGlnSWxjNzhaaWJTbzdZVm13NFBoeUx4OFFWRGNuSkVtWnFtZjI3V2phem8yVTdqT09zN2dqQU56L1o0Ti8ydDNjL1pPTjRRY2lmYkt5dlk4TE9NdmRZbXVVL1dGOW43Ni83Mit2K3o5YjhiMDNldnAwZHkyTjJQTjJZdkEzL0JMazBwdHdBQUhpY1kyQmtZR0FBNGdjM0VxYkg4OXQ4WmVCbWZnRVVZYmpzdTBrR1FmL1BaSDdCSEFUa2NqQXdnVVFCWVc0TDFYaWNZMkJrWUdBTytwOEZKRjh3TVB6L0R5U0JJaWlBR3dDSDFBV2dBQUFBZUp4amZzSEF3QXpEa1ZDTXpoY0U0Z1VNREFDeTV3YS9BQUFBQUFEdUFaWUIzQUlpQWxZQ29nTmtBK2dFckFVS0FBRUFBQUFMQUpBQUNRQUFBQUFBQWdBa0FEUUFjd0FBQUhVTGNBQUFBQUI0bkhXUXkwN0NRQlNHLzVHTENva2FUZHc2S3dNeGxrc2lDeElTRWd4c2RFTU1XMU5LYVV0S2gwd0hFbDdEZC9CaGZBbWZ4WjkyTUFaaW0rbDg1NXN6WjA0SHdEVytJWkEvVHh3NUM1d3h5dmtFcCtoWkx0QS9XeTZTWHl5WFVNV2I1VEw5dStVS0hoQllydUlHSDZ3Z2l1ZU1GdmkwTEhBbExpMmY0RUxjV1M3UVAxb3VrbnVXUzdnVnI1Ykw5SjdsQ2lZaXRWekZ2ZmdhcU5WV1IwRm9aRzFRbCsxbXF5T25XNm1vb3NTTnBiczJvZEtwN011NVNvd2Z4OHJ4MUhMUFl6OVl4NjdlaC90NTR1czBVb2xzT2MyOUd2bUpyMTNqejNiVjAwM1FObVl1NTFvdDVkQm15SlZXQzk4elRtak1xdHRvL0QwUEF5aXNzSVZHeEtzS1lTQlJvNjF6YnFPSkZqcWtLVE1rTS9Pc0NBbGN4RFF1MXR3Ulppc3A0ejdIbkZGQzZ6TWpKanZ3K0YwZStURXA0UDZZVmZUUjZtRThJZTNPaURJdjJaZkQ3ZzZ6UnFRa3kzUXpPL3Z0UGNXR3A3VnBEWGZ0dXRSWlZ4TERneHFTOTdGYlc5QjQ5RTUySzRhMml3YmZmLzd2QitOcGhFOEFlSnh0eGtFT2d5QVFCZEQ1dElwSXI4S2hrSXdPQ1ZnQzQ2SzNiOUp1ZmF0SGh2NVd1dWRoOE1BVEUyWllMSEJZNGZFaW8ySlZRc2xEbDhLN2hpMGZydWREZnB1R3hNNDJ2V3ZsVTUzS1ZiY1JyalkzUGxNdVhuc2NFcmcyL2ZqWU5hZkNJUllsK2dKZnBCN1plSnhqOE43QmNDSW9ZaU1qWTEva0JzYWRIQXdjRE1rRkd4bFluVFl4TURKb2dSaWJ1WmdZT1NBc1BnWXdpODFwRjlNQm9EUW5rTTN1dEl2QkFjSm1abkRacU1MWUVSaXh3YUVqWWlOemlzdEdOUkJ2RjBjREF5T0xRMGR5U0FSSVNTUVFiT1poWXVUUjJzSDR2M1VEUys5R0pnWVhBQXgySS9RQUFBPT0pIGZvcm1hdChcIndvZmZcIik7XG59XG4uZGVtby1pY29uIHtcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1mYW1pbHk6IFwic3ByZWFkdmlldy1kZW1vLWljb25cIjtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXZhcmlhbnQ6IG5vcm1hbDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbn1cblxuLmljb24tbGVmdC1iaWc6YmVmb3JlIHtcbiAgY29udGVudDogXCLuoIJcIjtcbn1cblxuLyogJ+6ggicgKi9cbi5pY29uLXJpZ2h0LWJpZzpiZWZvcmUge1xuICBjb250ZW50OiBcIu6gg1wiO1xufVxuXG4vKiAn7qCDJyAqL1xuLm1haW4tY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbi5idXR0b24tY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZmxleC1ncm93OiAwO1xuICBmbGV4LXNocmluazogMDtcbn1cbi5idXR0b24tY29udGFpbmVyICN0aXRsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBmbGV4LWdyb3c6IDE7XG4gIGZsZXgtc2hyaW5rOiAxO1xufVxuLmJ1dHRvbi1jb250YWluZXIgLmJ0biB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBoZWlnaHQ6IDMycHg7XG59XG5cbi5ncmlkIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogNzAwcHg7XG4gIG1pbi1oZWlnaHQ6IDcwMHB4O1xuICBtaW4td2lkdGg6IDg2MHB4O1xuICBmbGV4LWdyb3c6IDA7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5mbGV4MCB7XG4gIGZsZXgtZ3JvdzogMDtcbiAgZmxleC1zaHJpbms6IDA7XG59XG5cbi5nYy1ncmlkIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NlY2VjZTtcbn1cblxuLmNhbGVuZGFyLWdyb3VwaW5nIC5saW5rQnRuIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgcGFkZGluZzogNnB4O1xufVxuLmNhbGVuZGFyLWdyb3VwaW5nIC5wb3BvdmVyLWRpYWxvZyB7XG4gIHdpZHRoOiAxNjBweDtcbn1cbi5jYWxlbmRhci1ncm91cGluZyAucG9wb3Zlci1kaWFsb2cgLmdyb3VwLWNvbnRlbnQge1xuICBmb250LXNpemU6IDEycHg7XG59XG4uY2FsZW5kYXItZ3JvdXBpbmcgLmdjLWNhbGVuZGFyLWNlbGwtdGV4dCB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDM1cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG4ubWF4VmFsdWVDbGFzcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1YTU0YzQ7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cblxuLm1pblZhbHVlQ2xhc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTM5MTdlO1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIGNvbG9yOiAjZmZmO1xuICBmb250LXNpemU6IDE1cHg7XG59XG5cbi5wZXJzb25OYW1lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tbGVmdDogNXB4O1xuICB3aWR0aDogNDBweDtcbn1cblxuLnBlcnNvblNhbGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAyNXB4O1xufVxuXG4uaW5jb21lIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnN1bW1hcnlDZWxsIHtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBib3R0b206IDA7XG4gIHBhZGRpbmc6IDAuNGVtO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAwO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5pbmNvbWVDb250YWluZXIge1xuICBjb2xvcjogIzc3Nztcbn1cblxuLnBlcmNlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWE1NGM0O1xuICBjb2xvcjogI2ZmZjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBhZGRpbmctbGVmdDogOHB4O1xuICBwYWRkaW5nLXJpZ2h0OiA4cHg7XG59XG5cbi5wb3BvdmVyLWRpYWxvZzpiZWZvcmUge1xuICBjb250ZW50OiBcIlwiO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IGZpeGVkO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDB2aDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xufSIsIkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogJ3NwcmVhZHZpZXctZGVtby1pY29uJztcbiAgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7YmFzZTY0LGQwOUdSZ0FCQUFBQUFCRmNBQThBQUFBQUhkd0FBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCSFUxVkNBQUFCV0FBQUFETUFBQUJDc1A2ejdVOVRMeklBQUFHTUFBQUFRd0FBQUZZK0lVa3lZMjFoY0FBQUFkQUFBQUIyQUFBQjdnbFA3UTFqZG5RZ0FBQUNTQUFBQUJNQUFBQWdCdFgvQW1ad1oyMEFBQUpjQUFBRmtBQUFDM0NLa1pCWloyRnpjQUFBQit3QUFBQUlBQUFBQ0FBQUFCQm5iSGxtQUFBSDlBQUFCbVlBQUFvVUxwcXlsR2hsWVdRQUFBNWNBQUFBTUFBQUFEWUpvcWZZYUdobFlRQUFEb3dBQUFBZEFBQUFKQWM5QTExb2JYUjRBQUFPckFBQUFCZ0FBQUFzSjUwQUFHeHZZMkVBQUE3RUFBQUFHQUFBQUJnTk1BOU1iV0Y0Y0FBQUR0d0FBQUFnQUFBQUlBRWhERFp1WVcxbEFBQU8vQUFBQVhjQUFBTE56SjBjSG5CdmMzUUFBQkIwQUFBQWJBQUFBSkM4dDltaGNISmxjQUFBRU9BQUFBQjZBQUFBaHVWQks3eDRuR05nWkdCZzRHS1FZOUJoWUhSeDh3bGg0R0JnWVlBQWtBeGpUbVo2SWxBTXlnUEtzWUJwRGlCbWc0Z0NBSW9qQTA4QWVKeGpZR1NleFRpQmdaV0JnYW1LYVE4REEwTVBoR1o4d0dESXlBUVVaV0JsWnNBS0F0SmNVeGdjWGpDODRHUU8rcC9GRU1VY3hEQWRLTXdJa2dNQThjZ0wwUUI0bk8yUjBRM0NRQXhEMzlGUTZLbWo4TWxBZkRFTG8yYUwxa2s5QnBHZXBWaTUrN0NCTzdDSWx3Z1lYd1kxSDdtai9ZWFpmdkR1bXlnL3QrT1FVcW85V20rNkRmMjQ4dURKMXU5Vy9yTzMvcnpOeXUyaWt6UktqelRWU0pyS05rMjFsVVlwazBaNWswYkprMFlkcUtrTDVnbDNYeHROQUFCNG5HTmdRQU1TRU1nYzlEOFRoQUVTWmdQYkFIaWNyVlpwZDlOR0ZCMTVTWnlFTENVTExXcGh4TVJwc0VZbWJNR0FDVUd5WXlCZG5LMlZvSXNVTyttKzhZbmY0Ri96Wk5wejZEZCtXdThiTHlTUXRPZHdtcE9qZCtmTjFjemJaUkpha3RnTDY1R1VteS9GMU5ZbWpldzhDZW1HVGN0UmZDZzdleUZsaXNuZkJWRVFyWmJhdHgySFJFUWlVTFd1c0VRUSt4NVptbVI4NkZGR3k3YWtWMDNLTFQzcExsdmpRYjFWMzM0YU9zcXhPNkdrWmpOMGFEMnlKVlVZVmFKSXBqMVMwcVpscVBvclNTdTh2OExNVjgxUXdvaE9JbW04R2NiUVNONGJaN1RLYURXMjR5aUtiTExjS0ZJa211RkJGSG1VMVJMbjVJb0pETW9IelpEeXlxY1I1Y1A4aUt6WW81eFdzRXUyMC95K0wzbW5kemsvc1Y5dlViYmtRQi9JanV6ZzdIUWxYNFJiVzJIY3RKUHRLRlFSZHRkM1Ftelo3RlQvWm8veW1rWUR0eXN5dmRDTVlLbDhoUkFyUDZITS9pRlpMWnhQK1pKSG8xcXlrUk5CNjJWTzdFcytnZGJqaUNseHpSaFowTjNSQ1JIVS9aSXpEUGFZUGg3ODhkNHBsZ3NUQW5nY3kzcEhKWndJRXlsaGN6UkoyakJ5WUNWbGl5cXA5YTZZT09WMVdzUmJ3bjd0MnRHWHptampVSGRpUEZzUEhWczVVY254YUZLbm1VeWQya25Ob3lrTm9wUjBKbmpNcndNb1A2SkpYbTFqTlltVlI5TTRac2FFUkNJQ0xkeExVMEVzTzdHa0tRVE5veG05dVJ1bXVYWXRXcVRKQS9YY28vZjA1bGE0dWROVDJnNzBzMFovVnFkaU90Z0wwK2xwNUMveGFkcmxJa1hwK3VrWmZremlRZFlDTXBFdE5zT1Vnd2R2L1E3U3k5ZVdISVhYQnRqdTdmTXJxSDNXUlBDa0Fmc2IwQjVQMVNrSlRJV1lWWWhXUUdLdGExbVd5ZFdzRnFuSTFIZERtbGErck5NRWluSWNGOGUrakhIOVh6TXpscGdTdnQrSjA3TWpMajF6N1VzSTB4eDhtM1U5bXRlcHhYSUJjV1o1VHFkWmx1L3JOTWZ5QTUzbVdaN1g2UWhMVzZlakxEL1VhWUhsUnpvZFkzbEJDNXAwMzhHUWl6RGtBZzZRTUlTbEEwTllYb0loTEJVTVlia0lRMWdXWVFqTEpSakM4bU1Zd25JWmhyQzhyR1hWMUZOSjQ5cVpXQVpzUW1CaWpoNjV6RVhsYWlxNVZFSzdhRlJxUTU0U2JwVlVGTStxZjJXZ1hqenloam13RmtpWHlKcGZNYzZWajBibCtOWVZMVzhhTzFmQXNlcHZINDcyT2ZGUzFvdUZQd1gvMWRaVUpiMWl6Y09UcS9BYmhwNXNKNm8ycVhoMFRaZlBWVDI2L2w5VVZGZ0w5QnRJaFZnb3lySnNjR2NpaEk4Nm5ZWnFvSlZEekd6TVBMVHJkY3VhbjhQOU56RkNGbEQ5K0RjVUdndmNnMDVaU1ZudDRLelYxOXV5M0R1RGNqZ1RMRWt4Ti9QNlZ2Z2lJN1BTZnBGWnlwNlBmQjV3Qll4S1pkaHFBNjBWdk5rbk1RK1ozaVRQQkhGYlVUWkkydGpPQklrTkhQT0FlZk9kQkNaaDZxb041RTdoaGczNEJXRnV3WGtuWEtKNm95eUg3a1hzOHlpay9GdW40a1QycUdpTXdMUFpHMkd2NzBMS2IzRU1KRFQ1cFg0TVZCV2hxUmcxRmRBMFVtNm9CbC9HMmJwdFFzWU85Q01xZHNPeXJPTER4eGIzbFpKdEdZUjhwSWpWbzZPZjFsNmlUcXJjZm1ZVWwrK2R2Z1hCSURVeGYzdmZkSEdReXJ0YXlUSkhiUU5UdHhxVlU5ZWFRK05WaCtybVVmVzk0K3dUT1d1YWJyb25IbnBmMDZyYndjVmNMTEQyYlE3U1VpWVgxUFZoaFEyaXk4V2xVT3BsTkVudnVBY1lGaGpRNzFDS2pmK3IrdGg4bml0VmhkRnhKTjlPMUxmUjUyQU0vQS9ZZjBmMUE5RDNZK2h5RFM3UDk1b1RuMjcwNFd5WnJxSVg2NmZvTnpCcnJibFp1Z2JjMEhRRDRpRkhyWTY0eWcxOHB3WnhlcVM1SE9raDRHUGRGZUlCd0NhQXhlQVQzYldNNWxNQW8vbU1PVDdBNTh4aDBHUU9neTNtTU5obXpockFEbk1ZN0RLSHdSNXpHSHpCbkhXQUw1bkRJR1FPZzRnNURKNHdKd0I0eWh3R1h6R0h3ZGZNWWZBTmMrNERmTXNjQmpGekdDVE1ZYkN2NmRZd3pDMWUwRjJndGtGVm9BTlRUMWpjdytKUVUyWEkvbzRYaHYyOVFjeit3U0NtL3FqcDlwRDZFeThNOVdlRG1QcUxRVXo5VmRPZElmVTNYaGpxN3dZeDlRK0RtUHBNdnhqTFpRYS9qSHlYQ2dlVVhXdys1KytKOXcvYnhVQzVBQUVBQWYvL0FBOTRuS1ZWV1c4YjF4VSs1OTdaT0J5dW1vV3l5REUzY1d4U2tGeXVpcXhTbEJmUWt1a0Z0cERRU2FUUWpxeTJrRzNKRGVDZzZQYWd3TFhSSmdLeUZLaGJCQWlzeHdhdCt0S1hBSDFvbjdvQWJYNUNId0laUlpHblByU0l4ajJYWWhVN2licWdRODY5NTd2bnpNeTU1enZuWEFnQVBQNDczK0ZCaU1CaG1JQVp1QUF2d1JwOEZ6YmhRcXNUQ3pFMWFqQ0ZxMG92RW1BOHJER0duUFdDTWtNQVhCQXpRbGVYR0NCMDN2aiszWTN2ZlBQT0s3ZFdWMTVlZXVIWnkrZlAxZ1pYSlM2blNxT1dxYWk1Yk1HclZldE9wV3pIQ0hzRDNDQ01uOUVMWE1JOWZCejM4QmZaZnhuL3ZiM1FDL3VoZ1Y3Z3Z0NU4yNzl3WEtUUlRqOGg0dlY5NExqK1R3N1M0TXFuRHo1aDliVGlpWmMvdUdFVHRHN1FhMXhVVnNYa3JBb0wvdzlQYUZoK1ZkaUx3Zi85LzJxRTJ2NDZBQ2hmeU8xMDY1a2dxanIyT1EwZzE3RFBxSXg5UW1raVBpVVVkSDZHUXVPL3BUQXowR2NPb0dTZ2IyVDJLTWtOY0NWek1DWHN0Mmw3OTFFZk1jZHhkeHNINi9BcDlQOEYvZWw0VW9BZTMrTlgyRjhoQmZsV0JoaG5hN1NJNjhBQitBSndEbDBTb0ZOdzdKd2tKMHJZMzUxam14RlVzaDRXcWcyc2x3K2p3TFJYZmlXZjhsL2RzcXlpZGR6eTN6Wk52R0ZOMlVYTDJzTDdxVHd1dGQzaWxqbHRsZ1lLWEJXV1UvYldFZGozcFVhK3VIMWZPT05yWW5VZHFDRFpBbENaZG9HWTdkaWpCYlB2aTZtU0V4UGt4QXhtQmpXVDhRU3FseDIwZWMzMDM3R25yS0p0UC9SZlRlWHpLYnovMExhTC9RK2JPT1dhd3NPaU5XMDlMTHJrR1c1WjB3UXQveDJ6Nzh2M0tNOXFNQVJlSzY5VEJtRTdnSEE2U002Y0lxOFFGb1RMWFJHc1RyN0FaTHRrVlp0eXBSYkFXRFlzSHp0enAvZjJ4WlA0aXYvNnlyVUg4OWZLWTkvWS9QT2JLK1ZEMHQvOEgvaXZvOEhpMlZQWGZ0ai96dGY0RHZzMUZDRFpHaDZodDJFN2hIQkt2SmQyRHl2NWJJN0pGdTAxakxtc3A2ajBvOVFxMUF1MHl4bHNzaGtjUjYvYVpKV3lpM3puN2tmM3ZPS3R0MGJ5ZXBnemlYRkRDcG1xR1ZVajNXVzgrTm9IeS9jK3VvdExWN2Q2MHRXQ0pxR2hJOU1rSHBIRHRwWk1EaFhMYnk3TXZkYWI3RzBKOWg5djgrZjVKZENnQ2JmZ1hHdCticmJCdVl4dGtDbEpaSDRUZEFDbVE0OHNtS3l4SlhwR2xiamFBd2tVU1htUk5oTG9RaUJnNE56TjFaWGwwVW96V2YvU1lhc1VwSkpyVk1kUk1lMG1ZclhnNWFwMWo2WXdVNVVJaGhuZDZPVml0QjNKc2FtK2FsV3ZpVld2WGlPYkpqWk0xYmIyN2tFVkZzUllpNGxhckRmcWpTWnIxRVVveUlCcWQ5Tk8ydlJuRzJQSjM5UXgyd2lIVFNma2hvTGhoRzRicGg2UHEzWTRhU1RabmJtVHF5eHE2aWs5RUUrMFIyUUxNNzN6WitwZlBUMXJ2SmNxRmxNL01wOUpKME9HbmJDVEUvTkhScTVOUGJzY01WbmlVSUtaZURGVnhQVFgwNDBxUms3TUowS0ZXRGlhRGd6cEJ2by9ab3FpS2V6b1lpUWFLQjZKSjcxUVhzT3lWVDRhTjBzRnc1Z3NuWC8ra09NVVUzamRMWWJtaW03NFJNZTI4dWRuSzVNaXR5aU9nb056N0RGMVBST0dJUTkzVzFUQlRFN1pZWW8wRzZZQ0FTNmFtOVErKy9QNHhXN0xJMjdrdGIwaUp0VmFQMDlmVmhBbENTL1JoTkp6SUtGMGRxUlYrTHdsckgzZThFb3JEcEJKSjV4b0pLQ1JHNHFwVWk0NkRVKzFLaFpXYzFrcVFNdXNsS2tKZUE3bWFraHR3R3YwRzhMdnlodVZNL2lTSVV2K242U1FMT0VFZDNmOFl6djhuTG00czJnZXR6ZUlvWTNLZEpzcGh1Ui9LTkdJNDlMdEhYL2lFVDVJV1l1UFhyU3NEUnNHUFgrYngvZDcvbkU0Q1YrQjVkYlY1MDR6UlR1YUdZNEZVS0hHMEpZNUkwRkJ1Q2t4QnFvQzZpcUVJYUNGQTcxSWlHbUd6aFRVbENWUWcwRjFBVlExMklXZ0d1eGNYNzY2OU1LVnk1Y3VkT2Jhc3pObTNpeUlLeGVsUk1YWVhwYnQ1VmZaZHY0REhvcGxZcWFMMVBZcHR5c2VKYmRDQVJNMnNjR2hFTXY5NjdCdVVEWlRpaDVHY2NhNHVwYlg5UDZ3K2FuNGhxN3VpYXAreGpjMGplRWZtYWI1OS84eElzbmJpb1IvMGJWNmRkUS9ObHJGbXJEN3FSY1lvK05qVFBQZTEzVDhwZjhyc1lpellqeEE5cGRaYlBkaktnWGRaTmRuNmFTVUw5TVhkejhlUDNWaW5BMzFuVmkwa3VpYWkzcWZoM2Y1SmsrSlNvY2dSQ2tuWFpodnRVVVg0d2lpQTFCam9FNGdnNlRJMHBKdWFGeFJWV1doTHlocU54aWdJbGM3OFppYlNvN1lWbXc0UGh5THg4UVZEY25KRW1acW1mMjdXamF6bzJVN2pPT3M3Z2pBTnovWjROLzJ0M2MvWk9ONFFjaWZiS3l2WThMT012ZFltdVUvV0Y5bjc2LzcyK3YrejliOGIwM2V2cDBkeTJOMlBOMll2QTMvQkxrMHB0d0FBSGljWTJCa1lHQUE0Z2MzRXFiSDg5dDhaZUJtZmdFVVlianN1MGtHUWYvUFpIN0JIQVRrY2pBd2dVUUJZVzRMMVhpY1kyQmtZR0FPK3A4RkpGOHdNUHovRHlTQklpaUFHd0NIMUFXZ0FBQUFlSnhqZnNIQXdBekRrVkNNemhjRTRnVU1EQUN5NXdhL0FBQUFBQUR1QVpZQjNBSWlBbFlDb2dOa0ErZ0VyQVVLQUFFQUFBQUxBSkFBQ1FBQUFBQUFBZ0FrQURRQWN3QUFBSFVMY0FBQUFBQjRuSFdReTA3Q1FCU0cvNUdMQ29rYVRkdzZLd014bGtzaUN4SVNFZ3hzZEVNTVcxTkthVXRLaDB3SEVsN0RkL0JoZkFtZnhaOTJNQVppbStsODU1c3paMDRId0RXK0laQS9UeHc1QzV3eHl2a0VwK2haTHRBL1d5NlNYeXlYVU1XYjVUTDl1K1VLSGhCWXJ1SUdINndnaXVlTUZ2aTBMSEFsTGkyZjRFTGNXUzdRUDFvdWtudVdTN2dWcjViTDlKN2xDaVlpdFZ6RnZmZ2FxTlZXUjBGb1pHMVFsKzFtcXlPblc2bW9vc1NOcGJzMm9kS3A3TXU1U293Zng4cngxSExQWXo5WXg2N2VoL3Q1NHVzMFVvbHNPYzI5R3ZtSnIxM2p6M2JWMDAzUU5tWXU1MW90NWRCbXlKVldDOTh6VG1qTXF0dG8vRDBQQXlpc3NJVkd4S3NLWVNCUm82MXpicU9KRmpxa0tUTWtNL09zQ0FsY3hEUXUxdHdSWmlzcDR6N0huRkZDNnpNakpqdncrRjBlK1RFcDRQNllWZlRSNm1FOEllM09pREl2MlpmRDdnNnpScVFreTNRek8vdnRQY1dHcDdWcERYZnR1dFJaVnhMRGd4cVM5N0ZiVzlCNDlFNTJLNGEyaXdiZmYvN3ZCK05waEU4QWVKeHR4a0VPZ3lBUUJkRDV0SXBJcjhLaGtJd09DVmdDNDZLM2I5SnVmYXRIaHY1V3V1ZGg4TUFURTJaWUxIQlk0ZkVpbzJKVlFzbERsOEs3aGkwZnJ1ZERmcHVHeE00MnZXdmxVNTNLVmJjUnJqWTNQbE11WG5zY0VyZzIvZmpZTmFmQ0lSWWwrZ0pmcEI3WmVKeGo4TjdCY0NJb1lpTWpZMS9rQnNhZEhBd2NETWtGR3hsWW5UWXhNREpvZ1JpYnVaZ1lPU0FzUGdZd2k4MXBGOU1Cb0RRbmtNM3V0SXZCQWNKbVpuRFpxTUxZRVJpeHdhRWpZaU56aXN0R05SQnZGMGNEQXlPTFEwZHlTQVJJU1NRUWJPWmhZdVRSMnNINHYzVURTKzlHSmdZWEFBeDJJL1FBQUE9PSlcbiAgICBmb3JtYXQoJ3dvZmYnKTtcbn1cblxuLmRlbW8taWNvbiB7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtZmFtaWx5OiAnc3ByZWFkdmlldy1kZW1vLWljb24nO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtdmFyaWFudDogbm9ybWFsO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4uaWNvbi1sZWZ0LWJpZzpiZWZvcmUge1xuICBjb250ZW50OiAnXFxlODAyJztcbn0gLyogJ+6ggicgKi9cblxuLmljb24tcmlnaHQtYmlnOmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICdcXGU4MDMnO1xufSAvKiAn7qCDJyAqL1xuXG4ubWFpbi1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuLmJ1dHRvbi1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4LWdyb3c6IDA7XG4gIGZsZXgtc2hyaW5rOiAwO1xuXG4gICN0aXRsZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBmbGV4LXNocmluazogMTtcbiAgfVxuXG4gIC5idG4ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDMycHg7XG4gIH1cbn1cblxuLmdyaWQge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA3MDBweDtcbiAgbWluLWhlaWdodDogNzAwcHg7XG4gIG1pbi13aWR0aDogODYwcHg7XG4gIGZsZXgtZ3JvdzogMDtcbiAgZmxleC1zaHJpbms6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmZsZXgwIHtcbiAgZmxleC1ncm93OiAwO1xuICBmbGV4LXNocmluazogMDtcbn1cblxuLmdjLWdyaWQge1xuICBib3JkZXI6IDFweCBzb2xpZCAjY2VjZWNlO1xufVxuXG4uY2FsZW5kYXItZ3JvdXBpbmcge1xuICAubGlua0J0biB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgcGFkZGluZzogNnB4O1xuICB9XG5cbiAgLnBvcG92ZXItZGlhbG9nIHtcbiAgICB3aWR0aDogMTYwcHg7XG4gIH1cblxuICAucG9wb3Zlci1kaWFsb2cgLmdyb3VwLWNvbnRlbnQge1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgfVxuXG4gIC5nYy1jYWxlbmRhci1jZWxsLXRleHQge1xuICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAgIGZvbnQtc2l6ZTogMzVweDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi5tYXhWYWx1ZUNsYXNzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVhNTRjNDtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1zaXplOiAxNXB4O1xufVxuXG4ubWluVmFsdWVDbGFzcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1MzkxN2U7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cblxuLnBlcnNvbk5hbWUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG4gIHdpZHRoOiA0MHB4O1xufVxuXG4ucGVyc29uU2FsZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6IDI1cHg7XG59XG5cbi5pbmNvbWUge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDE4cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uc3VtbWFyeUNlbGwge1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJvdHRvbTogMDtcbiAgcGFkZGluZzogMC40ZW07XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDA7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmluY29tZUNvbnRhaW5lciB7XG4gIGNvbG9yOiAjNzc3O1xufVxuXG4ucGVyY2VudCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1YTU0YzQ7XG4gIGNvbG9yOiAjZmZmO1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiAxM3B4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcbn1cblxuLnBvcG92ZXItZGlhbG9nOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMHZoO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4iXX0= */
(function () { const IS_PROD = window.process.env.NODE_ENV === 'production'; const USE_NPM = window.process.env.USE_NPM; const USE_CDN = window.process.env.USE_CDN; const SITE_ROOT = window.process.env.SITE_ROOT; const FRAMEWORK = window.process.env.FRAMEWORK; const ext = IS_PROD ? '.min.js' : '.js'; function js(name) { return name + ext; } function npm(t) { if (!t.file) { t.file = IS_PROD ? t.prod : t.dev; } const version = USE_CDN && t.version ? '@' + t.version : ''; const path = t.pkg + version + '/' + t.file; if (USE_CDN) { return 'https://unpkg.com/' + path; } return 'npm:' + path; } function dv(t) { if (USE_CDN || USE_NPM) { t.file = 'dist/' + t.file + '.min.js'; return npm(t); } return SITE_ROOT + '/static/dataviews/' + js(t.file); } const isTypeScript = FRAMEWORK === 'angular'; const babelConfig = { es2015: true, react: true, }; const meta = { js: { babelOptions: babelConfig, }, ts: { typescriptOptions: { tsconfig: true }, }, }; const map = { // gc.dataviews packages '@grapecity/dataviews.common': dv({pkg:'@grapecity/dataviews.common',file:'gc.dataviews.common',version:'1.8.12'}), '@grapecity/dataviews.core': dv({pkg:'@grapecity/dataviews.core',file:'gc.dataviews.core',version:'1.8.12'}), '@grapecity/dataviews.grid': dv({pkg:'@grapecity/dataviews.grid',file:'gc.dataviews.grid',version:'1.8.12'}), '@grapecity/dataviews.cardlayout': dv({pkg:'@grapecity/dataviews.cardlayout',file:'gc.dataviews.cardlayout',version:'1.8.12'}), '@grapecity/dataviews.masonry': dv({pkg:'@grapecity/dataviews.masonry',file:'gc.dataviews.masonry',version:'1.8.12'}), '@grapecity/dataviews.calendar': dv({pkg:'@grapecity/dataviews.calendar',file:'gc.dataviews.calendar',version:'1.8.12'}), '@grapecity/dataviews.timeline': dv({pkg:'@grapecity/dataviews.timeline',file:'gc.dataviews.timeline',version:'1.8.12'}), '@grapecity/dataviews.trellis': dv({pkg:'@grapecity/dataviews.trellis',file:'gc.dataviews.trellis',version:'1.8.12'}), '@grapecity/dataviews.gantt': dv({pkg:'@grapecity/dataviews.gantt',file:'gc.dataviews.gantt',version:'1.8.12'}), '@grapecity/dataviews.searchbox': dv({pkg:'@grapecity/dataviews.searchbox',file:'gc.dataviews.searchbox',version:'1.8.12'}), '@grapecity/dataviews.react': dv({pkg:'@grapecity/dataviews.react',file:'gc.dataviews.react',version:'1.8.12'}), '@grapecity/dataviews.vue': dv({pkg:'@grapecity/dataviews.vue',file:'gc.dataviews.vue',version:'1.8.12'}), '@grapecity/dataviews.angular': dv({pkg:'@grapecity/dataviews.angular',file:'gc.dataviews.angular',version:'1.8.12'}), '@grapecity/dataviews.csvexport': dv({pkg:'@grapecity/dataviews.angular',file:'gc.dataviews.csvexport',version:'1.8.12'}), // third-party libs react: npm({pkg:'react',prod:'umd/react.production.min.js',dev:'umd/react.development.js',version:'16.13.1'}), 'react-dom': npm({pkg:'react-dom',prod:'umd/react-dom.production.min.js',dev:'umd/react-dom.development.js',version:'16.13.1'}), 'react-router-dom': npm({pkg:'react-router-dom',prod:'umd/react-router-dom.min.js',dev:'umd/react-router-dom.js',version:'5.2.0'}), 'vue': npm({pkg:'vue',file:'dist/vue.js',version:'2.6.12'}), 'vue-router': npm({pkg:'vue-router',file:'dist/vue-router.js',version:'3.4.3'}), 'lodash': npm({pkg: 'lodash', file: js('lodash')}), 'zone.js': npm({pkg: 'zone.js', file: js('dist/zone')}), 'rxjs': npm({pkg: 'rxjs', file: js('bundles/rxjs.umd')}), 'rxjs/operators': npm({pkg:'rxjs-operators-bundle',prod:'dist/bundle.min.js',dev:'dist/bundle.js',version:'1.0.2'}), '@angular/core': npm({pkg: '@angular/core', file: js('bundles/core.umd')}), '@angular/common': npm({pkg: '@angular/common', file: js('bundles/common.umd')}), '@angular/compiler': npm({pkg: '@angular/compiler', file: js('bundles/compiler.umd')}), '@angular/platform-browser': npm({pkg: '@angular/platform-browser', file: js('bundles/platform-browser.umd')}), '@angular/platform-browser-dynamic': npm({pkg: '@angular/platform-browser-dynamic', file: js('bundles/platform-browser-dynamic.umd')}), '@angular/http': npm({pkg: '@angular/http', file: js('bundles/http.umd')}), '@angular/common/http': npm({pkg: '@angular/common', file: js('bundles/common-http.umd')}), '@angular/router': npm({pkg: '@angular/router', file: js('bundles/router.umd')}), '@angular/forms': npm({pkg: '@angular/forms', file: js('bundles/forms.umd')}), // systemjs plugins 'systemjs-plugin-json': npm({pkg:'systemjs-plugin-json',file:'json.js',version:'0.3.0'}), 'systemjs-plugin-css': npm({pkg:'systemjs-plugin-css',file:'css.js',version:'0.1.37'}), 'systemjs-plugin-babel': npm({pkg:'systemjs-plugin-babel',file:'plugin-babel.js',version:'0.0.25'}), 'systemjs-babel-build': npm({pkg:'systemjs-plugin-babel',file:'systemjs-babel-browser.js',version:'0.0.25'}), 'plugin-typescript': npm({pkg:'plugin-typescript',file:'lib/plugin.js',version:'8.0.0'}), 'typescript': npm({pkg:'typescript',file:'lib/typescript.js',version:'4.0.2'}), 'systemjs-vue-browser': npm({pkg:'systemjs-vue-browser',file:'index.js',version:'1.0.11'}), }; const config = { defaultJSExtensions: true, transpiler: isTypeScript ? 'plugin-typescript' : 'systemjs-plugin-babel', typescriptOptions: { tsconfig: true }, meta: { '*.json': {loader: 'systemjs-plugin-json'}, '*.css': {loader: 'systemjs-plugin-css'}, '*.vue': {loader: 'systemjs-vue-browser'}, '*.js': meta.js, '*.ts': meta.ts, 'app.js': { format: 'esm', babelOptions: babelConfig, }, 'typescript': { exports: 'ts', }, '@grapecity/dataviews.common': { format: 'amd', }, '@grapecity/dataviews.core': { format: 'amd', deps: [ '@grapecity/dataviews.common', ], }, '@grapecity/dataviews.grid': { format: 'amd', deps: [ '@grapecity/dataviews.common', '@grapecity/dataviews.core', ], }, '@grapecity/dataviews.cardlayout': { format: 'amd', deps: [ '@grapecity/dataviews.common', ], }, '@grapecity/dataviews.masonry': { format: 'amd', deps: [ '@grapecity/dataviews.common', ], }, '@grapecity/dataviews.calendar': { format: 'amd', deps: [ '@grapecity/dataviews.common', '@grapecity/dataviews.core', ], }, '@grapecity/dataviews.timeline': { format: 'amd', deps: [ '@grapecity/dataviews.common', ], }, '@grapecity/dataviews.trellis': { format: 'amd', deps: [ '@grapecity/dataviews.common', ], }, '@grapecity/dataviews.gantt': { format: 'amd', deps: [ '@grapecity/dataviews.common', ], }, '@grapecity/dataviews.searchbox': { format: 'amd', deps: [ '@grapecity/dataviews.common', ], }, '@grapecity/dataviews.react': { format: 'amd', deps: [ 'react', '@grapecity/dataviews.common', '@grapecity/dataviews.core' ], }, '@grapecity/dataviews.vue': { format: 'amd', deps: [ 'vue', '@grapecity/dataviews.common', '@grapecity/dataviews.core' ], }, '@grapecity/dataviews.angular': { format: 'amd', deps: [ '@angular/core', '@grapecity/dataviews.common', '@grapecity/dataviews.core' ], }, '@grapecity/dataviews.csvexport': { format: 'amd', deps: [ '@grapecity/dataviews.common' ], }, }, paths: { // paths serve as alias 'npm:': SITE_ROOT + '/node_modules/', }, // map tells the System loader where to look for things map: map, // packages tells the System loader how to load when no filename and/or no extension packages: { '.': { defaultExtension: isTypeScript ? 'ts' : 'js' }, node_modules: { defaultExtension: 'js' }, } }; // fast format detection to avoid detection by source code using regexp Object.keys(map).filter(function (key) { return !config.meta[key]; }).forEach(function (key) { const path = map[key]; if (path.indexOf('/umd') >= 0 || path.indexOf('.umd') >= 0) { config.meta[key] = { format: 'amd' }; } if (path.indexOf('/cjs') >= 0) { config.meta[key] = { format: 'cjs' }; } }); System.config(config); })(this);