From ef5d07b902b2280013457976649ecf9c0eefe963 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 17 Apr 2018 14:45:11 +0200 Subject: [PATCH 001/540] Cross domain communication - Avoiding to send unnecessary HTTP header using AJAX to prevent browser to execute additional HTTP OPTIONS request in CORS mode - Avoiding to cause HTTP 404 Not Found errors on local domain --- src/docs/assets/portal.js | 7 +----- src/docs/components/docs/configuration.jsx | 6 +++-- src/lib/vendor.js | 28 +++++++--------------- src/lib/vendor.test.js | 3 +++ 4 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index a5397182..229ae884 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -8,12 +8,7 @@ const COOKIE_DOMAIN = parts.length > 1 ? `;domain=.${parts.slice(-2).join('.')}` const COOKIE_MAX_AGE = 33696000; const COOKIE_NAME = 'euconsent'; -const readVendorListPromise = fetch('./vendors.json', { - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } -}) +const readVendorListPromise = fetch('./vendors.json') .then(res => res.json()) .catch(err => { log.error(`Failed to load vendor list from vendors.json`, err); diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 4553bece..6aa602d2 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -3,6 +3,7 @@ import style from './docs.less'; import { Controlled as CodeMirror } from 'react-codemirror2'; import {js_beautify as beautify} from 'js-beautify'; +const LOCAL_VENDOR_LIST_LOCATION = `//${window.location.host}/cmp/vendors.json`; const script = beautify(` window.__cmp.config = { @@ -51,8 +52,9 @@ export default class CmpApi extends Component { storeConsentGlobally (Boolean): - If true then the the consent data is written to a cookie on the globalConsentLocation domain. - If false then the consent data will be written to a cookie on the domain that the CMP is loaded from. + If true then the vendors will be loaded from the global list location using the globalConsentLocation for cross domain communication + and the consent data is written to a cookie on the globalConsentLocation domain. + If false then the vendors will be loaded from {LOCAL_VENDOR_LIST_LOCATION} and the consent data will be written to a cookie on the domain that the CMP is loaded from. storePublisherData (Boolean): diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 2c3abdfc..782bd86c 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -6,21 +6,14 @@ import { sendPortalCommand } from './portal'; const LOCAL_VENDOR_LIST_LOCATION = `//${window.location.host}/cmp/vendors.json`; -/** - * Attempt to load a vendor list from the local domain. If a - * list is not found attempt to load it from the global list location - * using the "portal" for cross domain communication. - */ function fetchVendorList() { - return fetch(LOCAL_VENDOR_LIST_LOCATION, { - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } - }).then(res => res.json()) - .catch(() => { - log.debug('Local vendors.json not found. Requesting global list'); - return sendPortalCommand({command: 'readVendorList'}); + if (config.storeConsentGlobally && config.globalConsentLocation) { + return sendPortalCommand({command: 'readVendorList'}); + } + + return fetch(LOCAL_VENDOR_LIST_LOCATION).then(res => res.json()) + .catch(err => { + log.error(`Failed to load vendors list from ${LOCAL_VENDOR_LIST_LOCATION}`, err); }); } @@ -29,12 +22,7 @@ function fetchPurposeList() { return Promise.resolve(); } - return fetch(config.customPurposeListLocation, { - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } - }) + return fetch(config.customPurposeListLocation) .then(res => res.json()) .catch(err => { log.error(`Failed to load custom purposes list from ${config.customPurposeListLocation}`, err); diff --git a/src/lib/vendor.test.js b/src/lib/vendor.test.js index 1f8b9ee7..eeafa2ee 100644 --- a/src/lib/vendor.test.js +++ b/src/lib/vendor.test.js @@ -24,6 +24,9 @@ describe('vendor', () => { }); }); it('fetchVendorList sends a portal command', (done) => { + config.update({ + storeConsentGlobally: true + }); window.fetch = jest.fn().mockImplementation(() => Promise.reject()); fetchVendorList() .then(() => { From 9c116f6f8355d8f8223de40e55d36f30249cc297 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 17 Apr 2018 15:16:53 +0200 Subject: [PATCH 002/540] DreamLab specific changes --- src/components/footer/footer.jsx | 16 +++++++++------- src/docs/assets/portal.js | 2 +- webpack.config.babel.js | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/components/footer/footer.jsx b/src/components/footer/footer.jsx index dfb627c9..efa0f1c4 100644 --- a/src/components/footer/footer.jsx +++ b/src/components/footer/footer.jsx @@ -41,13 +41,15 @@ export default class Footer extends Component { class={style.close} onClick={this.handleClose} /> - A reminder you can control your user privacy preferences - - here - + + A reminder you can control your user privacy preferences + + here + + ); } diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index 229ae884..c775bbd9 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -8,7 +8,7 @@ const COOKIE_DOMAIN = parts.length > 1 ? `;domain=.${parts.slice(-2).join('.')}` const COOKIE_MAX_AGE = 33696000; const COOKIE_NAME = 'euconsent'; -const readVendorListPromise = fetch('./vendors.json') +const readVendorListPromise = fetch('//ocdn.eu/files/mastt/OWY7MDA_/a0f36bd165c1234fa41943198b5e1337.json') .then(res => res.json()) .catch(err => { log.error(`Failed to load vendor list from vendors.json`, err); diff --git a/webpack.config.babel.js b/webpack.config.babel.js index f37ab572..46e99c4a 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -86,7 +86,7 @@ const commonConfig = { sourceMap: CSS_MAPS, importLoaders: 1, minimize: true, - localIdentName: '[name]_[local]--[hash:base64:5]' + localIdentName: 'cmp-[name]_[local]' } }, { From 0d2449c739cbe30460154e368a3f22c24d38028a Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 17 Apr 2018 15:54:12 +0200 Subject: [PATCH 003/540] internet-explorer --- src/docs/components/examples/advanced/adAfterConsent.jsx | 2 +- src/docs/lib/stub.js | 2 +- src/index.js | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/docs/components/examples/advanced/adAfterConsent.jsx b/src/docs/components/examples/advanced/adAfterConsent.jsx index 43365588..ae8140f5 100644 --- a/src/docs/components/examples/advanced/adAfterConsent.jsx +++ b/src/docs/components/examples/advanced/adAfterConsent.jsx @@ -8,7 +8,7 @@ window.__cmp('addEventListener', 'onSubmit', function(result){ adFrame.src = 'http://ib.adnxs.com/tt?id=1959558'; var contentArea = document.getElementById('MyContentArea'); contentArea.innerHTML = ''; - contentArea.append(adFrame); + contentArea.appendChild(adFrame); }); `; diff --git a/src/docs/lib/stub.js b/src/docs/lib/stub.js index 9ca70f69..41a0ef87 100644 --- a/src/docs/lib/stub.js +++ b/src/docs/lib/stub.js @@ -45,7 +45,7 @@ function buildScript(config, cmpLocation='../cmp.bundle.js') { t.async = false; t.src = '${cmpLocation}'; var tag = document.getElementsByTagName('head')[0]; - tag.append(t); + tag.appendChild(t); } })(window, document);`; } diff --git a/src/index.js b/src/index.js index 44648972..b03c0105 100755 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ import 'core-js/fn/array/fill'; import 'core-js/fn/array/map'; import 'core-js/fn/array/for-each'; import 'core-js/fn/array/filter'; +import 'core-js/fn/array/from'; import {init} from './lib/init'; import { CMP_GLOBAL_NAME } from './lib/cmp'; From 47330f0285bed56b043072f96b4a8a40837dbe40 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 17 Apr 2018 16:36:01 +0200 Subject: [PATCH 004/540] Consents must be saved only on user's intentional action --- src/components/popup/popup.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index c5bb55e4..8a1529aa 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -51,7 +51,6 @@ export default class Popup extends Component { >
From 1bc4c8b4bafad61ab3a0732c59b1e487dae4bd6a Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 19 Apr 2018 14:19:34 +0200 Subject: [PATCH 005/540] Optimized cross domain communication --- package.json | 1 + src/docs/assets/portal.html | 1 - webpack.config.babel.js | 5 ++++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ef6429e1..d41daeaa 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "eslint-plugin-react": "^7.0.0", "extract-text-webpack-plugin": "^3.0.2", "file-loader": "^1.1.6", + "html-webpack-inline-source-plugin": "0.0.10", "html-webpack-plugin": "^2.28.0", "identity-obj-proxy": "^3.0.0", "jest": "^22.2.1", diff --git a/src/docs/assets/portal.html b/src/docs/assets/portal.html index 266b545b..e8708106 100644 --- a/src/docs/assets/portal.html +++ b/src/docs/assets/portal.html @@ -1,6 +1,5 @@ - diff --git a/webpack.config.babel.js b/webpack.config.babel.js index 46e99c4a..025e5e7b 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -1,5 +1,6 @@ import webpack from 'webpack'; import HtmlWebpackPlugin from 'html-webpack-plugin'; +import HtmlWebpackInlineSourcePlugin from 'html-webpack-inline-source-plugin'; import CopyWebpackPlugin from 'copy-webpack-plugin'; import autoprefixer from 'autoprefixer'; import path from 'path'; @@ -228,8 +229,10 @@ module.exports = [ new HtmlWebpackPlugin({ filename: 'portal.html', template: './docs/assets/portal.html', - chunks: ['portal'] + chunks: ['portal'], + inlineSource: '\\.(js|css)$' }), + new HtmlWebpackInlineSourcePlugin(), new CopyWebpackPlugin([ { from: 'docs/assets', to: '.' }, ]) From 69c8f8a7fa1a535766af43901ca35a185c44dba5 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 19 Apr 2018 14:21:08 +0200 Subject: [PATCH 006/540] Short living cookie for first test that will only measure conversion rate using Google Analytics --- src/docs/assets/portal.js | 4 ++-- src/lib/cookie/cookie.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index c775bbd9..37b5824a 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -5,10 +5,10 @@ import log from "../../lib/log"; const host = (window && window.location && window.location.hostname) || ''; const parts = host.split('.'); const COOKIE_DOMAIN = parts.length > 1 ? `;domain=.${parts.slice(-2).join('.')}` : ''; -const COOKIE_MAX_AGE = 33696000; +const COOKIE_MAX_AGE = 1209600;//33696000; const COOKIE_NAME = 'euconsent'; -const readVendorListPromise = fetch('//ocdn.eu/files/mastt/OWY7MDA_/a0f36bd165c1234fa41943198b5e1337.json') +const readVendorListPromise = fetch('//ocdn.eu/files/mastt/OTE7MDA_/6a1308f1bedc7a2a5f93a1d91de34f49.json') .then(res => res.json()) .catch(err => { log.error(`Failed to load vendor list from vendors.json`, err); diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index d797c506..6eca6374 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -13,10 +13,10 @@ import pack from '../../../package.json'; import config from '../config'; const PUBLISHER_CONSENT_COOKIE_NAME = 'pubconsent'; -const PUBLISHER_CONSENT_COOKIE_MAX_AGE = 33696000; +const PUBLISHER_CONSENT_COOKIE_MAX_AGE = 1209600;//33696000; const VENDOR_CONSENT_COOKIE_NAME = 'euconsent'; -const VENDOR_CONSENT_COOKIE_MAX_AGE = 33696000; +const VENDOR_CONSENT_COOKIE_MAX_AGE = 1209600;//33696000; function encodeVendorIdsToBits(maxVendorId, selectedVendorIds = new Set()) { From ce23d1667aded1e4d3623512916f5a7cae7f7028 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 19 Apr 2018 14:59:02 +0200 Subject: [PATCH 007/540] Message title Root domain name as message title is useless because it doesn't work properly for functional domains (eg. example.com.pl -> com.pl). In addition it's also legally problematic for vertical portals which have many websites in different root domains but want obtain consents once for all of them. --- src/components/popup/intro/intro.jsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/popup/intro/intro.jsx b/src/components/popup/intro/intro.jsx index 24a9bc80..0e5782f5 100644 --- a/src/components/popup/intro/intro.jsx +++ b/src/components/popup/intro/intro.jsx @@ -10,9 +10,6 @@ class LocalLabel extends Label { }; } -const HOST_PARTS = ((window && window.location && window.location.hostname) || '').split('.'); -const DOMAIN = HOST_PARTS.length > 0 ? HOST_PARTS.slice(-2).join('.') : ''; - export default class Intro extends Component { static defaultProps = {}; @@ -32,7 +29,7 @@ export default class Intro extends Component { onClick={onClose} />
- Thanks for visiting {DOMAIN} + Thanks for visiting
In order to run a successful website, we and certain third parties are setting cookies and accessing and storing information on your device for various purposes. Various third parties are also collecting data to show you personalized content and ads. Some third parties require your consent to collect data to serve you personalized content and ads. From e545f25eb49adc8493e082d3eeb60e6cca833d35 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 19 Apr 2018 16:18:36 +0200 Subject: [PATCH 008/540] New vendors list file --- src/docs/assets/portal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index 37b5824a..1195a807 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -8,7 +8,7 @@ const COOKIE_DOMAIN = parts.length > 1 ? `;domain=.${parts.slice(-2).join('.')}` const COOKIE_MAX_AGE = 1209600;//33696000; const COOKIE_NAME = 'euconsent'; -const readVendorListPromise = fetch('//ocdn.eu/files/mastt/OTE7MDA_/6a1308f1bedc7a2a5f93a1d91de34f49.json') +const readVendorListPromise = fetch('//ocdn.eu/files/mastt/Nzk7MDA_/b1f7c053e2b116a12721f60ccfd0f4df.json') .then(res => res.json()) .catch(err => { log.error(`Failed to load vendor list from vendors.json`, err); From 670dd6a7e72e9c7a800999279e2a13803b9d900d Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 25 Apr 2018 13:31:54 +0200 Subject: [PATCH 009/540] Cookie max age --- src/docs/assets/portal.js | 2 +- src/lib/cookie/cookie.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index f8e44db4..d6d2e672 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -5,7 +5,7 @@ import log from "../../lib/log"; const host = (window && window.location && window.location.hostname) || ''; const parts = host.split('.'); const COOKIE_DOMAIN = parts.length > 1 ? `;domain=.${parts.slice(-2).join('.')}` : ''; -const COOKIE_MAX_AGE = 1209600;//33696000; +const COOKIE_MAX_AGE = 33696000; const COOKIE_NAME = 'euconsent'; const readVendorListPromise = fetch('./vendorlist.json', { diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index d7bf9487..63c96e6a 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -13,10 +13,10 @@ import pack from '../../../package.json'; import config from '../config'; const PUBLISHER_CONSENT_COOKIE_NAME = 'pubconsent'; -const PUBLISHER_CONSENT_COOKIE_MAX_AGE = 1209600;//33696000; +const PUBLISHER_CONSENT_COOKIE_MAX_AGE = 33696000; const VENDOR_CONSENT_COOKIE_NAME = 'euconsent'; -const VENDOR_CONSENT_COOKIE_MAX_AGE = 1209600;//33696000; +const VENDOR_CONSENT_COOKIE_MAX_AGE = 33696000; function encodeVendorIdsToBits(maxVendorId, selectedVendorIds = new Set()) { From 83dfb822b0686dfeddce903ba756fdc80d99d56d Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 25 Apr 2018 15:23:24 +0200 Subject: [PATCH 010/540] Reading publisher consent data from external source --- src/complete.js | 1 - src/lib/config.js | 2 ++ src/lib/cookie/cookie.js | 66 ++++++++++++++++++++++++++++++----- src/lib/cookie/cookie.test.js | 11 +++--- src/lib/init.js | 6 ++-- 5 files changed, 69 insertions(+), 17 deletions(-) diff --git a/src/complete.js b/src/complete.js index c92177c5..295e66ae 100644 --- a/src/complete.js +++ b/src/complete.js @@ -4,7 +4,6 @@ import 'core-js/fn/array/map'; import 'core-js/fn/array/for-each'; import 'core-js/fn/array/filter'; import 'core-js/fn/array/from'; -import Promise from 'promise-polyfill'; import log from './lib/log'; import { init } from './lib/init'; import { CMP_GLOBAL_NAME } from "./lib/cmp"; diff --git a/src/lib/config.js b/src/lib/config.js index 72d0b795..9cea87bb 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,6 +6,8 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, + getPublisherConsentData: null, + setPublisherConsentData: null, logging: false, localization: {}, forceLocale: null, diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 63c96e6a..f1b678db 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -210,23 +210,73 @@ function writeCookie(name, value, maxAgeSeconds, path = '/') { document.cookie = `${name}=${value};path=${path}${maxAge}`; } +function readExternalPublisherConsentCookie() { + log.debug('Request publisher consent data from external source'); + return new Promise((resolve, reject) => { + try { + config.getPublisherConsentData((err, cookie) => { + if (err) { + log.error('Failed reading external publisher consent data', err); + reject(err); + } else { + log.debug('Read publisher consent data from external source', cookie); + resolve(cookie && decodePublisherConsentData(cookie)); + } + }); + } catch (err) { + log.error('Failed reading extenral publisher consent data', err); + reject(err); + } + }); +} + +function readLocalPublisherConsentCookie() { + const cookie = readCookie(PUBLISHER_CONSENT_COOKIE_NAME); + log.debug('Read publisher consent data from local cookie', cookie); + return Promise.resolve(cookie && decodePublisherConsentData(cookie)); +} + function readPublisherConsentCookie() { // If configured try to read publisher cookie if (config.storePublisherData) { - const cookie = readCookie(PUBLISHER_CONSENT_COOKIE_NAME); - log.debug('Read publisher consent data from local cookie', cookie); - if (cookie) { - return decodePublisherConsentData(cookie); - } + return config.setPublisherConsentData ? + readExternalPublisherConsentCookie() : + readLocalPublisherConsentCookie(); } + return Promise.resolve(); } -function writePublisherConsentCookie(publisherConsentData) { +function writeExternalPublisherConsentCookie(publisherConsentData) { + log.debug('Write publisher consent data to external source', publisherConsentData); + return new Promise((resolve, reject) => { + try { + config.setPublisherConsentData(encodePublisherConsentData(publisherConsentData), err => { + if (err) { + log.error('Failed writing external publisher consent data', err); + reject(err); + } else { + resolve(); + } + }); + } catch (err) { + log.error('Failed writing external publisher consent data', err); + reject(err); + } + }); +} + +function writeLocalPublisherConsentCookie(publisherConsentData) { log.debug('Write publisher consent data to local cookie', publisherConsentData); - writeCookie(PUBLISHER_CONSENT_COOKIE_NAME, + return Promise.resolve(writeCookie(PUBLISHER_CONSENT_COOKIE_NAME, encodePublisherConsentData(publisherConsentData), PUBLISHER_CONSENT_COOKIE_MAX_AGE, - '/'); + '/')); +} + +function writePublisherConsentCookie(publisherConsentData) { + return config.setPublisherConsentData ? + writeExternalPublisherConsentCookie(publisherConsentData) : + writeLocalPublisherConsentCookie(publisherConsentData); } diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index f5701627..b9a46ea7 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -210,11 +210,12 @@ describe('cookie', () => { lastUpdated: aDate, }; - writePublisherConsentCookie(publisherConsentData); - const fromCookie = readPublisherConsentCookie(); - - expect(document.cookie).to.contain(PUBLISHER_CONSENT_COOKIE_NAME); - expect(fromCookie).to.deep.include(publisherConsentData); + return writePublisherConsentCookie(publisherConsentData).then(() => { + readPublisherConsentCookie().then((fromCookie) => { + expect(document.cookie).to.contain(PUBLISHER_CONSENT_COOKIE_NAME); + expect(fromCookie).to.deep.include(publisherConsentData); + }); + }); }); it('converts selected vendor list to a range', () => { diff --git a/src/lib/init.js b/src/lib/init.js index 8af1638a..a45a6724 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -17,8 +17,8 @@ export function init(configUpdates) { log.debug('Using configuration:', config); // Fetch the current vendor consent before initializing - return readVendorConsentCookie() - .then(vendorConsentData => { + return Promise.all([readVendorConsentCookie(), readPublisherConsentCookie()]) + .then(([vendorConsentData, publisherConsentData]) => {console.info('!!', vendorConsentData, publisherConsentData) // Initialize the store with all of our consent data const store = new Store({ @@ -26,7 +26,7 @@ export function init(configUpdates) { cmpId: CMP_ID, cookieVersion: COOKIE_VERSION, vendorConsentData, - publisherConsentData: readPublisherConsentCookie() + publisherConsentData }); // Pull queued command from __cmp stub From 7f7cf6ac2922ec717297f90061a7d00669d5b17c Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 25 Apr 2018 15:48:02 +0200 Subject: [PATCH 011/540] Reading vendor consent data from external source --- src/lib/config.js | 2 ++ src/lib/cookie/cookie.js | 47 +++++++++++++++++++++++++++++++++++++++- src/lib/init.js | 2 +- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/lib/config.js b/src/lib/config.js index 9cea87bb..e2a40acd 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -8,6 +8,8 @@ const defaultConfig = { storePublisherData: false, getPublisherConsentData: null, setPublisherConsentData: null, + getVendorConsentData: null, + setVendorConsentData: null, logging: false, localization: {}, forceLocale: null, diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index f1b678db..0faa6380 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -224,7 +224,7 @@ function readExternalPublisherConsentCookie() { } }); } catch (err) { - log.error('Failed reading extenral publisher consent data', err); + log.error('Failed reading external publisher consent data', err); reject(err); } }); @@ -280,6 +280,26 @@ function writePublisherConsentCookie(publisherConsentData) { } +function readExternalVendorConsentCookie() { + log.debug('Request consent data from external source'); + return new Promise((resolve, reject) => { + try { + config.getVendorConsentData((err, cookie) => { + if (err) { + log.error('Failed reading external vendor consent data', err); + reject(err); + } else { + log.debug('Read consent data from external source', cookie); + resolve(cookie && decodeVendorConsentData(cookie)); + } + }); + } catch (err) { + log.error('Failed reading external vendor consent data', err); + reject(err); + } + }); +} + /** * Read vendor consent data from third-party cookie on the * global vendor list domain. @@ -300,6 +320,25 @@ function readGlobalVendorConsentCookie() { }); } +function writeExternalVendorConsentCookie(vendorConsentData) { + log.debug('Write consent data to external source', vendorConsentData); + return new Promise((resolve, reject) => { + try { + config.setVendorConsentData(encodeVendorConsentData(vendorConsentData), err => { + if (err) { + log.error('Failed writing external vendor consent data', err); + reject(err); + } else { + resolve(); + } + }); + } catch (err) { + log.error('Failed writing external vendor consent data', err); + reject(err); + } + }); +} + /** * Write vendor consent data to third-party cookie on the * global vendor list domain. @@ -345,11 +384,17 @@ function writeLocalVendorConsentCookie(vendorConsentData) { } function readVendorConsentCookie() { + if (config.getVendorConsentData) { + return readExternalVendorConsentCookie(); + } return config.storeConsentGlobally ? readGlobalVendorConsentCookie() : readLocalVendorConsentCookie(); } function writeVendorConsentCookie(vendorConsentData) { + if (config.setVendorConsentData) { + return writeExternalVendorConsentCookie(vendorConsentData); + } return config.storeConsentGlobally ? writeGlobalVendorConsentCookie(vendorConsentData) : writeLocalVendorConsentCookie(vendorConsentData); } diff --git a/src/lib/init.js b/src/lib/init.js index a45a6724..4d3ab90e 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -18,7 +18,7 @@ export function init(configUpdates) { // Fetch the current vendor consent before initializing return Promise.all([readVendorConsentCookie(), readPublisherConsentCookie()]) - .then(([vendorConsentData, publisherConsentData]) => {console.info('!!', vendorConsentData, publisherConsentData) + .then(([vendorConsentData, publisherConsentData]) => { // Initialize the store with all of our consent data const store = new Store({ From 1ad5ed4755351d2d8f49177c47f0875943e0c6b5 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 27 Apr 2018 11:53:44 +0200 Subject: [PATCH 012/540] Revert "Reading publisher consent data from external source" This reverts commit 83dfb822b0686dfeddce903ba756fdc80d99d56d. --- src/lib/config.js | 6 +- src/lib/cookie/cookie.js | 111 +++------------------------------- src/lib/cookie/cookie.test.js | 11 ++-- src/lib/init.js | 33 +++++++++- src/lib/store.js | 41 ++++++++++--- 5 files changed, 77 insertions(+), 125 deletions(-) diff --git a/src/lib/config.js b/src/lib/config.js index e2a40acd..5ba6ac62 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,10 +6,8 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - getPublisherConsentData: null, - setPublisherConsentData: null, - getVendorConsentData: null, - setVendorConsentData: null, + getConsentData: null, + setConsentData: null, logging: false, localization: {}, forceLocale: null, diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 0faa6380..63c96e6a 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -210,95 +210,25 @@ function writeCookie(name, value, maxAgeSeconds, path = '/') { document.cookie = `${name}=${value};path=${path}${maxAge}`; } -function readExternalPublisherConsentCookie() { - log.debug('Request publisher consent data from external source'); - return new Promise((resolve, reject) => { - try { - config.getPublisherConsentData((err, cookie) => { - if (err) { - log.error('Failed reading external publisher consent data', err); - reject(err); - } else { - log.debug('Read publisher consent data from external source', cookie); - resolve(cookie && decodePublisherConsentData(cookie)); - } - }); - } catch (err) { - log.error('Failed reading external publisher consent data', err); - reject(err); - } - }); -} - -function readLocalPublisherConsentCookie() { - const cookie = readCookie(PUBLISHER_CONSENT_COOKIE_NAME); - log.debug('Read publisher consent data from local cookie', cookie); - return Promise.resolve(cookie && decodePublisherConsentData(cookie)); -} - function readPublisherConsentCookie() { // If configured try to read publisher cookie if (config.storePublisherData) { - return config.setPublisherConsentData ? - readExternalPublisherConsentCookie() : - readLocalPublisherConsentCookie(); - } - return Promise.resolve(); -} - -function writeExternalPublisherConsentCookie(publisherConsentData) { - log.debug('Write publisher consent data to external source', publisherConsentData); - return new Promise((resolve, reject) => { - try { - config.setPublisherConsentData(encodePublisherConsentData(publisherConsentData), err => { - if (err) { - log.error('Failed writing external publisher consent data', err); - reject(err); - } else { - resolve(); - } - }); - } catch (err) { - log.error('Failed writing external publisher consent data', err); - reject(err); + const cookie = readCookie(PUBLISHER_CONSENT_COOKIE_NAME); + log.debug('Read publisher consent data from local cookie', cookie); + if (cookie) { + return decodePublisherConsentData(cookie); } - }); + } } -function writeLocalPublisherConsentCookie(publisherConsentData) { +function writePublisherConsentCookie(publisherConsentData) { log.debug('Write publisher consent data to local cookie', publisherConsentData); - return Promise.resolve(writeCookie(PUBLISHER_CONSENT_COOKIE_NAME, + writeCookie(PUBLISHER_CONSENT_COOKIE_NAME, encodePublisherConsentData(publisherConsentData), PUBLISHER_CONSENT_COOKIE_MAX_AGE, - '/')); + '/'); } -function writePublisherConsentCookie(publisherConsentData) { - return config.setPublisherConsentData ? - writeExternalPublisherConsentCookie(publisherConsentData) : - writeLocalPublisherConsentCookie(publisherConsentData); -} - - -function readExternalVendorConsentCookie() { - log.debug('Request consent data from external source'); - return new Promise((resolve, reject) => { - try { - config.getVendorConsentData((err, cookie) => { - if (err) { - log.error('Failed reading external vendor consent data', err); - reject(err); - } else { - log.debug('Read consent data from external source', cookie); - resolve(cookie && decodeVendorConsentData(cookie)); - } - }); - } catch (err) { - log.error('Failed reading external vendor consent data', err); - reject(err); - } - }); -} /** * Read vendor consent data from third-party cookie on the @@ -320,25 +250,6 @@ function readGlobalVendorConsentCookie() { }); } -function writeExternalVendorConsentCookie(vendorConsentData) { - log.debug('Write consent data to external source', vendorConsentData); - return new Promise((resolve, reject) => { - try { - config.setVendorConsentData(encodeVendorConsentData(vendorConsentData), err => { - if (err) { - log.error('Failed writing external vendor consent data', err); - reject(err); - } else { - resolve(); - } - }); - } catch (err) { - log.error('Failed writing external vendor consent data', err); - reject(err); - } - }); -} - /** * Write vendor consent data to third-party cookie on the * global vendor list domain. @@ -384,17 +295,11 @@ function writeLocalVendorConsentCookie(vendorConsentData) { } function readVendorConsentCookie() { - if (config.getVendorConsentData) { - return readExternalVendorConsentCookie(); - } return config.storeConsentGlobally ? readGlobalVendorConsentCookie() : readLocalVendorConsentCookie(); } function writeVendorConsentCookie(vendorConsentData) { - if (config.setVendorConsentData) { - return writeExternalVendorConsentCookie(vendorConsentData); - } return config.storeConsentGlobally ? writeGlobalVendorConsentCookie(vendorConsentData) : writeLocalVendorConsentCookie(vendorConsentData); } diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index b9a46ea7..f5701627 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -210,12 +210,11 @@ describe('cookie', () => { lastUpdated: aDate, }; - return writePublisherConsentCookie(publisherConsentData).then(() => { - readPublisherConsentCookie().then((fromCookie) => { - expect(document.cookie).to.contain(PUBLISHER_CONSENT_COOKIE_NAME); - expect(fromCookie).to.deep.include(publisherConsentData); - }); - }); + writePublisherConsentCookie(publisherConsentData); + const fromCookie = readPublisherConsentCookie(); + + expect(document.cookie).to.contain(PUBLISHER_CONSENT_COOKIE_NAME); + expect(fromCookie).to.deep.include(publisherConsentData); }); it('converts selected vendor list to a range', () => { diff --git a/src/lib/init.js b/src/lib/init.js index 4d3ab90e..1433c25e 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -2,7 +2,7 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; import Cmp, { CMP_GLOBAL_NAME } from './cmp'; -import { readVendorConsentCookie, readPublisherConsentCookie } from './cookie/cookie'; +import { readVendorConsentCookie, readPublisherConsentCookie, decodeVendorConsentData, decodePublisherConsentData } from './cookie/cookie'; import { fetchVendorList, fetchPurposeList } from './vendor'; import log from './log'; import pack from '../../package.json'; @@ -12,12 +12,41 @@ const CMP_VERSION = 1; const CMP_ID = 1; const COOKIE_VERSION = 1; +function readExternalConsentData(config) { + return new Promise((resolve, reject) => { + try { + config.getConsentData((err, data) => { + if (err) { + reject(err); + } else { + try { + resolve([ + decodeVendorConsentData(data.vendor), + decodePublisherConsentData(data.publisher) + ]); + } catch (err) { + reject(err); + } + } + }); + } catch (err) { + reject(err); + } + }); +} + +function readInternalConsentData() { + return readVendorConsentCookie().then(vendorConsentData => { + return [vendorConsentData, readPublisherConsentCookie()]; + }); +} + export function init(configUpdates) { config.update(configUpdates); log.debug('Using configuration:', config); // Fetch the current vendor consent before initializing - return Promise.all([readVendorConsentCookie(), readPublisherConsentCookie()]) + return (config.getConsentData ? readExternalConsentData(config) : readInternalConsentData()) .then(([vendorConsentData, publisherConsentData]) => { // Initialize the store with all of our consent data diff --git a/src/lib/store.js b/src/lib/store.js index c00427f4..1215b727 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -1,6 +1,7 @@ -import { writePublisherConsentCookie, writeVendorConsentCookie } from "./cookie/cookie"; +import { writePublisherConsentCookie, writeVendorConsentCookie, encodePublisherConsentData, encodeVendorConsentData } from "./cookie/cookie"; import config from './config'; import { findLocale } from './localize'; +import log from './log'; /** * Copy a data object and make sure to replace references @@ -224,16 +225,36 @@ export default class Store { publisherConsentData.created = publisherConsentData.created || now; publisherConsentData.lastUpdated = now; - // Write vendor cookie to appropriate domain - writeVendorConsentCookie({...vendorConsentData, vendorList}); + const vendorConsents = {...vendorConsentData, vendorList}; + const publisherConsents = { + ...vendorConsentData, ...publisherConsentData, + vendorList, + customPurposeList + }; + if (config.setConsentData) { + let consentData = { + vendor: encodeVendorConsentData(vendorConsents) + }; + if (config.storePublisherData) { + consentData.publisher = encodePublisherConsentData(publisherConsents); + } + try { + config.setConsentData(consentData, err => { + if (err) { + log.error('Failed writing external consent data', err); + } + }); + } catch (err) { + log.error('Failed writing external consent data', err); + } + } else { + // Write vendor cookie to appropriate domain + writeVendorConsentCookie(vendorConsents); - // Write publisher cookie if enabled - if (config.storePublisherData) { - writePublisherConsentCookie({ - ...vendorConsentData, ...publisherConsentData, - vendorList, - customPurposeList - }); + // Write publisher cookie if enabled + if (config.storePublisherData) { + writePublisherConsentCookie(publisherConsents); + } } // Store the persisted data From 24a8f2f6565f0116602319f1198d241db420457c Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 27 Apr 2018 15:19:31 +0200 Subject: [PATCH 013/540] Configuration of technical purposes that should be always active because they are required for service to work --- .../popup/details/purposes/purposes.jsx | 6 ++++ src/docs/components/docs/configuration.jsx | 29 +++++++++++++++++++ src/lib/config.js | 7 +++-- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 8d9821e4..7a2cb922 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -2,6 +2,7 @@ import { h, Component } from 'preact'; import style from './purposes.less'; import Switch from '../../../switch/switch'; import Label from "../../../label/label"; +import config from '../../../../lib/config'; class LocalLabel extends Label { static defaultProps = { @@ -69,6 +70,7 @@ export default class Purposes extends Component { const purposeIsActive = selectedPurposeIndex < purposes.length ? selectedPurposeIds.has(selectedPurposeId) : selectedCustomPurposeIds.has(selectedPurposeId); + const purposeIsTechnical = selectedPurposeIndex < purposes.length && config.technicalPurposes && config.technicalPurposes.indexOf(selectedPurpose.id) >= 0; const currentPurposeLocalizePrefix = `${selectedPurposeIndex >= purposes.length ? 'customPurpose' : 'purpose'}${selectedPurposeId}`; return ( @@ -89,6 +91,7 @@ export default class Purposes extends Component {
{selectedPurpose.name}
+ {!purposeIsTechnical &&
{purposeIsActive ? 'Active' : 'Inactive'}
+ }
+ {!purposeIsTechnical && Show full vendor list + }
diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 89711932..7f7b1529 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -73,6 +73,35 @@ export default class CmpApi extends Component { to debug. A boolean value of false disables logging.
+ + getConsentData(callback) (Function): + + Custom function to read vendor and publisher consent cookies + Arguments + + callback(err, consentData) (Function): Function to be executed with consent data object consisted with required vendor and optional publisher attributes + + + + + setConsentData(consentData, callback) (Function): + + Custom function to write vendor and publisher consent cookies + Arguments + + consentData (Object): Consent data object consisted with required vendor and optional publisher attributes + + + callback(err) (Function): Function to be executed on consent data write + + + + + technicalPurposes (Array): + + List of purpose identifiers that should be always active + + ); diff --git a/src/lib/config.js b/src/lib/config.js index 5ba6ac62..615b80c3 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,12 +6,13 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - getConsentData: null, - setConsentData: null, logging: false, localization: {}, forceLocale: null, - gdprApplies: true + gdprApplies: true, + getConsentData: null, + setConsentData: null, + technicalPurposes: [] }; class Config { From ceb31764f5d8bdf9adac396bf33bb3a46e155661 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 27 Apr 2018 18:11:55 +0200 Subject: [PATCH 014/540] Grouping purposes --- .../popup/details/purposes/purposes.jsx | 83 ++++++++++++++----- src/lib/config.js | 3 +- 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 7a2cb922..4a92617b 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -35,20 +35,62 @@ export default class Purposes extends Component { handleSelectPurpose = ({isSelected}) => { const {selectedPurposeIndex} = this.state; const { - purposes, - customPurposes, selectPurpose, selectCustomPurpose } = this.props; - const allPurposes = [...purposes, ...customPurposes]; - const id = allPurposes[selectedPurposeIndex].id; - - if (selectedPurposeIndex < purposes.length) { - selectPurpose(id, isSelected); - } - else { - selectCustomPurpose(id, isSelected); - } + const allPurposes = this.getAllPurposes(); + const selectedPurpose = allPurposes[selectedPurposeIndex]; + const ids = selectedPurpose.ids; + + selectedPurpose.ids.forEach(id => { + if (selectedPurpose.custom) { + selectCustomPurpose(id, isSelected); + } + else { + selectPurpose(id, isSelected); + } + }); + }; + + getAllPurposes = () => { + const { + purposes, + customPurposes + } = this.props; + let allPurposes = []; + + let purposeIdToGroupIndex = {}; + (config.groupPurposes || []).forEach((ids, i) => { + ids.forEach(id => { + purposeIdToGroupIndex[id] = i; + }); + }); + let groupIndexToPurposeIndex = {}; + (purposes || []).forEach(purpose => { + if (purposeIdToGroupIndex.hasOwnProperty(purpose.id)) { + const groupIndex = purposeIdToGroupIndex[purpose.id]; + if (groupIndexToPurposeIndex.hasOwnProperty(groupIndex)) { + allPurposes[groupIndexToPurposeIndex[groupIndex]].ids.push(purpose.id); + return; + } + groupIndexToPurposeIndex[groupIndex] = allPurposes.length; + } + allPurposes.push({ + ids: [purpose.id], + name: purpose.name, + custom: false + }); + }); + + (customPurposes || []).forEach(purpose => { + allPurposes.push({ + ids: [purpose.id], + name: purpose.name, + custom: true + }); + }); + + return allPurposes; }; @@ -56,22 +98,21 @@ export default class Purposes extends Component { const { onShowVendors, - purposes, - customPurposes, selectedPurposeIds, selectedCustomPurposeIds } = props; const {selectedPurposeIndex} = state; - const allPurposes = [...purposes, ...customPurposes]; + const allPurposes = this.getAllPurposes(); const selectedPurpose = allPurposes[selectedPurposeIndex]; - const selectedPurposeId = selectedPurpose && selectedPurpose.id; - const purposeIsActive = selectedPurposeIndex < purposes.length ? - selectedPurposeIds.has(selectedPurposeId) : - selectedCustomPurposeIds.has(selectedPurposeId); - const purposeIsTechnical = selectedPurposeIndex < purposes.length && config.technicalPurposes && config.technicalPurposes.indexOf(selectedPurpose.id) >= 0; - const currentPurposeLocalizePrefix = `${selectedPurposeIndex >= purposes.length ? 'customPurpose' : 'purpose'}${selectedPurposeId}`; + const purposeIsActive = selectedPurpose && selectedPurpose.ids.some(id => + selectedPurpose.custom ? selectedCustomPurposeIds.has(id) : selectedPurposeIds.has(id) + ); + const purposeIsTechnical = config.technicalPurposes && selectedPurpose && !selectedPurpose.custom && selectedPurpose.ids.some(id => + config.technicalPurposes.indexOf(id) >= 0 + ); + const currentPurposeLocalizePrefix = `${selectedPurpose && selectedPurpose.custom ? 'customPurpose' : 'purpose'}${selectedPurpose && selectedPurpose.ids}`; return (
@@ -80,7 +121,7 @@ export default class Purposes extends Component {
- = purposes.length ? 'customPurpose' : 'purpose'}${purpose.id}.menu`}>{purpose.name} + {purpose.name}
))}
diff --git a/src/lib/config.js b/src/lib/config.js index 615b80c3..dd7808d8 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -12,7 +12,8 @@ const defaultConfig = { gdprApplies: true, getConsentData: null, setConsentData: null, - technicalPurposes: [] + technicalPurposes: [], + groupPurposes: [] }; class Config { From a1db85582b0199bcdc5a8b71dfd26626ce26dd10 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 27 Apr 2018 21:49:28 +0200 Subject: [PATCH 015/540] Grouping purposes --- src/components/popup/details/purposes/purposes.jsx | 2 +- src/docs/components/docs/configuration.jsx | 6 ++++++ src/lib/config.js | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 4a92617b..dd5e3e22 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -60,7 +60,7 @@ export default class Purposes extends Component { let allPurposes = []; let purposeIdToGroupIndex = {}; - (config.groupPurposes || []).forEach((ids, i) => { + (config.purposeGroups || []).forEach((ids, i) => { ids.forEach(id => { purposeIdToGroupIndex[id] = i; }); diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 7f7b1529..e8e84bf7 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -102,6 +102,12 @@ export default class CmpApi extends Component { List of purpose identifiers that should be always active + + purposeGroups (Array): + + Array of arrays with purpose identifiers that should be organized in groups - each one with single switch which activates/deactivates all purposes in given group. For example: [[1, 4], [2, 3, 5]]. Purposes which are not included in any group will be displayed separatelly + + ); diff --git a/src/lib/config.js b/src/lib/config.js index dd7808d8..6a0601e1 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -13,7 +13,7 @@ const defaultConfig = { getConsentData: null, setConsentData: null, technicalPurposes: [], - groupPurposes: [] + purposeGroups: [] }; class Config { From 398415653ae3575fb0052c375e056f2fa9ee5596 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Sun, 6 May 2018 22:27:40 +0200 Subject: [PATCH 016/540] technicalPurposes -> legIntPurposeIds List of (non-consentable) data purposes that will be used under legitimate interest --- src/components/popup/details/purposes/purposes.jsx | 4 ++-- src/docs/components/docs/configuration.jsx | 4 ++-- src/lib/config.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index dd5e3e22..81412474 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -109,8 +109,8 @@ export default class Purposes extends Component { const purposeIsActive = selectedPurpose && selectedPurpose.ids.some(id => selectedPurpose.custom ? selectedCustomPurposeIds.has(id) : selectedPurposeIds.has(id) ); - const purposeIsTechnical = config.technicalPurposes && selectedPurpose && !selectedPurpose.custom && selectedPurpose.ids.some(id => - config.technicalPurposes.indexOf(id) >= 0 + const purposeIsTechnical = config.legIntPurposeIds && selectedPurpose && !selectedPurpose.custom && selectedPurpose.ids.some(id => + config.legIntPurposeIds.indexOf(id) >= 0 ); const currentPurposeLocalizePrefix = `${selectedPurpose && selectedPurpose.custom ? 'customPurpose' : 'purpose'}${selectedPurpose && selectedPurpose.ids}`; diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index e8e84bf7..2a6d00c9 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -97,9 +97,9 @@ export default class CmpApi extends Component { - technicalPurposes (Array): + legIntPurposeIds (Array): - List of purpose identifiers that should be always active + List of (non-consentable) data purposes that will be used under legitimate interest diff --git a/src/lib/config.js b/src/lib/config.js index 6a0601e1..a18f911b 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -12,7 +12,7 @@ const defaultConfig = { gdprApplies: true, getConsentData: null, setConsentData: null, - technicalPurposes: [], + legIntPurposeIds: [], purposeGroups: [] }; From 66a2ad41b7792a9c8533e20c77e3d3f89b569532 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 9 May 2018 13:27:31 +0200 Subject: [PATCH 017/540] Polish translation --- src/lib/translations.js | 165 ++++++++++++---------------------------- 1 file changed, 50 insertions(+), 115 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index aa7ba397..3f348010 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -5,133 +5,68 @@ * inline in each component. */ export default { - en: { + pl: { intro: { - title: '', - description: '', - acceptAll: '', - rejectAll: '', - showPurposes: '' + title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', + description: `Z dniem 25 maja 2018 roku rozpoczyna obowiązywanie Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (określane popularnie jako „RODO”). + RODO obowiązywać będzie w identycznym zakresie we wszystkich krajach Unii Europejskiej, a więc także w Polsce i wprowadza szereg zmian w zasadach regulujących przetwarzanie danych osobowych, które będą miały wpływ na wiele dziedzin życia, w tym na korzystanie z usług internetowych takich jak między innymi usługa portalu Onet i innych serwisów oferowanych przez Onet Holding sp. z o.o. + W tej informacji przedstawiamy skrót najważniejszych zagadnień dotyczących przetwarzania Twoich danych osobowych jakie może mieć miejsce po 25 maja 2018 roku w związku z korzystaniem z naszych usług. Prosimy o jej przeczytanie, nie zajmie to więcej niż kilka minut. +

Czym są dane osobowe

+ Dane osobowe to zgodnie z RODO informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej. W przypadku korzystania z naszych serwisów takimi danymi są np. adres e-mail, adres IP lub Twoje dane w koncie poczty elektronicznej czy koncie w innej usłudze Onetu. + Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach (np. local storage) instalowanych przez nas lub naszych zaufanych partnerów na naszych stronach i urządzeniach których używasz podczas korzystania z naszych usług. +

Podstawa i cel przetwarzania

+ Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a w przypadkach korzystania z naszych usług wystąpią co do zasady trzy z nich: + - niezbędność przetwarzania do zawarcia lub wykonania umowy, której jesteś stroną – umowa, o której mówią przepisy to w naszym przypadku regulamin danej usługi. Jeśli zatem zawieramy z Tobą umowę o realizację danej usługi – np. usługi, w ramach której zapewniamy Ci możliwość zapoznania z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu, to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. W przypadku, gdy zakładasz u nas konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tej możliwości nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. + - niezbędność przetwarzania do celów wynikających z prawnie uzasadnionych interesów realizowanych przez administratora lub przez stronę trzecią. Ta podstawa przetwarzania danych dotyczy przypadków, gdy ich przetwarzanie jest uzasadnione z uwagi na nasze usprawiedliwione potrzeby, co obejmuje między innymi konieczność zapewnienia bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszania naszych usług i dopasowania ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach) jak również prowadzenie marketingu i promocji naszych własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). + - Twoja dobrowolna zgoda. Ta podstawa przetwarzania danych będzie konieczna głównie w przypadku świadczenia Ci usług marketingowych przez podmioty trzecie (Zaufanych Partnerów, o których mowa poniżej) lub na ich rzecz. Chcąc przedstawić Ci reklamy, które będą dla Ciebie interesujące (np. przedstawić Ci reklamę produktu, którego możesz aktualnie potrzebować) reklamodawcy i ich przedstawiciele muszą mieć możliwość przetwarzania Twoich danych. Oczywiście udzielenie powyższej zgody jest całkowicie dobrowolne i jeśli nie chcesz, nie musisz jej udzielać. Udostępniane przez nas rozwiązanie umożliwia Ci także ograniczenie zakresu tej zgody, jak również jej zmianę w każdym momencie. Pozostałe przysługujące Ci w związku z udzieloną zgodą uprawnienia zostały opisane poniżej. + Twoje dane w ramach naszych usług przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu. +

Administrator

+ Administratorem Twoich danych osobowych będzie Onet – czyli Onet Holding sp. z o.o. z siedzibą w Warszawie (02 – 672), ul. Domaniewska 52, zarejestrowana w rejestrze przedsiębiorców Krajowego Rejestru Sądowego prowadzonym przez Sąd Rejonowy dla m. st. Warszawy Wydział XIII Gospodarczy Krajowego Rejestru Sądowego pod numerem KRS 0000420780, z kapitałem zakładowym w kwocie 95.000 zł (w całości wpłaconym), NIP: 5272677009, REGON: 146127300 – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie w tym miejscu i zdecydować którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych. +

Przekazywanie danych

+ Twoje dane będzie przetwarzać Onet i Zaufani Partnerzy – jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z danych, a jedynie do korzystania z nich w celach wyraźnie wskazanych przez Onet lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie. +

Cookies

+ Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. +

Twoje uprawnienia

+ Zgodnie z RODO przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas i Zaufanych Partnerów. + Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać. + Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia, lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego - GIODO. Uprawnienia powyższe przysługują także w przypadku prawidłowego przetwarzania danych przez administratora. W tym miejscu znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. +

Zgoda

+ Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez Onet Holding sp. z o.o. w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) oraz jeśli zgadzasz się na instalowanie plików cookies na Twoim urządzeniach i dostęp do tych plików przez Onet i Zaufanych Partnerów możesz w łatwy sposób wyrazić tą zgodę klikając w przycisk „Rozumiem” lub zamykając to okno. + Jeśli nie chcesz wyrazić opisanej wyżej zgody lub ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. + W każdym momencie możesz także edytować Twoje preferencje w zakresie udzielonej zgody w tym nawet wycofać ją całkowicie klikając w ustawienia zaawansowane lub przechodząc na naszą stronę polityki prywatności.`, + acceptAll: 'Rozumiem', + showPurposes: 'Ustawienia zaawansowane' }, details: { - title: '', - back: '', - save: '' + title: 'Ustawienia prywatności', + back: 'Cofnij', + save: 'Zapisz i zamknij' }, purposes: { - active: '', - inactive: '', - showVendors: '', - cookies: { - menu: '', - title: '', - description: '' - }, - purpose1: { - description: 'Allow storing or accessing information on a user’s device.' - }, - purpose2: { - description: `Allow processing of a user’s data to provide and inform personalised advertising (including delivery, measurement, and reporting) based on a user’s preferences or interests known or inferred from data collected across multiple sites, apps, or devices; and/or accessing or storing information on devices for that purpose. - Will include following Features: -

    -
  • Matching Data to Offline Sources - combining data from offline sources that were initially collected in other contexts.
  • -
  • Linking Devices - allow processing of a user’s data to connect such user across multiple devices.
  • -
  • Precise Geographic Location data - allow processing of a user’s precise geographic location data in support of a purpose for which that certain third party has consent.
  • -
` - }, - purpose3: { - description: `Allow processing of a user’s data to deliver content or advertisements and measure the delivery of such content or advertisements, extract insights and generate reports to understand service usage; and/or accessing or storing information on devices for that purpose. - Will include following Features: -
    -
  • Matching Data to Offline Sources - combining data from offline sources that were initially collected in other contexts.
  • -
  • Linking Devices - allow processing of a user’s data to connect such user across multiple devices.
  • -
  • Precise Geographic Location data - allow processing of a user’s precise geographic location data in support of a purpose for which that certain third party has consent.
  • -
` - }, - purpose4: { - description: `Allow processing of a user’s data to provide and inform personalised content (including delivery, measurement, and reporting) based on a user’s preferences or interests known or inferred from data collected across multiple sites, apps, or devices; and/or accessing or storing information on devices for that purpose. - Will include following Features: -
    -
  • Matching Data to Offline Sources - combining data from offline sources that were initially collected in other contexts.
  • -
  • Linking Devices - allow processing of a user’s data to connect such user across multiple devices.
  • -
  • Precise Geographic Location data - allow processing of a user’s precise geographic location data in support of a purpose for which that certain third party has consent.
  • -
` - }, - customPurpose1: { - menu: '', - title: '', - description: '' - } - }, - vendors: { - title: '', - rejectAll: '', - acceptAll: '', - company: '', - offOn: '', - description: '', - moreChoices: '' - }, - footer: { - message: '', - consentLink: '' - } - }, - de: { - intro: { - title: 'Diese Website verwendet Cookies', - description: 'Wir und unsere Partner verwenden sogenannte Cookies (kleine Textdateien) im Webbrowser um zu verstehen, was unsere Besucher interessiert und entsprechend relevante Inhalte und Werbung anbieten zu können. Zukünftig benötigen wir wahrscheinlich ihr/euer Einverständnis dazu. Ein Beispiel, wie dies aussehen könnte, finden sie/findet ihr unter dieser Erklärung ', - acceptAll: 'Alle Cookies akzeptieren', - rejectAll: 'Alle Cookies ablehnen', - showPurposes: 'Verwendungszwecke zeigen' - }, - details: { - title: 'Datenschutzeinstellungen', - back: 'Abbrechen', - save: 'Sichern und Beenden' - }, - purposes: { - active: 'Aktiv', - inactive: 'Inaktiv', - showVendors: '', - cookies: { - menu: 'Wie wir Cookies einsetzen', - title: 'Diese Website verwendet Cookies', - description: 'Unsere Partner und wir setzen Cookies (kleine Textdateien) und sammeln Informationen während des Surfens im Web in diesem Browser. Dies dient dazu zu verstehen, was unsere Besucher interessiert und entsprechend relevante Inhalte und Werbung anbieten zu können.' - }, - purpose1: { - menu: 'Zugriff auf ein Gerät', - title: 'Zugriff auf ein Gerät', - description: 'Die Erlaubnis zum Speichern und Abrufen von Informationen auf dem Gerät eines Website-Besuchers.Das ist notwendig, um Cookies im Web-Browser zu speichern und zur Anzeige relevanter Informationen und Werbung abrufen zu können.' - }, - purpose2: { - menu: 'Persönlich angepaßte Werbung', - title: 'Persönlich angepaßte Werbung', - description: 'Die Erlaubnis, Besucherdaten so zu verarbeiten und/oder zu speichern und abzurufen, dass persönlich angepaßte Werbung angeboten und angezeigt werden kann (dies umfaßt die Auslieferung, Messung und die Erstellung von Berichten darüber). Dies erfolgt auf der Basis bekannter Präferenzen oder Interessen, oder durch das Schließen auf Präferenzen oder Interessen durch die Erfassung von Daten auch über verschiedene Websites, Apps oder Geräte hinweg zu diesem Zweck.' + active: 'Aktywna', + inactive: 'Nieaktywna', + showVendors: 'Pokaż listę naszych zaufanych partnerów', + purpose5: { + menu: 'Instalowanie plików cookies', + title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', + description: 'Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści.' }, purpose3: { - menu: 'Analysen', - title: 'Analysen', - description: 'Die Erlaubnis, Besucherdaten zur Anzeige von Inhalten oder Werbung zu verarbeiten, und zur Messung der Auslieferung solcher Inhalte oder Werbung. Umfasst ist die Gewinnung von Erkenntnissen und die Generierung von Berichten um die Nutzung des angebotenen Service zu verstehen, und/oder das Abrufen oder Speichern von Informationen auf Geräten zu diesem Zweck.' - }, - purpose4: { - menu: 'Persönlich angepasste Inhalte', - title: 'Persönlich angepasste Inhalte', - description: 'Die Erlaubnis, Besucherdaten zur Anzeige von personalisierten Inhalten zu verarbeiten, und zur Messung der Auslieferung. Umfasst ist die Gewinnung von Erkenntnissen darüber und die Generierung von Berichten dazu. Dies erfolgt auf der Basis bekannter Präferenzen oder Interessen, oder durch das Schließen auf Präferenzen oder Interessen durch die Erfassung von Daten auch über verschiedene Websites, Apps oder Geräte hinweg zu diesem Zweck.' + menu: 'Przetwarzanie danych osobowych', + title: 'Przetwarzanie danych osobowych w celach marketingowych przez Zaufanych Partnerów.', + description: 'Zgoda dotyczy przetwarzania Twoich danych osobowych przez Zaufanych Partnerów w celach marketingowych, które obejmują także niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych. Na podstawie tej zgody, Twoje dane, w tym zebrane informacje o Twojej aktywności na stronach internetowych, będą wykorzystywane do prezentowania Ci reklam produktów i usług naszych Partnerów biznesowych, dopasowanych do Twoich zainteresowań.' } }, vendors: { - title: 'Unsere Partner', - rejectAll: 'Alle ablehnen', - acceptAll: 'Alle akzeptieren', - company: 'Unternehmen', - offOn: 'Aus/An', - description: 'Helfen Sie uns, Ihnen einen besseren Service zu bieten! Unsere Partner verwenden Cookies Ihres Browsers, um quer durch das Web zu verstehen, was Sie interessiert und Ihnen entsprechend relevante Inhalte und Werbung anzubieten.', - moreChoices: 'Weitere Auswahlmöglichkeiten' + title: 'Nasi zaufani partnerzy', + company: 'Partner', + offOn: 'Akceptuję', + description: 'Poniżej lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie chcesz wyrazić zgody danemu podmiotowi odznacz wybraną opcję.', + moreChoices: 'Edytuj zgody dla naszych Zaufanych Partnerów' }, footer: { - message: 'Du kannst deine Datenschutz-Einstellungen bearbeiten', - consentLink: 'hier' + message: 'Zmień swoje ustawienia prywatności klikając', + consentLink: 'tutaj' } } }; From cb9193013984f2ca864e60c715c73168ff8ae704 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 9 May 2018 15:33:39 +0200 Subject: [PATCH 018/540] Could not find definition to decode cookie version NaN --- src/lib/init.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 1433c25e..4cf86ad7 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -21,8 +21,8 @@ function readExternalConsentData(config) { } else { try { resolve([ - decodeVendorConsentData(data.vendor), - decodePublisherConsentData(data.publisher) + data.vendor && decodeVendorConsentData(data.vendor), + data.publisher && decodePublisherConsentData(data.publisher) ]); } catch (err) { reject(err); From 70c095657009820f5d2c4df0986954e226ff0063 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 9 May 2018 15:50:05 +0200 Subject: [PATCH 019/540] Polish translation --- src/lib/translations.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 3f348010..e22c3c54 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -46,12 +46,12 @@ export default { active: 'Aktywna', inactive: 'Nieaktywna', showVendors: 'Pokaż listę naszych zaufanych partnerów', - purpose5: { + purpose1: { menu: 'Instalowanie plików cookies', title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', description: 'Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści.' }, - purpose3: { + 'purpose2,3,4,5': { menu: 'Przetwarzanie danych osobowych', title: 'Przetwarzanie danych osobowych w celach marketingowych przez Zaufanych Partnerów.', description: 'Zgoda dotyczy przetwarzania Twoich danych osobowych przez Zaufanych Partnerów w celach marketingowych, które obejmują także niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych. Na podstawie tej zgody, Twoje dane, w tym zebrane informacje o Twojej aktywności na stronach internetowych, będą wykorzystywane do prezentowania Ci reklam produktów i usług naszych Partnerów biznesowych, dopasowanych do Twoich zainteresowań.' From 0dcd134e0ff0b79bd4a226142f6c28c7e0f17523 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 9 May 2018 16:54:05 +0200 Subject: [PATCH 020/540] Adding scrollbars on popup intro when description text is very long --- src/components/popup/intro/intro.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/popup/intro/intro.less b/src/components/popup/intro/intro.less index 09a27a9a..7a724bd4 100644 --- a/src/components/popup/intro/intro.less +++ b/src/components/popup/intro/intro.less @@ -11,6 +11,7 @@ div.intro { .description { margin: 4% 0; overflow: auto; + height: 270px; } .options { display: flex; From cc27281bdd025b73b5de34555a6071ec6c53185e Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 9 May 2018 19:05:06 +0200 Subject: [PATCH 021/540] Cookie value must be always string --- src/lib/init.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 4cf86ad7..168b9c05 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -21,8 +21,8 @@ function readExternalConsentData(config) { } else { try { resolve([ - data.vendor && decodeVendorConsentData(data.vendor), - data.publisher && decodePublisherConsentData(data.publisher) + data.vendor && decodeVendorConsentData(data.vendor) || '', + data.publisher && decodePublisherConsentData(data.publisher) || '' ]); } catch (err) { reject(err); From 06fabbf333f3fadd8f7c3b6f24ca40c1c8368dfb Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 10 May 2018 15:19:34 +0200 Subject: [PATCH 022/540] Polish translation --- src/lib/translations.js | 100 ++++++++++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 35 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index e22c3c54..0186f1a7 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,44 +8,74 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `Z dniem 25 maja 2018 roku rozpoczyna obowiązywanie Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (określane popularnie jako „RODO”). - RODO obowiązywać będzie w identycznym zakresie we wszystkich krajach Unii Europejskiej, a więc także w Polsce i wprowadza szereg zmian w zasadach regulujących przetwarzanie danych osobowych, które będą miały wpływ na wiele dziedzin życia, w tym na korzystanie z usług internetowych takich jak między innymi usługa portalu Onet i innych serwisów oferowanych przez Onet Holding sp. z o.o. - W tej informacji przedstawiamy skrót najważniejszych zagadnień dotyczących przetwarzania Twoich danych osobowych jakie może mieć miejsce po 25 maja 2018 roku w związku z korzystaniem z naszych usług. Prosimy o jej przeczytanie, nie zajmie to więcej niż kilka minut. -

Czym są dane osobowe

- Dane osobowe to zgodnie z RODO informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej. W przypadku korzystania z naszych serwisów takimi danymi są np. adres e-mail, adres IP lub Twoje dane w koncie poczty elektronicznej czy koncie w innej usłudze Onetu. - Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach (np. local storage) instalowanych przez nas lub naszych zaufanych partnerów na naszych stronach i urządzeniach których używasz podczas korzystania z naszych usług. -

Podstawa i cel przetwarzania

- Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a w przypadkach korzystania z naszych usług wystąpią co do zasady trzy z nich: - - niezbędność przetwarzania do zawarcia lub wykonania umowy, której jesteś stroną – umowa, o której mówią przepisy to w naszym przypadku regulamin danej usługi. Jeśli zatem zawieramy z Tobą umowę o realizację danej usługi – np. usługi, w ramach której zapewniamy Ci możliwość zapoznania z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu, to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. W przypadku, gdy zakładasz u nas konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tej możliwości nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. - - niezbędność przetwarzania do celów wynikających z prawnie uzasadnionych interesów realizowanych przez administratora lub przez stronę trzecią. Ta podstawa przetwarzania danych dotyczy przypadków, gdy ich przetwarzanie jest uzasadnione z uwagi na nasze usprawiedliwione potrzeby, co obejmuje między innymi konieczność zapewnienia bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszania naszych usług i dopasowania ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach) jak również prowadzenie marketingu i promocji naszych własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). - - Twoja dobrowolna zgoda. Ta podstawa przetwarzania danych będzie konieczna głównie w przypadku świadczenia Ci usług marketingowych przez podmioty trzecie (Zaufanych Partnerów, o których mowa poniżej) lub na ich rzecz. Chcąc przedstawić Ci reklamy, które będą dla Ciebie interesujące (np. przedstawić Ci reklamę produktu, którego możesz aktualnie potrzebować) reklamodawcy i ich przedstawiciele muszą mieć możliwość przetwarzania Twoich danych. Oczywiście udzielenie powyższej zgody jest całkowicie dobrowolne i jeśli nie chcesz, nie musisz jej udzielać. Udostępniane przez nas rozwiązanie umożliwia Ci także ograniczenie zakresu tej zgody, jak również jej zmianę w każdym momencie. Pozostałe przysługujące Ci w związku z udzieloną zgodą uprawnienia zostały opisane poniżej. - Twoje dane w ramach naszych usług przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu. -

Administrator

- Administratorem Twoich danych osobowych będzie Onet – czyli Onet Holding sp. z o.o. z siedzibą w Warszawie (02 – 672), ul. Domaniewska 52, zarejestrowana w rejestrze przedsiębiorców Krajowego Rejestru Sądowego prowadzonym przez Sąd Rejonowy dla m. st. Warszawy Wydział XIII Gospodarczy Krajowego Rejestru Sądowego pod numerem KRS 0000420780, z kapitałem zakładowym w kwocie 95.000 zł (w całości wpłaconym), NIP: 5272677009, REGON: 146127300 – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie w tym miejscu i zdecydować którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych. -

Przekazywanie danych

- Twoje dane będzie przetwarzać Onet i Zaufani Partnerzy – jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z danych, a jedynie do korzystania z nich w celach wyraźnie wskazanych przez Onet lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie. -

Cookies

- Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. -

Twoje uprawnienia

- Zgodnie z RODO przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas i Zaufanych Partnerów. - Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać. - Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia, lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego - GIODO. Uprawnienia powyższe przysługują także w przypadku prawidłowego przetwarzania danych przez administratora. W tym miejscu znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. -

Zgoda

- Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez Onet Holding sp. z o.o. w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) oraz jeśli zgadzasz się na instalowanie plików cookies na Twoim urządzeniach i dostęp do tych plików przez Onet i Zaufanych Partnerów możesz w łatwy sposób wyrazić tą zgodę klikając w przycisk „Rozumiem” lub zamykając to okno. - Jeśli nie chcesz wyrazić opisanej wyżej zgody lub ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. - W każdym momencie możesz także edytować Twoje preferencje w zakresie udzielonej zgody w tym nawet wycofać ją całkowicie klikając w ustawienia zaawansowane lub przechodząc na naszą stronę polityki prywatności.`, - acceptAll: 'Rozumiem', + description: `

Na naszych stronach używamy technologii, takich jak pliki cookie, do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty powiązane z Grupą Onet-RAS oraz nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Chcemy zapoznać Cię ze szczegółami stosowanych przez nas technologii oraz z przepisami, które niebawem wejdą w życie, tak aby dać Ci pełną wiedzę i komfort w korzystaniu z naszych serwisów internetowych.

+ +

RODO

+

Z dniem 25 maja 2018 roku rozpoczyna obowiązywanie Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (określane popularnie jako „RODO”). + + RODO obowiązywać będzie w identycznym zakresie we wszystkich krajach Unii Europejskiej, a więc także w Polsce i wprowadza szereg zmian w zasadach regulujących przetwarzanie danych osobowych, które będą miały wpływ na wiele dziedzin życia, w tym na korzystanie z usług internetowych, takich jak między innymi usługa portalu Onet, serwisu Sympatia, serwisu Fakt24.pl, serwisu Skąpiec, Opineo i innych serwisów oferowanych przez podmioty tworzące Grupę Onet-RAS. + + W tej informacji przedstawiamy skrót najważniejszych zagadnień dotyczących przetwarzania Twoich danych osobowych, jakie może mieć miejsce po 25 maja 2018 roku w związku z korzystaniem z naszych usług. Prosimy Cię o jej przeczytanie, nie zajmie to więcej niż kilka minut.

+ + +

Czym są dane osobowe

+

Dane osobowe to zgodnie z RODO informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej. W przypadku korzystania z naszych serwisów takimi danymi są np. adres e-mail, adres IP lub Twoje dane w koncie poczty elektronicznej czy koncie w innej usłudze oferowanej przez podmioty z Grupy Onet-RAS. + + Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach (np. local storage) instalowanych przez nas lub naszych Zaufanych Partnerów na naszych stronach i urządzeniach, których używasz podczas korzystania z naszych usług.

+ +

Podstawa i cel przetwarzania

+ +

Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a przypadkach korzystania z naszych usług wystąpią, co do zasady trzy z nich:

+
+
    +
  • -Niezbędność przetwarzania do zawarcia lub wykonania umowy, której jesteś stroną – umowa, o której mówią przepisy to w naszym przypadku regulamin danej usługi. Jeśli zatem zawieramy z Tobą umowę o realizację danej usługi – np. usługi, w ramach, której zapewniamy Ci możliwość zapoznania z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu, to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. W przypadku, gdy zakładasz u nas konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tej możliwości nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać.
  • +
  • -Niezbędność przetwarzania do celów wynikających z prawnie uzasadnionych interesów realizowanych przez administratora lub przez stronę trzecią. Ta podstawa przetwarzania danych dotyczy przypadków, gdy ich przetwarzanie jest uzasadnione z uwagi na nasze usprawiedliwione potrzeby, co obejmuje między innymi konieczność zapewnienia bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszania naszych usług i dopasowania ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach) jak również prowadzenie marketingu i promocji własnych usług administratora z Grupy Onet-RAS w serwisie tego administratora (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych)
  • +
  • -Twoja dobrowolna zgoda. Ta podstawa przetwarzania danych będzie konieczna głównie w przypadku świadczenia Ci usług marketingowych przez podmioty trzecie (Zaufanych Partnerów, o których mowa poniżej) lub na ich rzecz. Chcąc przedstawić Ci reklamy, które będą dla Ciebie interesujące (np. przedstawić Ci reklamę produktu, którego możesz aktualnie potrzebować) reklamodawcy i ich przedstawiciele muszą mieć możliwość przetwarzania Twoich danych. Oczywiście udzielenie powyższej zgody jest całkowicie dobrowolne i jeśli nie chcesz, nie musisz jej udzielać. Udostępniane przez nas rozwiązanie umożliwia Ci także ograniczenie zakresu tej zgody, jak również jej zmianę w każdym momencie. Pozostałe przysługujące Ci w związku z udzieloną zgodą uprawnienia zostały opisane poniżej.
  • +
+
+

Twoje dane w ramach naszych usług przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu.

+ +

Administratorzy

+

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem - a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

+ +

Przekazywanie danych

+

Twoje dane będą przetwarzać podmioty z Grupy Onet-RAS i Zaufani Partnerzy – jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z nich, a jedynie do korzystania w celach wyraźnie wskazanych przez dany podmiot z Grupy Onet-RAS lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). Dzięki temu możemy np. lepiej dobrać najciekawsze lub najtańsze oferty dopasowane dla Ciebie. W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym, o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie, jednak nigdy w innym przypadku.

+ +

Cookies

+

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

+ +

Twoje uprawnienia

+

Zgodnie z RODO przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas i Zaufanych Partnerów.


+ +

Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać.


+

+ Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia, lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzani danych oraz prawo do wniesienia skargi do organu nadzorczego - GIODO. Uprawnienia powyższe przysługują także w przypadku prawidłowego przetwarzania danych przez administratora. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. +

+ + +

Zgoda

+

Jeśli chcesz zgodzić się na przetwarzanie przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez podmioty z Grupy Onet-RAS w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) w tym ich przetwarzanie w plikach cookies itp. + + instalowanych na Twoich urządzeniach i odczytywanych z tych plików przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów możesz w łatwy sposób wyrazić tę zgodę klikając w przycisk „Przejdź na stronę” lub zamykając to okno. + + Jeśli nie chcesz wyrazić opisanej wyżej zgody lub w ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. + + Wyrażenie zgody jest dobrowolne. W każdym momencie możesz także edytować Twoje preferencje w zakresie udzielonej zgody w tym nawet wycofać ją całkowicie klikając w ustawienia zaawansowane lub przechodząc na naszą stronę polityki prywatności. + + Powyższa zgoda dotyczy przetwarzania w celach marketingowych innych niż własne cele podmiotów z Grupy Onet-RAS. Informujemy jednocześnie, iż podmioty z Grupy Onet-RAS w ramach udostępnianych przez siebie usług internetowych przetwarzać będą Twoje dane we własnych celach marketingowych opisanych szczegółowo powyżej w oparciu o ich prawnie uzasadniony interes, jako administratora.

+`, + acceptAll: 'Przejdź na stronę', showPurposes: 'Ustawienia zaawansowane' }, details: { - title: 'Ustawienia prywatności', - back: 'Cofnij', + title: 'Ustawienia zaawansowane', + back: 'Wstecz', save: 'Zapisz i zamknij' }, purposes: { active: 'Aktywna', inactive: 'Nieaktywna', - showVendors: 'Pokaż listę naszych zaufanych partnerów', + showVendors: 'Pokaż listę naszych Zaufanych Partnerów', purpose1: { menu: 'Instalowanie plików cookies', title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', @@ -53,16 +83,16 @@ export default { }, 'purpose2,3,4,5': { menu: 'Przetwarzanie danych osobowych', - title: 'Przetwarzanie danych osobowych w celach marketingowych przez Zaufanych Partnerów.', - description: 'Zgoda dotyczy przetwarzania Twoich danych osobowych przez Zaufanych Partnerów w celach marketingowych, które obejmują także niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych. Na podstawie tej zgody, Twoje dane, w tym zebrane informacje o Twojej aktywności na stronach internetowych, będą wykorzystywane do prezentowania Ci reklam produktów i usług naszych Partnerów biznesowych, dopasowanych do Twoich zainteresowań.' + title: 'Przetwarzanie danych osobowych w celach marketingowych przez naszych Zaufanych Partnerów.', + description: 'Zgoda dotyczy przetwarzania Twoich danych osobowych przez Zaufanych Partnerów w celach marketingowych, które obejmują także niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych. Na podstawie tej zgody, Twoje dane, w tym zebrane informacje o Twojej aktywności na stronach internetowych, będą wykorzystywane do prezentowania Ci reklam produktów i usług naszych Partnerów biznesowych, dopasowanych do Twoich zainteresowań.' } }, vendors: { - title: 'Nasi zaufani partnerzy', + title: 'Nasi Zaufani Partnerzy', company: 'Partner', offOn: 'Akceptuję', - description: 'Poniżej lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie chcesz wyrazić zgody danemu podmiotowi odznacz wybraną opcję.', - moreChoices: 'Edytuj zgody dla naszych Zaufanych Partnerów' + description: `Poniżej lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „zmień ustawienia partnerów” i odznacz wybraną opcję.Jeśli nie chcesz by Twoje dane były przetwarzane przez podmioty z Grupy Onet-RAS (lub odpowiednio by podmioty te nie wykorzystywały plików cookies itp. na Twoich urządzeniach) wróć do poprzedniego okna i przesuń suwak w pozycję „nieaktywna”.`, + moreChoices: 'Pokaż listę Zaufanych Partnerów' }, footer: { message: 'Zmień swoje ustawienia prywatności klikając', From bf4d0db321dc82c794a8358f00383c9646119250 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 10 May 2018 15:32:57 +0200 Subject: [PATCH 023/540] Polish translation --- src/lib/translations.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 0186f1a7..78f75003 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -27,11 +27,11 @@ export default {

Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a przypadkach korzystania z naszych usług wystąpią, co do zasady trzy z nich:


-
    +
    1. -Niezbędność przetwarzania do zawarcia lub wykonania umowy, której jesteś stroną – umowa, o której mówią przepisy to w naszym przypadku regulamin danej usługi. Jeśli zatem zawieramy z Tobą umowę o realizację danej usługi – np. usługi, w ramach, której zapewniamy Ci możliwość zapoznania z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu, to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. W przypadku, gdy zakładasz u nas konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tej możliwości nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać.
    2. -Niezbędność przetwarzania do celów wynikających z prawnie uzasadnionych interesów realizowanych przez administratora lub przez stronę trzecią. Ta podstawa przetwarzania danych dotyczy przypadków, gdy ich przetwarzanie jest uzasadnione z uwagi na nasze usprawiedliwione potrzeby, co obejmuje między innymi konieczność zapewnienia bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszania naszych usług i dopasowania ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach) jak również prowadzenie marketingu i promocji własnych usług administratora z Grupy Onet-RAS w serwisie tego administratora (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych)
    3. -Twoja dobrowolna zgoda. Ta podstawa przetwarzania danych będzie konieczna głównie w przypadku świadczenia Ci usług marketingowych przez podmioty trzecie (Zaufanych Partnerów, o których mowa poniżej) lub na ich rzecz. Chcąc przedstawić Ci reklamy, które będą dla Ciebie interesujące (np. przedstawić Ci reklamę produktu, którego możesz aktualnie potrzebować) reklamodawcy i ich przedstawiciele muszą mieć możliwość przetwarzania Twoich danych. Oczywiście udzielenie powyższej zgody jest całkowicie dobrowolne i jeśli nie chcesz, nie musisz jej udzielać. Udostępniane przez nas rozwiązanie umożliwia Ci także ograniczenie zakresu tej zgody, jak również jej zmianę w każdym momencie. Pozostałe przysługujące Ci w związku z udzieloną zgodą uprawnienia zostały opisane poniżej.
    4. -
+

Twoje dane w ramach naszych usług przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu.

From e350290aedf7ed87748da0cf993e8a1fb6122ee1 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 11 May 2018 17:27:14 +0200 Subject: [PATCH 024/540] Reading consent data from external source --- src/lib/init.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 168b9c05..0574d9e4 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -21,8 +21,8 @@ function readExternalConsentData(config) { } else { try { resolve([ - data.vendor && decodeVendorConsentData(data.vendor) || '', - data.publisher && decodePublisherConsentData(data.publisher) || '' + data.vendor && decodeVendorConsentData(data.vendor) || undefined, + data.publisher && decodePublisherConsentData(data.publisher) || undefined ]); } catch (err) { reject(err); From 87b46790964aa39261848b5a96277a7ee9dde881 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 11 May 2018 17:29:09 +0200 Subject: [PATCH 025/540] Publisher consent cookie - new format - fix for writing standard purposes --- src/lib/cookie/cookie.js | 2 -- src/lib/cookie/definitions/publisher/version1.js | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 57c5caf5..a970854c 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -178,7 +178,6 @@ function decodePublisherConsentData(cookieValue) { publisherPurposeVersion, created, lastUpdated, - standardPurposeIdBitString, customPurposeIdBitString } = decodePublisherCookieValue(cookieValue); @@ -189,7 +188,6 @@ function decodePublisherConsentData(cookieValue) { publisherPurposeVersion, created, lastUpdated, - selectedPurposeIds: decodeBitsToIds(standardPurposeIdBitString), selectedCustomPurposeIds: decodeBitsToIds(customPurposeIdBitString) }; diff --git a/src/lib/cookie/definitions/publisher/version1.js b/src/lib/cookie/definitions/publisher/version1.js index 4772ad43..9738589c 100644 --- a/src/lib/cookie/definitions/publisher/version1.js +++ b/src/lib/cookie/definitions/publisher/version1.js @@ -5,6 +5,9 @@ export default { { name: 'created', type: 'date', numBits: 36 }, { name: 'lastUpdated', type: 'date', numBits: 36 }, { name: 'cmpId', type: 'int', numBits: 12 }, + { name: 'cmpVersion', type: 'int', numBits: 12 }, + { name: 'consentScreen', type: 'int', numBits: 6 }, + { name: 'consentLanguage', type: '6bitchar', numBits: 12 }, { name: 'vendorListVersion', type: 'int', numBits: 12 }, { name: 'publisherPurposeVersion', type: 'int', numBits: 12 }, { name: 'standardPurposeIdBitString', type: 'bits', numBits: 24 }, From 3b086de0efa75175858688b9fd10e4a206f311ab Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 11 May 2018 18:14:45 +0200 Subject: [PATCH 026/540] Publisher consent cookie - new format - fix for writing standard purposes --- src/lib/cookie/cookie.js | 2 ++ src/lib/store.js | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index a970854c..57c5caf5 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -178,6 +178,7 @@ function decodePublisherConsentData(cookieValue) { publisherPurposeVersion, created, lastUpdated, + standardPurposeIdBitString, customPurposeIdBitString } = decodePublisherCookieValue(cookieValue); @@ -188,6 +189,7 @@ function decodePublisherConsentData(cookieValue) { publisherPurposeVersion, created, lastUpdated, + selectedPurposeIds: decodeBitsToIds(standardPurposeIdBitString), selectedCustomPurposeIds: decodeBitsToIds(customPurposeIdBitString) }; diff --git a/src/lib/store.js b/src/lib/store.js index 1215b727..cb40d3e9 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -231,6 +231,9 @@ export default class Store { vendorList, customPurposeList }; + // publisherConsentData.selectedPurposeIds is never updated + publisherConsents.selectedPurposeIds = vendorConsentData.selectedPurposeIds; + if (config.setConsentData) { let consentData = { vendor: encodeVendorConsentData(vendorConsents) From 3864d094d5bb81281cc80cd9e39f6f3f76c649c1 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 11 May 2018 18:30:31 +0200 Subject: [PATCH 027/540] Revert "Publisher consent cookie" This reverts commit 3b086de0efa75175858688b9fd10e4a206f311ab. --- src/lib/cookie/cookie.js | 2 -- src/lib/cookie/cookie.test.js | 1 - src/lib/cookie/cookieutils.test.js | 3 +++ src/lib/store.js | 3 --- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 57c5caf5..a970854c 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -178,7 +178,6 @@ function decodePublisherConsentData(cookieValue) { publisherPurposeVersion, created, lastUpdated, - standardPurposeIdBitString, customPurposeIdBitString } = decodePublisherCookieValue(cookieValue); @@ -189,7 +188,6 @@ function decodePublisherConsentData(cookieValue) { publisherPurposeVersion, created, lastUpdated, - selectedPurposeIds: decodeBitsToIds(standardPurposeIdBitString), selectedCustomPurposeIds: decodeBitsToIds(customPurposeIdBitString) }; diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index 70b59963..436f638f 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -114,7 +114,6 @@ describe('cookie', () => { vendorListVersion: 1, created: aDate, lastUpdated: aDate, - selectedPurposeIds: new Set([1, 2]), }; const publisherConsentData = { diff --git a/src/lib/cookie/cookieutils.test.js b/src/lib/cookie/cookieutils.test.js index 3e7f129b..dbb3e789 100644 --- a/src/lib/cookie/cookieutils.test.js +++ b/src/lib/cookie/cookieutils.test.js @@ -250,6 +250,9 @@ describe('cookieutils', () => { created: aDate, lastUpdated: aDate, cmpId: 1, + cmpVersion: 0, + consentScreen: 0, + consentLanguage: 'AA', vendorListVersion: 1, publisherPurposeVersion: 1, numCustomPurposes: 4, diff --git a/src/lib/store.js b/src/lib/store.js index cb40d3e9..1215b727 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -231,9 +231,6 @@ export default class Store { vendorList, customPurposeList }; - // publisherConsentData.selectedPurposeIds is never updated - publisherConsents.selectedPurposeIds = vendorConsentData.selectedPurposeIds; - if (config.setConsentData) { let consentData = { vendor: encodeVendorConsentData(vendorConsents) From b4bd5f903aa9679da14ea5c7b353ea9fa8826214 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 11 May 2018 18:38:11 +0200 Subject: [PATCH 028/540] Polish translation --- src/lib/translations.js | 88 +++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 48 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 78f75003..6512fa85 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,62 +8,54 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

Na naszych stronach używamy technologii, takich jak pliki cookie, do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty powiązane z Grupą Onet-RAS oraz nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Chcemy zapoznać Cię ze szczegółami stosowanych przez nas technologii oraz z przepisami, które niebawem wejdą w życie, tak aby dać Ci pełną wiedzę i komfort w korzystaniu z naszych serwisów internetowych.

+ description: `

Na naszych stronach używamy technologii, takich jak pliki cookie, do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty powiązane z Grupą Onet-RAS oraz nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Pragniemy zapoznać Cię ze szczegółami stosowanych przez nas technologii oraz z przepisami, które niebawem wejdą w życie, tak aby dać Ci pełną wiedzę i komfort w korzystaniu z naszych serwisów internetowych.

-

RODO

-

Z dniem 25 maja 2018 roku rozpoczyna obowiązywanie Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (określane popularnie jako „RODO”). +

RODO

+

Z dniem 25 maja 2018 r. rozpoczyna obowiązywanie Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (określane popularnie jako „RODO”). +RODO obowiązywać będzie w identycznym zakresie we wszystkich krajach Unii Europejskiej, a więc także w Polsce i wprowadza szereg zmian w zasadach regulujących przetwarzanie danych osobowych, które będą miały wpływ na wiele dziedzin życia, w tym na korzystanie z usług internetowych, takich jak między innymi usługi portalu Onet, serwisu Sympatia, serwisu Fakt24.pl, serwisu Skąpiec, Opineo i innych serwisów oferowanych przez podmioty tworzące Grupę Onet-RAS. + + W tej informacji przedstawiamy skrót najważniejszych zagadnień dotyczących przetwarzania Twoich danych osobowych, jakie może mieć miejsce po 25 maja 2018 r. w związku z korzystaniem z naszych usług. Prosimy Cię o jej przeczytanie, nie zajmie to więcej niż kilka minut.

- RODO obowiązywać będzie w identycznym zakresie we wszystkich krajach Unii Europejskiej, a więc także w Polsce i wprowadza szereg zmian w zasadach regulujących przetwarzanie danych osobowych, które będą miały wpływ na wiele dziedzin życia, w tym na korzystanie z usług internetowych, takich jak między innymi usługa portalu Onet, serwisu Sympatia, serwisu Fakt24.pl, serwisu Skąpiec, Opineo i innych serwisów oferowanych przez podmioty tworzące Grupę Onet-RAS. - - W tej informacji przedstawiamy skrót najważniejszych zagadnień dotyczących przetwarzania Twoich danych osobowych, jakie może mieć miejsce po 25 maja 2018 roku w związku z korzystaniem z naszych usług. Prosimy Cię o jej przeczytanie, nie zajmie to więcej niż kilka minut.

+

Czym są dane osobowe

+

Dane osobowe to, zgodnie z RODO, informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej. W przypadku korzystania z naszych serwisów takimi danymi są np. adres e-mail, adres IP lub Twoje dane w koncie poczty elektronicznej czy koncie w innej usłudze oferowanej przez podmioty z Grupy Onet-RAS. +Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach (np. local storage) instalowanych przez nas lub naszych Zaufanych Partnerów na naszych stronach i urządzeniach, których używasz podczas korzystania z naszych usług.

-

Czym są dane osobowe

-

Dane osobowe to zgodnie z RODO informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej. W przypadku korzystania z naszych serwisów takimi danymi są np. adres e-mail, adres IP lub Twoje dane w koncie poczty elektronicznej czy koncie w innej usłudze oferowanej przez podmioty z Grupy Onet-RAS. +

Podstawa i cel przetwarzania

- Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach (np. local storage) instalowanych przez nas lub naszych Zaufanych Partnerów na naszych stronach i urządzeniach, których używasz podczas korzystania z naszych usług.

+

Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a przypadkach korzystania z naszych usług wystąpią, co do zasady trzy z nich:

+
+
    +
  • 1. Niezbędność przetwarzania do zawarcia lub wykonania umowy, której jesteś stroną. Umowa to, w naszym przypadku, regulamin danej usługi. Jeśli zatem zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. W przypadku, gdy zakładasz u nas konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tej możliwości nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać.
  • +
  • 2. Niezbędność przetwarzania do celów wynikających z prawnie uzasadnionych interesów realizowanych przez administratora lub przez stronę trzecią. Ta podstawa przetwarzania danych dotyczy przypadków, gdy ich przetwarzanie jest uzasadnione z uwagi na nasze usprawiedliwione potrzeby, co obejmuje między innymi konieczność zapewnienia bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszania naszych usług i dopasowania ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach) jak również prowadzenie marketingu i promocji własnych usług administratora z Grupy Onet-RAS w serwisie tego administratora (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych).
  • +
  • 3. Twoja dobrowolna zgoda. Jest potrzebna głównie w przypadku, gdy usługi marketingowe dostarczają Ci podmioty trzecie (czyli Zaufani Partnerzy, o których mowa poniżej) oraz gdy to my świadczymy takie usługi dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele muszą mieć możliwość przetwarzania Twoich danych. Udzielenie takiej zgody jest całkowicie dobrowolne, i jeśli nie chcesz, nie musisz jej udzielać. Dzięki naszemu rozwiązaniu masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie. Twoje pozostałe uprawnienia wynikające z udzielenia zgody są opisane poniżej.
  • +
+
+

Twoje dane, w ramach naszych usług, przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu.

-

Podstawa i cel przetwarzania

+

Administratorzy

+

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

-

Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a przypadkach korzystania z naszych usług wystąpią, co do zasady trzy z nich:

-
-
    -
  1. -Niezbędność przetwarzania do zawarcia lub wykonania umowy, której jesteś stroną – umowa, o której mówią przepisy to w naszym przypadku regulamin danej usługi. Jeśli zatem zawieramy z Tobą umowę o realizację danej usługi – np. usługi, w ramach, której zapewniamy Ci możliwość zapoznania z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu, to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. W przypadku, gdy zakładasz u nas konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tej możliwości nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać.
  2. -
  3. -Niezbędność przetwarzania do celów wynikających z prawnie uzasadnionych interesów realizowanych przez administratora lub przez stronę trzecią. Ta podstawa przetwarzania danych dotyczy przypadków, gdy ich przetwarzanie jest uzasadnione z uwagi na nasze usprawiedliwione potrzeby, co obejmuje między innymi konieczność zapewnienia bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszania naszych usług i dopasowania ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach) jak również prowadzenie marketingu i promocji własnych usług administratora z Grupy Onet-RAS w serwisie tego administratora (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych)
  4. -
  5. -Twoja dobrowolna zgoda. Ta podstawa przetwarzania danych będzie konieczna głównie w przypadku świadczenia Ci usług marketingowych przez podmioty trzecie (Zaufanych Partnerów, o których mowa poniżej) lub na ich rzecz. Chcąc przedstawić Ci reklamy, które będą dla Ciebie interesujące (np. przedstawić Ci reklamę produktu, którego możesz aktualnie potrzebować) reklamodawcy i ich przedstawiciele muszą mieć możliwość przetwarzania Twoich danych. Oczywiście udzielenie powyższej zgody jest całkowicie dobrowolne i jeśli nie chcesz, nie musisz jej udzielać. Udostępniane przez nas rozwiązanie umożliwia Ci także ograniczenie zakresu tej zgody, jak również jej zmianę w każdym momencie. Pozostałe przysługujące Ci w związku z udzieloną zgodą uprawnienia zostały opisane poniżej.
  6. -
-
-

Twoje dane w ramach naszych usług przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu.

+

Przekazywanie danych

+

Twoje dane będą przetwarzać podmioty z Grupy Onet-RAS i Zaufani Partnerzy, jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z nich, a jedynie do korzystania w celach wyraźnie wskazanych przez dany podmiot z Grupy Onet-RAS lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). Dzięki temu możemy np. lepiej dobrać najciekawsze lub najtańsze oferty dopasowane dla Ciebie. W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym, o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie, jednak nigdy w innym przypadku.

-

Administratorzy

-

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem - a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

+

Cookies

+

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. Twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

-

Przekazywanie danych

-

Twoje dane będą przetwarzać podmioty z Grupy Onet-RAS i Zaufani Partnerzy – jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z nich, a jedynie do korzystania w celach wyraźnie wskazanych przez dany podmiot z Grupy Onet-RAS lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). Dzięki temu możemy np. lepiej dobrać najciekawsze lub najtańsze oferty dopasowane dla Ciebie. W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym, o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie, jednak nigdy w innym przypadku.

+

Twoje uprawnienia

+

Zgodnie z RODO przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas i Zaufanych Partnerów.


+ +

Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać.


+

+Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzani danych oraz prawo do wniesienia skargi do organu nadzorczego – GIODO. Uprawnienia powyższe przysługują także w przypadku prawidłowego przetwarzania danych przez administratora. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. +

-

Cookies

-

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

-

Twoje uprawnienia

-

Zgodnie z RODO przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas i Zaufanych Partnerów.


- -

Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać.


-

- Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia, lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzani danych oraz prawo do wniesienia skargi do organu nadzorczego - GIODO. Uprawnienia powyższe przysługują także w przypadku prawidłowego przetwarzania danych przez administratora. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. -

- - -

Zgoda

-

Jeśli chcesz zgodzić się na przetwarzanie przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez podmioty z Grupy Onet-RAS w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) w tym ich przetwarzanie w plikach cookies itp. - - instalowanych na Twoich urządzeniach i odczytywanych z tych plików przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów możesz w łatwy sposób wyrazić tę zgodę klikając w przycisk „Przejdź na stronę” lub zamykając to okno. - - Jeśli nie chcesz wyrazić opisanej wyżej zgody lub w ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. - - Wyrażenie zgody jest dobrowolne. W każdym momencie możesz także edytować Twoje preferencje w zakresie udzielonej zgody w tym nawet wycofać ją całkowicie klikając w ustawienia zaawansowane lub przechodząc na naszą stronę polityki prywatności. - - Powyższa zgoda dotyczy przetwarzania w celach marketingowych innych niż własne cele podmiotów z Grupy Onet-RAS. Informujemy jednocześnie, iż podmioty z Grupy Onet-RAS w ramach udostępnianych przez siebie usług internetowych przetwarzać będą Twoje dane we własnych celach marketingowych opisanych szczegółowo powyżej w oparciu o ich prawnie uzasadniony interes, jako administratora.

-`, +

Zgoda

+

Jeśli chcesz zgodzić się na przetwarzanie przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez podmioty z Grupy Onet-RAS w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) w tym ich przetwarzanie w plikach cookies itp. instalowanych na Twoich urządzeniach i odczytywanych z tych plików przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów możesz w łatwy sposób wyrazić tę zgodę, klikając w przycisk „Przejdź na stronę” lub zamykając to okno. +Jeśli nie chcesz wyrazić opisanej wyżej zgody lub w ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. +Wyrażenie zgody jest dobrowolne. W każdym momencie możesz także edytować Twoje preferencje w zakresie udzielonej zgody, w tym nawet wycofać ją całkowicie, klikając w ustawienia zaawansowane lub przechodząc na naszą stronę polityki prywatności. +Powyższa zgoda dotyczy przetwarzania w celach marketingowych innych niż własne cele podmiotów z Grupy Onet-RAS. Informujemy jednocześnie, iż podmioty z Grupy Onet-RAS w ramach udostępnianych przez siebie usług internetowych przetwarzać będą Twoje dane we własnych celach marketingowych opisanych szczegółowo powyżej w oparciu o ich prawnie uzasadniony interes, jako administratora.

`, acceptAll: 'Przejdź na stronę', showPurposes: 'Ustawienia zaawansowane' }, @@ -91,12 +83,12 @@ export default { title: 'Nasi Zaufani Partnerzy', company: 'Partner', offOn: 'Akceptuję', - description: `Poniżej lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „zmień ustawienia partnerów” i odznacz wybraną opcję.Jeśli nie chcesz by Twoje dane były przetwarzane przez podmioty z Grupy Onet-RAS (lub odpowiednio by podmioty te nie wykorzystywały plików cookies itp. na Twoich urządzeniach) wróć do poprzedniego okna i przesuń suwak w pozycję „nieaktywna”.`, - moreChoices: 'Pokaż listę Zaufanych Partnerów' + description: `Poniżej lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „zmień ustawienia Zajufanych Partnerów” i odznacz wybraną opcję.Jeśli nie chcesz by Twoje dane były przetwarzane przez podmioty z Grupy Onet-RAS (lub odpowiednio by podmioty te nie wykorzystywały plików cookies itp. na Twoich urządzeniach) wróć do poprzedniego okna i ustaw suwak w pozycji „nieaktywna”.`, + moreChoices: 'Zmień ustawienia Zaufanych Partnerów' }, footer: { message: 'Zmień swoje ustawienia prywatności klikając', consentLink: 'tutaj' } } -}; +}; \ No newline at end of file From 848b2049ad8f4f05918e0eed00a445e20666f479 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Sat, 12 May 2018 16:37:53 +0200 Subject: [PATCH 029/540] Don't wipe out `commandQueue` --- src/complete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/complete.js b/src/complete.js index 295e66ae..d61a117f 100644 --- a/src/complete.js +++ b/src/complete.js @@ -71,7 +71,7 @@ function addLocatorFrame() { addLocatorFrame(); // Add stub -const commandQueue = []; +const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; const cmp = function (command, parameter, callback) { commandQueue.push({ command, From a2033466b26b38834634736fa44e82a73337c7ce Mon Sep 17 00:00:00 2001 From: skoklowski Date: Sun, 13 May 2018 20:38:49 +0200 Subject: [PATCH 030/540] Internet Explorer 11 support By default all consents and vendors should be checked --- src/complete.js | 1 + src/index.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/complete.js b/src/complete.js index d61a117f..05629440 100644 --- a/src/complete.js +++ b/src/complete.js @@ -4,6 +4,7 @@ import 'core-js/fn/array/map'; import 'core-js/fn/array/for-each'; import 'core-js/fn/array/filter'; import 'core-js/fn/array/from'; +import 'core-js/fn/set'; import log from './lib/log'; import { init } from './lib/init'; import { CMP_GLOBAL_NAME } from "./lib/cmp"; diff --git a/src/index.js b/src/index.js index b03c0105..d6f9827f 100755 --- a/src/index.js +++ b/src/index.js @@ -4,6 +4,7 @@ import 'core-js/fn/array/map'; import 'core-js/fn/array/for-each'; import 'core-js/fn/array/filter'; import 'core-js/fn/array/from'; +import 'core-js/fn/set'; import {init} from './lib/init'; import { CMP_GLOBAL_NAME } from './lib/cmp'; From ec69b5fabfbcdb1c9ff3c2ef16e398f854568d9d Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 14 May 2018 14:25:13 +0200 Subject: [PATCH 031/540] Ability do disable loading vendor list from `globalConsentLocation` --- src/lib/vendor.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 51d6f855..5bc116cb 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -9,13 +9,16 @@ import { sendPortalCommand } from './portal'; * fallback to portal location. */ function fetchVendorList() { - const {globalVendorListLocation} = config; + const {globalVendorListLocation, storeConsentGlobally, globalConsentLocation} = config; return (globalVendorListLocation ? fetch(globalVendorListLocation) : Promise.reject('Missing globalVendorListLocation')) .then(res => res.json()) - .catch(() => { - return sendPortalCommand({command: 'readVendorList'}); + .catch(err => { + if (storeConsentGlobally && globalConsentLocation) { + return sendPortalCommand({command: 'readVendorList'}); + } + log.error(`Failed to load vendor list from ${globalVendorListLocation}`, err); }); } From b99f96a2f06e9e9cfd43bf08f4c445e86b1ab8be Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 14 May 2018 15:49:12 +0200 Subject: [PATCH 032/540] Polish translation --- src/lib/translations.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 6512fa85..2026a33a 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,7 +8,7 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

Na naszych stronach używamy technologii, takich jak pliki cookie, do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty powiązane z Grupą Onet-RAS oraz nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Pragniemy zapoznać Cię ze szczegółami stosowanych przez nas technologii oraz z przepisami, które niebawem wejdą w życie, tak aby dać Ci pełną wiedzę i komfort w korzystaniu z naszych serwisów internetowych.

+ description: `

Na naszych stronach używamy technologii, takich jak pliki cookie, do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty powiązane z Grupą Onet-RAS oraz nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Pragniemy zapoznać Cię ze szczegółami stosowanych przez nas technologii oraz z przepisami, które niebawem wejdą w życie, tak aby dać Ci pełną wiedzę i komfort w korzystaniu z naszych serwisów internetowych. Zapoznaj się z poniższymi informacjami przed przejściem do serwisu. Klikając przycisk „Przejdź do serwisu” lub zamykając to okno zgadzasz się na postanowienia zawarte poniżej.

RODO

Z dniem 25 maja 2018 r. rozpoczyna obowiązywanie Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (określane popularnie jako „RODO”). @@ -34,7 +34,7 @@ Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach

Twoje dane, w ramach naszych usług, przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu.

Administratorzy

-

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

+

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

Przekazywanie danych

Twoje dane będą przetwarzać podmioty z Grupy Onet-RAS i Zaufani Partnerzy, jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z nich, a jedynie do korzystania w celach wyraźnie wskazanych przez dany podmiot z Grupy Onet-RAS lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). Dzięki temu możemy np. lepiej dobrać najciekawsze lub najtańsze oferty dopasowane dla Ciebie. W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym, o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie, jednak nigdy w innym przypadku.

@@ -56,7 +56,7 @@ Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostow Jeśli nie chcesz wyrazić opisanej wyżej zgody lub w ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. Wyrażenie zgody jest dobrowolne. W każdym momencie możesz także edytować Twoje preferencje w zakresie udzielonej zgody, w tym nawet wycofać ją całkowicie, klikając w ustawienia zaawansowane lub przechodząc na naszą stronę polityki prywatności. Powyższa zgoda dotyczy przetwarzania w celach marketingowych innych niż własne cele podmiotów z Grupy Onet-RAS. Informujemy jednocześnie, iż podmioty z Grupy Onet-RAS w ramach udostępnianych przez siebie usług internetowych przetwarzać będą Twoje dane we własnych celach marketingowych opisanych szczegółowo powyżej w oparciu o ich prawnie uzasadniony interes, jako administratora.

`, - acceptAll: 'Przejdź na stronę', + acceptAll: 'Przejdź do serwisu', showPurposes: 'Ustawienia zaawansowane' }, details: { From 4169690f42354358882632ac0dc3f468ac2678be Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 14 May 2018 15:53:00 +0200 Subject: [PATCH 033/540] Polish translation --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 2026a33a..86955e56 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -34,7 +34,7 @@ Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach

Twoje dane, w ramach naszych usług, przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu.

Administratorzy

-

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

+

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

Przekazywanie danych

Twoje dane będą przetwarzać podmioty z Grupy Onet-RAS i Zaufani Partnerzy, jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z nich, a jedynie do korzystania w celach wyraźnie wskazanych przez dany podmiot z Grupy Onet-RAS lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). Dzięki temu możemy np. lepiej dobrać najciekawsze lub najtańsze oferty dopasowane dla Ciebie. W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym, o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie, jednak nigdy w innym przypadku.

From 10c5024da36ea9489f211184a9caec44fe586f85 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Mon, 14 May 2018 16:26:01 +0200 Subject: [PATCH 034/540] show footer only when not all consents are true --- src/complete.js | 5 +++-- src/components/app.jsx | 1 + src/docs/components/docs/cmpApi.jsx | 13 ++++++++++++- src/lib/cmp.js | 8 ++++++++ src/lib/store.js | 10 ++++++++++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/complete.js b/src/complete.js index 295e66ae..5f88abac 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,4 +1,4 @@ -import 'core-js/fn/array/reduce'; + import 'core-js/fn/array/reduce'; import 'core-js/fn/array/fill'; import 'core-js/fn/array/map'; import 'core-js/fn/array/for-each'; @@ -21,7 +21,8 @@ function handleConsentResult(cmp, {vendorListVersion: listVersion} = {}, {create cmp('showConsentTool'); } else { - log.debug('Consent found. Not showing consent tool'); + log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); + cmp('showFooter'); } } diff --git a/src/components/app.jsx b/src/components/app.jsx index c6d72604..4d7b01f6 100644 --- a/src/components/app.jsx +++ b/src/components/app.jsx @@ -14,6 +14,7 @@ export default class App extends Component { store.persist(); notify('onSubmit'); store.toggleConsentToolShowing(false); + store.toggleFooterShowing(true); }; diff --git a/src/docs/components/docs/cmpApi.jsx b/src/docs/components/docs/cmpApi.jsx index 12f2be82..61405289 100644 --- a/src/docs/components/docs/cmpApi.jsx +++ b/src/docs/components/docs/cmpApi.jsx @@ -58,6 +58,17 @@ const commands = [ resultDescription: 'true' } }, + { + command: 'showFooter', + parameter: { + type: '[parameter]', + description: '(ignored)' + }, + callback: { + resultType: 'result (Boolean)', + resultDescription: 'true' + } + }, { command: 'addEventListener', parameter: { @@ -103,7 +114,7 @@ const events = [ ]; export default class CmpApi extends Component { - render() { + render () { return (
diff --git a/src/lib/cmp.js b/src/lib/cmp.js index c88134b9..e0a269f8 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -127,6 +127,14 @@ export default class Cmp { showConsentTool: (_, callback = () => {}) => { this.store.toggleConsentToolShowing(true); callback(true); + }, + + /** + * Trigger the footer UI to be shown + */ + showFooter: (_, callback = () => {}) => { + this.store.toggleFooterShowing(true); + callback(true); } }; diff --git a/src/lib/store.js b/src/lib/store.js index 1215b727..55c02837 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -64,6 +64,8 @@ export default class Store { this.updateCustomPurposeList(customPurposeList); } + isAllSetTrue = obj => Object.values(obj).every((value) => value === true); + /** * Build vendor consent object from data that has already been persisted. This * list will only return consent=true for vendors that exist in the current @@ -335,11 +337,19 @@ export default class Store { toggleConsentToolShowing = (isShown) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; + this.isConsentToolShowing === true ? document.body.classList.add('cmp') : document.body.classList.remove('cmp'); this.isFooterShowing = false; this.storeUpdate(); }; toggleFooterShowing = (isShown) => { + const vendorConsents = this.getVendorConsentsObject(); + const publisherConsents = this.getPublisherConsentsObject(); + if( this.isAllSetTrue(vendorConsents.purposeConsents) && + this.isAllSetTrue(vendorConsents.vendorConsents) && + this.isAllSetTrue(publisherConsents.standardPurposes)) { + isShown = false; + }; this.isFooterShowing = typeof isShown === 'boolean' ? isShown : !this.isFooterShowing; this.isConsentToolShowing = false; this.storeUpdate(); From f3528219b40344ac20f21fb940eca623ef9fdea5 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Mon, 14 May 2018 16:39:44 +0200 Subject: [PATCH 035/540] format code --- src/complete.js | 2 +- src/lib/store.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/complete.js b/src/complete.js index 5f88abac..fa728f58 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,4 +1,4 @@ - import 'core-js/fn/array/reduce'; +import 'core-js/fn/array/reduce'; import 'core-js/fn/array/fill'; import 'core-js/fn/array/map'; import 'core-js/fn/array/for-each'; diff --git a/src/lib/store.js b/src/lib/store.js index 55c02837..6070b380 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -345,11 +345,11 @@ export default class Store { toggleFooterShowing = (isShown) => { const vendorConsents = this.getVendorConsentsObject(); const publisherConsents = this.getPublisherConsentsObject(); - if( this.isAllSetTrue(vendorConsents.purposeConsents) && + if (this.isAllSetTrue(vendorConsents.purposeConsents) && this.isAllSetTrue(vendorConsents.vendorConsents) && this.isAllSetTrue(publisherConsents.standardPurposes)) { - isShown = false; - }; + isShown = false; + } this.isFooterShowing = typeof isShown === 'boolean' ? isShown : !this.isFooterShowing; this.isConsentToolShowing = false; this.storeUpdate(); From 6dee3c2b02a0b1838aec0ee325ad5d0bc08a0469 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 14 May 2018 17:33:26 +0200 Subject: [PATCH 036/540] Polish translation --- src/lib/translations.js | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 86955e56..4a900189 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,22 +8,17 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

Na naszych stronach używamy technologii, takich jak pliki cookie, do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty powiązane z Grupą Onet-RAS oraz nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Pragniemy zapoznać Cię ze szczegółami stosowanych przez nas technologii oraz z przepisami, które niebawem wejdą w życie, tak aby dać Ci pełną wiedzę i komfort w korzystaniu z naszych serwisów internetowych. Zapoznaj się z poniższymi informacjami przed przejściem do serwisu. Klikając przycisk „Przejdź do serwisu” lub zamykając to okno zgadzasz się na postanowienia zawarte poniżej.

- + description: `

Na naszych stronach używamy technologii, takich jak pliki cookie, do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty powiązane z Grupą Onet-RAS oraz nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Pragniemy zapoznać Cię ze szczegółami stosowanych przez nas technologii oraz z przepisami, które niebawem wejdą w życie, tak aby dać Ci pełną wiedzę i komfort w korzystaniu z naszych serwisów internetowych. Zapoznaj się z poniższymi informacjami przed przejściem do serwisu. Klikając przycisk „przejdź do serwisu” lub zamykając to okno zgadzasz się na postanowienia zawarte poniżej.

RODO

Z dniem 25 maja 2018 r. rozpoczyna obowiązywanie Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (określane popularnie jako „RODO”). RODO obowiązywać będzie w identycznym zakresie we wszystkich krajach Unii Europejskiej, a więc także w Polsce i wprowadza szereg zmian w zasadach regulujących przetwarzanie danych osobowych, które będą miały wpływ na wiele dziedzin życia, w tym na korzystanie z usług internetowych, takich jak między innymi usługi portalu Onet, serwisu Sympatia, serwisu Fakt24.pl, serwisu Skąpiec, Opineo i innych serwisów oferowanych przez podmioty tworzące Grupę Onet-RAS. W tej informacji przedstawiamy skrót najważniejszych zagadnień dotyczących przetwarzania Twoich danych osobowych, jakie może mieć miejsce po 25 maja 2018 r. w związku z korzystaniem z naszych usług. Prosimy Cię o jej przeczytanie, nie zajmie to więcej niż kilka minut.

- -

Czym są dane osobowe

Dane osobowe to, zgodnie z RODO, informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej. W przypadku korzystania z naszych serwisów takimi danymi są np. adres e-mail, adres IP lub Twoje dane w koncie poczty elektronicznej czy koncie w innej usłudze oferowanej przez podmioty z Grupy Onet-RAS. Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach (np. local storage) instalowanych przez nas lub naszych Zaufanych Partnerów na naszych stronach i urządzeniach, których używasz podczas korzystania z naszych usług.

-

Podstawa i cel przetwarzania

- -

Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a przypadkach korzystania z naszych usług wystąpią, co do zasady trzy z nich:

+

Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a w przypadkach korzystania z naszych usług wystąpią, co do zasady trzy z nich:


  • 1. Niezbędność przetwarzania do zawarcia lub wykonania umowy, której jesteś stroną. Umowa to, w naszym przypadku, regulamin danej usługi. Jeśli zatem zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. W przypadku, gdy zakładasz u nas konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tej możliwości nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać.
  • @@ -32,16 +27,12 @@ Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach

Twoje dane, w ramach naszych usług, przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu.

-

Administratorzy

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

-

Przekazywanie danych

Twoje dane będą przetwarzać podmioty z Grupy Onet-RAS i Zaufani Partnerzy, jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z nich, a jedynie do korzystania w celach wyraźnie wskazanych przez dany podmiot z Grupy Onet-RAS lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). Dzięki temu możemy np. lepiej dobrać najciekawsze lub najtańsze oferty dopasowane dla Ciebie. W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym, o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie, jednak nigdy w innym przypadku.

-

Cookies

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. Twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

-

Twoje uprawnienia

Zgodnie z RODO przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas i Zaufanych Partnerów.


@@ -49,8 +40,6 @@ Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach

Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzani danych oraz prawo do wniesienia skargi do organu nadzorczego – GIODO. Uprawnienia powyższe przysługują także w przypadku prawidłowego przetwarzania danych przez administratora. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień.

- -

Zgoda

Jeśli chcesz zgodzić się na przetwarzanie przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez podmioty z Grupy Onet-RAS w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) w tym ich przetwarzanie w plikach cookies itp. instalowanych na Twoich urządzeniach i odczytywanych z tych plików przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów możesz w łatwy sposób wyrazić tę zgodę, klikając w przycisk „Przejdź na stronę” lub zamykając to okno. Jeśli nie chcesz wyrazić opisanej wyżej zgody lub w ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. From 7ca77675576de63099799cae65056b5a6d3b0867 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 14 May 2018 22:51:08 +0200 Subject: [PATCH 037/540] Prevent to cache CORS response from other domain --- src/lib/vendor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 5bc116cb..aa712f4c 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -11,7 +11,7 @@ import { sendPortalCommand } from './portal'; function fetchVendorList() { const {globalVendorListLocation, storeConsentGlobally, globalConsentLocation} = config; return (globalVendorListLocation ? - fetch(globalVendorListLocation) : + fetch(globalVendorListLocation + ((globalVendorListLocation + '').indexOf('?') < 0 ? '?' : '&') + 'host=' + encodeURIComponent(window.location.hostname)) : Promise.reject('Missing globalVendorListLocation')) .then(res => res.json()) .catch(err => { From 34f28c15cdd984882acbc9e88be38e5f1a25934c Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 14 May 2018 23:08:02 +0200 Subject: [PATCH 038/540] Revert "Prevent to cache CORS response from other domain" This reverts commit 7ca77675576de63099799cae65056b5a6d3b0867. --- src/lib/vendor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index aa712f4c..5bc116cb 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -11,7 +11,7 @@ import { sendPortalCommand } from './portal'; function fetchVendorList() { const {globalVendorListLocation, storeConsentGlobally, globalConsentLocation} = config; return (globalVendorListLocation ? - fetch(globalVendorListLocation + ((globalVendorListLocation + '').indexOf('?') < 0 ? '?' : '&') + 'host=' + encodeURIComponent(window.location.hostname)) : + fetch(globalVendorListLocation) : Promise.reject('Missing globalVendorListLocation')) .then(res => res.json()) .catch(err => { From be1c07c76521a0b480b1f724882c58825956632e Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 15 May 2018 12:14:23 +0200 Subject: [PATCH 039/540] Polish translation --- src/lib/translations.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 4a900189..3903413c 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -41,7 +41,7 @@ Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzani danych oraz prawo do wniesienia skargi do organu nadzorczego – GIODO. Uprawnienia powyższe przysługują także w przypadku prawidłowego przetwarzania danych przez administratora. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień.

Zgoda

-

Jeśli chcesz zgodzić się na przetwarzanie przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez podmioty z Grupy Onet-RAS w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) w tym ich przetwarzanie w plikach cookies itp. instalowanych na Twoich urządzeniach i odczytywanych z tych plików przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów możesz w łatwy sposób wyrazić tę zgodę, klikając w przycisk „Przejdź na stronę” lub zamykając to okno. +

Jeśli chcesz zgodzić się na przetwarzanie przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez podmioty z Grupy Onet-RAS w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) w tym ich przetwarzanie w plikach cookies itp. instalowanych na Twoich urządzeniach i odczytywanych z tych plików przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów możesz w łatwy sposób wyrazić tę zgodę, klikając w przycisk „Przejdź do serwisu” lub zamykając to okno. Jeśli nie chcesz wyrazić opisanej wyżej zgody lub w ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. Wyrażenie zgody jest dobrowolne. W każdym momencie możesz także edytować Twoje preferencje w zakresie udzielonej zgody, w tym nawet wycofać ją całkowicie, klikając w ustawienia zaawansowane lub przechodząc na naszą stronę polityki prywatności. Powyższa zgoda dotyczy przetwarzania w celach marketingowych innych niż własne cele podmiotów z Grupy Onet-RAS. Informujemy jednocześnie, iż podmioty z Grupy Onet-RAS w ramach udostępnianych przez siebie usług internetowych przetwarzać będą Twoje dane we własnych celach marketingowych opisanych szczegółowo powyżej w oparciu o ich prawnie uzasadniony interes, jako administratora.

`, @@ -72,7 +72,7 @@ Powyższa zgoda dotyczy przetwarzania w celach marketingowych innych niż własn title: 'Nasi Zaufani Partnerzy', company: 'Partner', offOn: 'Akceptuję', - description: `Poniżej lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „zmień ustawienia Zajufanych Partnerów” i odznacz wybraną opcję.Jeśli nie chcesz by Twoje dane były przetwarzane przez podmioty z Grupy Onet-RAS (lub odpowiednio by podmioty te nie wykorzystywały plików cookies itp. na Twoich urządzeniach) wróć do poprzedniego okna i ustaw suwak w pozycji „nieaktywna”.`, + description: `Poniżej lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „zmień ustawienia Zaufanych Partnerów” i odznacz wybraną opcję. Jeśli nie chcesz by Twoje dane były przetwarzane przez podmioty z Grupy Onet-RAS (lub odpowiednio by podmioty te nie wykorzystywały plików cookies itp. na Twoich urządzeniach) wróć do poprzedniego okna i ustaw suwak w pozycji „nieaktywna”.`, moreChoices: 'Zmień ustawienia Zaufanych Partnerów' }, footer: { From bcce7d5c56abc8958ce2e37672593c1247c7a807 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Wed, 16 May 2018 11:29:34 +0200 Subject: [PATCH 040/540] fix serve file from dev-server on vm --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d41daeaa..4b2ca10c 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "clean": "rm -rf build", - "dev": "cross-env NODE_ENV=development webpack-dev-server --inline --hot --progress", + "dev": "cross-env NODE_ENV=development webpack-dev-server --inline --hot --progress --host $HOSTNAME --public $HOSTNAME:8080", "start": "serve build -s -c 1", "prestart": "npm run build", "build": "cross-env NODE_ENV=production webpack --progress", From ec2b5881167b55a69d039bcfd7d4b76dbd79a700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Pawlicki?= Date: Wed, 16 May 2018 12:00:45 +0200 Subject: [PATCH 041/540] openConsentTool event added --- src/docs/components/docs/cmpApi.jsx | 5 +++++ src/docs/components/examples/basic/eventListeners.jsx | 5 +++++ src/lib/cmp.js | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/src/docs/components/docs/cmpApi.jsx b/src/docs/components/docs/cmpApi.jsx index 12f2be82..6b8008bf 100644 --- a/src/docs/components/docs/cmpApi.jsx +++ b/src/docs/components/docs/cmpApi.jsx @@ -95,6 +95,11 @@ const events = [ description: 'Fired when the full CMP implementation has been loaded AND all vendor list information has been retrieved. If the CMP is ready before an event listener is added the listener will be fired immediately after being added.', result: '{"event":"cmpReady"}' }, + { + name: 'openConsentTool', + description: 'Fired when the CMP ConsentTool wants to be opened', + result: '{"event":"openConsentTool"}' + }, { name: 'onSubmit', description: 'Fired when the user submits consent data via the consent tool UI', diff --git a/src/docs/components/examples/basic/eventListeners.jsx b/src/docs/components/examples/basic/eventListeners.jsx index fc33e74a..19b845b6 100644 --- a/src/docs/components/examples/basic/eventListeners.jsx +++ b/src/docs/components/examples/basic/eventListeners.jsx @@ -11,6 +11,11 @@ window.__cmp('addEventListener', 'cmpReady', function(result){ myLogger('Event "cmpReady" called: ' + JSON.stringify(result)); }); +myLogger('Add eventListener "openConsentTool"'); +window.__cmp('addEventListener', 'openConsentTool', function(result){ + myLogger('Event "openConsentTool" called: ' + JSON.stringify(result)); +}); + myLogger('Add eventListener "onSubmit"'); window.__cmp('addEventListener', 'onSubmit', function(result){ myLogger('Event "onSubmit" called: ' + JSON.stringify(result)); diff --git a/src/lib/cmp.js b/src/lib/cmp.js index c88134b9..1bce4366 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -10,6 +10,7 @@ export default class Cmp { constructor(store) { this.isLoaded = false; this.cmpReady = false; + this.openConsentTool = false; this.eventListeners = {}; this.store = store; this.processCommand.receiveMessage = this.receiveMessage; @@ -95,6 +96,9 @@ export default class Cmp { if (event === 'cmpReady' && this.cmpReady) { callback({event}); } + if (event === 'openConsentTool' && this.openConsentTool) { + callback({event}); + } }, /** @@ -126,6 +130,10 @@ export default class Cmp { */ showConsentTool: (_, callback = () => {}) => { this.store.toggleConsentToolShowing(true); + + this.openConsentTool = true; + this.notify('openConsentTool'); + callback(true); } }; From 6a60e6d4756aa82c12496aa70ef78c8400fc6a0e Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Thu, 17 May 2018 14:53:52 +0200 Subject: [PATCH 042/540] add showConsentDetailView function to api --- src/components/popup/popup.jsx | 12 +++++++++++- src/lib/cmp.js | 10 ++++++++++ src/lib/store.js | 6 ++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index 8a1529aa..f0466113 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -10,9 +10,19 @@ const SECTION_DETAILS = 1; export default class Popup extends Component { state = { - selectedPanelIndex: SECTION_INTRO + selectedPanelIndex: SECTION_INTRO, + isDetailViewAsDefault: false }; + componentWillReceiveProps(newProps) { + if (newProps.store.isDetailViewAsDefault !== this.state.isDetailViewAsDefault) { + this.setState({ + selectedPanelIndex: newProps.store.isDetailViewAsDefault ? SECTION_DETAILS : SECTION_INTRO, + isDetailViewAsDefault: newProps.store.isDetailViewAsDefault + }); + } + } + onAcceptAll = () => { const { store, onSave } = this.props; store.selectAllVendors(true); diff --git a/src/lib/cmp.js b/src/lib/cmp.js index c88134b9..0b28e9bc 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -125,6 +125,16 @@ export default class Cmp { * Trigger the consent tool UI to be shown */ showConsentTool: (_, callback = () => {}) => { + this.store.toogleDetailViewAsDefault(false); + this.store.toggleConsentToolShowing(true); + callback(true); + }, + + /** + * Trigger the consent tool UI to be shown on Detail View + */ + showConsentDetailView: (_, callback = () => {}) => { + this.store.toogleDetailViewAsDefault(true); this.store.toggleConsentToolShowing(true); callback(true); } diff --git a/src/lib/store.js b/src/lib/store.js index 1215b727..4f4d1f12 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -59,6 +59,7 @@ export default class Store { this.isConsentToolShowing = false; this.isFooterShowing = false; + this.isDetailViewAsDefault = false; this.updateVendorList(vendorList); this.updateCustomPurposeList(customPurposeList); @@ -345,6 +346,11 @@ export default class Store { this.storeUpdate(); }; + toogleDetailViewAsDefault = (isDefault) => { + this.isDetailViewAsDefault = typeof isDefault === 'boolean' ? isDefault : !this.isDetailViewAsDefault; + this.storeUpdate(); + } + updateVendorList = vendorList => { const { From b9d9ea84796810c4a31f680e86740704b84f1364 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Tue, 22 May 2018 11:08:12 +0200 Subject: [PATCH 043/540] add autoDisplay parameter, and check autoDisplay before display CMP board --- src/lib/cmp.js | 22 ++++++++++++++++------ src/lib/config.js | 3 ++- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 0b28e9bc..e9eef2cb 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -123,20 +123,30 @@ export default class Cmp { /** * Trigger the consent tool UI to be shown + * When autoDisplay is set false does not show the consent tool and Callback call with false */ showConsentTool: (_, callback = () => {}) => { - this.store.toogleDetailViewAsDefault(false); - this.store.toggleConsentToolShowing(true); - callback(true); + if (config.autoDisplay) { + this.store.toogleDetailViewAsDefault(false) + this.store.toggleConsentToolShowing(true) + callback(true); + } else { + callback(false); + } }, /** * Trigger the consent tool UI to be shown on Detail View + * When autoDisplay is set false does not show the consent tool and Callback call with false */ showConsentDetailView: (_, callback = () => {}) => { - this.store.toogleDetailViewAsDefault(true); - this.store.toggleConsentToolShowing(true); - callback(true); + if (config.autoDisplay) { + this.store.toogleDetailViewAsDefault(true) + this.store.toggleConsentToolShowing(true) + callback(true); + } else { + callback(false); + } } }; diff --git a/src/lib/config.js b/src/lib/config.js index a18f911b..d33ce55b 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -13,7 +13,8 @@ const defaultConfig = { getConsentData: null, setConsentData: null, legIntPurposeIds: [], - purposeGroups: [] + purposeGroups: [], + autoDisplay: true }; class Config { From 411ee6fc446803fe1bf99566e144f9bbfa4272a3 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Tue, 22 May 2018 11:27:53 +0200 Subject: [PATCH 044/540] doc --- src/docs/components/docs/configuration.jsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 2a6d00c9..1c99b2eb 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -108,6 +108,11 @@ export default class CmpApi extends Component { Array of arrays with purpose identifiers that should be organized in groups - each one with single switch which activates/deactivates all purposes in given group. For example: [[1, 4], [2, 3, 5]]. Purposes which are not included in any group will be displayed separatelly + + autoDisplay (Boolean): + Default is set true. If true autoDisplay: true the consent tool UI can be display, and after display callback (argument of the function: "showConsentTool" and "showConsentDetailView") call with true parameter. + If is set false autoDisplay: false the consent tool UI will never be displayed, and callback (argument of the function: "showConsentTool" and "showConsentDetailView") call with false parameter +
); From 419b730b764886ce3a2e03025b6840a385ed8c25 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Tue, 22 May 2018 12:09:30 +0200 Subject: [PATCH 045/540] check autoDisplay when initialize CMP --- src/complete.js | 5 +++-- src/docs/components/docs/configuration.jsx | 4 ++-- src/lib/cmp.js | 20 +++++--------------- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/complete.js b/src/complete.js index 05629440..1f00a16d 100644 --- a/src/complete.js +++ b/src/complete.js @@ -8,18 +8,19 @@ import 'core-js/fn/set'; import log from './lib/log'; import { init } from './lib/init'; import { CMP_GLOBAL_NAME } from "./lib/cmp"; +import configuration from "./lib/config"; function handleConsentResult(cmp, {vendorListVersion: listVersion} = {}, {created, vendorListVersion} = {}) { if (!created) { log.debug('No consent data found. Showing consent tool'); - cmp('showConsentTool'); + configuration.autoDisplay && cmp('showConsentTool'); } else if (!listVersion) { log.debug('Could not determine vendor list version. Not showing consent tool'); } else if (vendorListVersion !== listVersion) { log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); - cmp('showConsentTool'); + configuration.autoDisplay && cmp('showConsentTool'); } else { log.debug('Consent found. Not showing consent tool'); diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 1c99b2eb..9d8f0181 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -110,8 +110,8 @@ export default class CmpApi extends Component {
autoDisplay (Boolean): - Default is set true. If true autoDisplay: true the consent tool UI can be display, and after display callback (argument of the function: "showConsentTool" and "showConsentDetailView") call with true parameter. - If is set false autoDisplay: false the consent tool UI will never be displayed, and callback (argument of the function: "showConsentTool" and "showConsentDetailView") call with false parameter + Default is set true. If true autoDisplay: true when initialize CMP the consent tool UI is display with default settings. + If is set false autoDisplay: false the consent tool UI will never be displayed when initialize CMP diff --git a/src/lib/cmp.js b/src/lib/cmp.js index e9eef2cb..10cfca9b 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -123,30 +123,20 @@ export default class Cmp { /** * Trigger the consent tool UI to be shown - * When autoDisplay is set false does not show the consent tool and Callback call with false */ showConsentTool: (_, callback = () => {}) => { - if (config.autoDisplay) { - this.store.toogleDetailViewAsDefault(false) - this.store.toggleConsentToolShowing(true) - callback(true); - } else { - callback(false); - } + this.store.toogleDetailViewAsDefault(false); + this.store.toggleConsentToolShowing(true); + callback(true); }, /** * Trigger the consent tool UI to be shown on Detail View - * When autoDisplay is set false does not show the consent tool and Callback call with false */ showConsentDetailView: (_, callback = () => {}) => { - if (config.autoDisplay) { - this.store.toogleDetailViewAsDefault(true) - this.store.toggleConsentToolShowing(true) + this.store.toogleDetailViewAsDefault(true); + this.store.toggleConsentToolShowing(true); callback(true); - } else { - callback(false); - } } }; From 5923aad4888d1e791adcaee07ad88614498a880c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Pawlicki?= Date: Tue, 22 May 2018 13:24:29 +0200 Subject: [PATCH 046/540] openConsentTool - notify about the event --- src/lib/cmp.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 1ae646cb..0e2dbb68 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -131,7 +131,11 @@ export default class Cmp { showConsentTool: (_, callback = () => {}) => { this.store.toogleDetailViewAsDefault(false); this.store.toggleConsentToolShowing(true); - callback(true); + + this.openConsentTool = true; + this.notify('openConsentTool', { section: 'intro' }); + + callback(); }, /** @@ -142,9 +146,9 @@ export default class Cmp { this.store.toggleConsentToolShowing(true); this.openConsentTool = true; - this.notify('openConsentTool'); + this.notify('openConsentTool', { section: 'details' }); - callback(true); + callback(); } }; From 37eee6cf9410ed87950be5f5adac0580a42f6828 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Tue, 22 May 2018 17:46:48 +0200 Subject: [PATCH 047/540] show consent callback call with true --- src/lib/cmp.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 0e2dbb68..1cf019fa 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -135,7 +135,7 @@ export default class Cmp { this.openConsentTool = true; this.notify('openConsentTool', { section: 'intro' }); - callback(); + callback(true); }, /** @@ -148,7 +148,7 @@ export default class Cmp { this.openConsentTool = true; this.notify('openConsentTool', { section: 'details' }); - callback(); + callback(true); } }; From 33c9c5fe5dc39ede099e421f7e245d3f35e46146 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 22 May 2018 17:54:32 +0200 Subject: [PATCH 048/540] Documentation: config.autoDisplay --- src/docs/components/docs/configuration.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 9d8f0181..2854ea12 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -110,7 +110,7 @@ export default class CmpApi extends Component { autoDisplay (Boolean): - Default is set true. If true autoDisplay: true when initialize CMP the consent tool UI is display with default settings. + Default is set true. If true autoDisplay: true when initialize CMP the consent tool UI may be displayed automatically according to user's current consents. If is set false autoDisplay: false the consent tool UI will never be displayed when initialize CMP From 89f001e3abf8cb28d7409903cc8caf2a47ca1ee0 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 23 May 2018 13:15:25 +0200 Subject: [PATCH 049/540] Polish translation --- src/lib/translations.js | 80 ++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 3903413c..d317b4ba 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,43 +8,56 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

Na naszych stronach używamy technologii, takich jak pliki cookie, do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty powiązane z Grupą Onet-RAS oraz nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Pragniemy zapoznać Cię ze szczegółami stosowanych przez nas technologii oraz z przepisami, które niebawem wejdą w życie, tak aby dać Ci pełną wiedzę i komfort w korzystaniu z naszych serwisów internetowych. Zapoznaj się z poniższymi informacjami przed przejściem do serwisu. Klikając przycisk „przejdź do serwisu” lub zamykając to okno zgadzasz się na postanowienia zawarte poniżej.

-

RODO

-

Z dniem 25 maja 2018 r. rozpoczyna obowiązywanie Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych oraz uchylenia dyrektywy 95/46/WE (określane popularnie jako „RODO”). -RODO obowiązywać będzie w identycznym zakresie we wszystkich krajach Unii Europejskiej, a więc także w Polsce i wprowadza szereg zmian w zasadach regulujących przetwarzanie danych osobowych, które będą miały wpływ na wiele dziedzin życia, w tym na korzystanie z usług internetowych, takich jak między innymi usługi portalu Onet, serwisu Sympatia, serwisu Fakt24.pl, serwisu Skąpiec, Opineo i innych serwisów oferowanych przez podmioty tworzące Grupę Onet-RAS. + description: `

Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

+ +

Zgoda

+ +

Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy Onet-RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno. +Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”. +Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę +polityki prywatności. - W tej informacji przedstawiamy skrót najważniejszych zagadnień dotyczących przetwarzania Twoich danych osobowych, jakie może mieć miejsce po 25 maja 2018 r. w związku z korzystaniem z naszych usług. Prosimy Cię o jej przeczytanie, nie zajmie to więcej niż kilka minut.

-

Czym są dane osobowe

-

Dane osobowe to, zgodnie z RODO, informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej. W przypadku korzystania z naszych serwisów takimi danymi są np. adres e-mail, adres IP lub Twoje dane w koncie poczty elektronicznej czy koncie w innej usłudze oferowanej przez podmioty z Grupy Onet-RAS. -Dane osobowe mogą być zapisywane w plikach cookies lub podobnych technologiach (np. local storage) instalowanych przez nas lub naszych Zaufanych Partnerów na naszych stronach i urządzeniach, których używasz podczas korzystania z naszych usług.

-

Podstawa i cel przetwarzania

-

Przetwarzanie danych osobowych wymaga podstawy prawnej. RODO przewiduje kilka rodzajów takich podstaw prawnych dla przetwarzania danych, a w przypadkach korzystania z naszych usług wystąpią, co do zasady trzy z nich:

+ Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa Onet-RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). +Podmioty z Grupy Onet-RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy Onet-RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy Onet-RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji. +

+

Administrator danych osobowych

+

Administratorem Twoich danych osobowych jest podmiot z Grupy Onet-RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy Onet-RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

+ +

Podstawa i cel przetwarzania

+ +

Twoje dane przetwarzamy w następujących celach:


    -
  • 1. Niezbędność przetwarzania do zawarcia lub wykonania umowy, której jesteś stroną. Umowa to, w naszym przypadku, regulamin danej usługi. Jeśli zatem zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. W przypadku, gdy zakładasz u nas konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tej możliwości nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać.
  • -
  • 2. Niezbędność przetwarzania do celów wynikających z prawnie uzasadnionych interesów realizowanych przez administratora lub przez stronę trzecią. Ta podstawa przetwarzania danych dotyczy przypadków, gdy ich przetwarzanie jest uzasadnione z uwagi na nasze usprawiedliwione potrzeby, co obejmuje między innymi konieczność zapewnienia bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszania naszych usług i dopasowania ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach) jak również prowadzenie marketingu i promocji własnych usług administratora z Grupy Onet-RAS w serwisie tego administratora (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych).
  • -
  • 3. Twoja dobrowolna zgoda. Jest potrzebna głównie w przypadku, gdy usługi marketingowe dostarczają Ci podmioty trzecie (czyli Zaufani Partnerzy, o których mowa poniżej) oraz gdy to my świadczymy takie usługi dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele muszą mieć możliwość przetwarzania Twoich danych. Udzielenie takiej zgody jest całkowicie dobrowolne, i jeśli nie chcesz, nie musisz jej udzielać. Dzięki naszemu rozwiązaniu masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie. Twoje pozostałe uprawnienia wynikające z udzielenia zgody są opisane poniżej.
  • + +
  • 1. Jeśli zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. Gdy zakładasz konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tego nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. Niepodanie takich danych uniemożliwi nam zawarcie i wykonanie umowy.
  • + +
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu i promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • + +
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
-
-

Twoje dane, w ramach naszych usług, przetwarzane będą wyłącznie w przypadku posiadania przez nas lub inny podmiot przetwarzający dane jednej z dopuszczonych przez RODO podstaw prawnych i wyłącznie w celu dostosowanym do danej podstawy, zgodnie z opisem powyżej. Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania – czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy – przez czas jej wykonywania, a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora – do czasu istnienia tego uzasadnionego interesu.

-

Administratorzy

-

Administratorami Twoich danych osobowych będą podmioty z Grupy Onet-RAS, logo podmiotu, na którego stronę wszedłeś możesz zobaczyć na planszy zawierającej niniejszą informację, a pełne dane wszystkich podmiotów możesz sprawdzić pod tym linkiem – a także nasi Zaufani Partnerzy, czyli firmy i inne podmioty, z którymi współpracujemy głównie w zakresie marketingowym. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i zdecydować, którym z nich chcesz wyrazić zgodę na przetwarzanie Twoich danych.

-

Przekazywanie danych

-

Twoje dane będą przetwarzać podmioty z Grupy Onet-RAS i Zaufani Partnerzy, jeśli wyrazisz im zgodę, ale mogą być one również powierzone do przetwarzania innym podmiotom. W każdym takim przypadku przekazanie danych nie uprawnia ich odbiorcy do dowolnego korzystania z nich, a jedynie do korzystania w celach wyraźnie wskazanych przez dany podmiot z Grupy Onet-RAS lub Zaufanego Partnera. Przekazywanie danych ma miejsce na ogół w przypadku współpracy z podwykonawcą (np. agencją marketingową) lub usługodawcą (np. dostawcą usług przechowywania danych). Dzięki temu możemy np. lepiej dobrać najciekawsze lub najtańsze oferty dopasowane dla Ciebie. W każdym przypadku przekazanie danych nie zwalnia przekazującego z odpowiedzialności za ich przetwarzanie. Dane mogą być też przekazywane organom publicznym, o ile upoważniają ich do tego obowiązujące przepisy i przedstawią odpowiednie żądanie, jednak nigdy w innym przypadku.

+ +
+

Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania, czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy, przez czas jej wykonywania i ewentualnie okres przedawnienia roszczeń z niej (zwykle nie więcej niż 3 lata, a maksymalnie 10 lat), a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora, do czasu zgłoszenia przez Ciebie skutecznego sprzeciwu.

+ +

Przekazywanie danych

+ +

Administratorzy danych mogą powierzać Twoje dane podwykonawcom IT, księgowym, agencjom marketingowym etc. Zrobią to jedynie na podstawie umowy o powierzenie przetwarzania danych zobowiązującej taki podmiot do odpowiedniego zabezpieczenia danych i niekorzystania z nich do własnych celów.

+

Cookies

-

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. Twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

+ +

Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy Onet-RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym https://polityka-prywatnosci.onet.pl/polityka-prywatnosci.html" target="_blank">linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

+

Twoje uprawnienia

-

Zgodnie z RODO przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas i Zaufanych Partnerów.


+ +

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. Twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

+ +

Twoje uprawnienia

+

Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy Onet-RAS Polska i Zaufanych Partnerów:


-

Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać.


+

1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);


-Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzani danych oraz prawo do wniesienia skargi do organu nadzorczego – GIODO. Uprawnienia powyższe przysługują także w przypadku prawidłowego przetwarzania danych przez administratora. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. -

-

Zgoda

-

Jeśli chcesz zgodzić się na przetwarzanie przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów Twoich danych osobowych zebranych w związku z korzystaniem przez Ciebie ze stron i aplikacji internetowych dostarczanych przez podmioty z Grupy Onet-RAS w celach marketingowych (obejmujących niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych) w tym ich przetwarzanie w plikach cookies itp. instalowanych na Twoich urządzeniach i odczytywanych z tych plików przez podmioty z Grupy Onet-RAS i Zaufanych Partnerów możesz w łatwy sposób wyrazić tę zgodę, klikając w przycisk „Przejdź do serwisu” lub zamykając to okno. -Jeśli nie chcesz wyrazić opisanej wyżej zgody lub w ograniczyć jej zakres prosimy o kliknięcie w „Ustawienia zaawansowane”. -Wyrażenie zgody jest dobrowolne. W każdym momencie możesz także edytować Twoje preferencje w zakresie udzielonej zgody, w tym nawet wycofać ją całkowicie, klikając w ustawienia zaawansowane lub przechodząc na naszą stronę polityki prywatności. -Powyższa zgoda dotyczy przetwarzania w celach marketingowych innych niż własne cele podmiotów z Grupy Onet-RAS. Informujemy jednocześnie, iż podmioty z Grupy Onet-RAS w ramach udostępnianych przez siebie usług internetowych przetwarzać będą Twoje dane we własnych celach marketingowych opisanych szczegółowo powyżej w oparciu o ich prawnie uzasadniony interes, jako administratora.

`, +Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tymadresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. +

`, acceptAll: 'Przejdź do serwisu', showPurposes: 'Ustawienia zaawansowane' }, @@ -58,21 +71,22 @@ Powyższa zgoda dotyczy przetwarzania w celach marketingowych innych niż własn inactive: 'Nieaktywna', showVendors: 'Pokaż listę naszych Zaufanych Partnerów', purpose1: { - menu: 'Instalowanie plików cookies', + menu: 'Cookies itp.', title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', - description: 'Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści.' + description: `

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści.

+

Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

` }, 'purpose2,3,4,5': { menu: 'Przetwarzanie danych osobowych', title: 'Przetwarzanie danych osobowych w celach marketingowych przez naszych Zaufanych Partnerów.', - description: 'Zgoda dotyczy przetwarzania Twoich danych osobowych przez Zaufanych Partnerów w celach marketingowych, które obejmują także niezbędne działania analityczne i zestawianie w profile marketingowe na podstawie Twojej aktywności na stronach internetowych. Na podstawie tej zgody, Twoje dane, w tym zebrane informacje o Twojej aktywności na stronach internetowych, będą wykorzystywane do prezentowania Ci reklam produktów i usług naszych Partnerów biznesowych, dopasowanych do Twoich zainteresowań.' + description: '

Zgoda dotyczy przetwarzania Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty przez np. zestawianie w odpowiednich grupach użytkowników, oraz związane z tym niezbędne działania statystyczne) przez naszych Zaufanych Partnerów. Na podstawie tej zgody, Twoje dane, w tym zebrane informacje o Twojej aktywności na stronach internetowych, będą wykorzystywane do prezentowania Ci reklam produktów i usług naszych Partnerów biznesowych, dopasowanych do Twoich zainteresowań.

' } }, vendors: { title: 'Nasi Zaufani Partnerzy', company: 'Partner', offOn: 'Akceptuję', - description: `Poniżej lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „zmień ustawienia Zaufanych Partnerów” i odznacz wybraną opcję. Jeśli nie chcesz by Twoje dane były przetwarzane przez podmioty z Grupy Onet-RAS (lub odpowiednio by podmioty te nie wykorzystywały plików cookies itp. na Twoich urządzeniach) wróć do poprzedniego okna i ustaw suwak w pozycji „nieaktywna”.`, + description: 'Poniżej znajduje się lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez naszych Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „Zmień ustawienia Zaufanych Partnerów” i odznacz wybraną opcję.', moreChoices: 'Zmień ustawienia Zaufanych Partnerów' }, footer: { From b84003f2e9c0c1b699f61bb104d7037c3ddcb748 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 23 May 2018 14:58:54 +0200 Subject: [PATCH 050/540] Polish translation --- src/lib/translations.js | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index d317b4ba..f46f454a 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -12,16 +12,19 @@ export default {

Zgoda

-

Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy Onet-RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno. -Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”. -Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę -polityki prywatności. +

Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy Onet-RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

+ +

Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

+ +

Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę +polityki prywatności.

- Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa Onet-RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). -Podmioty z Grupy Onet-RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy Onet-RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy Onet-RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji. +

Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa Onet-RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

+ +

Podmioty z Grupy Onet-RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy Onet-RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy Onet-RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

Administrator danych osobowych

-

Administratorem Twoich danych osobowych jest podmiot z Grupy Onet-RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy Onet-RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

+

Administratorem Twoich danych osobowych jest podmiot z Grupy Onet-RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy Onet-RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

Podstawa i cel przetwarzania

@@ -45,18 +48,14 @@ Podmioty z Grupy Onet-RAS Polska w ramach udostępnianych przez siebie usług in

Cookies

-

Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy Onet-RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym https://polityka-prywatnosci.onet.pl/polityka-prywatnosci.html" target="_blank">linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

- -

Twoje uprawnienia

+

Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy Onet-RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

-

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. W ten sposób technologię tę wykorzystują również nasi Zaufani Partnerzy, którzy także chcą serwować reklamy jak najlepiej dopasowane do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. Twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz różne strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

- +

Twoje uprawnienia

-

Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy Onet-RAS Polska i Zaufanych Partnerów:


- -

1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);


-

-Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tymadresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. +

Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy Onet-RAS Polska i Zaufanych Partnerów:

+
+

1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

+

2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień.

`, acceptAll: 'Przejdź do serwisu', showPurposes: 'Ustawienia zaawansowane' @@ -74,7 +73,7 @@ Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostow menu: 'Cookies itp.', title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', description: `

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści.

-

Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

` +

Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

` }, 'purpose2,3,4,5': { menu: 'Przetwarzanie danych osobowych', From 0f35ff954df0a6d1c108c7ac4b62e0d59609b687 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Thu, 24 May 2018 10:37:26 +0200 Subject: [PATCH 051/540] don't import Array.from when already exist --- src/complete.js | 2 +- src/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/complete.js b/src/complete.js index 1f00a16d..e7740fb8 100644 --- a/src/complete.js +++ b/src/complete.js @@ -3,8 +3,8 @@ import 'core-js/fn/array/fill'; import 'core-js/fn/array/map'; import 'core-js/fn/array/for-each'; import 'core-js/fn/array/filter'; -import 'core-js/fn/array/from'; import 'core-js/fn/set'; +!Array.from && import ('core-js/fn/array/from'); import log from './lib/log'; import { init } from './lib/init'; import { CMP_GLOBAL_NAME } from "./lib/cmp"; diff --git a/src/index.js b/src/index.js index d6f9827f..da22cc2b 100755 --- a/src/index.js +++ b/src/index.js @@ -3,8 +3,8 @@ import 'core-js/fn/array/fill'; import 'core-js/fn/array/map'; import 'core-js/fn/array/for-each'; import 'core-js/fn/array/filter'; -import 'core-js/fn/array/from'; import 'core-js/fn/set'; +!Array.from && import ('core-js/fn/array/from'); import {init} from './lib/init'; import { CMP_GLOBAL_NAME } from './lib/cmp'; From e12a125a7780e878a0d1632d11ed6683169fbecc Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Thu, 24 May 2018 10:54:24 +0200 Subject: [PATCH 052/540] chack statment before import --- src/complete.js | 12 ++++++------ src/index.js | 13 ++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/complete.js b/src/complete.js index e7740fb8..80fa112c 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,10 +1,10 @@ -import 'core-js/fn/array/reduce'; -import 'core-js/fn/array/fill'; -import 'core-js/fn/array/map'; -import 'core-js/fn/array/for-each'; -import 'core-js/fn/array/filter'; -import 'core-js/fn/set'; +!Array.reduce && import ('core-js/fn/array/reduce'); +!Array.fill && import ('core-js/fn/array/fill'); +!Array.map && import ('core-js/fn/array/map'); +!Array.forEach && import ('core-js/fn/array/for-each'); +!Array.filter && import ('core-js/fn/array/filter'); !Array.from && import ('core-js/fn/array/from'); +import 'core-js/fn/set'; import log from './lib/log'; import { init } from './lib/init'; import { CMP_GLOBAL_NAME } from "./lib/cmp"; diff --git a/src/index.js b/src/index.js index da22cc2b..8fd064ce 100755 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,10 @@ -import 'core-js/fn/array/reduce'; -import 'core-js/fn/array/fill'; -import 'core-js/fn/array/map'; -import 'core-js/fn/array/for-each'; -import 'core-js/fn/array/filter'; -import 'core-js/fn/set'; +!Array.reduce && import ('core-js/fn/array/reduce'); +!Array.fill && import ('core-js/fn/array/fill'); +!Array.map && import ('core-js/fn/array/map'); +!Array.forEach && import ('core-js/fn/array/for-each'); +!Array.filter && import ('core-js/fn/array/filter'); !Array.from && import ('core-js/fn/array/from'); - +import 'core-js/fn/set'; import {init} from './lib/init'; import { CMP_GLOBAL_NAME } from './lib/cmp'; From 8b0da1043b93d47da588ae13731cec8a8052ef9a Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 24 May 2018 11:47:25 +0200 Subject: [PATCH 053/540] Don't require Array polyfills when already exist --- src/complete.js | 12 ++++++------ src/index.js | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/complete.js b/src/complete.js index 80fa112c..e3eea1ce 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,9 +1,9 @@ -!Array.reduce && import ('core-js/fn/array/reduce'); -!Array.fill && import ('core-js/fn/array/fill'); -!Array.map && import ('core-js/fn/array/map'); -!Array.forEach && import ('core-js/fn/array/for-each'); -!Array.filter && import ('core-js/fn/array/filter'); -!Array.from && import ('core-js/fn/array/from'); +!Array.reduce && require('core-js/fn/array/reduce'); +!Array.fill && require('core-js/fn/array/fill'); +!Array.map && require('core-js/fn/array/map'); +!Array.forEach && require('core-js/fn/array/for-each'); +!Array.filter && require('core-js/fn/array/filter'); +!Array.from && require('core-js/fn/array/from'); import 'core-js/fn/set'; import log from './lib/log'; import { init } from './lib/init'; diff --git a/src/index.js b/src/index.js index 8fd064ce..01ec9bbf 100755 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,9 @@ -!Array.reduce && import ('core-js/fn/array/reduce'); -!Array.fill && import ('core-js/fn/array/fill'); -!Array.map && import ('core-js/fn/array/map'); -!Array.forEach && import ('core-js/fn/array/for-each'); -!Array.filter && import ('core-js/fn/array/filter'); -!Array.from && import ('core-js/fn/array/from'); +!Array.reduce && require('core-js/fn/array/reduce'); +!Array.fill && require('core-js/fn/array/fill'); +!Array.map && require('core-js/fn/array/map'); +!Array.forEach && require('core-js/fn/array/for-each'); +!Array.filter && require('core-js/fn/array/filter'); +!Array.from && require('core-js/fn/array/from'); import 'core-js/fn/set'; import {init} from './lib/init'; import { CMP_GLOBAL_NAME } from './lib/cmp'; From 26d47808018a04d6638e4caf5bd28ce285f3a545 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 24 May 2018 11:49:14 +0200 Subject: [PATCH 054/540] Don't require Array polyfills when already exist --- src/complete.js | 2 +- src/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/complete.js b/src/complete.js index e3eea1ce..cec6a9ab 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,4 +1,4 @@ -!Array.reduce && require('core-js/fn/array/reduce'); +!Array.reduce && require('core-js/fn/array/reduce'); !Array.fill && require('core-js/fn/array/fill'); !Array.map && require('core-js/fn/array/map'); !Array.forEach && require('core-js/fn/array/for-each'); diff --git a/src/index.js b/src/index.js index 01ec9bbf..16b8b64b 100755 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,4 @@ -!Array.reduce && require('core-js/fn/array/reduce'); +!Array.reduce && require('core-js/fn/array/reduce'); !Array.fill && require('core-js/fn/array/fill'); !Array.map && require('core-js/fn/array/map'); !Array.forEach && require('core-js/fn/array/for-each'); From 0a61c7adba8192d4a04ea86c5bbe052e074fb2fe Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 24 May 2018 15:05:39 +0200 Subject: [PATCH 055/540] MooTools Array.from incompatibility --- src/complete.js | 11 +++++------ src/index.js | 11 +++++------ src/lib/cmp.js | 5 +++-- src/lib/cookie/cookie.js | 3 ++- src/lib/store.js | 11 ++++++----- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/complete.js b/src/complete.js index cec6a9ab..9f89afdf 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,9 +1,8 @@ -!Array.reduce && require('core-js/fn/array/reduce'); -!Array.fill && require('core-js/fn/array/fill'); -!Array.map && require('core-js/fn/array/map'); -!Array.forEach && require('core-js/fn/array/for-each'); -!Array.filter && require('core-js/fn/array/filter'); -!Array.from && require('core-js/fn/array/from'); +import 'core-js/fn/array/reduce'; +import 'core-js/fn/array/fill'; +import 'core-js/fn/array/map'; +import 'core-js/fn/array/for-each'; +import 'core-js/fn/array/filter'; import 'core-js/fn/set'; import log from './lib/log'; import { init } from './lib/init'; diff --git a/src/index.js b/src/index.js index 16b8b64b..7a0a54a9 100755 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,8 @@ -!Array.reduce && require('core-js/fn/array/reduce'); -!Array.fill && require('core-js/fn/array/fill'); -!Array.map && require('core-js/fn/array/map'); -!Array.forEach && require('core-js/fn/array/for-each'); -!Array.filter && require('core-js/fn/array/filter'); -!Array.from && require('core-js/fn/array/from'); +import 'core-js/fn/array/reduce'; +import 'core-js/fn/array/fill'; +import 'core-js/fn/array/map'; +import 'core-js/fn/array/for-each'; +import 'core-js/fn/array/filter'; import 'core-js/fn/set'; import {init} from './lib/init'; import { CMP_GLOBAL_NAME } from './lib/cmp'; diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 1cf019fa..212a3a7a 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -3,6 +3,7 @@ import config from './config'; import { encodeVendorConsentData } from './cookie/cookie'; +const arrayFrom = require('core-js/library/fn/array/from'); export const CMP_GLOBAL_NAME = '__cmp'; @@ -175,8 +176,8 @@ export default class Cmp { // Encode the persisted data return persistedVendorConsentData && encodeVendorConsentData({ ...persistedVendorConsentData, - selectedVendorIds: new Set(Array.from(selectedVendorIds).filter(id => allowedVendorIds.has(id))), - selectedPurposeIds: new Set(Array.from(selectedPurposeIds).filter(id => allowedPurposeIds.has(id))), + selectedVendorIds: new Set(arrayFrom(selectedVendorIds).filter(id => allowedVendorIds.has(id))), + selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds).filter(id => allowedPurposeIds.has(id))), vendorList }); }; diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index a970854c..8290892f 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -11,6 +11,7 @@ import { import { sendPortalCommand } from '../portal'; import pack from '../../../package.json'; import config from '../config'; +const arrayFrom = require('core-js/library/fn/array/from'); const PUBLISHER_CONSENT_COOKIE_NAME = 'pubconsent'; const PUBLISHER_CONSENT_COOKIE_MAX_AGE = 33696000; @@ -30,7 +31,7 @@ function encodeVendorIdsToBits(maxVendorId, selectedVendorIds = new Set()) { function encodePurposeIdsToBits(purposes, selectedPurposeIds = new Set()) { const maxPurposeId = Math.max(0, ...purposes.map(({id}) => id), - ...Array.from(selectedPurposeIds)); + ...arrayFrom(selectedPurposeIds)); let purposeString = ''; for (let id = 1; id <= maxPurposeId; id++) { purposeString += (selectedPurposeIds.has(id) ? '1' : '0'); diff --git a/src/lib/store.js b/src/lib/store.js index 4f4d1f12..b007344c 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -2,6 +2,7 @@ import { writePublisherConsentCookie, writeVendorConsentCookie, encodePublisherC import config from './config'; import { findLocale } from './localize'; import log from './log'; +const arrayFrom = require('core-js/library/fn/array/from'); /** * Copy a data object and make sure to replace references @@ -106,7 +107,7 @@ export default class Store { // vendor ID to map any consent data we already have const lastVendorId = Math.max(maxVendorId, ...vendors.map(({id}) => id), - ...Array.from(selectedVendorIds)); + ...arrayFrom(selectedVendorIds)); // Map all IDs up to the highest vendor ID found for (let i = 1; i <= lastVendorId; i++) { @@ -117,7 +118,7 @@ export default class Store { // Map all purpose IDs const lastPurposeId = Math.max( ...purposes.map(({id}) => id), - ...Array.from(selectedPurposeIds)); + ...arrayFrom(selectedPurposeIds)); const purposeMap = {}; for (let i = 1; i <= lastPurposeId; i++) { @@ -170,11 +171,11 @@ export default class Store { const lastStandardPurposeId = Math.max( ...purposes.map(({id}) => id), - ...Array.from(selectedPurposeIds)); + ...arrayFrom(selectedPurposeIds)); const lastCustomPurposeId = Math.max( ...customPurposes.map(({id}) => id), - ...Array.from(selectedPurposeIds)); + ...arrayFrom(selectedPurposeIds)); // Map all purpose IDs const standardPurposeMap = {}; @@ -374,7 +375,7 @@ export default class Store { // Find the maxVendorId out of the vendor list and selectedVendorIds this.vendorConsentData.maxVendorId = Math.max(maxVendorId, ...vendors.map(({id}) => id), - ...Array.from(selectedVendorIds)); + ...arrayFrom(selectedVendorIds)); this.vendorList = vendorList; this.storeUpdate(); }; From 26f4b032f9932c5dc610e9600cbbed4c1212238f Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Fri, 25 May 2018 10:46:32 +0200 Subject: [PATCH 056/540] accept all when click close button on intro view --- src/components/popup/intro/intro.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/popup/intro/intro.jsx b/src/components/popup/intro/intro.jsx index 0e5782f5..6eccba5a 100644 --- a/src/components/popup/intro/intro.jsx +++ b/src/components/popup/intro/intro.jsx @@ -19,14 +19,13 @@ export default class Intro extends Component { const { onAcceptAll, onShowPurposes, - onClose } = props; return (
Thanks for visiting From d9d0bd462b24c45806c17d7ead334616bdf71f07 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 25 May 2018 12:09:16 +0200 Subject: [PATCH 057/540] If vendor consent data has already been persisted set default selected status only for new vendors --- src/lib/store.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib/store.js b/src/lib/store.js index b007344c..5848c907 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -369,6 +369,15 @@ export default class Store { this.vendorConsentData.selectedPurposeIds = new Set(purposes.map(p => p.id)); this.vendorConsentData.selectedVendorIds = new Set(vendors.map(v => v.id)); } + // If vendor consent data has already been persisted set default selected status only for new vendors + else { + const {maxVendorId} = this.persistedVendorConsentData; + vendors.forEach(v => { + if (v.id > maxVendorId) { + this.vendorConsentData.selectedVendorIds.add(v.id); + } + }); + } const {selectedVendorIds = new Set()} = this.vendorConsentData; From 083608dcfcfb3d4efbb4e9aa46e6b0052f4338f2 Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Fri, 25 May 2018 16:13:29 +0200 Subject: [PATCH 058/540] Merge feature "allowedVendorIds" from master --- src/lib/cmp.js | 16 +++------- src/lib/config.js | 3 +- src/lib/cookie/cookie.test.js | 1 - src/lib/init.js | 35 +++++++++++++-------- src/lib/store.js | 58 +++++++++++++++++++++-------------- src/lib/store.test.js | 22 ++----------- src/lib/vendor.js | 23 ++++++++++---- src/lib/vendor.test.js | 36 +++++++++++++++++----- 8 files changed, 110 insertions(+), 84 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 212a3a7a..9d2c99ff 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -156,28 +156,20 @@ export default class Cmp { generateConsentString = () => { const { persistedVendorConsentData, - vendorList + vendorList, + allowedVendorIds } = this.store; - const { - vendors = [], - purposes = [] - } = vendorList || {}; - const { selectedVendorIds = new Set(), selectedPurposeIds = new Set() } = persistedVendorConsentData || {}; - // Filter consents by values that exist in the current vendorList - const allowedVendorIds = new Set(vendors.map(({id}) => id)); - const allowedPurposeIds = new Set(purposes.map(({id}) => id)); - // Encode the persisted data return persistedVendorConsentData && encodeVendorConsentData({ ...persistedVendorConsentData, - selectedVendorIds: new Set(arrayFrom(selectedVendorIds).filter(id => allowedVendorIds.has(id))), - selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds).filter(id => allowedPurposeIds.has(id))), + selectedVendorIds: new Set(arrayFrom(selectedVendorIds).filter(id => !allowedVendorIds.size || allowedVendorIds.has(id))), + selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)), vendorList }); }; diff --git a/src/lib/config.js b/src/lib/config.js index d33ce55b..77e30ebd 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -14,7 +14,8 @@ const defaultConfig = { setConsentData: null, legIntPurposeIds: [], purposeGroups: [], - autoDisplay: true + autoDisplay: true, + allowedVendorIds: null }; class Config { diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index 436f638f..144cb6b4 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -232,7 +232,6 @@ describe('cookie', () => { const maxVendorId = Math.max(...vendorList.vendors.map(vendor => vendor.id)); const ranges = convertVendorsToRanges(maxVendorId, new Set([2, 3, 5, 6, 10])); - console.log(ranges); expect(ranges).to.deep.equal([ { isRange: true, diff --git a/src/lib/init.js b/src/lib/init.js index 0574d9e4..cbeefe3e 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -3,7 +3,7 @@ import Promise from 'promise-polyfill'; import Store from './store'; import Cmp, { CMP_GLOBAL_NAME } from './cmp'; import { readVendorConsentCookie, readPublisherConsentCookie, decodeVendorConsentData, decodePublisherConsentData } from './cookie/cookie'; -import { fetchVendorList, fetchPurposeList } from './vendor'; +import { fetchPubVendorList, fetchGlobalVendorList, fetchPurposeList } from './vendor'; import log from './log'; import pack from '../../package.json'; import config from './config'; @@ -22,6 +22,7 @@ function readExternalConsentData(config) { try { resolve([ data.vendor && decodeVendorConsentData(data.vendor) || undefined, + undefined, data.publisher && decodePublisherConsentData(data.publisher) || undefined ]); } catch (err) { @@ -36,9 +37,11 @@ function readExternalConsentData(config) { } function readInternalConsentData() { - return readVendorConsentCookie().then(vendorConsentData => { - return [vendorConsentData, readPublisherConsentCookie()]; - }); + return Promise.all([ + readVendorConsentCookie(), + fetchPubVendorList(), + readPublisherConsentCookie() + ]); } export function init(configUpdates) { @@ -47,7 +50,13 @@ export function init(configUpdates) { // Fetch the current vendor consent before initializing return (config.getConsentData ? readExternalConsentData(config) : readInternalConsentData()) - .then(([vendorConsentData, publisherConsentData]) => { + .then(([vendorConsentData, pubVendorsList, publisherConsentData]) => { + const {vendors} = pubVendorsList || {}; + + // Check config for allowedVendorIds then the pubVendorList + const {allowedVendorIds: configVendorIds} = config; + const allowedVendorIds = configVendorIds instanceof Array && configVendorIds.length ? configVendorIds : + vendors && vendors.map(vendor => vendor.id); // Initialize the store with all of our consent data const store = new Store({ @@ -55,7 +64,9 @@ export function init(configUpdates) { cmpId: CMP_ID, cookieVersion: COOKIE_VERSION, vendorConsentData, - publisherConsentData + publisherConsentData, + pubVendorsList, + allowedVendorIds }); // Pull queued command from __cmp stub @@ -67,22 +78,22 @@ export function init(configUpdates) { // Expose `processCommand` as the CMP implementation window[CMP_GLOBAL_NAME] = cmp.processCommand; - // Render the UI - const App = require('../components/app').default; - render(, document.body); - // Notify listeners that the CMP is loaded log.debug(`Successfully loaded CMP version: ${pack.version}`); cmp.isLoaded = true; cmp.notify('isLoaded'); + // Render the UI + const App = require('../components/app').default; + render(, document.body); + // Execute any previously queued command cmp.commandQueue = commandQueue; cmp.processCommandQueue(); // Request lists return Promise.all([ - fetchVendorList().then(store.updateVendorList), + fetchGlobalVendorList().then(store.updateVendorList), fetchPurposeList().then(store.updateCustomPurposeList) ]).then(() => { cmp.cmpReady = true; @@ -95,5 +106,3 @@ export function init(configUpdates) { log.error('Failed to load CMP', err); }); } - - diff --git a/src/lib/store.js b/src/lib/store.js index 5848c907..0c53691e 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -29,7 +29,9 @@ export default class Store { vendorConsentData, publisherConsentData, vendorList, - customPurposeList + customPurposeList, + pubVendorsList, + allowedVendorIds } = {}) { // Keep track of data that has already been persisted this.persistedVendorConsentData = copyData(vendorConsentData); @@ -58,6 +60,8 @@ export default class Store { cmpId }); + this.pubVendorsList = pubVendorsList; + this.allowedVendorIds = new Set(allowedVendorIds); this.isConsentToolShowing = false; this.isFooterShowing = false; this.isDetailViewAsDefault = false; @@ -74,9 +78,16 @@ export default class Store { getVendorConsentsObject = (vendorIds) => { const { vendorList = {}, - persistedVendorConsentData = {} + persistedVendorConsentData = {}, + pubVendorsList = {}, + allowedVendorIds, } = this; + const { + publisherVendorsVersion, + globalVendorListVersion + } = pubVendorsList; + const { cookieVersion, created, @@ -93,14 +104,10 @@ export default class Store { const {purposes = [], vendors = []} = vendorList; - // No consent will be allowed for vendors or purposes not on the list - const allowedVendorIds = new Set(vendors.map(({id}) => id)); - const allowedPurposeIds = new Set(purposes.map(({id}) => id)); - // Map requested vendorIds const vendorMap = {}; if (vendorIds && vendorIds.length) { - vendorIds.forEach(id => vendorMap[id] = selectedVendorIds.has(id) && allowedVendorIds.has(id)); + vendorIds.forEach(id => vendorMap[id] = selectedVendorIds.has(id) && (!allowedVendorIds.size || allowedVendorIds.has(id))); } else { // In case the vendor list has not been loaded yet find the highest @@ -111,7 +118,7 @@ export default class Store { // Map all IDs up to the highest vendor ID found for (let i = 1; i <= lastVendorId; i++) { - vendorMap[i] = selectedVendorIds.has(i) && allowedVendorIds.has(i); + vendorMap[i] = selectedVendorIds.has(i) && (!allowedVendorIds.size || allowedVendorIds.has(i)); } } @@ -122,7 +129,7 @@ export default class Store { const purposeMap = {}; for (let i = 1; i <= lastPurposeId; i++) { - purposeMap[i] = selectedPurposeIds.has(i) && allowedPurposeIds.has(i); + purposeMap[i] = selectedPurposeIds.has(i); } return { @@ -133,6 +140,8 @@ export default class Store { cmpVersion, consentScreen, consentLanguage, + publisherVendorsVersion, + globalVendorListVersion, vendorListVersion, maxVendorId, purposeConsents: purposeMap, @@ -166,9 +175,6 @@ export default class Store { const {purposes = []} = vendorList; const {purposes: customPurposes = []} = customPurposeList; - // No consent will be allowed for purposes not on the list - const allowedPurposeIds = new Set(purposes.map(({id}) => id)); - const lastStandardPurposeId = Math.max( ...purposes.map(({id}) => id), ...arrayFrom(selectedPurposeIds)); @@ -180,7 +186,7 @@ export default class Store { // Map all purpose IDs const standardPurposeMap = {}; for (let i = 1; i <= lastStandardPurposeId; i++) { - standardPurposeMap[i] = selectedPurposeIds.has(i) && allowedPurposeIds.has(i); + standardPurposeMap[i] = selectedPurposeIds.has(i); } const customPurposeMap = {}; for (let i = 1; i <= lastCustomPurposeId; i++) { @@ -350,15 +356,30 @@ export default class Store { toogleDetailViewAsDefault = (isDefault) => { this.isDetailViewAsDefault = typeof isDefault === 'boolean' ? isDefault : !this.isDetailViewAsDefault; this.storeUpdate(); - } + }; updateVendorList = vendorList => { + const { + pubVendorsList = {}, + allowedVendorIds + } = this; const { created, maxVendorId = 0 } = this.vendorConsentData; + if (vendorList) { + // Filter vendors in vendorList by allowedVendorIds + if (vendorList.vendors && allowedVendorIds.size) { + vendorList.vendors = vendorList.vendors.filter(({id}) => allowedVendorIds.has(id)); + } + + // If a pubVendorList is applied make the vendor list version = 0 + const { publisherVendorsVersion } = pubVendorsList; + vendorList.vendorListVersion = publisherVendorsVersion ? 0 : vendorList.vendorListVersion; + } + const { vendors = [], purposes = [], @@ -369,15 +390,6 @@ export default class Store { this.vendorConsentData.selectedPurposeIds = new Set(purposes.map(p => p.id)); this.vendorConsentData.selectedVendorIds = new Set(vendors.map(v => v.id)); } - // If vendor consent data has already been persisted set default selected status only for new vendors - else { - const {maxVendorId} = this.persistedVendorConsentData; - vendors.forEach(v => { - if (v.id > maxVendorId) { - this.vendorConsentData.selectedVendorIds.add(v.id); - } - }); - } const {selectedVendorIds = new Set()} = this.vendorConsentData; diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 932c3a5a..1e3bd329 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -61,9 +61,6 @@ describe('store', () => { expect(store.isConsentToolShowing).to.equal(false); - expect(store.vendorList).to.be.undefined; - expect(store.customPurposeList).to.be.undefined; - expect(store.vendorConsentData.cookieVersion).to.equal(1); expect(store.vendorConsentData.cmpId).to.equal(1); @@ -122,9 +119,10 @@ describe('store', () => { expect(vendorObject.purposeConsents['4']).to.be.true; }); - it('returns consent=false for vendors that are not in the vendorList', () => { + it('returns consent=false for vendors that are not in the allowedVendors', () => { const store = new Store({ vendorList, + allowedVendorIds: [1,2,3,4,5,6], vendorConsentData: { selectedVendorIds: new Set([4, 5, 7, 8]), selectedPurposeIds: new Set([1, 4]) @@ -141,22 +139,6 @@ describe('store', () => { expect(vendorObject.vendorConsents['8']).to.be.false; }); - it('returns consent=false for purposes that are not in the vendorList', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - selectedPurposeIds: new Set([1, 4, 9, 10]) - } - }); - - const vendorObject = store.getVendorConsentsObject(); - - expect(vendorObject.purposeConsents['1']).to.be.true; - expect(vendorObject.purposeConsents['4']).to.be.true; - expect(vendorObject.purposeConsents['9']).to.be.false; - expect(vendorObject.purposeConsents['10']).to.be.false; - }); - it('selects vendor IDs', () => { const store = new Store({ vendorList, diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 5bc116cb..528cd288 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -4,11 +4,21 @@ import config from './config'; import log from './log'; import { sendPortalCommand } from './portal'; +const PUB_VENDOR_LOCATION = '/.well-known/pubvendors.json'; + +/** + * Fetch the pubvendors.json from the local domain + */ +function fetchPubVendorList() { + return fetch(PUB_VENDOR_LOCATION) + .then(res => res.json()) + .catch(() => {}); +} + /** - * Attempt to load the vendors list from the global location and - * fallback to portal location. + * Fetch the global vendor list if the location is configured */ -function fetchVendorList() { +function fetchGlobalVendorList() { const {globalVendorListLocation, storeConsentGlobally, globalConsentLocation} = config; return (globalVendorListLocation ? fetch(globalVendorListLocation) : @@ -18,7 +28,7 @@ function fetchVendorList() { if (storeConsentGlobally && globalConsentLocation) { return sendPortalCommand({command: 'readVendorList'}); } - log.error(`Failed to load vendor list from ${globalVendorListLocation}`, err); + log.error(`Failed to load global vendor list from ${globalVendorListLocation}`, err); }); } @@ -35,6 +45,7 @@ function fetchPurposeList() { } export { - fetchVendorList, - fetchPurposeList, + fetchGlobalVendorList, + fetchPubVendorList, + fetchPurposeList }; diff --git a/src/lib/vendor.test.js b/src/lib/vendor.test.js index 6333c8bb..baa6f9b3 100644 --- a/src/lib/vendor.test.js +++ b/src/lib/vendor.test.js @@ -7,7 +7,7 @@ import config from './config'; jest.mock('./portal'); const mockPortal = require('./portal'); -import { fetchVendorList, fetchPurposeList } from './vendor'; +import { fetchPubVendorList, fetchGlobalVendorList, fetchPurposeList } from './vendor'; describe('vendor', () => { @@ -16,18 +16,38 @@ describe('vendor', () => { window.fetch = jest.fn().mockImplementation(() => Promise.resolve({json: () => {}})); }); - it('fetchVendorList sends a portal command', (done) => { + + it('fetchPubVendorList fetches from `.well-known` URL', (done) => { + + fetchPubVendorList().then(() => { + expect(window.fetch.mock.calls[0][0]).to.equal('/.well-known/pubvendors.json'); + done(); + }); + }); + + it('fetchGlobalVendorList fetches from configured globalVendorListLocation', (done) => { config.update({ + globalVendorListLocation: 'globalpath.json', storeConsentGlobally: true }); - window.fetch = jest.fn().mockImplementation(() => Promise.reject()); - fetchVendorList() - .then(() => { - expect(mockPortal.sendPortalCommand.mock.calls[0][0]).to.deep.equal({ command: 'readVendorList' }); - done(); - }); + + fetchGlobalVendorList().then(() => { + expect(window.fetch.mock.calls[0][0]).to.equal('globalpath.json'); + done(); + }); }); + it('fetchGlobalVendorList returns nothing if globalVendorListLocation is empty', (done) => { + config.update({ + globalVendorListLocation: null, + storeConsentGlobally: true + }); + + fetchGlobalVendorList().then(() => { + expect(window.fetch.mock.calls).to.be.empty; + done(); + }); + }); it('fetchPurposeList returns nothing if there is no customPurposeListLocation', (done) => { config.update({ From 6a0c0acb47f82ede761162ad40f5af161dc97db5 Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Tue, 29 May 2018 09:42:52 +0200 Subject: [PATCH 059/540] Update metadata field for getPublisherConsents --- src/lib/cmp.js | 17 +++++++++++++++-- src/lib/store.js | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 9d2c99ff..31f097bd 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -1,7 +1,8 @@ import log from './log'; import config from './config'; import { - encodeVendorConsentData + encodeVendorConsentData, + encodePublisherConsentData } from './cookie/cookie'; const arrayFrom = require('core-js/library/fn/array/from'); @@ -23,8 +24,20 @@ export default class Cmp { * Get all publisher consent data from the data store. */ getPublisherConsents: (purposeIds, callback = () => {}) => { + const { + persistedPublisherConsentData, + persistedVendorConsentData, + vendorList, + customPurposeList + } = this.store; + const consent = { - metadata: this.generateConsentString(), + metadata: encodePublisherConsentData({ + ...persistedPublisherConsentData, + ...persistedVendorConsentData, + vendorList, + customPurposeList + }), gdprApplies: config.gdprApplies, hasGlobalScope: config.storeConsentGlobally, ...this.store.getPublisherConsentsObject() diff --git a/src/lib/store.js b/src/lib/store.js index 0c53691e..9ed06d8f 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -229,13 +229,15 @@ export default class Store { // Update version of list to one we are using vendorConsentData.vendorListVersion = vendorListVersion; + publisherConsentData.vendorListVersion = vendorListVersion; publisherConsentData.created = publisherConsentData.created || now; publisherConsentData.lastUpdated = now; const vendorConsents = {...vendorConsentData, vendorList}; const publisherConsents = { - ...vendorConsentData, ...publisherConsentData, + ...vendorConsentData, + ...publisherConsentData, vendorList, customPurposeList }; From 502b49c70009ccb6afb70a6109b00696cc5384cf Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 4 Jun 2018 17:11:22 +0200 Subject: [PATCH 060/540] Expose new event in CMP API: "onToggleConsentToolShowing" --- src/complete.js | 2 +- src/lib/init.js | 8 ++++++++ src/lib/store.js | 1 - 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/complete.js b/src/complete.js index fa728f58..4d2995ce 100644 --- a/src/complete.js +++ b/src/complete.js @@ -72,7 +72,7 @@ function addLocatorFrame() { addLocatorFrame(); // Add stub -const commandQueue = []; +const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; const cmp = function (command, parameter, callback) { commandQueue.push({ command, diff --git a/src/lib/init.js b/src/lib/init.js index 168b9c05..a3dbabdf 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -80,6 +80,14 @@ export function init(configUpdates) { cmp.commandQueue = commandQueue; cmp.processCommandQueue(); + let isConsentToolShowing = store.isConsentToolShowing; + store.subscribe(store => { + if (store.isConsentToolShowing != isConsentToolShowing) { + isConsentToolShowing = store.isConsentToolShowing; + cmp.notify('onToggleConsentToolShowing', isConsentToolShowing); + } + }); + // Request lists return Promise.all([ fetchVendorList().then(store.updateVendorList), diff --git a/src/lib/store.js b/src/lib/store.js index 6070b380..5fedbb0c 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -337,7 +337,6 @@ export default class Store { toggleConsentToolShowing = (isShown) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; - this.isConsentToolShowing === true ? document.body.classList.add('cmp') : document.body.classList.remove('cmp'); this.isFooterShowing = false; this.storeUpdate(); }; From 0f03d9f37bfe47589caeeea273ca26d57686d682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Thu, 7 Jun 2018 09:24:00 +0200 Subject: [PATCH 061/540] clicking on footer directs to intro section even before refresh --- src/lib/store.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/store.js b/src/lib/store.js index 8cff1c5b..93b7c24b 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -339,6 +339,7 @@ export default class Store { toggleConsentToolShowing = (isShown) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; + this.isDetailViewAsDefault = false; this.isFooterShowing = false; this.storeUpdate(); }; @@ -353,6 +354,7 @@ export default class Store { } this.isFooterShowing = typeof isShown === 'boolean' ? isShown : !this.isFooterShowing; this.isConsentToolShowing = false; + this.isDetailViewAsDefault = true; this.storeUpdate(); }; From bfd7265a69c6f75820310d3c44a76ca75b97e19d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Thu, 7 Jun 2018 09:52:47 +0200 Subject: [PATCH 062/540] removed unnecessary check for purposes --- src/lib/store.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 93b7c24b..a163bebf 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -346,10 +346,7 @@ export default class Store { toggleFooterShowing = (isShown) => { const vendorConsents = this.getVendorConsentsObject(); - const publisherConsents = this.getPublisherConsentsObject(); - if (this.isAllSetTrue(vendorConsents.purposeConsents) && - this.isAllSetTrue(vendorConsents.vendorConsents) && - this.isAllSetTrue(publisherConsents.standardPurposes)) { + if (this.isAllSetTrue(vendorConsents.purposeConsents) && this.isAllSetTrue(vendorConsents.vendorConsents)) { isShown = false; } this.isFooterShowing = typeof isShown === 'boolean' ? isShown : !this.isFooterShowing; From 8587e639dbe70769df0f5df4d430429f9f1f14a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Thu, 7 Jun 2018 14:36:01 +0200 Subject: [PATCH 063/540] fixes --- src/lib/cookie/cookie.test.js | 1 - src/lib/init.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index 436f638f..144cb6b4 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -232,7 +232,6 @@ describe('cookie', () => { const maxVendorId = Math.max(...vendorList.vendors.map(vendor => vendor.id)); const ranges = convertVendorsToRanges(maxVendorId, new Set([2, 3, 5, 6, 10])); - console.log(ranges); expect(ranges).to.deep.equal([ { isRange: true, diff --git a/src/lib/init.js b/src/lib/init.js index 017c32b2..85e944b4 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -82,7 +82,7 @@ export function init(configUpdates) { let isConsentToolShowing = store.isConsentToolShowing; store.subscribe(store => { - if (store.isConsentToolShowing != isConsentToolShowing) { + if (store.isConsentToolShowing !== isConsentToolShowing) { isConsentToolShowing = store.isConsentToolShowing; cmp.notify('onToggleConsentToolShowing', isConsentToolShowing); } From d39547b05d509e55e554313ba592ef99e61f9daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Fri, 8 Jun 2018 08:53:34 +0200 Subject: [PATCH 064/540] IE11 fix, showConsentDetailView fix --- src/components/footer/footer.jsx | 2 +- src/lib/store.js | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/footer/footer.jsx b/src/components/footer/footer.jsx index efa0f1c4..10f55082 100644 --- a/src/components/footer/footer.jsx +++ b/src/components/footer/footer.jsx @@ -24,7 +24,7 @@ export default class Footer extends Component { handleShowConsent = () => { const { store } = this.props; const { toggleConsentToolShowing } = store; - toggleConsentToolShowing(true); + toggleConsentToolShowing(true, true); }; render(props) { diff --git a/src/lib/store.js b/src/lib/store.js index a163bebf..bcb27e73 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -66,7 +66,7 @@ export default class Store { this.updateCustomPurposeList(customPurposeList); } - isAllSetTrue = obj => Object.values(obj).every((value) => value === true); + isAllSetTrue = obj => Object.keys(obj).map(key => obj[key]).every((value) => value === true); /** * Build vendor consent object from data that has already been persisted. This @@ -337,9 +337,11 @@ export default class Store { this.storeUpdate(); }; - toggleConsentToolShowing = (isShown) => { + toggleConsentToolShowing = (isShown, sectionIntro) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; - this.isDetailViewAsDefault = false; + if (sectionIntro) { + this.isDetailViewAsDefault = false; + } this.isFooterShowing = false; this.storeUpdate(); }; @@ -358,7 +360,7 @@ export default class Store { toogleDetailViewAsDefault = (isDefault) => { this.isDetailViewAsDefault = typeof isDefault === 'boolean' ? isDefault : !this.isDetailViewAsDefault; this.storeUpdate(); - } + }; updateVendorList = vendorList => { From 76ba296892a4384728a383278fce25f3d340453c Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 8 Jun 2018 23:44:30 +0200 Subject: [PATCH 065/540] Avoid using global polyfills --- src/lib/vendor.js | 20 +++++++++++++++++++- src/lib/vendor.test.js | 21 ++++++++++++++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 5bc116cb..43111645 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -1,9 +1,27 @@ import Promise from 'promise-polyfill'; -import 'whatwg-fetch'; import config from './config'; import log from './log'; import { sendPortalCommand } from './portal'; +function fetch(url) { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.onload = () => { + resolve({ + json: () => JSON.parse(xhr.responseText) + }); + }; + xhr.onerror = () => { + reject(new TypeError('Network request failed')); + }; + xhr.ontimeout = () => { + reject(new TypeError('Network request failed')); + }; + xhr.open('GET', url, true); + xhr.send(null); + }); +} + /** * Attempt to load the vendors list from the global location and * fallback to portal location. diff --git a/src/lib/vendor.test.js b/src/lib/vendor.test.js index 6333c8bb..ef3cba25 100644 --- a/src/lib/vendor.test.js +++ b/src/lib/vendor.test.js @@ -11,16 +11,27 @@ import { fetchVendorList, fetchPurposeList } from './vendor'; describe('vendor', () => { + let xhr; + beforeEach(() => { mockPortal.sendPortalCommand = jest.fn().mockImplementation(() => Promise.resolve()); - window.fetch = jest.fn().mockImplementation(() => Promise.resolve({json: () => {}})); + xhr = { + responseText: '{}', + open: jest.fn(), + send: () => { + this.onload(); + } + }; + window.XMLHttpRequest = jest.fn(() => xhr); }); it('fetchVendorList sends a portal command', (done) => { config.update({ storeConsentGlobally: true }); - window.fetch = jest.fn().mockImplementation(() => Promise.reject()); + xhr.send = () => { + this.onerror(); + }; fetchVendorList() .then(() => { expect(mockPortal.sendPortalCommand.mock.calls[0][0]).to.deep.equal({ command: 'readVendorList' }); @@ -35,7 +46,7 @@ describe('vendor', () => { }); fetchPurposeList().then(() => { - expect(window.fetch.mock.calls).to.be.empty; + expect(window.XMLHttpRequest.mock.calls).to.be.empty; done(); }); }); @@ -46,7 +57,7 @@ describe('vendor', () => { }); fetchPurposeList().then(() => { - expect(window.fetch.mock.calls).to.be.empty; + expect(window.XMLHttpRequest.mock.calls).to.be.empty; done(); }); }); @@ -58,7 +69,7 @@ describe('vendor', () => { }); fetchPurposeList().then(() => { - expect(window.fetch.mock.calls[0][0]).to.equal('somepath.json'); + expect(xhr.open.mock.calls[0][0]).to.equal('GET', 'somepath.json', true); done(); }); }); From 9c2287c0674072d2963ed8d9e9af546dfc5c3e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Mon, 11 Jun 2018 14:36:28 +0200 Subject: [PATCH 066/540] better handling of changing section --- src/components/footer/footer.jsx | 2 +- src/components/popup/details/details.jsx | 7 +++---- src/components/popup/popup.jsx | 9 ++++----- src/lib/store.js | 6 +----- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/components/footer/footer.jsx b/src/components/footer/footer.jsx index 10f55082..efa0f1c4 100644 --- a/src/components/footer/footer.jsx +++ b/src/components/footer/footer.jsx @@ -24,7 +24,7 @@ export default class Footer extends Component { handleShowConsent = () => { const { store } = this.props; const { toggleConsentToolShowing } = store; - toggleConsentToolShowing(true, true); + toggleConsentToolShowing(true); }; render(props) { diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index aeae0902..38a2d5e1 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -41,8 +41,7 @@ export default class Details extends Component { render(props, state) { const { onCancel, - onSave, - onClose, + onSaveOrClose, store } = props; const { selectedPanelIndex } = state; @@ -67,7 +66,7 @@ export default class Details extends Component {
User Privacy Preferences @@ -93,7 +92,7 @@ export default class Details extends Component {
Back - +
); diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index f0466113..2e3e56d4 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -43,10 +43,10 @@ export default class Popup extends Component { }); }; - handleClose = () => { + handleCloseOrSave = () => { const { store, onSave } = this.props; onSave(); - store.toggleFooterShowing(true); + this.onCancel() }; render(props, state) { @@ -67,13 +67,12 @@ export default class Popup extends Component {
+ />
diff --git a/src/lib/store.js b/src/lib/store.js index bcb27e73..a6ccca03 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -337,11 +337,8 @@ export default class Store { this.storeUpdate(); }; - toggleConsentToolShowing = (isShown, sectionIntro) => { + toggleConsentToolShowing = (isShown) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; - if (sectionIntro) { - this.isDetailViewAsDefault = false; - } this.isFooterShowing = false; this.storeUpdate(); }; @@ -353,7 +350,6 @@ export default class Store { } this.isFooterShowing = typeof isShown === 'boolean' ? isShown : !this.isFooterShowing; this.isConsentToolShowing = false; - this.isDetailViewAsDefault = true; this.storeUpdate(); }; From a73f04480f22a53045ddd9e940449d46ca64ef71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Wed, 13 Jun 2018 08:43:47 +0200 Subject: [PATCH 067/540] fix in tests --- src/lib/vendor.js | 5 ++++- src/lib/vendor.test.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index ffa7b902..51186f6c 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -3,6 +3,10 @@ import config from './config'; import log from './log'; import { sendPortalCommand } from './portal'; + +const PUB_VENDOR_LOCATION = '/.well-known/pubvendors.json'; + + function fetch(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); @@ -22,7 +26,6 @@ function fetch(url) { }); } -const PUB_VENDOR_LOCATION = '/.well-known/pubvendors.json'; /** * Fetch the pubvendors.json from the local domain diff --git a/src/lib/vendor.test.js b/src/lib/vendor.test.js index 431230e3..768ea176 100644 --- a/src/lib/vendor.test.js +++ b/src/lib/vendor.test.js @@ -29,7 +29,7 @@ describe('vendor', () => { it('fetchPubVendorList fetches from `.well-known` URL', (done) => { fetchPubVendorList().then(() => { - expect(window.fetch.mock.calls[0][0]).to.equal('/.well-known/pubvendors.json'); + expect(xhr.open.mock.calls[0][1]).to.equal('/.well-known/pubvendors.json'); done(); }); }); @@ -41,7 +41,7 @@ describe('vendor', () => { }); fetchGlobalVendorList().then(() => { - expect(window.fetch.mock.calls[0][0]).to.equal('globalpath.json'); + expect(xhr.open.mock.calls[0][1]).to.equal('globalpath.json'); done(); }); }); From 8dae738b8dd34cc482fd78284e7d24b0f915284e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Wed, 13 Jun 2018 14:30:05 +0200 Subject: [PATCH 068/540] new vednors selected after refresh of vendor list --- src/lib/store.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lib/store.js b/src/lib/store.js index 3327830e..3594a48d 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -399,6 +399,17 @@ export default class Store { this.vendorConsentData.selectedVendorIds = new Set(vendors.map(v => v.id)); } + // If vendor consent data has already been persisted set default selected status only for new vendors + else { + const {maxVendorId} = this.persistedVendorConsentData; + vendors.forEach(v => { + if (v.id > maxVendorId) { + this.vendorConsentData.selectedVendorIds.add(v.id); + } + }); + } + + const {selectedVendorIds = new Set()} = this.vendorConsentData; // Find the maxVendorId out of the vendor list and selectedVendorIds From f60fa05a56dd90e9d7eb007481e37f6c6f566129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Wed, 13 Jun 2018 15:11:07 +0200 Subject: [PATCH 069/540] variable rename --- src/lib/store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 3594a48d..49e4a40b 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -401,9 +401,9 @@ export default class Store { // If vendor consent data has already been persisted set default selected status only for new vendors else { - const {maxVendorId} = this.persistedVendorConsentData; + const {persistedMaxVendorId} = this.persistedVendorConsentData; vendors.forEach(v => { - if (v.id > maxVendorId) { + if (v.id > persistedMaxVendorId) { this.vendorConsentData.selectedVendorIds.add(v.id); } }); From 52d5d8aff1187cb8a8b401c3c4b5788824f52596 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Fri, 15 Jun 2018 13:36:55 +0200 Subject: [PATCH 070/540] during intialization cmp-board: check autodisplay before show footer --- src/complete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/complete.js b/src/complete.js index a9da370c..a1503116 100644 --- a/src/complete.js +++ b/src/complete.js @@ -23,7 +23,7 @@ function handleConsentResult(cmp, {vendorListVersion: listVersion} = {}, {create } else { log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); - cmp('showFooter'); + configuration.autoDisplay && cmp('showFooter'); } } From 71145f05caa1569c6914b96501d48413a4a06af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Tue, 19 Jun 2018 11:16:22 +0200 Subject: [PATCH 071/540] footer not showing if earlier call to showConsentTool was made --- src/complete.js | 12 ++++++------ src/lib/init.js | 6 ++++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/complete.js b/src/complete.js index a1503116..4ff451c0 100644 --- a/src/complete.js +++ b/src/complete.js @@ -9,7 +9,7 @@ import { init } from './lib/init'; import { CMP_GLOBAL_NAME } from "./lib/cmp"; import configuration from "./lib/config"; -function handleConsentResult(cmp, {vendorListVersion: listVersion} = {}, {created, vendorListVersion} = {}) { +function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion} = {}, {created, vendorListVersion} = {}) { if (!created) { log.debug('No consent data found. Showing consent tool'); configuration.autoDisplay && cmp('showConsentTool'); @@ -23,11 +23,11 @@ function handleConsentResult(cmp, {vendorListVersion: listVersion} = {}, {create } else { log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); - configuration.autoDisplay && cmp('showFooter'); + !isConsentToolShowing && configuration.autoDisplay && cmp('showFooter'); } } -function checkConsent(cmp) { +function checkConsent(cmp, store) { if (!cmp) { log.error('CMP failed to load'); } @@ -37,12 +37,12 @@ function checkConsent(cmp) { else { cmp('getVendorList', null, vendorList => { const timeout = setTimeout(() => { - handleConsentResult(cmp, vendorList); + handleConsentResult(cmp, store, vendorList); }, 100); cmp('getVendorConsents', null, vendorConsents => { clearTimeout(timeout); - handleConsentResult(cmp, vendorList, vendorConsents); + handleConsentResult(cmp, store, vendorList, vendorConsents); }); }); } @@ -104,4 +104,4 @@ listen('message', event => { }, false); // Initialize CMP and then check if we need to ask for consent -init(configUpdates).then(() => checkConsent(window.__cmp)); +init(configUpdates).then((store) => checkConsent(window.__cmp, store)); diff --git a/src/lib/init.js b/src/lib/init.js index 2eb9d6b3..4a4899ac 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -102,10 +102,12 @@ export function init(configUpdates) { // Request lists return Promise.all([ fetchGlobalVendorList().then(store.updateVendorList), - fetchPurposeList().then(store.updateCustomPurposeList) - ]).then(() => { + fetchPurposeList().then(store.updateCustomPurposeList), + store + ]).then((store) => { cmp.cmpReady = true; cmp.notify('cmpReady'); + return store[2]; }).catch(err => { log.error('Failed to load lists. CMP not ready', err); }); From a23fee6e6e4dc7b70a93ac93062b0565867ab5a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Tue, 19 Jun 2018 12:52:36 +0200 Subject: [PATCH 072/540] variable rename --- src/lib/init.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 4a4899ac..c5611ee1 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -101,13 +101,13 @@ export function init(configUpdates) { // Request lists return Promise.all([ + store, fetchGlobalVendorList().then(store.updateVendorList), fetchPurposeList().then(store.updateCustomPurposeList), - store - ]).then((store) => { + ]).then((params) => { cmp.cmpReady = true; cmp.notify('cmpReady'); - return store[2]; + return params[0]; }).catch(err => { log.error('Failed to load lists. CMP not ready', err); }); From a2385c31f7097b2f905fdf750d99c69e0a707706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Tue, 19 Jun 2018 12:54:53 +0200 Subject: [PATCH 073/540] remove coma --- src/lib/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/init.js b/src/lib/init.js index c5611ee1..463101b4 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -103,7 +103,7 @@ export function init(configUpdates) { return Promise.all([ store, fetchGlobalVendorList().then(store.updateVendorList), - fetchPurposeList().then(store.updateCustomPurposeList), + fetchPurposeList().then(store.updateCustomPurposeList) ]).then((params) => { cmp.cmpReady = true; cmp.notify('cmpReady'); From 8526ea57cdc09586a3f7d2f01136b6971a5a2525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Tue, 19 Jun 2018 16:30:57 +0200 Subject: [PATCH 074/540] fix variable maxVendorId, added test --- src/lib/store.js | 4 ++-- src/lib/store.test.js | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 49e4a40b..3594a48d 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -401,9 +401,9 @@ export default class Store { // If vendor consent data has already been persisted set default selected status only for new vendors else { - const {persistedMaxVendorId} = this.persistedVendorConsentData; + const {maxVendorId} = this.persistedVendorConsentData; vendors.forEach(v => { - if (v.id > persistedMaxVendorId) { + if (v.id > maxVendorId) { this.vendorConsentData.selectedVendorIds.add(v.id); } }); diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 1e3bd329..58374b16 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -99,6 +99,20 @@ describe('store', () => { expect(store.vendorConsentData.selectedPurposeIds).to.deep.equal(selectedPurposeIds); }); + it('initializes with new vendor list', () => { + const expected = new Set(vendorList.vendors.map(v => v.id)); + const selectedVendorIds = new Set([1, 2]); + const store = new Store({ + vendorConsentData: { + created: new Date(), + selectedVendorIds, + maxVendorId:2 + } + }); + store.updateVendorList(vendorList); + expect(store.vendorConsentData.selectedVendorIds).to.deep.equal(expected); + }); + it('build correct vendor consents object', () => { const store = new Store({ vendorList, From 3cb97dc74db240b8cfe8fe36b72c8800bb038ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Wed, 20 Jun 2018 08:45:12 +0200 Subject: [PATCH 075/540] remove declaration of variable maxVendorId --- src/lib/store.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 3594a48d..9e5add97 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -401,9 +401,8 @@ export default class Store { // If vendor consent data has already been persisted set default selected status only for new vendors else { - const {maxVendorId} = this.persistedVendorConsentData; vendors.forEach(v => { - if (v.id > maxVendorId) { + if (v.id > this.persistedVendorConsentData.maxVendorId) { this.vendorConsentData.selectedVendorIds.add(v.id); } }); From d3d6d07fec47b7750ffd0769debaa714c3feaafd Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Thu, 21 Jun 2018 16:39:55 +0200 Subject: [PATCH 076/540] added try..catch block --- src/lib/cmp.js | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 6a6c3cae..64950bfd 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -201,19 +201,24 @@ export default class Cmp { log.info(`Process ${queue.length} queued commands`); this.commandQueue = []; queue.forEach(({callId, command, parameter, callback, event}) => { - // If command is queued with an event we will relay its result via postMessage - if (event) { - this.processCommand(command, parameter, returnValue => - event.source.postMessage({ - __cmpReturn: { - callId, - command, - returnValue - } - }, event.origin)); - } - else { - this.processCommand(command, parameter, callback); + try { + // If command is queued with an event we will relay its result via postMessage + if (event) { + this.processCommand(command, parameter, returnValue => + event.source.postMessage({ + __cmpReturn: { + callId, + command, + returnValue + } + }, event.origin)); + } + else { + this.processCommand(command, parameter, callback); + } + } catch (err) { + log.error(`Invalid commandQueue element ${err}`); + return; } }); } From 6a1aa3782ab782a027f09fbe7bdf7ec5302a5831 Mon Sep 17 00:00:00 2001 From: Artur Szydlo Date: Fri, 22 Jun 2018 08:44:54 +0200 Subject: [PATCH 077/540] added try..catch to notify prototype --- src/lib/cmp.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 64950bfd..e31cc6aa 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -218,7 +218,6 @@ export default class Cmp { } } catch (err) { log.error(`Invalid commandQueue element ${err}`); - return; } }); } @@ -274,7 +273,11 @@ export default class Cmp { log.info(`Notify event: ${event}`); const eventSet = this.eventListeners[event] || new Set(); eventSet.forEach(listener => { - listener({event, data}); + try { + listener({event, data}); + } catch (err) { + log.error(err); + } }); // Process any queued commands that were waiting for consent data From 252c9c1f0bfc2228ab896dfd28c66d2aa69879b9 Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Mon, 25 Jun 2018 09:07:41 +0200 Subject: [PATCH 078/540] New command "getConsentString" --- src/lib/cmp.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 6a6c3cae..9b54ead4 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -60,6 +60,15 @@ export default class Cmp { callback(consent, true); }, + /** + * Get the consent string value. + */ + getConsentString: (params = {}, callback = () => {}) => { + const consent = this.generateConsentString(params); + + callback(consent, !!consent); + }, + /** * Get the encoded vendor consent data value. */ @@ -174,7 +183,7 @@ export default class Cmp { } }; - generateConsentString = () => { + generateConsentString = (data = {}) => { const { persistedVendorConsentData, vendorList, @@ -184,14 +193,18 @@ export default class Cmp { const { selectedVendorIds = new Set(), selectedPurposeIds = new Set() - } = persistedVendorConsentData || {}; + } = { + ...persistedVendorConsentData, + ...data + }; // Encode the persisted data return persistedVendorConsentData && encodeVendorConsentData({ ...persistedVendorConsentData, + vendorList, + ...data, selectedVendorIds: new Set(arrayFrom(selectedVendorIds).filter(id => !allowedVendorIds.size || allowedVendorIds.has(id))), selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)), - vendorList }); }; From ec4868034701c301a15e09ba2fa5ba95de7d17a4 Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Thu, 28 Jun 2018 09:29:03 +0200 Subject: [PATCH 079/540] New command "getConsentFields" (ADRODO-77) --- src/lib/cmp.js | 33 ++++++++++++++++++++++++++------- src/lib/store.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 9b54ead4..ff7c0cdf 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -63,10 +63,22 @@ export default class Cmp { /** * Get the consent string value. */ - getConsentString: (params = {}, callback = () => {}) => { - const consent = this.generateConsentString(params); + getConsentFields: (params = {}, callback = () => {}) => { + const data = this.store.getConsentFieldsObject(); + const now = new Date(); + const consent = { + metadata: this.generateConsentString({ + created: now, + lastUpdated: now, + ...data, + ...params + }), + gdprApplies: config.gdprApplies, + hasGlobalScope: config.storeConsentGlobally, + ...data + }; - callback(consent, !!consent); + callback(consent, true); }, /** @@ -198,14 +210,21 @@ export default class Cmp { ...data }; - // Encode the persisted data - return persistedVendorConsentData && encodeVendorConsentData({ + const consentData = { ...persistedVendorConsentData, vendorList, ...data, selectedVendorIds: new Set(arrayFrom(selectedVendorIds).filter(id => !allowedVendorIds.size || allowedVendorIds.has(id))), - selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)), - }); + selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)) + }; + + const valid = (data = {}) => [ + 'cmpId', 'cmpVersion', 'consentLanguage', 'consentScreen', 'cookieVersion', 'created', 'lastUpdated', + 'maxVendorId', 'selectedPurposeIds', 'selectedVendorIds', 'vendorListVersion' + ].every(prop => data.hasOwnProperty(prop)); + + // Encode the persisted data + return valid(consentData) ? encodeVendorConsentData(consentData) : undefined; }; processCommandQueue = () => { diff --git a/src/lib/store.js b/src/lib/store.js index 49e4a40b..f82806ca 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -207,6 +207,41 @@ export default class Store { }; }; + /** + * Build consent fields object from data that has already been persisted. + */ + getConsentFieldsObject = () => { + const now = new Date(); + const { + persistedVendorConsentData = {}, + vendorConsentData = {} + } = this; + const { + cmpId, + cmpVersion, + consentLanguage, + consentScreen = 0, + cookieVersion, + created, + globalVendorListVersion, + lastUpdated, + publisherVendorsVersion + } = { + ...vendorConsentData, + ...persistedVendorConsentData + }; + return { + cmpId, + cmpVersion, + consentLanguage, + consentScreen, + cookieVersion, + created, + globalVendorListVersion, + lastUpdated, + publisherVendorsVersion + }; + }; /** * Persist all consent data to the cookie. This data will NOT be filtered * by the vendorList and will include global consents set no matter what From 31bad0bf67ac9cd30adccc6673f026efe129af24 Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Thu, 28 Jun 2018 09:31:31 +0200 Subject: [PATCH 080/540] New command "getConsentFields" (ADRODO-77) --- src/lib/store.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/store.js b/src/lib/store.js index a7590fab..9959af73 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -211,7 +211,6 @@ export default class Store { * Build consent fields object from data that has already been persisted. */ getConsentFieldsObject = () => { - const now = new Date(); const { persistedVendorConsentData = {}, vendorConsentData = {} From b473750e97fd6d54b76371623f317297e51da72e Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Thu, 28 Jun 2018 10:13:20 +0200 Subject: [PATCH 081/540] New command "getConsentFields" (ADRODO-77) --- src/lib/cmp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index e13aa66e..8fcebe35 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -224,7 +224,7 @@ export default class Cmp { ].every(prop => data.hasOwnProperty(prop)); // Encode the persisted data - return valid(consentData) ? encodeVendorConsentData(consentData) : undefined; + return persistedVendorConsentData || valid(consentData) ? encodeVendorConsentData(consentData) : undefined; }; processCommandQueue = () => { From 4ffa3c45d570f3f87bb91e9539ad602ccd85b457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Wed, 18 Jul 2018 14:14:01 +0200 Subject: [PATCH 082/540] unchecked purposes --- src/components/popup/details/details.jsx | 1 + .../popup/details/purposes/purposes.jsx | 17 +++++++++++++++-- .../popup/details/purposes/purposes.test.js | 8 +++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 38a2d5e1..856e1b21 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -81,6 +81,7 @@ export default class Details extends Component { selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} onShowVendors={this.handleShowVendors} + store = {store} /> selectedPurpose.custom ? selectedCustomPurposeIds.has(id) : selectedPurposeIds.has(id) ); diff --git a/src/components/popup/details/purposes/purposes.test.js b/src/components/popup/details/purposes/purposes.test.js index 3b371007..6a4db44f 100644 --- a/src/components/popup/details/purposes/purposes.test.js +++ b/src/components/popup/details/purposes/purposes.test.js @@ -13,6 +13,8 @@ describe('Purposes', () => { }); it('should render links for vendors and all standard and custom purposes', () => { + let store = {}; + const purposes = render( { customPurposes={[ { id: 1, name: 'Custom Purpose 1' }, ]} + store={store} />, scratch); const purposeLinks = purposes.querySelectorAll(`.${style.purposeItem}`); @@ -30,7 +33,7 @@ describe('Purposes', () => { it('should select a standard purpose', () => { const selectPurpose = jest.fn(); const selectCustomPurpose = jest.fn(); - + let store = {}; let purposes; render( purposes = ref} @@ -40,6 +43,7 @@ describe('Purposes', () => { ]} selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} + store={store} />, scratch); purposes.handleSelectPurposeDetail(1)(); @@ -55,6 +59,7 @@ describe('Purposes', () => { const selectCustomPurpose = jest.fn(); let purposes; + let store = {}; render( purposes = ref} purposes={[ @@ -66,6 +71,7 @@ describe('Purposes', () => { ]} selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} + store={store} />, scratch); purposes.handleSelectPurposeDetail(2)(); From 55c9de1af332815b8ebf5de528469e9bd9f72aa9 Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Thu, 19 Jul 2018 15:29:13 +0200 Subject: [PATCH 083/540] Add unit test (ADRODO-86) --- .../popup/details/purposes/purposes.test.js | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/components/popup/details/purposes/purposes.test.js b/src/components/popup/details/purposes/purposes.test.js index 6a4db44f..d1cc66d8 100644 --- a/src/components/popup/details/purposes/purposes.test.js +++ b/src/components/popup/details/purposes/purposes.test.js @@ -81,4 +81,32 @@ describe('Purposes', () => { expect(selectCustomPurpose.mock.calls[0][1]).to.equal(true); expect(selectPurpose.mock.calls).to.be.empty; }); + + it('after selecting group of purposes with index 1, consent for those purposes should be withdrawn', done => { + const selectPurpose = jest.fn(); + const selectCustomPurpose = jest.fn(); + + let purposes; + let store = {}; + render( purposes = ref} + purposes={[ + { id: 1, name: 'Purpose 1' }, + { id: 2, name: 'Purpose 2' } + ]} + selectPurpose={selectPurpose} + selectCustomPurpose={selectCustomPurpose} + store={store} + />, scratch); + + purposes.componentDidUpdate = (prevProps, prevState) => { + if (purposes.state.selectedPurposeIndex === prevState.selectedPurposeIndex) { + expect(selectPurpose.mock.calls[0][0]).to.equal(2); + expect(selectPurpose.mock.calls[0][1]).to.equal(false); + expect(selectCustomPurpose.mock.calls).to.be.empty; + done(); + } + }; + purposes.handleSelectPurposeDetail(1)(); + }); }); From 4be6535b31e2987c5262dd386c7153cf63e97f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Thu, 19 Jul 2018 16:31:37 +0200 Subject: [PATCH 084/540] better passing props from deatils to purposes component --- src/components/popup/details/details.jsx | 7 ++++--- .../popup/details/purposes/purposes.jsx | 3 +-- .../popup/details/purposes/purposes.test.js | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 856e1b21..15c00bd9 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -54,8 +54,9 @@ export default class Details extends Component { selectPurpose, selectCustomPurpose, selectAllVendors, - selectVendor - } = store; + selectVendor, + persistedVendorConsentData = {}} + = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedCustomPurposeIds } = publisherConsentData; const { purposes = [], vendors = [] } = vendorList; @@ -81,7 +82,7 @@ export default class Details extends Component { selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} onShowVendors={this.handleShowVendors} - store = {store} + persistedVendorConsentData={persistedVendorConsentData} /> { }); it('should render links for vendors and all standard and custom purposes', () => { - let store = {}; + let persistedVendorConsentData = {}; const purposes = render( { customPurposes={[ { id: 1, name: 'Custom Purpose 1' }, ]} - store={store} + persistedVendorConsentData={persistedVendorConsentData} />, scratch); const purposeLinks = purposes.querySelectorAll(`.${style.purposeItem}`); @@ -33,7 +33,7 @@ describe('Purposes', () => { it('should select a standard purpose', () => { const selectPurpose = jest.fn(); const selectCustomPurpose = jest.fn(); - let store = {}; + let persistedVendorConsentData = {}; let purposes; render( purposes = ref} @@ -43,7 +43,7 @@ describe('Purposes', () => { ]} selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} - store={store} + persistedVendorConsentData={persistedVendorConsentData} />, scratch); purposes.handleSelectPurposeDetail(1)(); @@ -59,7 +59,7 @@ describe('Purposes', () => { const selectCustomPurpose = jest.fn(); let purposes; - let store = {}; + let persistedVendorConsentData = {}; render( purposes = ref} purposes={[ @@ -71,7 +71,7 @@ describe('Purposes', () => { ]} selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} - store={store} + persistedVendorConsentData={persistedVendorConsentData} />, scratch); purposes.handleSelectPurposeDetail(2)(); @@ -87,7 +87,7 @@ describe('Purposes', () => { const selectCustomPurpose = jest.fn(); let purposes; - let store = {}; + let persistedVendorConsentData = {}; render( purposes = ref} purposes={[ @@ -96,7 +96,7 @@ describe('Purposes', () => { ]} selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} - store={store} + persistedVendorConsentData={persistedVendorConsentData} />, scratch); purposes.componentDidUpdate = (prevProps, prevState) => { From 08e613e4c976b80be8a861aaa96b5a729f43a19e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Thu, 19 Jul 2018 16:54:29 +0200 Subject: [PATCH 085/540] fix --- src/components/popup/details/purposes/purposes.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index bdf7c730..156b8663 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -104,7 +104,6 @@ export default class Purposes extends Component { persistedVendorConsentData } = props; - const persistedVendorConsentData = store.persistedVendorConsentData || {}; const {created} = persistedVendorConsentData; const {selectedPurposeIndex} = state; From 2872e65dae367dc3d8cf27a6a46df4819f1ea2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Buzun?= Date: Thu, 19 Jul 2018 16:58:13 +0200 Subject: [PATCH 086/540] fix in formatting --- src/components/popup/details/details.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 15c00bd9..890fdd73 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -55,8 +55,8 @@ export default class Details extends Component { selectCustomPurpose, selectAllVendors, selectVendor, - persistedVendorConsentData = {}} - = store; + persistedVendorConsentData = {} + } = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedCustomPurposeIds } = publisherConsentData; const { purposes = [], vendors = [] } = vendorList; From c017f74d1dd9f4db61a2f83adc759771026a0924 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 20 Jul 2018 14:45:38 +0200 Subject: [PATCH 087/540] Update of Polish translation --- src/lib/translations.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index f46f454a..6545d716 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -12,7 +12,7 @@ export default {

Zgoda

-

Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy Onet-RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

+

Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy Onet-RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

@@ -21,7 +21,7 @@ export default {

Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa Onet-RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

-

Podmioty z Grupy Onet-RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy Onet-RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy Onet-RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

+

Podmioty z Grupy Onet-RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy Onet-RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy Onet-RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

Administrator danych osobowych

Administratorem Twoich danych osobowych jest podmiot z Grupy Onet-RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy Onet-RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

@@ -40,11 +40,11 @@ export default {
-

Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania, czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy, przez czas jej wykonywania i ewentualnie okres przedawnienia roszczeń z niej (zwykle nie więcej niż 3 lata, a maksymalnie 10 lat), a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora, do czasu zgłoszenia przez Ciebie skutecznego sprzeciwu.

+

Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania, czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy, przez czas jej wykonywania i ewentualnie okres przedawnienia roszczeń z niej (zwykle nie więcej niż 3 lata, a maksymalnie 6 lat), a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora, do czasu zgłoszenia przez Ciebie skutecznego sprzeciwu.

Przekazywanie danych

-

Administratorzy danych mogą powierzać Twoje dane podwykonawcom IT, księgowym, agencjom marketingowym etc. Zrobią to jedynie na podstawie umowy o powierzenie przetwarzania danych zobowiązującej taki podmiot do odpowiedniego zabezpieczenia danych i niekorzystania z nich do własnych celów.

+

Administratorzy danych mogą powierzać Twoje dane podwykonawcom IT, księgowym, agencjom marketingowym etc. Zrobią to jedynie w niezbędnym zakresie i na podstawie umowy o powierzenie przetwarzania danych zobowiązującej taki podmiot do odpowiedniego zabezpieczenia danych i niekorzystania z nich do własnych celów.

Cookies

From bc90647a5f39f8b150e9366bb71d7e74223f03aa Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 3 Sep 2018 11:19:57 +0200 Subject: [PATCH 088/540] Start dev server on hostname of VM --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b2ca10c..d888ade7 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "clean": "rm -rf build", - "dev": "cross-env NODE_ENV=development webpack-dev-server --inline --hot --progress --host $HOSTNAME --public $HOSTNAME:8080", + "dev": "cross-env NODE_ENV=development webpack-dev-server --inline --hot --progress --host 0.0.0.0 --public 0.0.0.0:8080", "start": "serve build -s -c 1", "prestart": "npm run build", "build": "cross-env NODE_ENV=production webpack --progress", From c1e80ad04d318e7698705360bf34e67a3239544e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81yko?= Date: Thu, 13 Sep 2018 13:28:15 +0200 Subject: [PATCH 089/540] Change the company name to: Grupa RAS Polska --- src/lib/translations.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 6545d716..adb288d0 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -12,19 +12,19 @@ export default {

Zgoda

-

Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy Onet-RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

+

Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

-

Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa Onet-RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

+

Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

-

Podmioty z Grupy Onet-RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy Onet-RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy Onet-RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

+

Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

Administrator danych osobowych

-

Administratorem Twoich danych osobowych jest podmiot z Grupy Onet-RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy Onet-RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

+

Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

Podstawa i cel przetwarzania

@@ -48,11 +48,11 @@ export default {

Cookies

-

Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy Onet-RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

+

Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

Twoje uprawnienia

-

Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy Onet-RAS Polska i Zaufanych Partnerów:

+

Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. @@ -93,4 +93,4 @@ export default { consentLink: 'tutaj' } } -}; \ No newline at end of file +}; From 9b5bc07e7cf906ac807397ed62ddec41230ff4b6 Mon Sep 17 00:00:00 2001 From: aszydlo Date: Thu, 13 Sep 2018 13:49:18 +0200 Subject: [PATCH 090/540] use 'getConsentFields' instead 'getVendorConsents', because 'getVendorConsents' return global vendor list version and 'getConsentFields' return our local vendor list version --- src/complete.js | 2 +- src/lib/store.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/complete.js b/src/complete.js index 4ff451c0..df93328d 100644 --- a/src/complete.js +++ b/src/complete.js @@ -40,7 +40,7 @@ function checkConsent(cmp, store) { handleConsentResult(cmp, store, vendorList); }, 100); - cmp('getVendorConsents', null, vendorConsents => { + cmp('getConsentFields', null, vendorConsents => { clearTimeout(timeout); handleConsentResult(cmp, store, vendorList, vendorConsents); }); diff --git a/src/lib/store.js b/src/lib/store.js index 9959af73..41996103 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -224,7 +224,8 @@ export default class Store { created, globalVendorListVersion, lastUpdated, - publisherVendorsVersion + publisherVendorsVersion, + vendorListVersion } = { ...vendorConsentData, ...persistedVendorConsentData @@ -237,6 +238,7 @@ export default class Store { cookieVersion, created, globalVendorListVersion, + vendorListVersion, lastUpdated, publisherVendorsVersion }; From 273d8cc7119ff29dc81a58a9af0f66d5aba5056d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81yko?= Date: Thu, 13 Sep 2018 14:08:09 +0200 Subject: [PATCH 091/540] Update a link address --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index adb288d0..e8a5e9e0 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -24,7 +24,7 @@ export default {

Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

Administrator danych osobowych

-

Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

+

Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

Podstawa i cel przetwarzania

From 7735a598dabd45b0a66d0dfc2f6aa4e287111718 Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Fri, 16 Nov 2018 11:32:43 +0100 Subject: [PATCH 092/540] Translation update --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index e8a5e9e0..d35808be 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,7 +8,7 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

+ description: `

Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

Zgoda

From dd26825739781ae5e00772c667ca658526ad09db Mon Sep 17 00:00:00 2001 From: tsmielowski Date: Fri, 16 Nov 2018 12:47:50 +0100 Subject: [PATCH 093/540] Translation update --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index d35808be..513c19f2 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,7 +8,7 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

+ description: `

Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

Zgoda

From 787bc473eadb1a5fc04622d2100fc80831c6eed2 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 6 Feb 2019 13:55:35 +0100 Subject: [PATCH 094/540] Correct handling of `attachEvent` parameters --- src/complete.js | 8 +++++++- src/docs/lib/stub.js | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/complete.js b/src/complete.js index df93328d..92bec7c2 100644 --- a/src/complete.js +++ b/src/complete.js @@ -98,7 +98,13 @@ cmp.receiveMessage = function (event) { window.__cmp = cmp; // Listen for postMessage events -const listen = window.attachEvent || window.addEventListener; +function listen(type, listener, useCapture) { + if (window.addEventListener) { + window.addEventListener(type, listener, useCapture); + } else if (window.attachEvent) { + window.attachEvent('on' + type, listener); + } +} listen('message', event => { window.__cmp.receiveMessage(event); }, false); diff --git a/src/docs/lib/stub.js b/src/docs/lib/stub.js index 5d62cd46..89150ea7 100644 --- a/src/docs/lib/stub.js +++ b/src/docs/lib/stub.js @@ -3,7 +3,13 @@ function buildScript(config, cmpLocation='../cmp.bundle.js') { return `(function(window, document) { if (!window.__cmp) { window.__cmp = (function() { - var listen = window.attachEvent || window.addEventListener; + function listen(type, listener, useCapture) { + if (window.addEventListener) { + window.addEventListener(type, listener, useCapture); + } else if (window.attachEvent) { + window.attachEvent('on' + type, listener); + } + } listen('message', function(event) { window.__cmp.receiveMessage(event); }, false); From 762c0bc6521aa7af907695357b570100ec19f5d0 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 6 Feb 2019 14:25:52 +0100 Subject: [PATCH 095/540] Ability to configure external function for fetching global vendor list --- src/docs/components/docs/configuration.jsx | 10 +++++++++ src/lib/config.js | 1 + src/lib/vendor.js | 26 +++++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 2854ea12..bc6ec855 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -96,6 +96,16 @@ export default class CmpApi extends Component {
+ + getVendorList(callback) (Function): + + Custom function to read global vendor list (overwrites globalVendorListLocation configuration) + Arguments + + callback(err, vendorList) (Function): Function to be executed with vendor list object + + + legIntPurposeIds (Array): diff --git a/src/lib/config.js b/src/lib/config.js index 77e30ebd..51ba4e36 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -12,6 +12,7 @@ const defaultConfig = { gdprApplies: true, getConsentData: null, setConsentData: null, + getVendorList: null, legIntPurposeIds: [], purposeGroups: [], autoDisplay: true, diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 51186f6c..de8ced29 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -40,7 +40,31 @@ function fetchPubVendorList() { * Fetch the global vendor list if the location is configured */ function fetchGlobalVendorList() { - const {globalVendorListLocation, storeConsentGlobally, globalConsentLocation} = config; + const {globalVendorListLocation, storeConsentGlobally, globalConsentLocation, getVendorList} = config; + if (getVendorList) { + return new Promise((resolve, reject) => { + try { + getVendorList((err, data) => { + if (err) { + reject(err); + } else { + try { + resolve(data); + } catch (err) { + reject(err); + } + } + }); + } catch (err) { + reject(err); + } + }).catch(err => { + if (storeConsentGlobally && globalConsentLocation) { + return sendPortalCommand({command: 'readVendorList'}); + } + log.error(`Failed to load global vendor list from configuration`, err); + }); + } return (globalVendorListLocation ? fetch(globalVendorListLocation) : Promise.reject('Missing globalVendorListLocation')) From ae71be61b6d3ea0f5ff32e050ee3edc9247b61ab Mon Sep 17 00:00:00 2001 From: aszydlo Date: Mon, 11 Feb 2019 10:25:58 +0100 Subject: [PATCH 096/540] add rel attr to link --- src/lib/translations.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 513c19f2..2e9c248a 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -17,14 +17,14 @@ export default {

Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę -polityki prywatności.

+polityki prywatności.

Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

Administrator danych osobowych

-

Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

+

Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

Podstawa i cel przetwarzania

@@ -48,14 +48,14 @@ export default {

Cookies

-

Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

+

Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

Twoje uprawnienia

Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

-

2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. +

2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień.

`, acceptAll: 'Przejdź do serwisu', showPurposes: 'Ustawienia zaawansowane' @@ -73,7 +73,7 @@ export default { menu: 'Cookies itp.', title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', description: `

Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści.

-

Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

` +

Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

` }, 'purpose2,3,4,5': { menu: 'Przetwarzanie danych osobowych', From 92ca793b1fef849bed3e197c84492f73154d5ce2 Mon Sep 17 00:00:00 2001 From: aszydlo Date: Mon, 11 Feb 2019 13:20:31 +0100 Subject: [PATCH 097/540] one more link --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 2e9c248a..60d1fdd4 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -24,7 +24,7 @@ export default {

Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

Administrator danych osobowych

-

Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

+

Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

Podstawa i cel przetwarzania

From 410b32806093c3a11f1fd1df2fb0262ea62ea647 Mon Sep 17 00:00:00 2001 From: aszydlo Date: Mon, 29 Apr 2019 12:55:16 +0200 Subject: [PATCH 098/540] changed text --- src/lib/translations.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 60d1fdd4..c2927caf 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -14,14 +14,17 @@ export default {

Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

-

Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

+

Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

-

Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie we własnych celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

+

Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

+

+ +

Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

Administrator danych osobowych

Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

@@ -34,7 +37,7 @@ export default {
  • 1. Jeśli zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. Gdy zakładasz konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tego nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. Niepodanie takich danych uniemożliwi nam zawarcie i wykonanie umowy.
  • -
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu i promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • +
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu i promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
  • @@ -54,8 +57,8 @@ export default {

    Twoje uprawnienia

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    -

    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    -

    2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. +

    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    +

    2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień.

    `, acceptAll: 'Przejdź do serwisu', showPurposes: 'Ustawienia zaawansowane' From 0186756e3de13137de8632f77f1f019660781096 Mon Sep 17 00:00:00 2001 From: aszydlo Date: Mon, 29 Apr 2019 14:03:40 +0200 Subject: [PATCH 099/540] removed unused end of paragraph --- src/lib/translations.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index c2927caf..d133ba00 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -22,7 +22,6 @@ export default {

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    -

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    @@ -57,7 +56,7 @@ export default {

    Twoje uprawnienia

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    -

    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    +

    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień.

    `, acceptAll: 'Przejdź do serwisu', From 039deb9a86353252481f811d5b0101d7b613915d Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 27 May 2019 18:10:15 +0200 Subject: [PATCH 100/540] Show footer if user didn't give consent to some vendors but only if they are present on current vendor list --- src/lib/store.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 41996103..7a23cf08 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -388,9 +388,22 @@ export default class Store { }; toggleFooterShowing = (isShown) => { - const vendorConsents = this.getVendorConsentsObject(); - if (this.isAllSetTrue(vendorConsents.purposeConsents) && this.isAllSetTrue(vendorConsents.vendorConsents)) { - isShown = false; + const vendorConsentsObject = this.getVendorConsentsObject(); + if (this.isAllSetTrue(vendorConsentsObject.purposeConsents)) { + let vendorConsents; + if (this.vendorList) { + const {vendors = {}} = this.vendorList; + const vendorIds = new Set(vendors.map(({id}) => id)); + vendorConsents = {}; + Object.keys(vendorConsentsObject.vendorConsents).filter(id => vendorIds.has(Number(id))).forEach(id => { + vendorConsents[id] = vendorConsentsObject.vendorConsents[id]; + }); + } else { + vendorConsents = vendorConsentsObject.vendorConsents; + } + if (this.isAllSetTrue(vendorConsents)) { + isShown = false; + } } this.isFooterShowing = typeof isShown === 'boolean' ? isShown : !this.isFooterShowing; this.isConsentToolShowing = false; From 808cc125ded1154c408cc4e09999d847cb81f431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81yko?= Date: Thu, 27 Jun 2019 11:37:13 +0200 Subject: [PATCH 101/540] New version of Polish translation --- src/lib/translations.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index d133ba00..22bd0b05 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -21,7 +21,7 @@ export default {

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    -

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    +

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    @@ -36,7 +36,7 @@ export default {
  • 1. Jeśli zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. Gdy zakładasz konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tego nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. Niepodanie takich danych uniemożliwi nam zawarcie i wykonanie umowy.
  • -
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu i promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • +
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
  • From 4e4927159b3f38549985004bd7a8c1d3a4da2125 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 6 Aug 2019 16:27:28 +0200 Subject: [PATCH 102/540] Serbian translation --- src/lib/translations.js | 54 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/lib/translations.js b/src/lib/translations.js index 22bd0b05..be8a3919 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -94,5 +94,59 @@ export default { message: 'Zmień swoje ustawienia prywatności klikając', consentLink: 'tutaj' } + }, + sr: { + intro: { + title: 'Hvala na poseti', + description: 'Da bismo bili u mogućnosti da održimo uspešno poslovanje portala, mi i određene treće strane postavljamo kolačiće, pristupamo i čuvamo informacije na Vašem uređaju za različite svrhe. Naši partneri takođe prikupljaju podatke da bi Vam prikazali personalizovani sadržaj i oglase. Neki od naših partnera traže i Vašu saglasnost za prikupljanje podataka da bismo Vam omogućili bolje korisničko iskustvo.', + acceptAll: 'Prihvatam, hvala!', + showPurposes: 'Odaberi svoje postavke' + }, + details: { + title: 'Postavke korisnika', + back: 'Nazad', + save: 'Snimi i izađi' + }, + purposes: { + active: 'Aktivno', + inactive: 'Neaktivno', + showVendors: 'Prikaži celu listu partnera', + purpose1: { + menu: 'Skladištenje i pristup informacijama', + title: 'Skladištenje i pristup informacijama', + description: 'Sladištenje informacija ili pristup tim informacijama, na Vašem uređaju, kao što su oglasni identifikatori, i/ili korišćenje kolačića i slične tehnologije' + }, + purpose2: { + menu: 'Personalizacija', + title: 'Personalizacija', + description: 'Prikupljanje i obrada informacija o Vašoj upotrebi ove web stranice kako bi se kasnije personalizovalo oglašavanje za Vas u drugim kontekstima, tj. na drugim web lokacijama ili aplikacijama. Sadržaj web lokacije ili aplikacije se obično koristi kako bi se profilisala Vaša interesovanja koja određuju Vaše buduće izbore.' + }, + purpose3: { + menu: 'Izbor oglasa, isporuka, izveštavanje', + title: 'Izbor oglasa, isporuka, izveštavanje', + description: 'Prikupljanje informacija i ukrštanje sa prethodno prikupljenim informacijama za odabir i isporuku oglasa relevantnih za Vas, kao i za merenje isporuke i efikasnosti takvih oglasa. To uključuje upotrebu prethodno prikupljenih informacija o Vašim interesovanjima za odabir oglasa, obradu podataka o tome koji su oglasi prikazani, koliko često su oni prikazani, kada i gde su prikazani, i da li ste preduzeli bilo kakvu radnju u vezi sa oglasom, uključujući na primer klik na oglas ili kupovina.' + }, + purpose4: { + menu: 'Izbor Vašeg sadržaja, isporuka i izveštaji', + title: 'Izbor Vašeg sadržaja, isporuka i izveštaji', + description: 'Prikupljanje informacija i ukrštanje sa prethodno prikupljenim informacijama za izbor i isporuku sadržaja za Vas i za merenje isporuke i efikasnosti takvog sadržaja. Ovo uključuje upotrebu prethodno prikupljenih informacija o Vašim interesovanjima za izbor sadržaja, obradu podataka o tome koji je sadržaj prikazan, koliko često ili koliko dugo je prikazivan, kada i gde je prikazan, i da li ste preduzeli bilo kakvu radnju vezanu za sadržaj, uključujući na primer klik na sadržaj.' + }, + purpose5: { + menu: 'Merenje', + title: 'Merenje', + description: 'Prikupljanje informacija o Vašem izboru sadržaja i kombinacija sa prethodno prikupljenim informacijama koje se koriste za merenje, razumevanje i izveštavanje o Vašoj preferencijama sadržaja.' + } + }, + vendors: { + title: 'Naši partneri', + company: 'Kompanija', + offOn: 'Dozvoli', + description: 'Pomozite nam da vam pružimo bolje iskustvo na našem sajtu! Naši partneri postavljaju kolačiće i prikupljaju informacije iz Vašeg pretraživača kako bi Vam pružili sadržaj web lokacija i isporučili relevantno oglašavanje', + moreChoices: 'Više opcija' + }, + footer: { + message: 'Podsetnik da uvek možete promeniti Vaša podešavanja', + consentLink: 'ovde' + } } }; From 7ee81b921007dfe4fd604b3bf4902d9b8afdc192 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 22 Aug 2019 15:42:41 +0200 Subject: [PATCH 103/540] Every purpose that is not considered as legitimate interest should not be selected when user switches to it --- src/components/popup/details/details.test.js | 18 ++++++++++++++-- .../popup/details/purposes/purposes.jsx | 21 ++++++++++--------- .../popup/details/purposes/purposes.test.js | 15 +++++++------ 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/components/popup/details/details.test.js b/src/components/popup/details/details.test.js index 7665c1b4..9b8eadba 100644 --- a/src/components/popup/details/details.test.js +++ b/src/components/popup/details/details.test.js @@ -14,7 +14,14 @@ describe('Details', () => { }); it('should render with purpose panel initially', () => { - const store = new Store(); + const store = new Store({ + vendorList: { + purposes: [ + { id: 1, name: 'Purpose 1' }, + { id: 2, name: 'Purpose 2' } + ] + } + }); store.isConsentToolShowing = false; const details =
    ; expect(details).to.contain(purposesStyle.purposes); @@ -22,7 +29,14 @@ describe('Details', () => { it('should switch between panel states', () => { - const store = new Store(); + const store = new Store({ + vendorList: { + purposes: [ + { id: 1, name: 'Purpose 1' }, + { id: 2, name: 'Purpose 2' } + ] + } + }); let details; render(
    { if (selectedPurpose.custom) { @@ -105,18 +104,14 @@ export default class Purposes extends Component { } = props; const {created} = persistedVendorConsentData; - const {selectedPurposeIndex} = state; + const { + selectedPurposeIndex, + renderedPurposeIndices + } = state; const allPurposes = this.getAllPurposes(); const selectedPurpose = allPurposes[selectedPurposeIndex]; - if (!created && selectedPurposeIndex && this.state.initialDisplayOfDetailView) { - this.setState({ - initialDisplayOfDetailView: 0 - }); - this.handleSelectPurpose({isSelected: false}) - } - const purposeIsActive = selectedPurpose && selectedPurpose.ids.some(id => selectedPurpose.custom ? selectedCustomPurposeIds.has(id) : selectedPurposeIds.has(id) ); @@ -125,6 +120,12 @@ export default class Purposes extends Component { ); const currentPurposeLocalizePrefix = `${selectedPurpose && selectedPurpose.custom ? 'customPurpose' : 'purpose'}${selectedPurpose && selectedPurpose.ids}`; + if (!created && !purposeIsTechnical && !renderedPurposeIndices.has(selectedPurposeIndex)) { + renderedPurposeIndices.add(selectedPurposeIndex); + this.setState({renderedPurposeIndices}); + this.handleSelectPurpose({isSelected: false}) + } + return (
    diff --git a/src/components/popup/details/purposes/purposes.test.js b/src/components/popup/details/purposes/purposes.test.js index 25577191..18db05ba 100644 --- a/src/components/popup/details/purposes/purposes.test.js +++ b/src/components/popup/details/purposes/purposes.test.js @@ -14,7 +14,7 @@ describe('Purposes', () => { it('should render links for vendors and all standard and custom purposes', () => { let persistedVendorConsentData = {}; - + const selectPurpose = jest.fn(); const purposes = render( { { id: 1, name: 'Custom Purpose 1' }, ]} persistedVendorConsentData={persistedVendorConsentData} + selectPurpose={selectPurpose} />, scratch); const purposeLinks = purposes.querySelectorAll(`.${style.purposeItem}`); expect(purposeLinks.length).to.equal(3); + expect(selectPurpose.mock.calls[0][0]).to.equal(1); + expect(selectPurpose.mock.calls[0][1]).to.equal(false); }); it('should select a standard purpose', () => { @@ -49,8 +52,8 @@ describe('Purposes', () => { purposes.handleSelectPurposeDetail(1)(); purposes.handleSelectPurpose({isSelected: true}); - expect(selectPurpose.mock.calls[0][0]).to.equal(2); - expect(selectPurpose.mock.calls[0][1]).to.equal(true); + expect(selectPurpose.mock.calls[1][0]).to.equal(2); + expect(selectPurpose.mock.calls[1][1]).to.equal(true); expect(selectCustomPurpose.mock.calls).to.be.empty; }); @@ -79,7 +82,7 @@ describe('Purposes', () => { expect(selectCustomPurpose.mock.calls[0][0]).to.equal(1); expect(selectCustomPurpose.mock.calls[0][1]).to.equal(true); - expect(selectPurpose.mock.calls).to.be.empty; + expect(selectPurpose.mock.calls).not.to.be.empty; }); it('after selecting group of purposes with index 1, consent for those purposes should be withdrawn', done => { @@ -101,8 +104,8 @@ describe('Purposes', () => { purposes.componentDidUpdate = (prevProps, prevState) => { if (purposes.state.selectedPurposeIndex === prevState.selectedPurposeIndex) { - expect(selectPurpose.mock.calls[0][0]).to.equal(2); - expect(selectPurpose.mock.calls[0][1]).to.equal(false); + expect(selectPurpose.mock.calls[1][0]).to.equal(2); + expect(selectPurpose.mock.calls[1][1]).to.equal(false); expect(selectCustomPurpose.mock.calls).to.be.empty; done(); } From 94ceb4ddab6d849a4455a3cc52d92fa6323c1c97 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 22 Aug 2019 16:25:39 +0200 Subject: [PATCH 104/540] semicolon --- src/components/popup/details/purposes/purposes.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index f343610b..392ae4b6 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -123,7 +123,7 @@ export default class Purposes extends Component { if (!created && !purposeIsTechnical && !renderedPurposeIndices.has(selectedPurposeIndex)) { renderedPurposeIndices.add(selectedPurposeIndex); this.setState({renderedPurposeIndices}); - this.handleSelectPurpose({isSelected: false}) + this.handleSelectPurpose({isSelected: false}); } return ( From 8e1c66615f7d4a1c03f212e24ff20eef07f6e354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81yko?= Date: Tue, 29 Oct 2019 19:11:31 +0100 Subject: [PATCH 105/540] Revert links to vendor policies --- .../externallinkicon/externallinkicon.jsx | 16 ++++++++++++++++ src/components/popup/details/vendors/vendors.jsx | 10 ++++++++-- .../popup/details/vendors/vendors.less | 5 +++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/components/externallinkicon/externallinkicon.jsx diff --git a/src/components/externallinkicon/externallinkicon.jsx b/src/components/externallinkicon/externallinkicon.jsx new file mode 100644 index 00000000..3e92ce98 --- /dev/null +++ b/src/components/externallinkicon/externallinkicon.jsx @@ -0,0 +1,16 @@ +import { h, Component } from 'preact'; + +export default class ExternalLinkIcon extends Component { + + static defaultProps = { + }; + + + render(props) { + return ( + + + + ); + } +} diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 0a442de4..3a295002 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -3,6 +3,7 @@ import style from './vendors.less'; import Button from '../../../button/button'; import Switch from '../../../switch/switch'; import Label from "../../../label/label"; +import ExternalLinkIcon from '../../../externallinkicon/externallinkicon' class LocalLabel extends Label { static defaultProps = { @@ -84,9 +85,14 @@ export default class Vendors extends Component {
    - {vendors.map(({ id, name }, index) => ( + {vendors.map(({ id, name, policyUrl }, index) => ( - + {editingConsents && {editingConsents && From eb166cf60fe5b560c6ad54ad3df37765b215bc3b Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Wed, 30 Oct 2019 17:42:43 +0100 Subject: [PATCH 108/540] first changes --- src/components/popup/details/details.jsx | 3 +- .../popup/details/purposes/purposes.jsx | 388 ++++++++++++++---- 2 files changed, 299 insertions(+), 92 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 890fdd73..c1abe2a4 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -59,7 +59,7 @@ export default class Details extends Component { } = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedCustomPurposeIds } = publisherConsentData; - const { purposes = [], vendors = [] } = vendorList; + const { purposes = [], vendors = [], features = []} = vendorList; const { purposes: customPurposes = [] } = customPurposeList; @@ -76,6 +76,7 @@ export default class Details extends Component { {}, +// purposes: [], +// customPurposes: [], +// selectedPurposeIds: new Set(), +// selectedCustomPurposeIds: new Set() +// }; +// +// +// handleSelectPurposeDetail = index => { +// return () => { +// this.setState({ +// selectedPurposeIndex: index +// }); +// }; +// }; +// +// handleSelectPurpose = ({isSelected}) => { +// const {selectedPurposeIndex} = this.state; +// const { +// selectPurpose, +// selectCustomPurpose +// } = this.props; +// const allPurposes = this.getAllPurposes(); +// const selectedPurpose = allPurposes[selectedPurposeIndex]; +// +// selectedPurpose.ids.forEach(id => { +// if (selectedPurpose.custom) { +// selectCustomPurpose(id, isSelected); +// } +// else { +// selectPurpose(id, isSelected); +// } +// }); +// }; +// +// getAllPurposes = () => { +// const { +// purposes, +// customPurposes +// } = this.props; +// let allPurposes = []; +// +// let purposeIdToGroupIndex = {}; +// (config.purposeGroups || []).forEach((ids, i) => { +// ids.forEach(id => { +// purposeIdToGroupIndex[id] = i; +// }); +// }); +// let groupIndexToPurposeIndex = {}; +// (purposes || []).forEach(purpose => { +// if (purposeIdToGroupIndex.hasOwnProperty(purpose.id)) { +// const groupIndex = purposeIdToGroupIndex[purpose.id]; +// if (groupIndexToPurposeIndex.hasOwnProperty(groupIndex)) { +// allPurposes[groupIndexToPurposeIndex[groupIndex]].ids.push(purpose.id); +// return; +// } +// groupIndexToPurposeIndex[groupIndex] = allPurposes.length; +// } +// allPurposes.push({ +// ids: [purpose.id], +// name: purpose.name, +// custom: false +// }); +// }); +// +// (customPurposes || []).forEach(purpose => { +// allPurposes.push({ +// ids: [purpose.id], +// name: purpose.name, +// custom: true +// }); +// }); +// +// return allPurposes; +// }; +// +// +// render(props, state) { +// +// const { +// onShowVendors, +// selectedPurposeIds, +// selectedCustomPurposeIds, +// persistedVendorConsentData +// } = props; +// +// const {created} = persistedVendorConsentData; +// const { +// selectedPurposeIndex, +// renderedPurposeIndices +// } = state; +// +// const allPurposes = this.getAllPurposes(); +// const selectedPurpose = allPurposes[selectedPurposeIndex]; +// +// const tabIsActive = selectedPurpose && selectedPurpose.ids.some(id => +// selectedPurpose.custom ? selectedCustomPurposeIds.has(id) : selectedPurposeIds.has(id) +// ); +// const purposeIsTechnical = config.legIntPurposeIds && selectedPurpose && !selectedPurpose.custom && selectedPurpose.ids.some(id => +// config.legIntPurposeIds.indexOf(id) >= 0 +// ); +// const currentPurposeLocalizePrefix = `${selectedPurpose && selectedPurpose.custom ? 'customPurpose' : 'purpose'}${selectedPurpose && selectedPurpose.ids}`; +// +// if (!created && !purposeIsTechnical && !renderedPurposeIndices.has(selectedPurposeIndex)) { +// renderedPurposeIndices.add(selectedPurposeIndex); +// this.setState({renderedPurposeIndices}); +// this.handleSelectPurpose({isSelected: false}); +// } +// +// return ( +//
    +//
    +// {allPurposes.map((purpose, index) => ( +//
    +// {purpose.name} +//
    +// ))} +//
    +// {selectedPurpose && +//
    +//
    +//
    +//
    +// {selectedPurpose.name} +//
    +// {!purposeIsTechnical && +//
    +// {tabIsActive ? 'Active' : 'Inactive'} +// +//
    +// } +//
    +//
    +// +// {!purposeIsTechnical && +// Show full vendor list +// } +//
    +//
    +//
    +// } +//
    +// ); +// } +// } import { h, Component } from 'preact'; import style from './purposes.less'; import Switch from '../../../switch/switch'; @@ -12,7 +181,7 @@ class LocalLabel extends Label { export default class Purposes extends Component { state = { - selectedPurposeIndex: 0, + selectedTabIndex: 0, renderedPurposeIndices: new Set() }; @@ -20,30 +189,31 @@ export default class Purposes extends Component { onShowVendors: () => {}, purposes: [], customPurposes: [], - selectedPurposeIds: new Set(), + selectedTabIds: new Set(), selectedCustomPurposeIds: new Set() }; - handleSelectPurposeDetail = index => { + handleSelectTabDetail = index => { + console.log(index); return () => { this.setState({ - selectedPurposeIndex: index + selectedTabIndex: index }); }; }; - handleSelectPurpose = ({isSelected}) => { - const {selectedPurposeIndex} = this.state; + handleSelectTab = ({isSelected}) => { + const {selectedTabIndex} = this.state; const { selectPurpose, selectCustomPurpose } = this.props; const allPurposes = this.getAllPurposes(); - const selectedPurpose = allPurposes[selectedPurposeIndex]; + const selectedTab = allPurposes[selectedTabIndex]; - selectedPurpose.ids.forEach(id => { - if (selectedPurpose.custom) { + selectedTab.ids.forEach(id => { + if (selectedTab.custom) { selectCustomPurpose(id, isSelected); } else { @@ -52,116 +222,152 @@ export default class Purposes extends Component { }); }; - getAllPurposes = () => { - const { - purposes, - customPurposes - } = this.props; - let allPurposes = []; - - let purposeIdToGroupIndex = {}; - (config.purposeGroups || []).forEach((ids, i) => { - ids.forEach(id => { - purposeIdToGroupIndex[id] = i; - }); - }); - let groupIndexToPurposeIndex = {}; - (purposes || []).forEach(purpose => { - if (purposeIdToGroupIndex.hasOwnProperty(purpose.id)) { - const groupIndex = purposeIdToGroupIndex[purpose.id]; - if (groupIndexToPurposeIndex.hasOwnProperty(groupIndex)) { - allPurposes[groupIndexToPurposeIndex[groupIndex]].ids.push(purpose.id); - return; - } - groupIndexToPurposeIndex[groupIndex] = allPurposes.length; - } - allPurposes.push({ - ids: [purpose.id], - name: purpose.name, - custom: false - }); - }); - - (customPurposes || []).forEach(purpose => { - allPurposes.push({ - ids: [purpose.id], - name: purpose.name, - custom: true - }); - }); - - return allPurposes; - }; + // getAllPurposes = () => { + // const { + // purposes, + // customPurposes + // } = this.props; + // let allPurposes = []; + // + // let purposeIdToGroupIndex = {}; + // (config.purposeGroups || []).forEach((ids, i) => { + // ids.forEach(id => { + // purposeIdToGroupIndex[id] = i; + // }); + // }); + // let groupIndexToPurposeIndex = {}; + // (purposes || []).forEach(purpose => { + // if (purposeIdToGroupIndex.hasOwnProperty(purpose.id)) { + // const groupIndex = purposeIdToGroupIndex[purpose.id]; + // if (groupIndexToPurposeIndex.hasOwnProperty(groupIndex)) { + // allPurposes[groupIndexToPurposeIndex[groupIndex]].ids.push(purpose.id); + // return; + // } + // groupIndexToPurposeIndex[groupIndex] = allPurposes.length; + // } + // allPurposes.push({ + // ids: [purpose.id], + // name: purpose.name, + // custom: false + // }); + // }); + // + // (customPurposes || []).forEach(purpose => { + // allPurposes.push({ + // ids: [purpose.id], + // name: purpose.name, + // custom: true + // }); + // }); + // + // return allPurposes; + // }; render(props, state) { + const tabs = ['Leg Int Publishera', 'Cele i funkcje przetwarzania danych osobowych']; const { onShowVendors, - selectedPurposeIds, + selectedTabIds, selectedCustomPurposeIds, - persistedVendorConsentData + persistedVendorConsentData, + purposes, + features } = props; const {created} = persistedVendorConsentData; const { - selectedPurposeIndex, + selectedTabIndex, renderedPurposeIndices } = state; - const allPurposes = this.getAllPurposes(); - const selectedPurpose = allPurposes[selectedPurposeIndex]; + // const allPurposes = this.getAllPurposes(); + const selectedTab = tabs[selectedTabIndex]; - const purposeIsActive = selectedPurpose && selectedPurpose.ids.some(id => - selectedPurpose.custom ? selectedCustomPurposeIds.has(id) : selectedPurposeIds.has(id) - ); - const purposeIsTechnical = config.legIntPurposeIds && selectedPurpose && !selectedPurpose.custom && selectedPurpose.ids.some(id => - config.legIntPurposeIds.indexOf(id) >= 0 - ); - const currentPurposeLocalizePrefix = `${selectedPurpose && selectedPurpose.custom ? 'customPurpose' : 'purpose'}${selectedPurpose && selectedPurpose.ids}`; + // const tabIsActive = selectedTab && selectedTab.ids.some(id => + // selectedTab.custom ? selectedCustomPurposeIds.has(id) : selectedTabIds.has(id) + // ); + // const purposeIsTechnical = config.legIntPurposeIds && selectedTab && !selectedTab.custom && selectedTab.ids.some(id => + // config.legIntPurposeIds.indexOf(id) >= 0 + // ); + // const currentPurposeLocalizePrefix = `${selectedTab && selectedTab.custom ? 'customPurpose' : 'purpose'}${selectedTab && selectedTab.ids}`; + const currentPurposeLocalizePrefix = selectedTab; - if (!created && !purposeIsTechnical && !renderedPurposeIndices.has(selectedPurposeIndex)) { - renderedPurposeIndices.add(selectedPurposeIndex); - this.setState({renderedPurposeIndices}); - this.handleSelectPurpose({isSelected: false}); - } + // if (!created && !purposeIsTechnical && !renderedPurposeIndices.has(selectedTabIndex)) { + // renderedPurposeIndices.add(selectedTabIndex); + // this.setState({renderedPurposeIndices}); + // this.handleSelectTab({isSelected: false}); + // } return (
    - {allPurposes.map((purpose, index) => ( -
    ( +
    - {purpose.name} + {tab}
    ))}
    - {selectedPurpose && -
    -
    -
    -
    - {selectedPurpose.name} + {!selectedTabIndex ? ( +
    Leg int publisher info
    + ) : ( +
    +
    +
    +
    + {selectedTab} +
    + + {/* switch */} + + {/*
    */} + {/* {tabIsActive ? 'Active' : 'Inactive'}*/} + {/* */} + {/*
    */}
    - {!purposeIsTechnical && -
    - {purposeIsActive ? 'Active' : 'Inactive'} - +
    +
    + Cele + {purposes.map((purpose, index) => { + return ( +
    + {/**/} +
    +

    {purpose.name}

    +

    {purpose.description}

    +
    +
    + ); + })} +
    +
    + Funkcje + {features.map((feature, index) => { + return ( +
    + {/**/} +
    +

    {feature.name}

    +

    {feature.description}

    +
    +
    + ); + })} +
    + {/*{!purposeIsTechnical &&*/} + {/* Show full vendor list*/} + {/*}*/}
    - } -
    -
    - - {!purposeIsTechnical && - Show full vendor list - }
    -
    + ) }
    ); From 73df69cc6833a7de8893d6c85192ea8a5ce15f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81yko?= Date: Thu, 31 Oct 2019 14:02:10 +0100 Subject: [PATCH 109/540] Small fixes after code review --- src/components/popup/details/vendors/vendors.jsx | 2 +- src/components/popup/details/vendors/vendors.less | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 5657e671..d11be6af 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -89,7 +89,7 @@ export default class Vendors extends Component {
    {name}
    +
    + {name} + +
    +
    Date: Tue, 29 Oct 2019 19:20:46 +0100 Subject: [PATCH 106/540] Remove unused imports --- src/components/externallinkicon/externallinkicon.jsx | 1 - src/components/popup/details/vendors/vendors.jsx | 1 - 2 files changed, 2 deletions(-) diff --git a/src/components/externallinkicon/externallinkicon.jsx b/src/components/externallinkicon/externallinkicon.jsx index 3e92ce98..61c0411a 100644 --- a/src/components/externallinkicon/externallinkicon.jsx +++ b/src/components/externallinkicon/externallinkicon.jsx @@ -5,7 +5,6 @@ export default class ExternalLinkIcon extends Component { static defaultProps = { }; - render(props) { return ( diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 3a295002..78c8e491 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -1,6 +1,5 @@ import { h, Component } from 'preact'; import style from './vendors.less'; -import Button from '../../../button/button'; import Switch from '../../../switch/switch'; import Label from "../../../label/label"; import ExternalLinkIcon from '../../../externallinkicon/externallinkicon' From 2d0b9d4f877fb92c34fddbd1835f08678ba26cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=81yko?= Date: Wed, 30 Oct 2019 17:32:19 +0100 Subject: [PATCH 107/540] Implement backward compatibility --- src/components/popup/details/vendors/vendors.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 78c8e491..5657e671 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -89,7 +89,9 @@ export default class Vendors extends Component {
    {name} + {policyUrl && policyUrl !== '' && + }
    {name} - {policyUrl && policyUrl !== '' && + {policyUrl && }
    diff --git a/src/components/popup/details/vendors/vendors.less b/src/components/popup/details/vendors/vendors.less index 41dc4252..c85876fa 100644 --- a/src/components/popup/details/vendors/vendors.less +++ b/src/components/popup/details/vendors/vendors.less @@ -97,6 +97,5 @@ div.vendors { .policy { margin: 0 5px; display: flex; - fill: @color-primary; } } From 442d9270b74a05f2f153c7d2b7a03daf0e0d3a9a Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 31 Oct 2019 16:18:53 +0100 Subject: [PATCH 110/540] Filtering vendor list --- src/components/popup/details/details.jsx | 32 ++++++++++++++++--- .../popup/details/purposes/purposes.jsx | 9 ++++-- src/lib/translations.js | 3 +- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 890fdd73..0bd0c016 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -18,10 +18,34 @@ class LocalLabel extends Label { export default class Details extends Component { state = { - selectedPanelIndex: SECTION_PURPOSES + selectedPanelIndex: SECTION_PURPOSES, + vendors: [] }; - handleShowVendors = () => { + getVendors = ({ isCustom = null, purposeIds = [], featureIds = [] } = {}) => { + const { vendorList = {} } = this.props.store; + const { vendors = [] } = vendorList; + return vendors.filter(vendor => { + if (isCustom !== null && (isCustom && vendor.external_id || !isCustom && !vendor.external_id)) { + return false; + } + + const vendorPurposeIds = new Set([...(vendor.purposeIds || []), ...(vendor.legIntPurposeIds || [])]); + if (!purposeIds.every(purposeId => vendorPurposeIds.has(purposeId))) { + return false; + } + + const vendorFeatureIds = new Set(vendor.featureIds || []); + if (!featureIds.every(featureId => vendorFeatureIds.has(featureId))) { + return false; + } + + return true; + }); + }; + + handleShowVendors = (filter) => { + this.state.vendors = this.getVendors(filter); this.setState({ selectedPanelIndex: SECTION_VENDORS }); @@ -59,7 +83,7 @@ export default class Details extends Component { } = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedCustomPurposeIds } = publisherConsentData; - const { purposes = [], vendors = [] } = vendorList; + const { purposes = [] } = vendorList; const { purposes: customPurposes = [] } = customPurposeList; @@ -88,7 +112,7 @@ export default class Details extends Component { selectedVendorIds={selectedVendorIds} selectAllVendors={selectAllVendors} selectVendor={selectVendor} - vendors={vendors} + vendors={state.vendors} /> diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 392ae4b6..55a1ce1e 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -93,11 +93,13 @@ export default class Purposes extends Component { return allPurposes; }; + createOnShowVendors(filter = {}) { + return () => this.props.onShowVendors(filter); + } render(props, state) { const { - onShowVendors, selectedPurposeIds, selectedCustomPurposeIds, persistedVendorConsentData @@ -157,7 +159,10 @@ export default class Purposes extends Component {
    {!purposeIsTechnical && - Show full vendor list + Show full vendor list + } + {!purposeIsTechnical && + Show full custom vendor list }
    diff --git a/src/lib/translations.js b/src/lib/translations.js index be8a3919..08580efe 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -70,7 +70,8 @@ export default { purposes: { active: 'Aktywna', inactive: 'Nieaktywna', - showVendors: 'Pokaż listę naszych Zaufanych Partnerów', + showVendors: 'Pokaż listę Zaufanych Partnerów', + showCustomVendors: 'Pokaż listę pozostałych Zaufanych Partnerów', purpose1: { menu: 'Cookies itp.', title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', From ba340c52d08b52a7b7d7ba199bb0a193a7597860 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Tue, 5 Nov 2019 14:07:48 +0100 Subject: [PATCH 111/540] mobile --- src/components/popup/details/purposes/purposes.jsx | 8 +++----- src/components/popup/details/purposes/purposes.less | 9 ++++++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 9e6799e6..bc5ac570 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -20,8 +20,6 @@ const Purpose = (props) => { isPublisherPurpose } = props; - console.log(isLegitimateInterest); - return (
    @@ -182,14 +180,14 @@ export default class Purposes extends Component {
    ) : (
    -
    +
    -
    +
    -
    +
    diff --git a/src/components/popup/details/purposes/purposes.less b/src/components/popup/details/purposes/purposes.less index 986cf543..d89cee65 100644 --- a/src/components/popup/details/purposes/purposes.less +++ b/src/components/popup/details/purposes/purposes.less @@ -35,6 +35,11 @@ flex: 1; padding: 20px; overflow: auto; + + @media screen and (max-width: 768px) { + overflow: scroll; + height: 47vh; + } } .vendorsSection { margin: 20px 0; @@ -47,7 +52,7 @@ margin: 5% 0; } } - .publisherPurposes { + .publisherSection { border-bottom: 1px solid #eaeaea; } .sectionInfo { @@ -72,6 +77,8 @@ .purposeDetail { margin-bottom: 10%; + overflow: auto; + height: auto; .detailHeader { display: flex; From 3596e3c928d74fc16f17212eda10fc7809ba22d2 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Tue, 5 Nov 2019 14:32:09 +0100 Subject: [PATCH 112/540] cleaning --- .../popup/details/purposes/purposes.jsx | 28 ++----------------- .../popup/details/purposes/purposes.less | 7 +++-- src/lib/translations.js | 11 -------- 3 files changed, 7 insertions(+), 39 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index bc5ac570..74ea0d5b 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -119,37 +119,15 @@ export default class Purposes extends Component { const { selectedPurposeIds, - // selectedCustomPurposeIds, - // persistedVendorConsentData, purposes, features } = props; - // const {created} = persistedVendorConsentData; const { - // selectedPurposeIndex, - // renderedPurposeIndices, selectedTab } = state; - const tabs = ['Info wydawcy', 'Cele i funkcje przetwarzania danych osobowych']; - - // const allPurposes = this.getAllPurposes(); - // const selectedPurpose = allPurposes[selectedPurposeIndex]; - - // const purposeIsActive = selectedPurpose && selectedPurpose.ids.some(id => - // selectedPurpose.custom ? selectedCustomPurposeIds.has(id) : selectedPurposeIds.has(id) - // ); - // const purposeIsTechnical = config.legIntPurposeIds && selectedPurpose && !selectedPurpose.custom && selectedPurpose.ids.some(id => - // config.legIntPurposeIds.indexOf(id) >= 0 - // ); - // const currentPurposeLocalizePrefix = `${selectedPurpose && selectedPurpose.custom ? 'customPurpose' : 'purpose'}${selectedPurpose && selectedPurpose.ids}`; - - // if (!created && !purposeIsTechnical && !renderedPurposeIndices.has(selectedPurposeIndex)) { - // renderedPurposeIndices.add(selectedPurposeIndex); - // this.setState({renderedPurposeIndices}); - // this.handleSelectPurpose({isSelected: false}); - // } + const tabs = ['Publisher informations', 'Purposes & Features']; const purposeIsActive = (id) => selectedPurposeIds.has(id); const purposeIsLegitimateInterest = (id) => config.legIntPurposeIds.indexOf(id) >= 0; @@ -166,7 +144,7 @@ export default class Purposes extends Component { ))}
    {!selectedTab ? ( -
    +
    @@ -179,7 +157,7 @@ export default class Purposes extends Component {
    ) : ( -
    +
    diff --git a/src/components/popup/details/purposes/purposes.less b/src/components/popup/details/purposes/purposes.less index d89cee65..6ec79939 100644 --- a/src/components/popup/details/purposes/purposes.less +++ b/src/components/popup/details/purposes/purposes.less @@ -31,7 +31,7 @@ cursor: auto; } } - .purposesDescription { + .purposeDescription { flex: 1; padding: 20px; overflow: auto; @@ -56,9 +56,10 @@ border-bottom: 1px solid #eaeaea; } .sectionInfo { + .sectionHeader{ display: flex; - flex-wrap: wrap; + flex-wrap: wrap; .title { font-size: 24px; @@ -76,7 +77,7 @@ } .purposeDetail { - margin-bottom: 10%; + margin-bottom: 3%; overflow: auto; height: auto; diff --git a/src/lib/translations.js b/src/lib/translations.js index 2dbd026e..5699b5fa 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -93,17 +93,6 @@ export default { showVendors: 'Pokaż listę Zaufanych Partnerów', showCustomVendors: 'Pokaż listę pozostałych Zaufanych Partnerów', title: 'Cele', - // purpose1: { - // menu: 'Cookies itp.', - // title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', - // description: `

    Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści.

    - //

    Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    ` - // }, - // 'purpose2,3,4,5': { - // menu: 'Przetwarzanie danych osobowych', - // title: 'Przetwarzanie danych osobowych w celach marketingowych przez naszych Zaufanych Partnerów.', - // description: '

    Zgoda dotyczy przetwarzania Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty przez np. zestawianie w odpowiednich grupach użytkowników, oraz związane z tym niezbędne działania statystyczne) przez naszych Zaufanych Partnerów. Na podstawie tej zgody, Twoje dane, w tym zebrane informacje o Twojej aktywności na stronach internetowych, będą wykorzystywane do prezentowania Ci reklam produktów i usług naszych Partnerów biznesowych, dopasowanych do Twoich zainteresowań.

    ' - // }, purpose1: { menu: '', title: 'Przechowywanie i dostęp do informacji', From 612fcaa7c0c06b9f358c08348c9f35a6b85f9097 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Tue, 5 Nov 2019 14:33:47 +0100 Subject: [PATCH 113/540] cleaning --- src/components/popup/details/details.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 28e636c9..b7fb8426 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -83,7 +83,7 @@ export default class Details extends Component { } = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedCustomPurposeIds } = publisherConsentData; - const { purposes = [], vendors = [], features = []} = vendorList; + const { purposes = [], features = []} = vendorList; const { purposes: customPurposes = [] } = customPurposeList; From 650dd0f10850d4cccfa22a289b7295a12116076f Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Tue, 5 Nov 2019 15:03:11 +0100 Subject: [PATCH 114/540] changing behaviour on tab selecting --- .../popup/details/purposes/purposes.jsx | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 74ea0d5b..93aad207 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -10,6 +10,11 @@ class LocalLabel extends Label { }; } +const TABS = [ + 'Publisher informations', + 'Purposes & Features' +]; + const Purpose = (props) => { const { purpose, @@ -86,7 +91,7 @@ export default class Purposes extends Component { state = { selectedPurposeIndex: 0, selectedTab: 0, - renderedPurposeIndices: new Set() + renderedTabIndices: new Set() }; static defaultProps = { @@ -106,10 +111,7 @@ export default class Purposes extends Component { }; }; - handleSelectPurpose = (e) => { - const { isSelected, dataId } = e; - this.props.selectPurpose(dataId, isSelected); - }; + handleSelectPurpose = ({isSelected, dataId}) => this.props.selectPurpose(dataId, isSelected); createOnShowVendors(filter = {}) { return () => this.props.onShowVendors(filter); @@ -119,23 +121,33 @@ export default class Purposes extends Component { const { selectedPurposeIds, + selectedCustomPurposeIds, purposes, - features + features, + persistedVendorConsentData } = props; + const {created} = persistedVendorConsentData; + const { - selectedTab + selectedTab, + renderedTabIndices } = state; - const tabs = ['Publisher informations', 'Purposes & Features']; - const purposeIsActive = (id) => selectedPurposeIds.has(id); const purposeIsLegitimateInterest = (id) => config.legIntPurposeIds.indexOf(id) >= 0; + if (!created && !renderedTabIndices.has(selectedTab)) { + renderedTabIndices.add(selectedTab); + for (let purpose of purposes) { + this.handleSelectPurpose({isSelected: false, dataId: purpose.id}); + } + } + return (
    - {tabs.map((tab, index) => ( + {TABS.map((tab, index) => (
    From f5efd2812e0870bbdfd2e5598c7f502766bf1928 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Tue, 5 Nov 2019 16:16:49 +0100 Subject: [PATCH 115/540] docs --- src/components/popup/details/purposes/purposes.jsx | 13 ++++++------- src/docs/components/docs/configuration.jsx | 9 +++++---- src/lib/config.js | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 93aad207..673d81a4 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -21,7 +21,7 @@ const Purpose = (props) => { isActive, onToggle, createOnShowVendors, - isLegitimateInterest, + isSwitchable, isPublisherPurpose } = props; @@ -31,7 +31,7 @@ const Purpose = (props) => {
    {purpose.name}
    - {!isLegitimateInterest && + {isSwitchable &&
    {isActive ? 'Active' : 'Inactive'} selectedPurposeIds.has(id); - const purposeIsLegitimateInterest = (id) => config.legIntPurposeIds.indexOf(id) >= 0; + const purposeIsSwitchable = (id) => !(config.legIntPurposeIds.indexOf(id) >= 0 || config.contractPurposeIds.indexOf(id) >= 0); if (!created && !renderedTabIndices.has(selectedTab)) { renderedTabIndices.add(selectedTab); @@ -185,7 +185,7 @@ export default class Purposes extends Component { isPublisherPurpose={true} purpose={purpose} isActive={purposeIsActive(purpose.id)} - isLegitimateInterest={purposeIsLegitimateInterest(purpose.id)} + isSwitchable={purposeIsSwitchable(purpose.id)} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggle={this.handleSelectPurpose}/>)}
    @@ -205,7 +205,7 @@ export default class Purposes extends Component { {purposes.map((purpose, index) => )}
    @@ -218,8 +218,7 @@ export default class Purposes extends Component {
    - ) - } + )}
    ); } diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index bc6ec855..bd60dec8 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -112,10 +112,11 @@ export default class CmpApi extends Component { List of (non-consentable) data purposes that will be used under legitimate interest - - purposeGroups (Array): - - Array of arrays with purpose identifiers that should be organized in groups - each one with single switch which activates/deactivates all purposes in given group. For example: [[1, 4], [2, 3, 5]]. Purposes which are not included in any group will be displayed separatelly + + contractPurposeIds (Array): + + List of (non-consentable) data purposes that are required for the performance of a contract + processing is necessary for the performance of a contract to which the data subject is party or in order to take steps at the request of the data subject prior to entering into a contract; diff --git a/src/lib/config.js b/src/lib/config.js index 51ba4e36..3cdd8e1e 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -14,7 +14,7 @@ const defaultConfig = { setConsentData: null, getVendorList: null, legIntPurposeIds: [], - purposeGroups: [], + contractPurposeIds: [], autoDisplay: true, allowedVendorIds: null }; From 2320d5f09491daa7b847633f9736b81a504351ed Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Wed, 6 Nov 2019 14:30:33 +0100 Subject: [PATCH 116/540] tests --- .../popup/details/purposes/purposes.jsx | 91 ++++++++++++++----- .../popup/details/purposes/purposes.test.js | 50 +++++----- 2 files changed, 97 insertions(+), 44 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 673d81a4..7a8e40c4 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -18,6 +18,7 @@ const TABS = [ const Purpose = (props) => { const { purpose, + index, isActive, onToggle, createOnShowVendors, @@ -36,7 +37,7 @@ const Purpose = (props) => { {isActive ? 'Active' : 'Inactive'}
    @@ -89,8 +90,7 @@ const Feature = (props) => { export default class Purposes extends Component { state = { - selectedPurposeIndex: 0, - selectedTab: 0, + selectedTabIndex: 0, renderedTabIndices: new Set() }; @@ -106,12 +106,52 @@ export default class Purposes extends Component { handleSelectTab = index => { return () => { this.setState({ - selectedTab: index + selectedTabIndex: index }); }; }; - handleSelectPurpose = ({isSelected, dataId}) => this.props.selectPurpose(dataId, isSelected); + handleSelectPurpose = ({isSelected, dataId}) => { + const { + selectPurpose, + selectCustomPurpose + } = this.props; + + const allPurposes = this.getAllPurposes(); + const selectedPurpose = allPurposes[dataId]; + + if (selectedPurpose.custom) { + selectCustomPurpose(selectedPurpose.id, isSelected); + } else { + selectPurpose(selectedPurpose.id, isSelected); + } + }; + + getAllPurposes = () => { + const { + purposes, + customPurposes + } = this.props; + let allPurposes = []; + + (purposes || []).forEach(purpose => { + allPurposes.push({ + id: purpose.id, + name: purpose.name, + custom: false + }); + }); + + (customPurposes || []).forEach(purpose => { + allPurposes.push({ + id: purpose.id, + name: purpose.name, + custom: true + }); + }); + + return allPurposes; + }; createOnShowVendors(filter = {}) { return () => this.props.onShowVendors(filter); @@ -130,17 +170,24 @@ export default class Purposes extends Component { const {created} = persistedVendorConsentData; const { - selectedTab, + selectedTabIndex, renderedTabIndices } = state; - const purposeIsActive = (id) => selectedPurposeIds.has(id); + const allPurposes = this.getAllPurposes(); + + const purposeIsActive = (id) => id <= purposes.length ? + selectedPurposeIds.has(id) : + selectedCustomPurposeIds.has(id); + const purposeIsSwitchable = (id) => !(config.legIntPurposeIds.indexOf(id) >= 0 || config.contractPurposeIds.indexOf(id) >= 0); - if (!created && !renderedTabIndices.has(selectedTab)) { - renderedTabIndices.add(selectedTab); - for (let purpose of purposes) { - this.handleSelectPurpose({isSelected: false, dataId: purpose.id}); + if (!created && selectedTabIndex === 1 && !renderedTabIndices.has(selectedTabIndex)) { + renderedTabIndices.add(selectedTabIndex); + for (let i = 0, j = purposes.length; i
    {TABS.map((tab, index) => ( -
    {tab}
    ))}
    - {!selectedTab ? ( + {!selectedTabIndex ? (
    @@ -181,13 +228,14 @@ export default class Purposes extends Component {
    - {purposes.map((purpose, index) => )} + {allPurposes.map((purpose, index) => )}
    @@ -203,9 +251,10 @@ export default class Purposes extends Component {
    {purposes.map((purpose, index) => )}
    diff --git a/src/components/popup/details/purposes/purposes.test.js b/src/components/popup/details/purposes/purposes.test.js index 18db05ba..d612bfc4 100644 --- a/src/components/popup/details/purposes/purposes.test.js +++ b/src/components/popup/details/purposes/purposes.test.js @@ -5,32 +5,40 @@ import style from './purposes.less'; import Purposes from './purposes'; -describe('Purposes', () => { +describe('Purposes and Features', () => { let scratch; beforeEach(() => { scratch = document.createElement('div'); }); - it('should render links for vendors and all standard and custom purposes', () => { + it('should render all standard, custom purposes for publisher and purposes and features for vendors', () => { let persistedVendorConsentData = {}; const selectPurpose = jest.fn(); + let purposesRef; const purposes = render( purposesRef = ref} + purposes = {[ { id: 1, name: 'Purpose 1' }, { id: 2, name: 'Purpose 2' } ]} - customPurposes={[ + features = {[ + { id: 1, name: 'Feature 1' }, + { id: 2, name: 'Feature 2' } + ]} + customPurposes = {[ { id: 1, name: 'Custom Purpose 1' }, ]} persistedVendorConsentData={persistedVendorConsentData} selectPurpose={selectPurpose} />, scratch); - const purposeLinks = purposes.querySelectorAll(`.${style.purposeItem}`); - expect(purposeLinks.length).to.equal(3); - expect(selectPurpose.mock.calls[0][0]).to.equal(1); - expect(selectPurpose.mock.calls[0][1]).to.equal(false); + purposesRef.componentDidUpdate = () => { + const purposesAndFeatures = purposes.querySelectorAll(`.${style.purposeDetail}`); + expect(purposesAndFeatures.length).to.equal(7); + }; + + purposesRef.handleSelectTab(1)(); }); it('should select a standard purpose', () => { @@ -49,11 +57,10 @@ describe('Purposes', () => { persistedVendorConsentData={persistedVendorConsentData} />, scratch); - purposes.handleSelectPurposeDetail(1)(); - purposes.handleSelectPurpose({isSelected: true}); + purposes.handleSelectPurpose({isSelected: true, dataId: 0}); - expect(selectPurpose.mock.calls[1][0]).to.equal(2); - expect(selectPurpose.mock.calls[1][1]).to.equal(true); + expect(selectPurpose.mock.calls[0][0]).to.equal(1); + expect(selectPurpose.mock.calls[0][1]).to.equal(true); expect(selectCustomPurpose.mock.calls).to.be.empty; }); @@ -77,15 +84,15 @@ describe('Purposes', () => { persistedVendorConsentData={persistedVendorConsentData} />, scratch); - purposes.handleSelectPurposeDetail(2)(); - purposes.handleSelectPurpose({isSelected: true}); + purposes.handleSelectPurpose({isSelected: true, dataId: 2}); + purposes.handleSelectPurpose({isSelected: true, dataId: 1}); expect(selectCustomPurpose.mock.calls[0][0]).to.equal(1); expect(selectCustomPurpose.mock.calls[0][1]).to.equal(true); expect(selectPurpose.mock.calls).not.to.be.empty; }); - it('after selecting group of purposes with index 1, consent for those purposes should be withdrawn', done => { + it('after selecting group of purposes with index 1, consent for those purposes should be withdrawn', () => { const selectPurpose = jest.fn(); const selectCustomPurpose = jest.fn(); @@ -102,14 +109,11 @@ describe('Purposes', () => { persistedVendorConsentData={persistedVendorConsentData} />, scratch); - purposes.componentDidUpdate = (prevProps, prevState) => { - if (purposes.state.selectedPurposeIndex === prevState.selectedPurposeIndex) { - expect(selectPurpose.mock.calls[1][0]).to.equal(2); - expect(selectPurpose.mock.calls[1][1]).to.equal(false); - expect(selectCustomPurpose.mock.calls).to.be.empty; - done(); - } + purposes.componentDidUpdate = () => { + expect(selectPurpose.mock.calls[1][0]).to.equal(2); + expect(selectPurpose.mock.calls[1][1]).to.equal(false); + expect(selectCustomPurpose.mock.calls).to.be.empty; }; - purposes.handleSelectPurposeDetail(1)(); + purposes.handleSelectTab(1)(); }); }); From 8fc0cc1256564c104a19a2dc7b908e5fd15831e0 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Wed, 6 Nov 2019 15:21:22 +0100 Subject: [PATCH 117/540] cleaning --- .../popup/details/purposes/purposes.jsx | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 7a8e40c4..10df0b47 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -22,7 +22,7 @@ const Purpose = (props) => { isActive, onToggle, createOnShowVendors, - isSwitchable, + isTechnical, isPublisherPurpose } = props; @@ -32,7 +32,7 @@ const Purpose = (props) => {
    {purpose.name}
    - {isSwitchable && + {!isTechnical &&
    {isActive ? 'Active' : 'Inactive'} !(config.legIntPurposeIds.indexOf(id) >= 0 || config.contractPurposeIds.indexOf(id) >= 0); + const purposeIsTechnical = (index) => { + const selectedPurpose = allPurposes[index]; + + return config.legIntPurposeIds && + config.contractPurposeIds && + selectedPurpose && !selectedPurpose.custom && + config.legIntPurposeIds.indexOf(selectedPurpose.id) >= 0 || + config.contractPurposeIds.indexOf(selectedPurpose.id) >= 0; + }; if (!created && selectedTabIndex === 1 && !renderedTabIndices.has(selectedTabIndex)) { renderedTabIndices.add(selectedTabIndex); for (let i = 0, j = purposes.length; i)}
    @@ -254,7 +262,7 @@ export default class Purposes extends Component { index={index} purpose={purpose} isActive={purposeIsActive(purpose.id)} - isSwitchable={true} + isTechnical={false} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggle={this.handleSelectPurpose}/>)}
    From a9b8295a1fc4267ec6e3024a18c3f2ccb42ec5e3 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Wed, 6 Nov 2019 15:30:43 +0100 Subject: [PATCH 118/540] doc fix --- src/docs/components/docs/configuration.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index bd60dec8..6d04295d 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -116,7 +116,6 @@ export default class CmpApi extends Component { contractPurposeIds (Array): List of (non-consentable) data purposes that are required for the performance of a contract - processing is necessary for the performance of a contract to which the data subject is party or in order to take steps at the request of the data subject prior to entering into a contract; From 677f902bbf4df8912ac37acdbc52a2ed8e53c2ad Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Wed, 6 Nov 2019 16:16:02 +0100 Subject: [PATCH 119/540] todo --- src/components/popup/details/purposes/purposes.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 10df0b47..1f0c3503 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -192,6 +192,7 @@ export default class Purposes extends Component { if (!created && selectedTabIndex === 1 && !renderedTabIndices.has(selectedTabIndex)) { renderedTabIndices.add(selectedTabIndex); + // TODO: differentiate publisher purposes from vendor purposes (publisher leg int purpose should not be unselected) for (let i = 0, j = purposes.length; i Date: Wed, 6 Nov 2019 16:49:15 +0100 Subject: [PATCH 120/540] bind in features --- src/components/popup/details/purposes/purposes.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 1f0c3503..d4ef34a7 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -23,7 +23,7 @@ const Purpose = (props) => { onToggle, createOnShowVendors, isTechnical, - isPublisherPurpose + isPublisherPurpose = false } = props; return ( @@ -271,7 +271,7 @@ export default class Purposes extends Component { {features.map((feature, index) => + createOnShowVendors={this.createOnShowVendors.bind(this)}/> )}
    From 5fdbe30ec942a9e711b5d89cb0f9a97aab76e77d Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Wed, 6 Nov 2019 16:55:50 +0100 Subject: [PATCH 121/540] label without content --- src/components/popup/details/purposes/purposes.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index d4ef34a7..e02688b3 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -207,7 +207,7 @@ export default class Purposes extends Component {
    - {tab} +
    ))}
    From c1435e89c28dc059598bf900ee9634960ab7eb28 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Wed, 6 Nov 2019 17:06:15 +0100 Subject: [PATCH 122/540] reordered --- src/components/popup/details/purposes/purposes.jsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index e02688b3..b844f810 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -4,17 +4,17 @@ import Switch from '../../../switch/switch'; import Label from "../../../label/label"; import config from '../../../../lib/config'; +const TABS = [ + 'Publisher informations', + 'Purposes & Features' +]; + class LocalLabel extends Label { static defaultProps = { prefix: 'purposes' }; } -const TABS = [ - 'Publisher informations', - 'Purposes & Features' -]; - const Purpose = (props) => { const { purpose, @@ -207,7 +207,7 @@ export default class Purposes extends Component {
    - +
    ))}
    From 6973466e77303df89f765ee684070bdbfd405ec0 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 6 Nov 2019 17:51:49 +0100 Subject: [PATCH 123/540] Direct link to vendor list view --- src/components/popup/details/details.jsx | 50 ++++++++++--------- src/components/popup/details/details.test.js | 4 +- .../popup/details/purposes/purposes.jsx | 18 ++++--- src/components/popup/popup.jsx | 43 +++++----------- src/components/popup/popup.test.js | 6 +-- src/docs/components/docs/cmpApi.jsx | 24 ++++++++- src/lib/cmp.js | 21 +++++++- src/lib/store.js | 13 +++-- src/lib/translations.js | 12 ++--- 9 files changed, 113 insertions(+), 78 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 0bd0c016..ab613036 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -6,9 +6,10 @@ import Purposes from './purposes/purposes'; import Vendors from './vendors/vendors'; import Panel from '../../panel/panel'; import Label from "../../label/label"; - -const SECTION_PURPOSES = 0; -const SECTION_VENDORS = 1; +import { + SECTION_PURPOSES, + SECTION_VENDORS +} from '../../../lib/store'; class LocalLabel extends Label { static defaultProps = { @@ -17,15 +18,21 @@ class LocalLabel extends Label { } export default class Details extends Component { - state = { - selectedPanelIndex: SECTION_PURPOSES, - vendors: [] - }; + constructor(props) { + super(props); + this.state = { + vendors: this.getVendors() + }; + } - getVendors = ({ isCustom = null, purposeIds = [], featureIds = [] } = {}) => { + getVendors = () => { const { vendorList = {} } = this.props.store; const { vendors = [] } = vendorList; - return vendors.filter(vendor => { + return vendors; + }; + + filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [] } = {}) => { + return this.getVendors().filter(vendor => { if (isCustom !== null && (isCustom && vendor.external_id || !isCustom && !vendor.external_id)) { return false; } @@ -45,30 +52,26 @@ export default class Details extends Component { }; handleShowVendors = (filter) => { - this.state.vendors = this.getVendors(filter); - this.setState({ - selectedPanelIndex: SECTION_VENDORS - }); + this.state.vendors = this.filterVendors(filter); + this.props.store.subsection = SECTION_VENDORS; + this.forceUpdate(); }; handleBack = () => { - const { onCancel } = this.props; - const { selectedPanelIndex } = this.state; - this.setState({ - selectedPanelIndex: Math.max(0, selectedPanelIndex - 1) - }); - if (selectedPanelIndex === SECTION_PURPOSES) { + const { onCancel, store } = this.props; + const { subsection } = store; + store.subsection = Math.max(0, subsection - 1); + this.forceUpdate(); + if (subsection === SECTION_PURPOSES) { onCancel(); } }; render(props, state) { const { - onCancel, onSaveOrClose, store } = props; - const { selectedPanelIndex } = state; const { vendorList = {}, @@ -79,7 +82,8 @@ export default class Details extends Component { selectCustomPurpose, selectAllVendors, selectVendor, - persistedVendorConsentData = {} + persistedVendorConsentData = {}, + subsection } = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedCustomPurposeIds } = publisherConsentData; @@ -97,7 +101,7 @@ export default class Details extends Component { User Privacy Preferences
    - + { ref={ref => details = ref} />, scratch); - expect(details.state.selectedPanelIndex).to.equal(0); + expect(details.props.store.subsection).to.equal(0); details.handleShowVendors(); - expect(details.state.selectedPanelIndex).to.equal(1); + expect(details.props.store.subsection).to.equal(1); }); }); diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 55a1ce1e..b511f693 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -42,14 +42,16 @@ export default class Purposes extends Component { const allPurposes = this.getAllPurposes(); const selectedPurpose = allPurposes[selectedPurposeIndex]; - selectedPurpose.ids.forEach(id => { - if (selectedPurpose.custom) { - selectCustomPurpose(id, isSelected); - } - else { - selectPurpose(id, isSelected); - } - }); + if (selectedPurpose) { + selectedPurpose.ids.forEach(id => { + if (selectedPurpose.custom) { + selectCustomPurpose(id, isSelected); + } + else { + selectPurpose(id, isSelected); + } + }); + } }; getAllPurposes = () => { diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index 2e3e56d4..7096c603 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -3,26 +3,12 @@ import style from './popup.less'; import Intro from './intro/intro'; import Details from './details/details'; import Panel from '../panel/panel'; - - -const SECTION_INTRO = 0; -const SECTION_DETAILS = 1; +import { + SECTION_INTRO, + SECTION_DETAILS +} from '../../lib/store'; export default class Popup extends Component { - state = { - selectedPanelIndex: SECTION_INTRO, - isDetailViewAsDefault: false - }; - - componentWillReceiveProps(newProps) { - if (newProps.store.isDetailViewAsDefault !== this.state.isDetailViewAsDefault) { - this.setState({ - selectedPanelIndex: newProps.store.isDetailViewAsDefault ? SECTION_DETAILS : SECTION_INTRO, - isDetailViewAsDefault: newProps.store.isDetailViewAsDefault - }); - } - } - onAcceptAll = () => { const { store, onSave } = this.props; store.selectAllVendors(true); @@ -32,27 +18,24 @@ export default class Popup extends Component { }; onCancel = () => { - this.setState({ - selectedPanelIndex: SECTION_INTRO - }); + this.props.store.section = SECTION_INTRO; + this.forceUpdate(); }; handleShowDetails = () => { - this.setState({ - selectedPanelIndex: SECTION_DETAILS - }); + this.props.store.section = SECTION_DETAILS; + this.forceUpdate(); }; handleCloseOrSave = () => { - const { store, onSave } = this.props; + const { onSave } = this.props; onSave(); this.onCancel() }; - render(props, state) { + render(props) { const { store } = props; - const { selectedPanelIndex } = state; - const { isConsentToolShowing } = store; + const { isConsentToolShowing, section } = store; return (
    - +
    diff --git a/src/components/popup/popup.test.js b/src/components/popup/popup.test.js index 17fa89ff..86a025c8 100644 --- a/src/components/popup/popup.test.js +++ b/src/components/popup/popup.test.js @@ -56,11 +56,11 @@ describe('Popup', () => { ref={ref => popup = ref} />, scratch); - expect(popup.state.selectedPanelIndex).to.equal(0); + expect(popup.props.store.section).to.equal(0); popup.handleShowDetails(); - expect(popup.state.selectedPanelIndex).to.equal(1); + expect(popup.props.store.section).to.equal(1); popup.onCancel(); - expect(popup.state.selectedPanelIndex).to.equal(0); + expect(popup.props.store.section).to.equal(0); }); }); diff --git a/src/docs/components/docs/cmpApi.jsx b/src/docs/components/docs/cmpApi.jsx index bb5128cf..6196252a 100644 --- a/src/docs/components/docs/cmpApi.jsx +++ b/src/docs/components/docs/cmpApi.jsx @@ -58,7 +58,29 @@ const commands = [ resultDescription: 'true' } }, - { + { + command: 'showConsentDetailView', + parameter: { + type: '[parameter]', + description: '(ignored)' + }, + callback: { + resultType: 'result (Boolean)', + resultDescription: 'true' + } + }, + { + command: 'showVendors', + parameter: { + type: '[parameter]', + description: '(ignored)' + }, + callback: { + resultType: 'result (Boolean)', + resultDescription: 'true' + } + }, + { command: 'showFooter', parameter: { type: '[parameter]', diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 8fcebe35..237d59ba 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -4,6 +4,10 @@ import { encodeVendorConsentData, encodePublisherConsentData } from './cookie/cookie'; +import { + SECTION_DETAILS, + SECTION_VENDORS +} from './store'; const arrayFrom = require('core-js/library/fn/array/from'); export const CMP_GLOBAL_NAME = '__cmp'; @@ -164,7 +168,7 @@ export default class Cmp { * Trigger the consent tool UI to be shown */ showConsentTool: (_, callback = () => {}) => { - this.store.toogleDetailViewAsDefault(false); + this.store.updateSection(); this.store.toggleConsentToolShowing(true); this.openConsentTool = true; @@ -177,7 +181,20 @@ export default class Cmp { * Trigger the consent tool UI to be shown on Detail View */ showConsentDetailView: (_, callback = () => {}) => { - this.store.toogleDetailViewAsDefault(true); + this.store.updateSection(SECTION_DETAILS); + this.store.toggleConsentToolShowing(true); + + this.openConsentTool = true; + this.notify('openConsentTool', { section: 'details' }); + + callback(true); + }, + + /** + * Trigger the vendors UI to be shown + */ + showVendors: (_, callback = () => {}) => { + this.store.updateSection(SECTION_DETAILS, SECTION_VENDORS); this.store.toggleConsentToolShowing(true); this.openConsentTool = true; diff --git a/src/lib/store.js b/src/lib/store.js index 7a23cf08..e8ff507e 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -4,6 +4,11 @@ import { findLocale } from './localize'; import log from './log'; const arrayFrom = require('core-js/library/fn/array/from'); +export const SECTION_INTRO = 0; +export const SECTION_DETAILS = 1; +export const SECTION_PURPOSES = 0; +export const SECTION_VENDORS = 1; + /** * Copy a data object and make sure to replace references * of Set objects with new ones. @@ -64,7 +69,8 @@ export default class Store { this.allowedVendorIds = new Set(allowedVendorIds); this.isConsentToolShowing = false; this.isFooterShowing = false; - this.isDetailViewAsDefault = false; + this.section = SECTION_INTRO; + this.subsection = SECTION_PURPOSES; this.updateVendorList(vendorList); this.updateCustomPurposeList(customPurposeList); @@ -410,8 +416,9 @@ export default class Store { this.storeUpdate(); }; - toogleDetailViewAsDefault = (isDefault) => { - this.isDetailViewAsDefault = typeof isDefault === 'boolean' ? isDefault : !this.isDetailViewAsDefault; + updateSection = (section = SECTION_INTRO, subsection = SECTION_PURPOSES) => { + this.section = section; + this.subsection = subsection; this.storeUpdate(); }; diff --git a/src/lib/translations.js b/src/lib/translations.js index 08580efe..d009090a 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -12,21 +12,21 @@ export default {

    Zgoda

    -

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    +

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    -

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    Administrator danych osobowych

    -

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    +

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    Podstawa i cel przetwarzania

    @@ -38,7 +38,7 @@ export default {
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • -
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
  • +
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.

  • @@ -50,11 +50,11 @@ export default {

    Cookies

    -

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    +

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    Twoje uprawnienia

    -

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:

    +

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. From ee4663f4ad10944327485d0d75b63e102e8423ab Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 6 Nov 2019 20:01:20 +0100 Subject: [PATCH 124/540] List purposes, legIntPurposes and features as vendors description in vendors list view --- src/components/popup/details/details.jsx | 4 +- .../popup/details/vendors/vendors.jsx | 32 ++++++++- .../popup/details/vendors/vendors.less | 3 + .../popup/details/vendors/vendors.test.js | 68 +++++++++++++----- src/lib/translations.js | 70 ++++++++++++++++--- 5 files changed, 151 insertions(+), 26 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 0bd0c016..3ee68761 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -83,7 +83,7 @@ export default class Details extends Component { } = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedCustomPurposeIds } = publisherConsentData; - const { purposes = [] } = vendorList; + const { purposes = [], features = [] } = vendorList; const { purposes: customPurposes = [] } = customPurposeList; @@ -113,6 +113,8 @@ export default class Details extends Component { selectAllVendors={selectAllVendors} selectVendor={selectVendor} vendors={state.vendors} + purposes={purposes} + features={features} />

    diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index d11be6af..395455bb 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -42,11 +42,21 @@ export default class Vendors extends Component { }); }; + getActiveAttributesNameElements = (setOfAttributes, idsOfActiveAttributes, translationPrefix='') => { + const activeAttributes = setOfAttributes + .filter(attribute => idsOfActiveAttributes.includes(attribute['id'])) + .map(attribute => ); + + return activeAttributes.length ? activeAttributes.reduce((prev, curr) => [...prev, ', ', curr]) : []; + }; + render(props, state) { const { vendors, selectedVendorIds, + purposes, + features } = props; const { editingConsents } = this.state; @@ -84,7 +94,7 @@ export default class Vendors extends Component {
    - {vendors.map(({ id, name, policyUrl }, index) => ( + {vendors.map(({ id, name, policyUrl, purposeIds, legIntPurposeIds, featureIds }, index) => ( {editingConsents && {editingConsents && + + + } diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index 31b0a1f3..8a4dc757 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -93,6 +93,34 @@ describe('Vendors', () => { expect(selectAllVendors.mock.calls[0][0]).to.equal(true); }); + it('should handle accepting all vendors if some vendors are rejected', () => { + const selectAllVendors = jest.fn(); + + let vendors; + render( vendors = ref} + vendors={[ + {id: 1, name: 'Vendor 1', purposeIds: [1], legIntPurposeIds: [2], featureIds: []}, + {id: 2, name: 'Vendor 2', purposeIds: [], legIntPurposeIds: [1], featureIds: []}, + {id: 3, name: 'Vendor 3', purposeIds: [1], legIntPurposeIds: [2], featureIds: [1]}, + {id: 4, name: 'Vendor 4', purposeIds: [2], legIntPurposeIds: [1], featureIds: [1, 2]} + ]} + purposes={[ + {id: 1, name: 'Purpose 1'}, + {id: 2, name: 'Purpose 2'}, + ]} + features={[ + {id: 1, name: 'Feature 1'}, + {id: 2, name: 'Feature 2'}, + ]} + selectAllVendors={selectAllVendors} + />, scratch); + + + vendors.handleFullConsentChange({isSelected: true}); + expect(selectAllVendors.mock.calls[0][0]).to.equal(true); + }); + it('should handle rejecting all vendors', () => { const selectAllVendors = jest.fn(); @@ -119,4 +147,82 @@ describe('Vendors', () => { vendors.handleRejectAll(); expect(selectAllVendors.mock.calls[0][0]).to.equal(false); }); + + it('should handle rejecting all vendors if some vendors are selected', () => { + const selectAllVendors = jest.fn(); + + let vendors; + render( vendors = ref} + vendors={[ + {id: 1, name: 'Vendor 1', purposeIds: [1], legIntPurposeIds: [2], featureIds: []}, + {id: 2, name: 'Vendor 2', purposeIds: [], legIntPurposeIds: [1], featureIds: []}, + {id: 3, name: 'Vendor 3', purposeIds: [1], legIntPurposeIds: [2], featureIds: [1]}, + {id: 4, name: 'Vendor 4', purposeIds: [2], legIntPurposeIds: [1], featureIds: [1, 2]} + ]} + purposes={[ + {id: 1, name: 'Purpose 1'}, + {id: 2, name: 'Purpose 2'}, + ]} + features={[ + {id: 1, name: 'Feature 1'}, + {id: 2, name: 'Feature 2'}, + ]} + selectAllVendors={selectAllVendors} + />, scratch); + + + vendors.handleFullConsentChange({isSelected: false}); + expect(selectAllVendors.mock.calls[0][0]).to.equal(false); + }); + + it('should return true if all vendors are accepted', () => { + let vendors; + render( vendors = ref} + vendors={[ + {id: 1, name: 'Vendor 1', purposeIds: [1], legIntPurposeIds: [2], featureIds: []}, + {id: 2, name: 'Vendor 2', purposeIds: [], legIntPurposeIds: [1], featureIds: []}, + {id: 3, name: 'Vendor 3', purposeIds: [1], legIntPurposeIds: [2], featureIds: [1]}, + {id: 4, name: 'Vendor 4', purposeIds: [2], legIntPurposeIds: [1], featureIds: [1, 2]} + ]} + purposes={[ + {id: 1, name: 'Purpose 1'}, + {id: 2, name: 'Purpose 2'}, + ]} + features={[ + {id: 1, name: 'Feature 1'}, + {id: 2, name: 'Feature 2'}, + ]} + selectedVendorIds={new Set([1, 2, 3, 4])} + />, scratch); + + const result = vendors.isFullVendorsConsentChosen(); + expect(result).to.equal(true); + }); + + it('should return false if some vendors are rejected', () => { + let vendors; + render( vendors = ref} + vendors={[ + {id: 1, name: 'Vendor 1', purposeIds: [1], legIntPurposeIds: [2], featureIds: []}, + {id: 2, name: 'Vendor 2', purposeIds: [], legIntPurposeIds: [1], featureIds: []}, + {id: 3, name: 'Vendor 3', purposeIds: [1], legIntPurposeIds: [2], featureIds: [1]}, + {id: 4, name: 'Vendor 4', purposeIds: [2], legIntPurposeIds: [1], featureIds: [1, 2]} + ]} + purposes={[ + {id: 1, name: 'Purpose 1'}, + {id: 2, name: 'Purpose 2'}, + ]} + features={[ + {id: 1, name: 'Feature 1'}, + {id: 2, name: 'Feature 2'}, + ]} + selectedVendorIds={new Set([1])} + />, scratch); + + const result = vendors.isFullVendorsConsentChosen(); + expect(result).to.equal(false); + }); }); From ffa8d2504581ee0910bfce6e1175f47894de313e Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 4 Dec 2019 16:10:52 +0100 Subject: [PATCH 161/540] Extract vendor name and vendor description from Vendors to separate component Vendor --- .../popup/details/vendors/vendor.jsx | 57 +++++++++++++++++++ .../popup/details/vendors/vendors.jsx | 37 +++--------- 2 files changed, 66 insertions(+), 28 deletions(-) create mode 100644 src/components/popup/details/vendors/vendor.jsx diff --git a/src/components/popup/details/vendors/vendor.jsx b/src/components/popup/details/vendors/vendor.jsx new file mode 100644 index 00000000..4d238376 --- /dev/null +++ b/src/components/popup/details/vendors/vendor.jsx @@ -0,0 +1,57 @@ +import {h, Component, Fragment} from "preact"; + +import style from "./vendors.less"; +import ExternalLinkIcon from "../../../externallinkicon/externallinkicon"; +import Label from "../../../label/label"; + +class LocalLabel extends Label { + static defaultProps = { + prefix: 'vendors' + }; +} + +export default class Vendor extends Component { + shouldComponentUpdate() { + return false; + } + + componentDidUpdate(prevProps, prevState) { + Object.entries(this.props).forEach(([key, val]) => + prevProps[key] !== val && console.log(`Prop '${key}' changed`) + ); + if (this.state) { + Object.entries(this.state).forEach(([key, val]) => + prevState[key] !== val && console.log(`State '${key}' changed`) + ); + } + } + + render() { + const {purposes, legIntPurposes, features} = this.props; + + return
    +
    + {this.props.name} + {this.props.policyUrl && + } +
    +
    + {purposes && !!purposes.length && + + Purposes{': '} + {purposes}{'. '} + } + {legIntPurposes && !!legIntPurposes.length && + + Legitimate interest purposes{': '} + {legIntPurposes}{'. '} + } + {features && !!features.length && + + Features{': '} + {features}{'. '} + } +
    +
    + } +} diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index d762b310..c80a10e8 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -2,7 +2,7 @@ import { h, Component } from 'preact'; import style from './vendors.less'; import Switch from '../../../switch/switch'; import Label from "../../../label/label"; -import ExternalLinkIcon from '../../../externallinkicon/externallinkicon' +import Vendor from './vendor' class LocalLabel extends Label { static defaultProps = { @@ -20,6 +20,8 @@ export default class Vendors extends Component { static defaultProps = { vendors: [], + purposes: [], + features: [], selectedVendorIds: new Set(), selectVendor: () => {} }; @@ -94,35 +96,14 @@ export default class Vendors extends Component {
    @@ -93,6 +103,26 @@ export default class Vendors extends Component { }
    +
    + {purposeIds && !!purposeIds.length && + + {': '} + {this.getActiveAttributesNameElements(purposes, purposeIds, 'purposes.purpose')}{'. '} + + } + {legIntPurposeIds && !!legIntPurposeIds.length && + + {': '} + {this.getActiveAttributesNameElements(purposes, legIntPurposeIds, 'purposes.purpose')}{'. '} + + } + {featureIds && !!featureIds.length && + + {': '} + {this.getActiveAttributesNameElements(features, featureIds, 'features.feature')}{'. '} + + } +
    diff --git a/src/components/popup/details/vendors/vendors.less b/src/components/popup/details/vendors/vendors.less index c85876fa..b7c8b18a 100644 --- a/src/components/popup/details/vendors/vendors.less +++ b/src/components/popup/details/vendors/vendors.less @@ -63,6 +63,9 @@ div.vendors { display: flex; align-items: center; } + .vendorDescription { + font-size: 10px; + } table { width: 100%; border-collapse: collapse; diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index bb4c7c82..31b0a1f3 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -15,15 +15,27 @@ describe('Vendors', () => { it('should render the vendor list', () => { const vendors = render(, scratch); const vendorRows = vendors.querySelectorAll(`.${style.vendorContent} tr`); + const firstVendorAttributes = vendorRows[0].querySelectorAll(`.${style.vendorDescription} span`); + const secondVendorAttributes = vendorRows[1].querySelectorAll(`.${style.vendorDescription} span`); expect(vendorRows.length).to.equal(4); + expect(firstVendorAttributes.length).to.equal(6); + expect(secondVendorAttributes.length).to.equal(3); }); it('should handle selecting a vendor', () => { @@ -33,10 +45,18 @@ describe('Vendors', () => { render( vendors = ref} vendors={[ - {id: 1, name: 'Vendor 1'}, - {id: 2, name: 'Vendor 2'}, - {id: 3, name: 'Vendor 3'}, - {id: 4, name: 'Vendor 4'} + {id: 1, name: 'Vendor 1', purposeIds: [1], legIntPurposeIds: [2], featureIds: []}, + {id: 2, name: 'Vendor 2', purposeIds: [], legIntPurposeIds: [1], featureIds: []}, + {id: 3, name: 'Vendor 3', purposeIds: [1], legIntPurposeIds: [2], featureIds: [1]}, + {id: 4, name: 'Vendor 4', purposeIds: [2], legIntPurposeIds: [1], featureIds: [1, 2]} + ]} + purposes={[ + {id: 1, name: 'Purpose 1'}, + {id: 2, name: 'Purpose 2'}, + ]} + features={[ + {id: 1, name: 'Feature 1'}, + {id: 2, name: 'Feature 2'}, ]} selectVendor={selectVendor} />, scratch); @@ -53,10 +73,18 @@ describe('Vendors', () => { render( vendors = ref} vendors={[ - {id: 1, name: 'Vendor 1'}, - {id: 2, name: 'Vendor 2'}, - {id: 3, name: 'Vendor 3'}, - {id: 4, name: 'Vendor 4'} + {id: 1, name: 'Vendor 1', purposeIds: [1], legIntPurposeIds: [2], featureIds: []}, + {id: 2, name: 'Vendor 2', purposeIds: [], legIntPurposeIds: [1], featureIds: []}, + {id: 3, name: 'Vendor 3', purposeIds: [1], legIntPurposeIds: [2], featureIds: [1]}, + {id: 4, name: 'Vendor 4', purposeIds: [2], legIntPurposeIds: [1], featureIds: [1, 2]} + ]} + purposes={[ + {id: 1, name: 'Purpose 1'}, + {id: 2, name: 'Purpose 2'}, + ]} + features={[ + {id: 1, name: 'Feature 1'}, + {id: 2, name: 'Feature 2'}, ]} selectAllVendors={selectAllVendors} />, scratch); @@ -72,10 +100,18 @@ describe('Vendors', () => { render( vendors = ref} vendors={[ - {id: 1, name: 'Vendor 1'}, - {id: 2, name: 'Vendor 2'}, - {id: 3, name: 'Vendor 3'}, - {id: 4, name: 'Vendor 4'} + {id: 1, name: 'Vendor 1', purposeIds: [1], legIntPurposeIds: [2], featureIds: []}, + {id: 2, name: 'Vendor 2', purposeIds: [], legIntPurposeIds: [1], featureIds: []}, + {id: 3, name: 'Vendor 3', purposeIds: [1], legIntPurposeIds: [2], featureIds: [1]}, + {id: 4, name: 'Vendor 4', purposeIds: [2], legIntPurposeIds: [1], featureIds: [1, 2]} + ]} + purposes={[ + {id: 1, name: 'Purpose 1'}, + {id: 2, name: 'Purpose 2'}, + ]} + features={[ + {id: 1, name: 'Feature 1'}, + {id: 2, name: 'Feature 2'}, ]} selectAllVendors={selectAllVendors} />, scratch); diff --git a/src/lib/translations.js b/src/lib/translations.js index 08580efe..e053c8d4 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -67,21 +67,75 @@ export default { back: 'Wstecz', save: 'Zapisz i zamknij' }, + tabs: { + tab1: { + menu: 'Informacje wydawcy', + title: 'Lorem ipsum dolor sit amet', + description: '

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc fringilla nisl erat, sodales molestie tortor accumsan sed. Vivamus at massa suscipit, ornare magna quis, tincidunt ante. Sed at enim vel est aliquet pharetra ut vehicula enim. In scelerisque justo orci, ac vehicula ligula finibus blandit. Vivamus non convallis nunc. Integer vitae vestibulum est, at scelerisque diam. Morbi blandit a erat vitae fermentum. Duis pulvinar pretium hendrerit. Vestibulum ligula justo, mattis nec tortor eu, dictum tempor urna. Quisque varius finibus neque vitae pellentesque. Curabitur pharetra vitae neque porta blandit. Suspendisse commodo lacinia sapien, ac egestas neque pharetra ut. Sed in tincidunt urna, id porttitor ipsum. In neque tortor, condimentum at est sed, tempor dignissim odio. Pellentesque suscipit, quam sit amet efficitur facilisis, enim nibh rhoncus nulla, id malesuada lectus ante et justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

    ', + }, + tab2: { + menu: 'Cele i funkcje przetwarzania danych osobowych', + title: '', + description: '', + } + }, + publisherConsents: { + title: "Zgody dla wydawcy", + description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc fringilla nisl erat, sodales molestie tortor accumsan sed.', + }, + vendorConsents: { + title: "Zgody dla partnerów", + description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc fringilla nisl erat, sodales molestie tortor accumsan sed.', + }, purposes: { active: 'Aktywna', inactive: 'Nieaktywna', showVendors: 'Pokaż listę Zaufanych Partnerów', showCustomVendors: 'Pokaż listę pozostałych Zaufanych Partnerów', + title: 'Cele', + legitimateInterestTitle: 'Cele uzasadnione prawnie', purpose1: { - menu: 'Cookies itp.', - title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', - description: `

    Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści.

    -

    Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    ` + menu: '', + title: 'Przechowywanie i dostęp do informacji', + description: '

    Przechowywanie informacji albo dostęp do informacji przechowywanych na urządzeniu użytkownika, w tym dostęp do identyfikatorów reklamowych, innych identyfikatorów urządzenia, wykorzystanie plików cookie oraz podobnych technologii.

    ' + }, + purpose2: { + menu: '', + title: 'Personalizacja', + description: '

    Gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji reklam lub treści dla użytkownika w innych kontekstach, na przykład w innych witrynach albo aplikacjach. Zazwyczaj treści w witrynie lub aplikacji są wykorzystywane do wyciągania wniosków na temat zainteresowań użytkownika, które zapewniają dane na potrzeby doboru reklam lub treści w przyszłości.

    ' + }, + purpose3: { + menu: '', + title: 'Wybór i dostarczanie reklam, tworzenie raportów na temat reklam', + description: '

    Gromadzenie informacji oraz przetwarzanie uprzednio zgromadzonych informacji w celu wyboru i dostarczenia użytkownikowi reklam oraz oceny dostarczania i skuteczności tych reklam. Obejmuje to wykorzystywanie uprzednio zgromadzonych informacji na temat zainteresowań użytkownika w celu wyboru reklam, przetwarzanie danych na temat wyświetlonych reklam, częstotliwości, czasu i miejsca ich wyświetlania, oraz informacji czy użytkownik podjął działania w związku z reklamą, np. klikając na reklamę albo dokonując zakupu. Nie obejmuje to Personalizacji, która obejmuje gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji reklam lub treści dla użytkownika w innych kontekstach, na przykład w witrynach albo aplikacjach.

    ' + }, + purpose4: { + menu: '', + title: 'Wybór i dostarczanie treści, tworzenie raportów na temat treści', + description: '

    Gromadzenie informacji oraz przetwarzanie uprzednio zgromadzonych informacji w celu wyboru i dostarczenia treści oraz oceny dostarczania i skuteczności tych treści. Obejmuje to wykorzystywanie uprzednio zgromadzonych informacji na temat zainteresowań użytkownika w celu wyboru treści, przetwarzanie danych na temat wyświetlonych treści, częstotliwości, czasu i miejsca ich wyświetlania, oraz informacji czy użytkownik podjął działania w związku z treścią, np. klikając na treść. Nie obejmuje to Personalizacji, która obejmuje gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji treści lub reklam dla użytkownika w innych kontekstach, na przykład w witrynach albo aplikacjach.

    ' + }, + purpose5: { + menu: '', + title: 'Pomiary', + description: '

    Gromadzenie informacji na temat wykorzystywania treści przez użytkownika oraz przetwarzanie uprzednio zgromadzonych informacji w celu oceny, zrozumienia i tworzenia raportów na temat wykorzystywania usługi przez użytkownika. Nie obejmuje to Personalizacji, gromadzenia i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji treści lub reklam dla użytkownika w innych kontekstach, tj. w ramach usługi, na przykład w witrynach albo aplikacjach.

    ' + } + }, + features: { + title: 'Funkcje', + feature1: { + menu: '', + title: 'Zestawianie danych offline', + description: '

    Łączenie danych ze źródeł offline, które zostały wyjściowo zgromadzone w kontekstach innych niż dane zgromadzone online na potrzeby realizacji jednego albo większej liczby celów.

    ' + }, + feature2: { + menu: '', + title: 'Łączenie urządzeń', + description: '

    Przetwarzanie danych w celu powiązania ze sobą wielu urządzeń należących do tego samego użytkownika na potrzeby realizacji jednego albo większej liczby celów.

    ' }, - 'purpose2,3,4,5': { - menu: 'Przetwarzanie danych osobowych', - title: 'Przetwarzanie danych osobowych w celach marketingowych przez naszych Zaufanych Partnerów.', - description: '

    Zgoda dotyczy przetwarzania Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty przez np. zestawianie w odpowiednich grupach użytkowników, oraz związane z tym niezbędne działania statystyczne) przez naszych Zaufanych Partnerów. Na podstawie tej zgody, Twoje dane, w tym zebrane informacje o Twojej aktywności na stronach internetowych, będą wykorzystywane do prezentowania Ci reklam produktów i usług naszych Partnerów biznesowych, dopasowanych do Twoich zainteresowań.

    ' + feature3: { + menu: '', + title: 'Dokładne dane dotyczące lokalizacji geograficznej', + description: '

    Gromadzenie i obsługa dokładnych danych dotyczących lokalizacji geograficznej na potrzeby realizacji jednego albo większej liczby celów.

    ' } }, vendors: { From 532b0d26ece7ea6aa787a6393e0b52a000c1b2bd Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 7 Nov 2019 09:25:32 +0100 Subject: [PATCH 125/540] Using State Correctly --- src/components/popup/details/details.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index ab613036..2b1a6f18 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -52,9 +52,10 @@ export default class Details extends Component { }; handleShowVendors = (filter) => { - this.state.vendors = this.filterVendors(filter); this.props.store.subsection = SECTION_VENDORS; - this.forceUpdate(); + this.setState({ + vendors: this.filterVendors(filter) + }); }; handleBack = () => { From 202c5da17183c7a877015c4657498695b45e4979 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Thu, 7 Nov 2019 15:13:10 +0100 Subject: [PATCH 126/540] Change function for compatibility with Internet Explorer --- src/components/popup/details/vendors/vendors.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 395455bb..016ac1c1 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -44,7 +44,7 @@ export default class Vendors extends Component { getActiveAttributesNameElements = (setOfAttributes, idsOfActiveAttributes, translationPrefix='') => { const activeAttributes = setOfAttributes - .filter(attribute => idsOfActiveAttributes.includes(attribute['id'])) + .filter(attribute => idsOfActiveAttributes.indexOf(attribute['id']) !== -1) .map(attribute => ); return activeAttributes.length ? activeAttributes.reduce((prev, curr) => [...prev, ', ', curr]) : []; From 7f40b6cc88a31911610ca0cf88d52f46218e527a Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Thu, 7 Nov 2019 15:14:19 +0100 Subject: [PATCH 127/540] purposeIsActive fix --- .../popup/details/purposes/purposes.jsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index b844f810..b563b7e7 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -176,9 +176,15 @@ export default class Purposes extends Component { const allPurposes = this.getAllPurposes(); - const purposeIsActive = (id) => id <= purposes.length ? - selectedPurposeIds.has(id) : - selectedCustomPurposeIds.has(id); + console.log(selectedPurposeIds); + + const purposeIsActive = (index) => { + const selectedPurpose = allPurposes[index]; + + return selectedPurpose && selectedPurpose.custom ? + selectedCustomPurposeIds.has(selectedPurpose.id) : + selectedPurposeIds.has(selectedPurpose.id); + }; const purposeIsTechnical = (index) => { const selectedPurpose = allPurposes[index]; @@ -241,7 +247,7 @@ export default class Purposes extends Component { index={index} isPublisherPurpose={true} purpose={purpose} - isActive={purposeIsActive(purpose.id)} + isActive={purposeIsActive(index)} isTechnical={purposeIsTechnical(index)} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggle={this.handleSelectPurpose}/>)} @@ -262,7 +268,7 @@ export default class Purposes extends Component { {purposes.map((purpose, index) => )} From 416264a2b3c1f891d91a9373fefdc36ae5102bcd Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Thu, 7 Nov 2019 15:15:17 +0100 Subject: [PATCH 128/540] removed console.log --- src/components/popup/details/purposes/purposes.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index b563b7e7..949755d1 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -176,8 +176,6 @@ export default class Purposes extends Component { const allPurposes = this.getAllPurposes(); - console.log(selectedPurposeIds); - const purposeIsActive = (index) => { const selectedPurpose = allPurposes[index]; From ea935f838534806a271c60b76b4229c7cf2d9c1f Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 7 Nov 2019 15:20:22 +0100 Subject: [PATCH 129/540] Props are Read-Only --- src/components/popup/details/details.jsx | 7 ++----- src/components/popup/popup.jsx | 11 +++-------- src/lib/store.js | 4 ++++ 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 2b1a6f18..f7a02af6 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -6,10 +6,7 @@ import Purposes from './purposes/purposes'; import Vendors from './vendors/vendors'; import Panel from '../../panel/panel'; import Label from "../../label/label"; -import { - SECTION_PURPOSES, - SECTION_VENDORS -} from '../../../lib/store'; +import { SECTION_PURPOSES, SECTION_VENDORS } from '../../../lib/store'; class LocalLabel extends Label { static defaultProps = { @@ -52,10 +49,10 @@ export default class Details extends Component { }; handleShowVendors = (filter) => { - this.props.store.subsection = SECTION_VENDORS; this.setState({ vendors: this.filterVendors(filter) }); + this.props.store.updateSubsection(SECTION_VENDORS); }; handleBack = () => { diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index 7096c603..61cfca33 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -3,10 +3,7 @@ import style from './popup.less'; import Intro from './intro/intro'; import Details from './details/details'; import Panel from '../panel/panel'; -import { - SECTION_INTRO, - SECTION_DETAILS -} from '../../lib/store'; +import { SECTION_DETAILS } from '../../lib/store'; export default class Popup extends Component { onAcceptAll = () => { @@ -18,13 +15,11 @@ export default class Popup extends Component { }; onCancel = () => { - this.props.store.section = SECTION_INTRO; - this.forceUpdate(); + this.props.store.updateSection(); }; handleShowDetails = () => { - this.props.store.section = SECTION_DETAILS; - this.forceUpdate(); + this.props.store.updateSection(SECTION_DETAILS); }; handleCloseOrSave = () => { diff --git a/src/lib/store.js b/src/lib/store.js index e8ff507e..5b70f243 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -418,6 +418,10 @@ export default class Store { updateSection = (section = SECTION_INTRO, subsection = SECTION_PURPOSES) => { this.section = section; + this.updateSubsection(subsection); + }; + + updateSubsection = (subsection) => { this.subsection = subsection; this.storeUpdate(); }; From 24385f441d4d1d7e0bf53f6cf49d7786602a3e27 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Thu, 7 Nov 2019 15:36:29 +0100 Subject: [PATCH 130/540] Props are Read-Only --- src/components/popup/details/details.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index f7a02af6..7c7bb59a 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -58,8 +58,7 @@ export default class Details extends Component { handleBack = () => { const { onCancel, store } = this.props; const { subsection } = store; - store.subsection = Math.max(0, subsection - 1); - this.forceUpdate(); + store.updateSubsection(Math.max(0, subsection - 1)); if (subsection === SECTION_PURPOSES) { onCancel(); } From ca8bde98b61b5fd72ef88f0b7e124891d28328f5 Mon Sep 17 00:00:00 2001 From: aszydlo Date: Fri, 8 Nov 2019 08:14:11 +0100 Subject: [PATCH 131/540] merge consents from and to global cookie if show board --- src/lib/init.js | 19 +++++++- src/lib/store.js | 111 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 117 insertions(+), 13 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 463101b4..f09d9fdf 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -44,13 +44,21 @@ function readInternalConsentData() { ]); } +function readGlobalAndExternalConsentData(config) { + return Promise.all([ + readVendorConsentCookie(), + readExternalConsentData(config) + ]); +} + export function init(configUpdates) { config.update(configUpdates); log.debug('Using configuration:', config); // Fetch the current vendor consent before initializing - return (config.getConsentData ? readExternalConsentData(config) : readInternalConsentData()) - .then(([vendorConsentData, pubVendorsList, publisherConsentData]) => { + // return ((config.getConsentData) ? readExternalConsentData(config) : readInternalConsentData()) + return readGlobalAndExternalConsentData(config) // ToDo - it is temporary solution + .then(([globalVendorConsentData, [vendorConsentData, pubVendorsList, publisherConsentData]]) => { const {vendors} = pubVendorsList || {}; // Check config for allowedVendorIds then the pubVendorList @@ -64,6 +72,7 @@ export function init(configUpdates) { cmpId: CMP_ID, cookieVersion: COOKIE_VERSION, vendorConsentData, + globalVendorConsentData, publisherConsentData, pubVendorsList, allowedVendorIds @@ -105,6 +114,12 @@ export function init(configUpdates) { fetchGlobalVendorList().then(store.updateVendorList), fetchPurposeList().then(store.updateCustomPurposeList) ]).then((params) => { + //Update consent data if cookie on global domain exists + if (store.persistedGlobalVendorConsentData) { + store.mergeVendorConsentsFromGlobalCookie(); + store.mergePurposeConsentsFromGlobalCookie(); + } + cmp.cmpReady = true; cmp.notify('cmpReady'); return params[0]; diff --git a/src/lib/store.js b/src/lib/store.js index 7a23cf08..b4054b21 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -1,4 +1,4 @@ -import { writePublisherConsentCookie, writeVendorConsentCookie, encodePublisherConsentData, encodeVendorConsentData } from "./cookie/cookie"; +import { writePublisherConsentCookie, writeVendorConsentCookie, readVendorConsentCookie, encodePublisherConsentData, encodeVendorConsentData } from "./cookie/cookie"; import config from './config'; import { findLocale } from './localize'; import log from './log'; @@ -27,6 +27,7 @@ export default class Store { cmpVersion = 1, cookieVersion = 1, vendorConsentData, + globalVendorConsentData, publisherConsentData, vendorList, customPurposeList, @@ -36,7 +37,9 @@ export default class Store { // Keep track of data that has already been persisted this.persistedVendorConsentData = copyData(vendorConsentData); this.persistedPublisherConsentData = copyData(publisherConsentData); + this.persistedGlobalVendorConsentData = copyData(globalVendorConsentData); + const consentLanguage = findLocale().substr(0, 2).toUpperCase(); this.vendorConsentData = Object.assign( { selectedPurposeIds: new Set(), @@ -47,9 +50,23 @@ export default class Store { cookieVersion, cmpId, cmpVersion, - consentLanguage: findLocale().substr(0, 2).toUpperCase() + consentLanguage }); + this.globalVendorConsentData = Object.assign( + { + selectedPurposeIds: new Set(), + selectedVendorIds: new Set() + }, + globalVendorConsentData, + { + cookieVersion, + cmpId, + cmpVersion, + consentLanguage + } + ); + this.publisherConsentData = Object.assign( { selectedCustomPurposeIds: new Set() @@ -59,7 +76,7 @@ export default class Store { cookieVersion, cmpId }); - + this.globalVendorIdsPresentOnList = new Map(); this.pubVendorsList = pubVendorsList; this.allowedVendorIds = new Set(allowedVendorIds); this.isConsentToolShowing = false; @@ -251,22 +268,27 @@ export default class Store { persist = () => { const { vendorConsentData, + globalVendorConsentData, publisherConsentData, vendorList, customPurposeList } = this; const { - vendorListVersion = 1 + vendorListVersion = 1, + globalVendorListVersion = 1 } = vendorList || {}; // Update modification dates and write the cookies const now = new Date(); vendorConsentData.created = vendorConsentData.created || now; vendorConsentData.lastUpdated = now; + globalVendorConsentData.created = globalVendorConsentData.created || now; + globalVendorConsentData.lastUpdated = now; // Update version of list to one we are using vendorConsentData.vendorListVersion = vendorListVersion; + globalVendorConsentData.vendorListVersion = globalVendorListVersion; publisherConsentData.vendorListVersion = vendorListVersion; publisherConsentData.created = publisherConsentData.created || now; @@ -295,14 +317,20 @@ export default class Store { } catch (err) { log.error('Failed writing external consent data', err); } - } else { - // Write vendor cookie to appropriate domain - writeVendorConsentCookie(vendorConsents); - + } else if (config.storePublisherData) { // Write publisher cookie if enabled - if (config.storePublisherData) { - writePublisherConsentCookie(publisherConsents); - } + writePublisherConsentCookie(publisherConsents); + } + + // Write vendor cookie to appropriate domain + if (config.storeConsentGlobally) { + this.mergeVendorConsentsToGlobalCookie(); + this.mergePurposeConsentsToGlobalCookie(); + + const globalVendorConsents = {...globalVendorConsentData, vendorList}; + writeVendorConsentCookie(globalVendorConsents); + + this.persistedGlobalVendorConsentData = copyData(globalVendorConsentData); } // Store the persisted data @@ -442,6 +470,11 @@ export default class Store { purposes = [], } = vendorList || {}; + //collection of global and local vendor ids [global id, local id] + this.globalVendorIdsPresentOnList = new Map(vendors.filter(vendor => vendor.external_id).map( vendor => { + return [vendor.external_id, vendor.id]; + })); + // If vendor consent data has never been persisted set default selected status if (!created) { this.vendorConsentData.selectedPurposeIds = new Set(purposes.map(p => p.id)); @@ -459,6 +492,14 @@ export default class Store { const {selectedVendorIds = new Set()} = this.vendorConsentData; + const { + selectedVendorIds : selectedGlobalVendorIds = new Set(), + maxVendorId : maxGlobalVendorId = 0 } = this.globalVendorConsentData; + + //Find the maxVendorId for globalVendor + this.globalVendorConsentData.maxVendorId = Math.max( maxGlobalVendorId, + ...vendors.map(({external_id}) => external_id || 0), + ...arrayFrom(selectedGlobalVendorIds)); // Find the maxVendorId out of the vendor list and selectedVendorIds this.vendorConsentData.maxVendorId = Math.max(maxVendorId, @@ -483,4 +524,52 @@ export default class Store { this.customPurposeList = customPurposeList; this.storeUpdate(); }; + + mergeVendorConsentsFromGlobalCookie = () => { + let selectedLocalIdsOfGlobalVendorInGlobalCookie = new Set(); + let selectedLocalIdsOfGlobalVendorInLocalCookie = new Set(); + const selectedGlobalVendorIdsInGlobalCookie = this.globalVendorConsentData.selectedVendorIds; + const globalCookieMaxVendorId = this.persistedGlobalVendorConsentData.maxVendorId; + + this.globalVendorIdsPresentOnList.forEach( (localId, globalId) => { + if (this.vendorConsentData.selectedVendorIds.has(localId) && globalId <= globalCookieMaxVendorId) { + selectedLocalIdsOfGlobalVendorInLocalCookie.add(localId); + } + }); + + selectedGlobalVendorIdsInGlobalCookie.forEach( globalId => { + if (this.globalVendorIdsPresentOnList.has(globalId)) { + selectedLocalIdsOfGlobalVendorInGlobalCookie.add(this.globalVendorIdsPresentOnList.get(globalId)); + } + }); + + selectedLocalIdsOfGlobalVendorInLocalCookie.forEach( localId => { + const isNewVendorOnList = this.persistedVendorConsentData && localId > this.persistedVendorConsentData.maxVendorId; + + if (!isNewVendorOnList && !selectedLocalIdsOfGlobalVendorInGlobalCookie.has(localId)) { + this.vendorConsentData.selectedVendorIds.delete(localId); + } + }); + }; + + mergeVendorConsentsToGlobalCookie = () => { + this.globalVendorIdsPresentOnList.forEach( (localId, globalId) => { + if (this.vendorConsentData.selectedVendorIds.has(localId)) { + this.globalVendorConsentData.selectedVendorIds.add(globalId); + } else { + this.globalVendorConsentData.selectedVendorIds.delete(globalId); + } + }); + }; + + mergePurposeConsentsFromGlobalCookie = () => { + const selectedPurposeIds = Array.from(this.vendorConsentData.selectedPurposeIds); + this.vendorConsentData.selectedPurposeIds = new Set(selectedPurposeIds.filter( id => ( + this.globalVendorConsentData.selectedPurposeIds.has(id) || config.legIntPurposeIds.includes(id) + ))); + }; + + mergePurposeConsentsToGlobalCookie = () => { + this.globalVendorConsentData.selectedPurposeIds = new Set(...this.vendorConsentData.selectedPurposeIds); + }; } From ff5d8481b01271f7333eea4e86765a81ee075b1c Mon Sep 17 00:00:00 2001 From: aszydlo Date: Fri, 8 Nov 2019 08:36:16 +0100 Subject: [PATCH 132/540] code smell --- src/lib/store.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index b4054b21..4ff6c199 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -471,7 +471,7 @@ export default class Store { } = vendorList || {}; //collection of global and local vendor ids [global id, local id] - this.globalVendorIdsPresentOnList = new Map(vendors.filter(vendor => vendor.external_id).map( vendor => { + this.globalVendorIdsPresentOnList = new Map(vendors.filter(vendor => vendor.external_id).map(vendor => { return [vendor.external_id, vendor.id]; })); @@ -497,7 +497,7 @@ export default class Store { maxVendorId : maxGlobalVendorId = 0 } = this.globalVendorConsentData; //Find the maxVendorId for globalVendor - this.globalVendorConsentData.maxVendorId = Math.max( maxGlobalVendorId, + this.globalVendorConsentData.maxVendorId = Math.max(maxGlobalVendorId, ...vendors.map(({external_id}) => external_id || 0), ...arrayFrom(selectedGlobalVendorIds)); @@ -528,18 +528,14 @@ export default class Store { mergeVendorConsentsFromGlobalCookie = () => { let selectedLocalIdsOfGlobalVendorInGlobalCookie = new Set(); let selectedLocalIdsOfGlobalVendorInLocalCookie = new Set(); - const selectedGlobalVendorIdsInGlobalCookie = this.globalVendorConsentData.selectedVendorIds; const globalCookieMaxVendorId = this.persistedGlobalVendorConsentData.maxVendorId; this.globalVendorIdsPresentOnList.forEach( (localId, globalId) => { if (this.vendorConsentData.selectedVendorIds.has(localId) && globalId <= globalCookieMaxVendorId) { selectedLocalIdsOfGlobalVendorInLocalCookie.add(localId); } - }); - - selectedGlobalVendorIdsInGlobalCookie.forEach( globalId => { - if (this.globalVendorIdsPresentOnList.has(globalId)) { - selectedLocalIdsOfGlobalVendorInGlobalCookie.add(this.globalVendorIdsPresentOnList.get(globalId)); + if (this.globalVendorConsentData.selectedVendorIds.has(globalId)) { + selectedLocalIdsOfGlobalVendorInGlobalCookie.add(localId); } }); From a3f5155020921b5c0f856be95749e27df134c9b9 Mon Sep 17 00:00:00 2001 From: aszydlo Date: Fri, 8 Nov 2019 10:42:21 +0100 Subject: [PATCH 133/540] writeVendorConsentCookie --- src/lib/store.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 4ff6c199..8ffae5b0 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -323,15 +323,13 @@ export default class Store { } // Write vendor cookie to appropriate domain - if (config.storeConsentGlobally) { - this.mergeVendorConsentsToGlobalCookie(); - this.mergePurposeConsentsToGlobalCookie(); + this.mergeVendorConsentsToGlobalCookie(); + this.mergePurposeConsentsToGlobalCookie(); - const globalVendorConsents = {...globalVendorConsentData, vendorList}; - writeVendorConsentCookie(globalVendorConsents); + const globalVendorConsents = {...globalVendorConsentData, vendorList}; + writeVendorConsentCookie(globalVendorConsents); - this.persistedGlobalVendorConsentData = copyData(globalVendorConsentData); - } + this.persistedGlobalVendorConsentData = copyData(globalVendorConsentData); // Store the persisted data this.persistedVendorConsentData = copyData(vendorConsentData); From 91e5544705ef7dd9ad97c9fc50ba244abc77c8ce Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 8 Nov 2019 12:07:59 +0100 Subject: [PATCH 134/540] Refactor translations --- src/components/popup/details/vendors/vendors.jsx | 6 +++--- src/lib/translations.js | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 016ac1c1..d762b310 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -106,19 +106,19 @@ export default class Vendors extends Component {
    {purposeIds && !!purposeIds.length && - {': '} + Purposes{': '} {this.getActiveAttributesNameElements(purposes, purposeIds, 'purposes.purpose')}{'. '} } {legIntPurposeIds && !!legIntPurposeIds.length && - {': '} + Legitimate interest purposes{': '} {this.getActiveAttributesNameElements(purposes, legIntPurposeIds, 'purposes.purpose')}{'. '} } {featureIds && !!featureIds.length && - {': '} + Features{': '} {this.getActiveAttributesNameElements(features, featureIds, 'features.feature')}{'. '} } diff --git a/src/lib/translations.js b/src/lib/translations.js index e053c8d4..70df71f8 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -93,7 +93,6 @@ export default { showVendors: 'Pokaż listę Zaufanych Partnerów', showCustomVendors: 'Pokaż listę pozostałych Zaufanych Partnerów', title: 'Cele', - legitimateInterestTitle: 'Cele uzasadnione prawnie', purpose1: { menu: '', title: 'Przechowywanie i dostęp do informacji', @@ -143,7 +142,10 @@ export default { company: 'Partner', offOn: 'Akceptuję', description: 'Poniżej znajduje się lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez naszych Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „Zmień ustawienia Zaufanych Partnerów” i odznacz wybraną opcję.', - moreChoices: 'Zmień ustawienia Zaufanych Partnerów' + moreChoices: 'Zmień ustawienia Zaufanych Partnerów', + purposes: 'Cele przetwarzania', + legitimateInterestPurposes: 'Cele przetwarzania na podstawie uzasadnionego interesu', + features: 'Funkcje' }, footer: { message: 'Zmień swoje ustawienia prywatności klikając', From e2ac98a650c57eb1faf18d6892aa79a697774f83 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Fri, 8 Nov 2019 12:46:29 +0100 Subject: [PATCH 135/540] reorganized --- .../popup/details/purposes/feature.jsx | 37 +++++++++ .../popup/details/purposes/purpose.jsx | 60 ++++++++++++++ .../popup/details/purposes/purposes.jsx | 80 +------------------ .../popup/details/purposes/purposes.less | 46 ++++++----- 4 files changed, 129 insertions(+), 94 deletions(-) create mode 100644 src/components/popup/details/purposes/feature.jsx create mode 100644 src/components/popup/details/purposes/purpose.jsx diff --git a/src/components/popup/details/purposes/feature.jsx b/src/components/popup/details/purposes/feature.jsx new file mode 100644 index 00000000..9e73f7e6 --- /dev/null +++ b/src/components/popup/details/purposes/feature.jsx @@ -0,0 +1,37 @@ +import { h } from 'preact'; +import style from "./purposes.less"; +import Label from "../../../label/label"; + +class LocalLabel extends Label { + static defaultProps = { + prefix: 'features' + }; +} + +const Feature = (props) => { + const { + feature, + createOnShowVendors + } = props; + + return ( + + ); +}; + +export default Feature; diff --git a/src/components/popup/details/purposes/purpose.jsx b/src/components/popup/details/purposes/purpose.jsx new file mode 100644 index 00000000..4ac0116c --- /dev/null +++ b/src/components/popup/details/purposes/purpose.jsx @@ -0,0 +1,60 @@ +import { h } from 'preact'; +import style from "./purposes.less"; +import Label from "../../../label/label"; +import Switch from '../../../switch/switch'; + + +class LocalLabel extends Label { + static defaultProps = { + prefix: 'purposes' + }; +} + +const Purpose = (props) => { + const { + purpose, + index, + isActive, + onToggle, + createOnShowVendors, + isTechnical, + isPublisherPurpose = false + } = props; + + return ( +
    +
    +
    + {purpose.name} +
    + {!isTechnical && +
    + {isActive ? 'Active' : 'Inactive'} + +
    + } +
    +
    + + {!isPublisherPurpose && ( + + )} +
    +
    + ); +}; + +export default Purpose; diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 949755d1..a90581e8 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -1,8 +1,9 @@ import { h, Component } from 'preact'; import style from './purposes.less'; -import Switch from '../../../switch/switch'; import Label from "../../../label/label"; import config from '../../../../lib/config'; +import Feature from './feature'; +import Purpose from "./purpose"; const TABS = [ 'Publisher informations', @@ -15,79 +16,6 @@ class LocalLabel extends Label { }; } -const Purpose = (props) => { - const { - purpose, - index, - isActive, - onToggle, - createOnShowVendors, - isTechnical, - isPublisherPurpose = false - } = props; - - return ( -
    -
    -
    - {purpose.name} -
    - {!isTechnical && -
    - {isActive ? 'Active' : 'Inactive'} - -
    - } -
    -
    - - {!isPublisherPurpose && ( - - )} -
    -
    - ); -}; - -const Feature = (props) => { - const { - feature, - createOnShowVendors - } = props; - - return ( - - ); -}; - export default class Purposes extends Component { state = { selectedTabIndex: 0, @@ -230,7 +158,7 @@ export default class Purposes extends Component {
    ) : (
    -
    +
    @@ -250,7 +178,7 @@ export default class Purposes extends Component { createOnShowVendors={this.createOnShowVendors.bind(this)} onToggle={this.handleSelectPurpose}/>)}
    -
    +
    diff --git a/src/components/popup/details/purposes/purposes.less b/src/components/popup/details/purposes/purposes.less index 6ec79939..051e333a 100644 --- a/src/components/popup/details/purposes/purposes.less +++ b/src/components/popup/details/purposes/purposes.less @@ -40,44 +40,51 @@ overflow: scroll; height: 47vh; } - } - .vendorsSection { - margin: 20px 0; - .header { - font-size: 22px; - font-weight: 700; - flex: 0 0 100%; - display: inline-block; - margin: 5% 0; + .purposesSection { + border-bottom: 1px solid #eaeaea; + + &:not(:first-child) { + margin: 3% 0; + } + + &:last-child { + border: none; + } + + .header { + font-size: 22px; + font-weight: 700; + flex: 0 0 100%; + display: inline-block; + } } } - .publisherSection { - border-bottom: 1px solid #eaeaea; - } + .sectionInfo { + & > div { + margin-bottom: 3%; + } - .sectionHeader{ + .sectionHeader { display: flex; flex-wrap: wrap; .title { - font-size: 24px; + font-size: 22px; font-weight: bold; flex: 0 0 100%; + @media @smartphone { font-size: 20px; padding-bottom: 5px; } } } - .sectionBody { - margin: 3% 0; - } } .purposeDetail { - margin-bottom: 3%; + margin: 3% 0; overflow: auto; height: auto; @@ -85,6 +92,7 @@ display: flex; flex-wrap: wrap; } + .title { font-size: 24px; font-weight: bold; @@ -94,6 +102,7 @@ padding-bottom: 5px; } } + .active { color: @color-primary; font-weight: bold; @@ -103,6 +112,7 @@ flex: 1 1 auto; } } + .body { margin: 5% 0; } From 003673d4592c7f7a4a3928328091cafa9c6803d1 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Fri, 8 Nov 2019 14:10:24 +0100 Subject: [PATCH 136/540] first tab translations --- .../popup/details/purposes/purposes.less | 2 +- src/lib/translations.js | 23 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.less b/src/components/popup/details/purposes/purposes.less index 051e333a..9688515c 100644 --- a/src/components/popup/details/purposes/purposes.less +++ b/src/components/popup/details/purposes/purposes.less @@ -57,6 +57,7 @@ font-weight: 700; flex: 0 0 100%; display: inline-block; + margin: 3% 0; } } } @@ -84,7 +85,6 @@ } .purposeDetail { - margin: 3% 0; overflow: auto; height: auto; diff --git a/src/lib/translations.js b/src/lib/translations.js index 12ab7877..3e776ff2 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -69,23 +69,34 @@ export default { }, tabs: { tab1: { - menu: 'Informacje wydawcy', - title: 'Lorem ipsum dolor sit amet', - description: '

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc fringilla nisl erat, sodales molestie tortor accumsan sed. Vivamus at massa suscipit, ornare magna quis, tincidunt ante. Sed at enim vel est aliquet pharetra ut vehicula enim. In scelerisque justo orci, ac vehicula ligula finibus blandit. Vivamus non convallis nunc. Integer vitae vestibulum est, at scelerisque diam. Morbi blandit a erat vitae fermentum. Duis pulvinar pretium hendrerit. Vestibulum ligula justo, mattis nec tortor eu, dictum tempor urna. Quisque varius finibus neque vitae pellentesque. Curabitur pharetra vitae neque porta blandit. Suspendisse commodo lacinia sapien, ac egestas neque pharetra ut. Sed in tincidunt urna, id porttitor ipsum. In neque tortor, condimentum at est sed, tempor dignissim odio. Pellentesque suscipit, quam sit amet efficitur facilisis, enim nibh rhoncus nulla, id malesuada lectus ante et justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

    ', + menu: 'Informacje ogólne', + title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', + description: `

    Znajdujesz się z szczegółowej sekcji mechanizmu umożliwiającego zarządzanie procesami przetwarzania Twoich danych osobowych na stronach internetowych i innych narzędziach udostępnianych przez podmioty z Grupy Ringier Axel Springer Polska.

    + +

    W zakładce widocznej poniżej uzyskasz niezbędne informacje o celach, zakresach i podstawach przetwarzania Twoich danych osobowych, administratorach tych danych oraz będziesz mogła/mógł zarządzić tym przetwarzaniem.

    + +

    Możesz w niej określić którym z Zaufanych Partnerów chcesz wyrazić zgodę na przetwarzanie Twoich danych osobowych, a także ustalić cele przetwarzania których dotyczyć ma Twoja zgoda – służy do tego suwak. Pozostawienie suwaka odznaczonego (ma on wtedy kolor szary) oznacza brak zgody, zaś kliknięcie w suwak powodować będzie wyrażenie zgody (suwak zmieni wtedy kolor na żółty), której on dotyczy – jej zakres jest podany przy danym suwaku. Pamiętaj, by potwierdzić Twój wybór klikając po dokonaniu wybranych przez Ciebie ustawień w przycisk „Zapisz i zamknij”.

    \ + +

    Niektórzy z Zaufanych Partnerów przetwarzać mogą Twoje dane w oparciu o ich uzasadniony interes. W takim wypadku nie udzielasz im zgody na przetwarzanie Twoich danych, ale możesz wyrazić sprzeciw wobec takiego przetwarzania.

    + +

    W zakładce „Przetwarzanie danych osobowych” dowiesz się także jak wykorzystywane są technologie cookies i podobne oraz jak zablokować ich działanie w Twojej przeglądarce.

    + +

    W razie jakichkolwiek wątpliwości zapraszamy do kontaktu na adres iod@grupaonet.pl. Pomocne informacje znajdziesz także zawsze w naszej Polityce Prywatności

    +`, }, tab2: { - menu: 'Cele i funkcje przetwarzania danych osobowych', + menu: 'Przetwarzanie danych osobowych', title: '', description: '', } }, publisherConsents: { title: "Zgody dla wydawcy", - description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc fringilla nisl erat, sodales molestie tortor accumsan sed.', + description: '', }, vendorConsents: { title: "Zgody dla partnerów", - description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc fringilla nisl erat, sodales molestie tortor accumsan sed.', + description: '', }, purposes: { active: 'Aktywna', From 214709987e2d5209ebf9f7d8891b180602b55425 Mon Sep 17 00:00:00 2001 From: aszydlo Date: Fri, 8 Nov 2019 15:04:52 +0100 Subject: [PATCH 137/540] mark vendor consent to true if has consent in global cookie --- src/lib/store.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/store.js b/src/lib/store.js index 8ffae5b0..c9bb9166 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -534,6 +534,7 @@ export default class Store { } if (this.globalVendorConsentData.selectedVendorIds.has(globalId)) { selectedLocalIdsOfGlobalVendorInGlobalCookie.add(localId); + this.vendorConsentData.selectedVendorIds.add(localId); } }); From 180318c4a13dea513ffb4da1e19a8183e4663082 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Fri, 8 Nov 2019 15:21:12 +0100 Subject: [PATCH 138/540] tabs refactored --- .../popup/details/purposes/purposes.jsx | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 8a4e5a47..45d35188 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -5,10 +5,8 @@ import config from '../../../../lib/config'; import Feature from './feature'; import Purpose from "./purpose"; -const TABS = [ - 'Publisher informations', - 'Purposes & Features' -]; +const PUBLISHER_INFO = 0; +const CONSENTS = 1; class LocalLabel extends Label { static defaultProps = { @@ -137,13 +135,17 @@ export default class Purposes extends Component { return (
    - {TABS.map((tab, index) => ( -
    - -
    - ))} +
    + +
    +
    + +
    {!selectedTabIndex ? (
    From e8029f01dbb9178b30bd043a3952e43b533ba09d Mon Sep 17 00:00:00 2001 From: skoklowski Date: Fri, 8 Nov 2019 16:29:47 +0100 Subject: [PATCH 139/540] Removing SR translation --- src/lib/translations.js | 54 ----------------------------------------- 1 file changed, 54 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index d009090a..f098dab0 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -95,59 +95,5 @@ export default { message: 'Zmień swoje ustawienia prywatności klikając', consentLink: 'tutaj' } - }, - sr: { - intro: { - title: 'Hvala na poseti', - description: 'Da bismo bili u mogućnosti da održimo uspešno poslovanje portala, mi i određene treće strane postavljamo kolačiće, pristupamo i čuvamo informacije na Vašem uređaju za različite svrhe. Naši partneri takođe prikupljaju podatke da bi Vam prikazali personalizovani sadržaj i oglase. Neki od naših partnera traže i Vašu saglasnost za prikupljanje podataka da bismo Vam omogućili bolje korisničko iskustvo.', - acceptAll: 'Prihvatam, hvala!', - showPurposes: 'Odaberi svoje postavke' - }, - details: { - title: 'Postavke korisnika', - back: 'Nazad', - save: 'Snimi i izađi' - }, - purposes: { - active: 'Aktivno', - inactive: 'Neaktivno', - showVendors: 'Prikaži celu listu partnera', - purpose1: { - menu: 'Skladištenje i pristup informacijama', - title: 'Skladištenje i pristup informacijama', - description: 'Sladištenje informacija ili pristup tim informacijama, na Vašem uređaju, kao što su oglasni identifikatori, i/ili korišćenje kolačića i slične tehnologije' - }, - purpose2: { - menu: 'Personalizacija', - title: 'Personalizacija', - description: 'Prikupljanje i obrada informacija o Vašoj upotrebi ove web stranice kako bi se kasnije personalizovalo oglašavanje za Vas u drugim kontekstima, tj. na drugim web lokacijama ili aplikacijama. Sadržaj web lokacije ili aplikacije se obično koristi kako bi se profilisala Vaša interesovanja koja određuju Vaše buduće izbore.' - }, - purpose3: { - menu: 'Izbor oglasa, isporuka, izveštavanje', - title: 'Izbor oglasa, isporuka, izveštavanje', - description: 'Prikupljanje informacija i ukrštanje sa prethodno prikupljenim informacijama za odabir i isporuku oglasa relevantnih za Vas, kao i za merenje isporuke i efikasnosti takvih oglasa. To uključuje upotrebu prethodno prikupljenih informacija o Vašim interesovanjima za odabir oglasa, obradu podataka o tome koji su oglasi prikazani, koliko često su oni prikazani, kada i gde su prikazani, i da li ste preduzeli bilo kakvu radnju u vezi sa oglasom, uključujući na primer klik na oglas ili kupovina.' - }, - purpose4: { - menu: 'Izbor Vašeg sadržaja, isporuka i izveštaji', - title: 'Izbor Vašeg sadržaja, isporuka i izveštaji', - description: 'Prikupljanje informacija i ukrštanje sa prethodno prikupljenim informacijama za izbor i isporuku sadržaja za Vas i za merenje isporuke i efikasnosti takvog sadržaja. Ovo uključuje upotrebu prethodno prikupljenih informacija o Vašim interesovanjima za izbor sadržaja, obradu podataka o tome koji je sadržaj prikazan, koliko često ili koliko dugo je prikazivan, kada i gde je prikazan, i da li ste preduzeli bilo kakvu radnju vezanu za sadržaj, uključujući na primer klik na sadržaj.' - }, - purpose5: { - menu: 'Merenje', - title: 'Merenje', - description: 'Prikupljanje informacija o Vašem izboru sadržaja i kombinacija sa prethodno prikupljenim informacijama koje se koriste za merenje, razumevanje i izveštavanje o Vašoj preferencijama sadržaja.' - } - }, - vendors: { - title: 'Naši partneri', - company: 'Kompanija', - offOn: 'Dozvoli', - description: 'Pomozite nam da vam pružimo bolje iskustvo na našem sajtu! Naši partneri postavljaju kolačiće i prikupljaju informacije iz Vašeg pretraživača kako bi Vam pružili sadržaj web lokacija i isporučili relevantno oglašavanje', - moreChoices: 'Više opcija' - }, - footer: { - message: 'Podsetnik da uvek možete promeniti Vaša podešavanja', - consentLink: 'ovde' - } } }; From 5f1ffac0f0297576442b346ce72907a681b6d569 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Fri, 8 Nov 2019 16:59:31 +0100 Subject: [PATCH 140/540] fixes after code review --- .../popup/details/purposes/purposes.jsx | 66 ++++++++----------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 45d35188..447e4782 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -5,8 +5,8 @@ import config from '../../../../lib/config'; import Feature from './feature'; import Purpose from "./purpose"; -const PUBLISHER_INFO = 0; -const CONSENTS = 1; +const TAB_PUBLISHER_INFO = 0; +const TAB_CONSENTS = 1; class LocalLabel extends Label { static defaultProps = { @@ -16,7 +16,7 @@ class LocalLabel extends Label { export default class Purposes extends Component { state = { - selectedTabIndex: 0, + selectedTab: 0, renderedTabIndices: new Set() }; @@ -29,10 +29,10 @@ export default class Purposes extends Component { selectedCustomPurposeIds: new Set() }; - handleSelectTab = index => { + handleSelectTab = tab => { return () => { this.setState({ - selectedTabIndex: index + selectedTab: tab }); }; }; @@ -98,56 +98,48 @@ export default class Purposes extends Component { const {created} = persistedVendorConsentData; const { - selectedTabIndex, + selectedTab, renderedTabIndices } = state; const allPurposes = this.getAllPurposes(); - const purposeIsActive = (index) => { - const selectedPurpose = allPurposes[index]; + const purposeIsActive = (purpose) => purpose && purpose.custom ? + selectedCustomPurposeIds.has(purpose.id) : + selectedPurposeIds.has(purpose.id); - return selectedPurpose && selectedPurpose.custom ? - selectedCustomPurposeIds.has(selectedPurpose.id) : - selectedPurposeIds.has(selectedPurpose.id); - }; - - const purposeIsTechnical = (index) => { - const selectedPurpose = allPurposes[index]; - - return config.legIntPurposeIds && - config.contractPurposeIds && - selectedPurpose && !selectedPurpose.custom && - config.legIntPurposeIds.indexOf(selectedPurpose.id) >= 0 || - config.contractPurposeIds.indexOf(selectedPurpose.id) >= 0; - }; + const purposeIsTechnical = (purpose) => config.legIntPurposeIds && + config.contractPurposeIds && + purpose && !purpose.custom && + config.legIntPurposeIds.indexOf(purpose.id) >= 0 || + config.contractPurposeIds.indexOf(purpose.id) >= 0; - if (!created && selectedTabIndex === 1 && !renderedTabIndices.has(selectedTabIndex)) { - renderedTabIndices.add(selectedTabIndex); + if (!created && selectedTab === TAB_CONSENTS && !renderedTabIndices.has(selectedTab)) { + renderedTabIndices.add(selectedTab); // TODO: differentiate publisher purposes from vendor purposes (publisher leg int purpose should not be unselected) - for (let i = 0, j = purposes.length; i { + if (!purposeIsTechnical(purpose)) { + this.handleSelectPurpose({isSelected: false, dataId: index}); } - } + }); } return (
    -
    - {!selectedTabIndex ? ( + {!selectedTab ? (
    @@ -169,7 +161,7 @@ export default class Purposes extends Component {
    -
    +
    @@ -177,8 +169,8 @@ export default class Purposes extends Component { index={index} isPublisherPurpose={true} purpose={purpose} - isActive={purposeIsActive(index)} - isTechnical={purposeIsTechnical(index)} + isActive={purposeIsActive(purpose)} + isTechnical={purposeIsTechnical(purpose)} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggle={this.handleSelectPurpose}/>)}
    @@ -198,7 +190,7 @@ export default class Purposes extends Component { {purposes.map((purpose, index) => )} From c0b4f6ba85f0520ef63e99af37ef6dc81812df6b Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Fri, 8 Nov 2019 17:01:20 +0100 Subject: [PATCH 141/540] selectedTab in initial state --- src/components/popup/details/purposes/purposes.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 447e4782..beeea77d 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -16,7 +16,7 @@ class LocalLabel extends Label { export default class Purposes extends Component { state = { - selectedTab: 0, + selectedTab: TAB_PUBLISHER_INFO, renderedTabIndices: new Set() }; From 85ffe67aea15248f2013d6fe61ca5e176ed56aac Mon Sep 17 00:00:00 2001 From: aszydlo Date: Mon, 11 Nov 2019 17:02:06 +0100 Subject: [PATCH 142/540] eslint fix --- src/lib/init.js | 18 ++++++++++-------- src/lib/store.js | 26 +++++++++++++++----------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index f09d9fdf..63c2e180 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -38,16 +38,19 @@ function readExternalConsentData(config) { function readInternalConsentData() { return Promise.all([ - readVendorConsentCookie(), - fetchPubVendorList(), - readPublisherConsentCookie() + [ + readVendorConsentCookie(), + fetchPubVendorList(), + readPublisherConsentCookie() + ], + undefined ]); } function readGlobalAndExternalConsentData(config) { return Promise.all([ - readVendorConsentCookie(), - readExternalConsentData(config) + readExternalConsentData(config), + readVendorConsentCookie() ]); } @@ -56,9 +59,8 @@ export function init(configUpdates) { log.debug('Using configuration:', config); // Fetch the current vendor consent before initializing - // return ((config.getConsentData) ? readExternalConsentData(config) : readInternalConsentData()) - return readGlobalAndExternalConsentData(config) // ToDo - it is temporary solution - .then(([globalVendorConsentData, [vendorConsentData, pubVendorsList, publisherConsentData]]) => { + return ((config.getConsentData) ? readGlobalAndExternalConsentData(config) : readInternalConsentData()) + .then(([[vendorConsentData, pubVendorsList, publisherConsentData], globalVendorConsentData]) => { const {vendors} = pubVendorsList || {}; // Check config for allowedVendorIds then the pubVendorList diff --git a/src/lib/store.js b/src/lib/store.js index c9bb9166..53a5e126 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -1,4 +1,4 @@ -import { writePublisherConsentCookie, writeVendorConsentCookie, readVendorConsentCookie, encodePublisherConsentData, encodeVendorConsentData } from "./cookie/cookie"; +import { writePublisherConsentCookie, writeVendorConsentCookie,encodePublisherConsentData, encodeVendorConsentData } from "./cookie/cookie"; import config from './config'; import { findLocale } from './localize'; import log from './log'; @@ -317,19 +317,23 @@ export default class Store { } catch (err) { log.error('Failed writing external consent data', err); } - } else if (config.storePublisherData) { - // Write publisher cookie if enabled - writePublisherConsentCookie(publisherConsents); - } + // Write vendor cookie to appropriate domain + this.mergeVendorConsentsToGlobalCookie(); + this.mergePurposeConsentsToGlobalCookie(); - // Write vendor cookie to appropriate domain - this.mergeVendorConsentsToGlobalCookie(); - this.mergePurposeConsentsToGlobalCookie(); + const globalVendorConsents = {...globalVendorConsentData, vendorList}; + writeVendorConsentCookie(globalVendorConsents); - const globalVendorConsents = {...globalVendorConsentData, vendorList}; - writeVendorConsentCookie(globalVendorConsents); + this.persistedGlobalVendorConsentData = copyData(globalVendorConsentData); + } else { + // Write vendor cookie to appropriate domain + writeVendorConsentCookie(vendorConsents); - this.persistedGlobalVendorConsentData = copyData(globalVendorConsentData); + // Write publisher cookie if enabled + if (config.storePublisherData) { + writePublisherConsentCookie(publisherConsents); + } + } // Store the persisted data this.persistedVendorConsentData = copyData(vendorConsentData); From 676cef6d0c1789dde95bc27a592df68cc4c83438 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 12 Nov 2019 11:02:21 +0100 Subject: [PATCH 143/540] Prevent layout from collapsing vendor links in case of "display: inline-block" style --- src/components/popup/details/purposes/purposes.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index b511f693..301b6570 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -161,10 +161,10 @@ export default class Purposes extends Component {
    From 50d9910bbed7a635c99e0d406522a5aec5ff56c8 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 12 Nov 2019 11:54:35 +0100 Subject: [PATCH 144/540] Polish translation --- .../popup/details/purposes/purposes.jsx | 4 ++-- src/lib/translations.js | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 301b6570..af4e8d1e 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -161,10 +161,10 @@ export default class Purposes extends Component {
    diff --git a/src/lib/translations.js b/src/lib/translations.js index d009090a..a5442cd4 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -12,21 +12,21 @@ export default {

    Zgoda

    -

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    +

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    -

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    Administrator danych osobowych

    -

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    +

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    Podstawa i cel przetwarzania

    @@ -38,7 +38,7 @@ export default {
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • -
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
  • +
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.

  • @@ -50,11 +50,11 @@ export default {

    Cookies

    -

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    +

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    Twoje uprawnienia

    -

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:

    +

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. @@ -70,8 +70,8 @@ export default { purposes: { active: 'Aktywna', inactive: 'Nieaktywna', - showVendors: 'Pokaż listę Zaufanych Partnerów', - showCustomVendors: 'Pokaż listę pozostałych Zaufanych Partnerów', + showVendors: 'Pokaż listę Zaufanych Partnerów IAB', + showCustomVendors: 'Pokaż listę Zaufanych Partnerów', purpose1: { menu: 'Cookies itp.', title: 'Instalowanie plików cookies itp. na Twoich urządzeniach i dostęp do tych plików.', From a8f486f9daf89344c82768a034f1956f4fe71991 Mon Sep 17 00:00:00 2001 From: mzabek2 Date: Tue, 12 Nov 2019 12:07:36 +0100 Subject: [PATCH 145/540] removed unnecesary divs and added margin-bottom --- src/components/popup/details/purposes/purposes.jsx | 6 ------ src/components/popup/details/purposes/purposes.less | 1 + src/lib/translations.js | 10 ++++------ 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index beeea77d..efe49551 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -161,9 +161,6 @@ export default class Purposes extends Component {

    -
    - -
    {allPurposes.map((purpose, index) =>
    -
    - -
    diff --git a/src/components/popup/details/purposes/purposes.less b/src/components/popup/details/purposes/purposes.less index 9688515c..8c324430 100644 --- a/src/components/popup/details/purposes/purposes.less +++ b/src/components/popup/details/purposes/purposes.less @@ -87,6 +87,7 @@ .purposeDetail { overflow: auto; height: auto; + margin-bottom: 3%; .detailHeader { display: flex; diff --git a/src/lib/translations.js b/src/lib/translations.js index 3e776ff2..2e7c4532 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -91,18 +91,16 @@ export default { } }, publisherConsents: { - title: "Zgody dla wydawcy", - description: '', + title: "Zgody dla Wydawcy", }, vendorConsents: { - title: "Zgody dla partnerów", - description: '', + title: "Zgody dla Partnerów", }, purposes: { active: 'Aktywna', inactive: 'Nieaktywna', - showVendors: 'Pokaż listę Zaufanych Partnerów', - showCustomVendors: 'Pokaż listę pozostałych Zaufanych Partnerów', + showVendors: 'Pokaż listę Zaufanych Partnerów IAB', + showCustomVendors: 'Pokaż listę Zaufanych Partnerów', title: 'Cele', purpose1: { menu: '', From f06eec9b34f46c1c5b3368f7a99b799c6e57ea54 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 12 Nov 2019 13:53:26 +0100 Subject: [PATCH 146/540] Test condition only once --- src/components/popup/details/purposes/purposes.jsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index af4e8d1e..9f389f27 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -160,12 +160,10 @@ export default class Purposes extends Component {
    - {!purposeIsTechnical && - - } - {!purposeIsTechnical && + {!purposeIsTechnical && [ + , - } + ]}
    From 276e7fcebe0aa18cfb116a435c542c2dfc3a9f5a Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 20 Nov 2019 09:20:56 +0100 Subject: [PATCH 147/540] Fix translations after confilct resloution --- src/lib/translations.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index d92d002c..2e11fb57 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -151,7 +151,10 @@ export default { company: 'Partner', offOn: 'Akceptuję', description: 'Poniżej znajduje się lista podmiotów, którym możesz wyrazić zgodę opisaną w poprzednim oknie. Dzięki tej zgodzie możliwe będzie lepsze dopasowania treści i reklam prezentowanych przez naszych Zaufanych Partnerów do Twoich zainteresowań. Jeśli nie wyrażasz zgody danemu Zaufanemu Partnerowi kliknij poniżej w „Zmień ustawienia Zaufanych Partnerów” i odznacz wybraną opcję.', - moreChoices: 'Zmień ustawienia Zaufanych Partnerów' + moreChoices: 'Zmień ustawienia Zaufanych Partnerów', + purposes: 'Cele przetwarzania', + legitimateInterestPurposes: 'Cele przetwarzania na podstawie uzasadnionego interesu', + features: 'Funkcje' }, footer: { message: 'Zmień swoje ustawienia prywatności klikając', From 6d01dbdd987eb5a46bb1ecd71490d3c921301c2f Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 22 Nov 2019 09:27:41 +0100 Subject: [PATCH 148/540] Fix bug and refactor --- src/lib/init.js | 3 +-- src/lib/store.js | 23 +++++++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 63c2e180..9c8506b7 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -42,8 +42,7 @@ function readInternalConsentData() { readVendorConsentCookie(), fetchPubVendorList(), readPublisherConsentCookie() - ], - undefined + ] ]); } diff --git a/src/lib/store.js b/src/lib/store.js index 53a5e126..16fc0862 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -1,4 +1,4 @@ -import { writePublisherConsentCookie, writeVendorConsentCookie,encodePublisherConsentData, encodeVendorConsentData } from "./cookie/cookie"; +import { writePublisherConsentCookie, writeVendorConsentCookie, encodePublisherConsentData, encodeVendorConsentData } from "./cookie/cookie"; import config from './config'; import { findLocale } from './localize'; import log from './log'; @@ -473,9 +473,9 @@ export default class Store { } = vendorList || {}; //collection of global and local vendor ids [global id, local id] - this.globalVendorIdsPresentOnList = new Map(vendors.filter(vendor => vendor.external_id).map(vendor => { - return [vendor.external_id, vendor.id]; - })); + this.globalVendorIdsPresentOnList = new Map(vendors.filter(vendor => vendor.external_id).map( + vendor => [vendor.external_id, vendor.id] + )); // If vendor consent data has never been persisted set default selected status if (!created) { @@ -516,7 +516,7 @@ export default class Store { // If publisher consent has never been persisted set the default selected status if (!created) { - const {purposes = [],} = customPurposeList || {}; + const {purposes = []} = customPurposeList || {}; this.publisherConsentData.selectedCustomPurposeIds = new Set(purposes.map(p => p.id)); } @@ -528,8 +528,8 @@ export default class Store { }; mergeVendorConsentsFromGlobalCookie = () => { - let selectedLocalIdsOfGlobalVendorInGlobalCookie = new Set(); - let selectedLocalIdsOfGlobalVendorInLocalCookie = new Set(); + const selectedLocalIdsOfGlobalVendorInGlobalCookie = new Set(); + const selectedLocalIdsOfGlobalVendorInLocalCookie = new Set(); const globalCookieMaxVendorId = this.persistedGlobalVendorConsentData.maxVendorId; this.globalVendorIdsPresentOnList.forEach( (localId, globalId) => { @@ -562,13 +562,12 @@ export default class Store { }; mergePurposeConsentsFromGlobalCookie = () => { - const selectedPurposeIds = Array.from(this.vendorConsentData.selectedPurposeIds); - this.vendorConsentData.selectedPurposeIds = new Set(selectedPurposeIds.filter( id => ( - this.globalVendorConsentData.selectedPurposeIds.has(id) || config.legIntPurposeIds.includes(id) - ))); + this.vendorConsentData.selectedPurposeIds = new Set([...this.vendorConsentData.selectedPurposeIds].filter( + id => this.globalVendorConsentData.selectedPurposeIds.has(id) || config.legIntPurposeIds.includes(id) + )); }; mergePurposeConsentsToGlobalCookie = () => { - this.globalVendorConsentData.selectedPurposeIds = new Set(...this.vendorConsentData.selectedPurposeIds); + this.globalVendorConsentData.selectedPurposeIds = this.vendorConsentData.selectedPurposeIds; }; } From cbd19a360ea4f00204be45ceb67c1c7a2563cc50 Mon Sep 17 00:00:00 2001 From: skoklowski Date: Mon, 25 Nov 2019 17:53:44 +0100 Subject: [PATCH 149/540] Separating publisher consent data from vendor consent data --- src/components/popup/details/details.jsx | 7 ++- .../popup/details/purposes/feature.jsx | 4 +- .../popup/details/purposes/purpose.jsx | 6 ++- .../popup/details/purposes/purposes.jsx | 52 +++++++++++++------ .../popup/details/purposes/purposes.test.js | 8 +++ src/components/popup/popup.jsx | 1 + src/components/popup/popup.test.js | 2 + src/lib/cmp.test.js | 2 +- src/lib/cookie/cookie.js | 6 ++- src/lib/cookie/cookie.test.js | 1 + src/lib/store.js | 36 ++++++++++--- src/lib/store.test.js | 37 +++++++++++++ 12 files changed, 132 insertions(+), 30 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 933bea93..bc068097 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -76,14 +76,16 @@ export default class Details extends Component { vendorConsentData, publisherConsentData, selectPurpose, + selectStandardPurpose, selectCustomPurpose, selectAllVendors, selectVendor, persistedVendorConsentData = {}, + persistedPublisherConsentData = {}, subsection } = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; - const { selectedCustomPurposeIds } = publisherConsentData; + const { selectedStandardPurposeIds, selectedCustomPurposeIds } = publisherConsentData; const { purposes = [], features = [] } = vendorList; const { purposes: customPurposes = [] } = customPurposeList; @@ -104,11 +106,14 @@ export default class Details extends Component { features={features} customPurposes={customPurposes} selectedPurposeIds={selectedPurposeIds} + selectedStandardPurposeIds={selectedStandardPurposeIds} selectedCustomPurposeIds={selectedCustomPurposeIds} selectPurpose={selectPurpose} + selectStandardPurpose={selectStandardPurpose} selectCustomPurpose={selectCustomPurpose} onShowVendors={this.handleShowVendors} persistedVendorConsentData={persistedVendorConsentData} + persistedPublisherConsentData={persistedPublisherConsentData} /> {
    - + {feature.name}
    - + {feature.description} Show full vendor list diff --git a/src/components/popup/details/purposes/purpose.jsx b/src/components/popup/details/purposes/purpose.jsx index 4ac0116c..24818d2b 100644 --- a/src/components/popup/details/purposes/purpose.jsx +++ b/src/components/popup/details/purposes/purpose.jsx @@ -21,11 +21,13 @@ const Purpose = (props) => { isPublisherPurpose = false } = props; + const prefix = purpose.custom ? `customPurpose${purpose.id}` : `purpose${purpose.id}`; + return (
    - {purpose.name} + {purpose.name}
    {!isTechnical &&
    @@ -39,7 +41,7 @@ const Purpose = (props) => { }
    - + {purpose.description} {!isPublisherPurpose && (
    { + handleSelectPurpose = ({isSelected, dataId}, isPublisher = false) => { const { selectPurpose, + selectStandardPurpose, selectCustomPurpose } = this.props; @@ -49,12 +51,18 @@ export default class Purposes extends Component { if (selectedPurpose) { if (selectedPurpose.custom) { selectCustomPurpose(selectedPurpose.id, isSelected); + } else if (isPublisher) { + selectStandardPurpose(selectedPurpose.id, isSelected); } else { selectPurpose(selectedPurpose.id, isSelected); } } }; + createHandleSelectPurpose = (isPublisher) => { + return (data) => this.handleSelectPurpose(data, isPublisher); + }; + getAllPurposes = () => { const { purposes, @@ -66,6 +74,7 @@ export default class Purposes extends Component { allPurposes.push({ id: purpose.id, name: purpose.name, + description: purpose.description, custom: false }); }); @@ -74,6 +83,7 @@ export default class Purposes extends Component { allPurposes.push({ id: purpose.id, name: purpose.name, + description: purpose.description, custom: true }); }); @@ -89,13 +99,16 @@ export default class Purposes extends Component { const { selectedPurposeIds, + selectedStandardPurposeIds, selectedCustomPurposeIds, purposes, features, - persistedVendorConsentData + persistedVendorConsentData, + persistedPublisherConsentData } = props; - const {created} = persistedVendorConsentData; + const {created: vendorConsentCreated} = persistedVendorConsentData; + const {created: publisherConsentCreated} = persistedPublisherConsentData; const { selectedTab, @@ -104,24 +117,31 @@ export default class Purposes extends Component { const allPurposes = this.getAllPurposes(); - const purposeIsActive = (purpose) => purpose && purpose.custom ? + const purposeIsActive = (purpose, isPublisher = false) => purpose && ( + purpose.custom ? selectedCustomPurposeIds.has(purpose.id) : - selectedPurposeIds.has(purpose.id); + (isPublisher ? selectedStandardPurposeIds : selectedPurposeIds).has(purpose.id) + ); const purposeIsTechnical = (purpose) => config.legIntPurposeIds && config.contractPurposeIds && purpose && !purpose.custom && - config.legIntPurposeIds.indexOf(purpose.id) >= 0 || - config.contractPurposeIds.indexOf(purpose.id) >= 0; + (config.legIntPurposeIds.indexOf(purpose.id) >= 0 || config.contractPurposeIds.indexOf(purpose.id) >= 0); - if (!created && selectedTab === TAB_CONSENTS && !renderedTabIndices.has(selectedTab)) { + if (selectedTab === TAB_CONSENTS && !renderedTabIndices.has(selectedTab)) { renderedTabIndices.add(selectedTab); - // TODO: differentiate publisher purposes from vendor purposes (publisher leg int purpose should not be unselected) - purposes.forEach((purpose, index) => { - if (!purposeIsTechnical(purpose)) { + if (!vendorConsentCreated) { + purposes.forEach((purpose, index) => { this.handleSelectPurpose({isSelected: false, dataId: index}); - } - }); + }); + } + if (!publisherConsentCreated) { + allPurposes.forEach((purpose, index) => { + if (!purposeIsTechnical(purpose)) { + this.handleSelectPurpose({isSelected: false, dataId: index}, true); + } + }); + } } return ( @@ -166,10 +186,10 @@ export default class Purposes extends Component { index={index} isPublisherPurpose={true} purpose={purpose} - isActive={purposeIsActive(purpose)} + isActive={purposeIsActive(purpose, true)} isTechnical={purposeIsTechnical(purpose)} createOnShowVendors={this.createOnShowVendors.bind(this)} - onToggle={this.handleSelectPurpose}/>)} + onToggle={this.createHandleSelectPurpose(true)}/>)}
    @@ -187,7 +207,7 @@ export default class Purposes extends Component { isActive={purposeIsActive(purpose)} isTechnical={false} createOnShowVendors={this.createOnShowVendors.bind(this)} - onToggle={this.handleSelectPurpose}/>)} + onToggle={this.createHandleSelectPurpose()}/>)}
    diff --git a/src/components/popup/details/purposes/purposes.test.js b/src/components/popup/details/purposes/purposes.test.js index d612bfc4..fcfbfa72 100644 --- a/src/components/popup/details/purposes/purposes.test.js +++ b/src/components/popup/details/purposes/purposes.test.js @@ -14,6 +14,7 @@ describe('Purposes and Features', () => { it('should render all standard, custom purposes for publisher and purposes and features for vendors', () => { let persistedVendorConsentData = {}; + let persistedPublisherConsentData = {}; const selectPurpose = jest.fn(); let purposesRef; const purposes = render( { { id: 1, name: 'Custom Purpose 1' }, ]} persistedVendorConsentData={persistedVendorConsentData} + persistedPublisherConsentData={persistedPublisherConsentData} selectPurpose={selectPurpose} />, scratch); @@ -45,6 +47,7 @@ describe('Purposes and Features', () => { const selectPurpose = jest.fn(); const selectCustomPurpose = jest.fn(); let persistedVendorConsentData = {}; + let persistedPublisherConsentData = {}; let purposes; render( purposes = ref} @@ -55,6 +58,7 @@ describe('Purposes and Features', () => { selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} persistedVendorConsentData={persistedVendorConsentData} + persistedPublisherConsentData={persistedPublisherConsentData} />, scratch); purposes.handleSelectPurpose({isSelected: true, dataId: 0}); @@ -70,6 +74,7 @@ describe('Purposes and Features', () => { let purposes; let persistedVendorConsentData = {}; + let persistedPublisherConsentData = {}; render( purposes = ref} purposes={[ @@ -82,6 +87,7 @@ describe('Purposes and Features', () => { selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} persistedVendorConsentData={persistedVendorConsentData} + persistedPublisherConsentData={persistedPublisherConsentData} />, scratch); purposes.handleSelectPurpose({isSelected: true, dataId: 2}); @@ -98,6 +104,7 @@ describe('Purposes and Features', () => { let purposes; let persistedVendorConsentData = {}; + let persistedPublisherConsentData = {}; render( purposes = ref} purposes={[ @@ -107,6 +114,7 @@ describe('Purposes and Features', () => { selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} persistedVendorConsentData={persistedVendorConsentData} + persistedPublisherConsentData={persistedPublisherConsentData} />, scratch); purposes.componentDidUpdate = () => { diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index 61cfca33..f412c46b 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -10,6 +10,7 @@ export default class Popup extends Component { const { store, onSave } = this.props; store.selectAllVendors(true); store.selectAllPurposes(true); + store.selectAllStandardPurposes(true); store.selectAllCustomPurposes(true); onSave(); }; diff --git a/src/components/popup/popup.test.js b/src/components/popup/popup.test.js index 86a025c8..5756e496 100644 --- a/src/components/popup/popup.test.js +++ b/src/components/popup/popup.test.js @@ -30,6 +30,7 @@ describe('Popup', () => { const store = new Store(); store.selectAllVendors = jest.fn(); store.selectAllPurposes = jest.fn(); + store.selectAllStandardPurposes = jest.fn(); store.selectAllCustomPurposes = jest.fn(); let popup; @@ -39,6 +40,7 @@ describe('Popup', () => { onSave={() => { expect(store.selectAllVendors.mock.calls[0][0]).to.equal(true); expect(store.selectAllPurposes.mock.calls[0][0]).to.equal(true); + expect(store.selectAllStandardPurposes.mock.calls[0][0]).to.equal(true); expect(store.selectAllCustomPurposes.mock.calls[0][0]).to.equal(true); done(); }} diff --git a/src/lib/cmp.test.js b/src/lib/cmp.test.js index 8dcc24ad..efeff14f 100644 --- a/src/lib/cmp.test.js +++ b/src/lib/cmp.test.js @@ -84,7 +84,7 @@ describe('cmp', () => { }); it('getPublisherConsents returns only persisted data', (done) => { - cmp.store.selectPurpose(1, false); + cmp.store.selectStandardPurpose(1, false); cmp.processCommand('getPublisherConsents', null, data => { expect(data.standardPurposes['1']).to.be.true; cmp.store.persist(); diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 8290892f..d2c993b5 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -157,7 +157,7 @@ function encodePublisherConsentData(publisherData) { const { vendorList = {}, customPurposeList = {}, - selectedPurposeIds, + selectedStandardPurposeIds, selectedCustomPurposeIds } = publisherData; const {purposes: customPurposes = []} = customPurposeList; @@ -166,7 +166,7 @@ function encodePublisherConsentData(publisherData) { return encodePublisherCookieValue({ ...publisherData, numCustomPurposes: customPurposes.length, - standardPurposeIdBitString: encodePurposeIdsToBits(purposes, selectedPurposeIds), + standardPurposeIdBitString: encodePurposeIdsToBits(purposes, selectedStandardPurposeIds), customPurposeIdBitString: encodePurposeIdsToBits(customPurposes, selectedCustomPurposeIds) }); } @@ -179,6 +179,7 @@ function decodePublisherConsentData(cookieValue) { publisherPurposeVersion, created, lastUpdated, + standardPurposeIdBitString, customPurposeIdBitString } = decodePublisherCookieValue(cookieValue); @@ -189,6 +190,7 @@ function decodePublisherConsentData(cookieValue) { publisherPurposeVersion, created, lastUpdated, + selectedStandardPurposeIds: decodeBitsToIds(standardPurposeIdBitString), selectedCustomPurposeIds: decodeBitsToIds(customPurposeIdBitString) }; diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index 144cb6b4..711c46c0 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -123,6 +123,7 @@ describe('cookie', () => { publisherPurposeVersion: 1, created: aDate, lastUpdated: aDate, + selectedStandardPurposeIds: new Set([1, 4, 5]), selectedCustomPurposeIds: new Set([2, 3]) }; diff --git a/src/lib/store.js b/src/lib/store.js index 5b70f243..9e1a7942 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -57,6 +57,7 @@ export default class Store { this.publisherConsentData = Object.assign( { + selectedStandardPurposeIds: new Set(), selectedCustomPurposeIds: new Set() }, publisherConsentData, @@ -165,8 +166,7 @@ export default class Store { const { vendorList = {}, customPurposeList = {}, - persistedPublisherConsentData = {}, - persistedVendorConsentData = {} + persistedPublisherConsentData = {} } = this; const { @@ -176,25 +176,25 @@ export default class Store { cmpId, vendorListVersion, publisherPurposeVersion, + selectedStandardPurposeIds = new Set(), selectedCustomPurposeIds = new Set() } = persistedPublisherConsentData; - const {selectedPurposeIds = new Set()} = persistedVendorConsentData; const {purposes = []} = vendorList; const {purposes: customPurposes = []} = customPurposeList; const lastStandardPurposeId = Math.max( ...purposes.map(({id}) => id), - ...arrayFrom(selectedPurposeIds)); + ...arrayFrom(selectedStandardPurposeIds)); const lastCustomPurposeId = Math.max( ...customPurposes.map(({id}) => id), - ...arrayFrom(selectedPurposeIds)); + ...arrayFrom(selectedStandardPurposeIds)); // Map all purpose IDs const standardPurposeMap = {}; for (let i = 1; i <= lastStandardPurposeId; i++) { - standardPurposeMap[i] = selectedPurposeIds.has(i); + standardPurposeMap[i] = selectedStandardPurposeIds.has(i); } const customPurposeMap = {}; for (let i = 1; i <= lastCustomPurposeId; i++) { @@ -369,6 +369,24 @@ export default class Store { this.storeUpdate(); }; + selectStandardPurpose = (purposeId, isSelected) => { + const {selectedStandardPurposeIds} = this.publisherConsentData; + if (isSelected) { + selectedStandardPurposeIds.add(purposeId); + } + else { + selectedStandardPurposeIds.delete(purposeId); + } + this.storeUpdate(); + }; + + selectAllStandardPurposes = (isSelected) => { + const {purposes = []} = this.vendorList || {}; + const operation = isSelected ? 'add' : 'delete'; + purposes.forEach(({id}) => this.publisherConsentData.selectedStandardPurposeIds[operation](id)); + this.storeUpdate(); + }; + selectCustomPurpose = (purposeId, isSelected) => { const {selectedCustomPurposeIds} = this.publisherConsentData; if (isSelected) { @@ -468,6 +486,12 @@ export default class Store { }); } + const {created: publisherConsentCreated} = this.publisherConsentData; + + // If publisher consent has never been persisted set the default selected status + if (!publisherConsentCreated) { + this.publisherConsentData.selectedStandardPurposeIds = new Set(purposes.map(p => p.id)); + } const {selectedVendorIds = new Set()} = this.vendorConsentData; diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 58374b16..54a15eda 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -229,6 +229,43 @@ describe('store', () => { expect(selectedPurposeIds.length).to.equal(vendorList.purposes.length); }); + it('selects standard purpose IDs', () => { + const store = new Store({ + vendorList, + publisherConsentData: { + created: new Date(), + selectedStandardPurposeIds: new Set([0, 2]), + } + }); + + store.selectStandardPurpose(0, false); + store.selectStandardPurpose(3, true); + store.persist(); + + const publisherObject = store.getPublisherConsentsObject(); + const selectedStandardPurposeIds = Object.keys(publisherObject.standardPurposes).filter(key => publisherObject.standardPurposes[key]); + + expect(selectedStandardPurposeIds).to.deep.equal(['2', '3']); + }); + + it('selects ALL standard purpose IDs', () => { + const store = new Store({ + vendorList, + publisherConsentData: { + created: new Date(), + selectedStandardPurposeIds: new Set([0, 2]), + } + }); + + store.selectAllStandardPurposes(true); + store.persist(); + + const publisherObject = store.getPublisherConsentsObject(); + const selectedStandardPurposeIds = Object.keys(publisherObject.standardPurposes).filter(key => publisherObject.standardPurposes[key]); + + expect(selectedStandardPurposeIds.length).to.equal(vendorList.purposes.length); + }); + it('selects custom purpose IDs', () => { const store = new Store({ customPurposeList, From 9f869d0d947fb28b045ad729a33a60dcaca94f9d Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 26 Nov 2019 12:21:22 +0100 Subject: [PATCH 150/540] Default translation --- src/components/popup/details/purposes/feature.jsx | 4 ++-- src/components/popup/details/purposes/purpose.jsx | 4 ++-- src/components/popup/details/purposes/purposes.jsx | 11 +++++++---- src/lib/translations.js | 10 ---------- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/components/popup/details/purposes/feature.jsx b/src/components/popup/details/purposes/feature.jsx index f7406d85..b0600a6c 100644 --- a/src/components/popup/details/purposes/feature.jsx +++ b/src/components/popup/details/purposes/feature.jsx @@ -24,10 +24,10 @@ const Feature = (props) => {
    diff --git a/src/components/popup/details/purposes/purpose.jsx b/src/components/popup/details/purposes/purpose.jsx index 24818d2b..f12c69e3 100644 --- a/src/components/popup/details/purposes/purpose.jsx +++ b/src/components/popup/details/purposes/purpose.jsx @@ -46,11 +46,11 @@ const Purpose = (props) => { )} diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 3c5761c9..f5239fa8 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -150,13 +150,13 @@ export default class Purposes extends Component {
    - + General information
    - + Personal data processing
    {!selectedTab ? ( @@ -164,11 +164,14 @@ export default class Purposes extends Component {
    - + Learn more about how information is being used?
    - + + We and select companies may access and use your information for the listed purposes. You may + customize your choices or continue using our site if you're OK with the purposes. +
    diff --git a/src/lib/translations.js b/src/lib/translations.js index 2e11fb57..5efaa4a5 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -86,8 +86,6 @@ export default { }, tab2: { menu: 'Przetwarzanie danych osobowych', - title: '', - description: '', } }, publisherConsents: { @@ -103,27 +101,22 @@ export default { showCustomVendors: 'Pokaż listę Zaufanych Partnerów', title: 'Cele', purpose1: { - menu: '', title: 'Przechowywanie i dostęp do informacji', description: '

    Przechowywanie informacji albo dostęp do informacji przechowywanych na urządzeniu użytkownika, w tym dostęp do identyfikatorów reklamowych, innych identyfikatorów urządzenia, wykorzystanie plików cookie oraz podobnych technologii.

    ' }, purpose2: { - menu: '', title: 'Personalizacja', description: '

    Gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji reklam lub treści dla użytkownika w innych kontekstach, na przykład w innych witrynach albo aplikacjach. Zazwyczaj treści w witrynie lub aplikacji są wykorzystywane do wyciągania wniosków na temat zainteresowań użytkownika, które zapewniają dane na potrzeby doboru reklam lub treści w przyszłości.

    ' }, purpose3: { - menu: '', title: 'Wybór i dostarczanie reklam, tworzenie raportów na temat reklam', description: '

    Gromadzenie informacji oraz przetwarzanie uprzednio zgromadzonych informacji w celu wyboru i dostarczenia użytkownikowi reklam oraz oceny dostarczania i skuteczności tych reklam. Obejmuje to wykorzystywanie uprzednio zgromadzonych informacji na temat zainteresowań użytkownika w celu wyboru reklam, przetwarzanie danych na temat wyświetlonych reklam, częstotliwości, czasu i miejsca ich wyświetlania, oraz informacji czy użytkownik podjął działania w związku z reklamą, np. klikając na reklamę albo dokonując zakupu. Nie obejmuje to Personalizacji, która obejmuje gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji reklam lub treści dla użytkownika w innych kontekstach, na przykład w witrynach albo aplikacjach.

    ' }, purpose4: { - menu: '', title: 'Wybór i dostarczanie treści, tworzenie raportów na temat treści', description: '

    Gromadzenie informacji oraz przetwarzanie uprzednio zgromadzonych informacji w celu wyboru i dostarczenia treści oraz oceny dostarczania i skuteczności tych treści. Obejmuje to wykorzystywanie uprzednio zgromadzonych informacji na temat zainteresowań użytkownika w celu wyboru treści, przetwarzanie danych na temat wyświetlonych treści, częstotliwości, czasu i miejsca ich wyświetlania, oraz informacji czy użytkownik podjął działania w związku z treścią, np. klikając na treść. Nie obejmuje to Personalizacji, która obejmuje gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji treści lub reklam dla użytkownika w innych kontekstach, na przykład w witrynach albo aplikacjach.

    ' }, purpose5: { - menu: '', title: 'Pomiary', description: '

    Gromadzenie informacji na temat wykorzystywania treści przez użytkownika oraz przetwarzanie uprzednio zgromadzonych informacji w celu oceny, zrozumienia i tworzenia raportów na temat wykorzystywania usługi przez użytkownika. Nie obejmuje to Personalizacji, gromadzenia i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji treści lub reklam dla użytkownika w innych kontekstach, tj. w ramach usługi, na przykład w witrynach albo aplikacjach.

    ' } @@ -131,17 +124,14 @@ export default { features: { title: 'Funkcje', feature1: { - menu: '', title: 'Zestawianie danych offline', description: '

    Łączenie danych ze źródeł offline, które zostały wyjściowo zgromadzone w kontekstach innych niż dane zgromadzone online na potrzeby realizacji jednego albo większej liczby celów.

    ' }, feature2: { - menu: '', title: 'Łączenie urządzeń', description: '

    Przetwarzanie danych w celu powiązania ze sobą wielu urządzeń należących do tego samego użytkownika na potrzeby realizacji jednego albo większej liczby celów.

    ' }, feature3: { - menu: '', title: 'Dokładne dane dotyczące lokalizacji geograficznej', description: '

    Gromadzenie i obsługa dokładnych danych dotyczących lokalizacji geograficznej na potrzeby realizacji jednego albo większej liczby celów.

    ' } From 4663b2eb8a81f475ea4b5b7fb1fd868845541e6b Mon Sep 17 00:00:00 2001 From: skoklowski Date: Tue, 26 Nov 2019 13:31:24 +0100 Subject: [PATCH 151/540] Default translation --- src/components/popup/details/purposes/purposes.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index f5239fa8..2e8fda41 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -181,7 +181,7 @@ export default class Purposes extends Component {
    - + Publisher consents
    @@ -198,12 +198,12 @@ export default class Purposes extends Component {
    - + Vendor consents
    - + Purposes {purposes.map((purpose, index) => )}
    - + Features {features.map((feature, index) => From 0526d9dc7a4bc866e33d998417e1ba754ba9cede Mon Sep 17 00:00:00 2001 From: skoklowski Date: Wed, 27 Nov 2019 14:09:45 +0100 Subject: [PATCH 152/540] Avoid vendorlist links to collapse in same line ...when style="display: inline-block" --- .../popup/details/purposes/feature.jsx | 16 +++++++++------ .../popup/details/purposes/purpose.jsx | 20 +++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/components/popup/details/purposes/feature.jsx b/src/components/popup/details/purposes/feature.jsx index b0600a6c..016eee4d 100644 --- a/src/components/popup/details/purposes/feature.jsx +++ b/src/components/popup/details/purposes/feature.jsx @@ -23,12 +23,16 @@ const Feature = (props) => {
    ); diff --git a/src/components/popup/details/purposes/purpose.jsx b/src/components/popup/details/purposes/purpose.jsx index f12c69e3..13b6ad9a 100644 --- a/src/components/popup/details/purposes/purpose.jsx +++ b/src/components/popup/details/purposes/purpose.jsx @@ -44,14 +44,18 @@ const Purpose = (props) => { {purpose.description} {!isPublisherPurpose && ( )}
    From c05a776f4c9f267bdefe2794798e8867efca2d18 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 29 Nov 2019 14:09:46 +0100 Subject: [PATCH 153/540] Add text to paragraph on the first page. --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 5efaa4a5..0a10c7b9 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -19,7 +19,7 @@ export default {

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    -

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    From 18686ecc72ee8c575912614dbb8bcfd5812d1ba4 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 29 Nov 2019 14:42:50 +0100 Subject: [PATCH 154/540] Change cookies paragraph --- src/lib/translations.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 0a10c7b9..5d4982c2 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -19,7 +19,7 @@ export default {

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    -

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    @@ -79,7 +79,7 @@ export default {

    Niektórzy z Zaufanych Partnerów przetwarzać mogą Twoje dane w oparciu o ich uzasadniony interes. W takim wypadku nie udzielasz im zgody na przetwarzanie Twoich danych, ale możesz wyrazić sprzeciw wobec takiego przetwarzania.

    -

    W zakładce „Przetwarzanie danych osobowych” dowiesz się także jak wykorzystywane są technologie cookies i podobne oraz jak zablokować ich działanie w Twojej przeglądarce.

    +

    Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    W razie jakichkolwiek wątpliwości zapraszamy do kontaktu na adres iod@grupaonet.pl. Pomocne informacje znajdziesz także zawsze w naszej Polityce Prywatności

    `, From cdfde6eb3001d112d98a7ae69728c3068d589af1 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 29 Nov 2019 14:55:22 +0100 Subject: [PATCH 155/540] Fix accidental overwrite paragraph on the first page. --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 5d4982c2..cf3d7f0b 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -19,7 +19,7 @@ export default {

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    -

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau).

    +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    From 944f965b173c208803f78a89380c912fab5ea24d Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 29 Nov 2019 15:13:35 +0100 Subject: [PATCH 156/540] Decorate phase 'Zaufani Partnerzy' by links redirecting to table of vendors --- src/lib/translations.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index cf3d7f0b..2bcd5ed8 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -12,21 +12,21 @@ export default {

    Zgoda

    -

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    +

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    -

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    Administrator danych osobowych

    -

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    +

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    Podstawa i cel przetwarzania

    @@ -38,7 +38,7 @@ export default {
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • -
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
  • +
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.

  • @@ -50,11 +50,11 @@ export default {

    Cookies

    -

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    +

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    Twoje uprawnienia

    -

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:

    +

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. From 02adcdb8671efe639b70f1d7b392642c8d2b1663 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 29 Nov 2019 15:24:16 +0100 Subject: [PATCH 157/540] Change title of publisherConsents section --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 2bcd5ed8..e754fc54 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -89,7 +89,7 @@ export default { } }, publisherConsents: { - title: "Zgody dla Wydawcy", + title: "Podstawy prawne przetwarzania danych przez Wydawcę (Uzasadniony interes administratora)", }, vendorConsents: { title: "Zgody dla Partnerów", From 00f20d3c3b351fbb68ad73ee66314a02af46e07c Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Mon, 2 Dec 2019 08:34:21 +0100 Subject: [PATCH 158/540] Remove irregular whitespace --- src/lib/translations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index e754fc54..52cc08d2 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -79,7 +79,7 @@ export default {

    Niektórzy z Zaufanych Partnerów przetwarzać mogą Twoje dane w oparciu o ich uzasadniony interes. W takim wypadku nie udzielasz im zgody na przetwarzanie Twoich danych, ale możesz wyrazić sprzeciw wobec takiego przetwarzania.

    -

    Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    +

    Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    W razie jakichkolwiek wątpliwości zapraszamy do kontaktu na adres iod@grupaonet.pl. Pomocne informacje znajdziesz także zawsze w naszej Polityce Prywatności

    `, From 1d69317ebe194b626ffa0050b13e576a8cb10a08 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Tue, 3 Dec 2019 15:27:32 +0100 Subject: [PATCH 159/540] Reject all vendors on first entry to vendors list view, when consent hasn't been created --- src/components/popup/details/details.jsx | 2 ++ src/components/popup/details/vendors/vendors.jsx | 6 ++++++ .../popup/details/vendors/vendors.test.js | 15 ++++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index bc068097..1c71a4b3 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -86,6 +86,7 @@ export default class Details extends Component { } = store; const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedStandardPurposeIds, selectedCustomPurposeIds } = publisherConsentData; + const { created: vendorConsentCreated } = persistedVendorConsentData; const { purposes = [], features = [] } = vendorList; const { purposes: customPurposes = [] } = customPurposeList; @@ -122,6 +123,7 @@ export default class Details extends Component { vendors={state.vendors} purposes={purposes} features={features} + vendorConsentCreated={vendorConsentCreated} />
    diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index d762b310..e3cdd0d5 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -24,6 +24,12 @@ export default class Vendors extends Component { selectVendor: () => {} }; + componentDidMount() { + if (!this.props.vendorConsentCreated) { + this.handleRejectAll(); + } + }; + handleAcceptAll = () => { this.props.selectAllVendors(true); }; diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index 31b0a1f3..d0982ba0 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -13,6 +13,8 @@ describe('Vendors', () => { }); it('should render the vendor list', () => { + const selectAllVendors = jest.fn(); + const vendors = render( { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + selectAllVendors={selectAllVendors} />, scratch); const vendorRows = vendors.querySelectorAll(`.${style.vendorContent} tr`); @@ -36,10 +39,13 @@ describe('Vendors', () => { expect(vendorRows.length).to.equal(4); expect(firstVendorAttributes.length).to.equal(6); expect(secondVendorAttributes.length).to.equal(3); + expect(selectAllVendors.mock.calls.length).to.equal(1); + expect(selectAllVendors.mock.calls[0][0]).to.equal(false); }); it('should handle selecting a vendor', () => { const selectVendor = jest.fn(); + const selectAllVendors = jest.fn(); let vendors; render( { {id: 2, name: 'Feature 2'}, ]} selectVendor={selectVendor} + selectAllVendors={selectAllVendors} />, scratch); vendors.handleSelectVendor({dataId: 2, isSelected: true}); + expect(selectAllVendors.mock.calls.length).to.equal(1); + expect(selectAllVendors.mock.calls[0][0]).to.equal(false); expect(selectVendor.mock.calls[0][0]).to.equal(2); expect(selectVendor.mock.calls[0][1]).to.equal(true); }); @@ -90,7 +99,9 @@ describe('Vendors', () => { />, scratch); vendors.handleAcceptAll(); - expect(selectAllVendors.mock.calls[0][0]).to.equal(true); + expect(selectAllVendors.mock.calls.length).to.equal(2); + expect(selectAllVendors.mock.calls[0][0]).to.equal(false); + expect(selectAllVendors.mock.calls[1][0]).to.equal(true); }); it('should handle rejecting all vendors', () => { @@ -117,6 +128,8 @@ describe('Vendors', () => { />, scratch); vendors.handleRejectAll(); + expect(selectAllVendors.mock.calls.length).to.equal(2); expect(selectAllVendors.mock.calls[0][0]).to.equal(false); + expect(selectAllVendors.mock.calls[1][0]).to.equal(false); }); }); From a25417431aa9e4c3e764fd4125fd1dc2c52b0005 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 4 Dec 2019 12:21:52 +0100 Subject: [PATCH 160/540] Add button which handle accept/reject all vendors --- .../popup/details/vendors/vendors.jsx | 19 +++- .../popup/details/vendors/vendors.test.js | 106 ++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index d762b310..9566920c 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -42,7 +42,16 @@ export default class Vendors extends Component { }); }; - getActiveAttributesNameElements = (setOfAttributes, idsOfActiveAttributes, translationPrefix='') => { + isFullVendorsConsentChosen = () => { + const {vendors, selectedVendorIds} = this.props; + return vendors.length === selectedVendorIds.size; + }; + + handleFullConsentChange = ({isSelected}) => { + isSelected ? this.handleAcceptAll() : this.handleRejectAll(); + }; + + getActiveAttributesNameElements = (setOfAttributes, idsOfActiveAttributes, translationPrefix = '') => { const activeAttributes = setOfAttributes .filter(attribute => idsOfActiveAttributes.indexOf(attribute['id']) !== -1) .map(attribute => ); @@ -85,7 +94,15 @@ export default class Vendors extends Component {
    CompanyAllow + +
    - {vendors.map(({ id, name, policyUrl, purposeIds, legIntPurposeIds, featureIds }, index) => ( + {vendors.map(({ id, name, policyUrl, purposeIds=[], legIntPurposeIds=[], featureIds=[] }, index) => ( {editingConsents && + {editingConsents && id%2 === 0 && + + || + + } ))} From 07520b674ef96476ea135d9b3a19071052f7248a Mon Sep 17 00:00:00 2001 From: apocentek Date: Fri, 28 Feb 2020 11:22:40 +0100 Subject: [PATCH 189/540] css, legitimate interest, work in progress... --- src/components/popup/details/details.jsx | 11 +- .../popup/details/purposes/purpose.jsx | 7 +- .../popup/details/purposes/purposes.jsx | 39 +++++- .../popup/details/purposes/purposes.test.js | 26 ++++ .../popup/details/vendors/vendor.jsx | 14 ++- .../popup/details/vendors/vendors.jsx | 38 +++--- .../popup/details/vendors/vendors.less | 8 +- .../popup/details/vendors/vendors.test.js | 14 ++- src/lib/store.js | 15 ++- src/lib/translations.js | 115 ++++++++++++------ 10 files changed, 224 insertions(+), 63 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 93de68d2..20864787 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -18,7 +18,8 @@ export default class Details extends Component { constructor(props) { super(props); this.state = { - vendors: this.getVendors() + vendors: this.getVendors(), + selectedLegitimateInterestsIds: new Set() }; } @@ -80,6 +81,7 @@ export default class Details extends Component { selectCustomPurpose, selectVendors, selectVendor, + selectVendorLegitimateInterest, initialVendorsRejection, persistedVendorConsentData = {}, persistedPublisherConsentData = {}, @@ -88,10 +90,9 @@ export default class Details extends Component { const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; const { selectedStandardPurposeIds, selectedCustomPurposeIds } = publisherConsentData; const { created: vendorConsentCreated } = persistedVendorConsentData; - const { purposes = [], features = [] } = vendorList; + const { purposes = [], features = [], specialPurposes = [], specialFeatures = [] } = vendorList; const { purposes: customPurposes = [] } = customPurposeList; - return (
    { purpose, index, isActive, + isLegitimateInterestActive, onToggle, + onToggleLegitInterest, createOnShowVendors, isTechnical, isPublisherPurpose = false @@ -43,13 +45,12 @@ const Purpose = (props) => {
    Uzasadniony interes
    -
    } diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 77e68278..2757e885 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -17,13 +17,17 @@ class LocalLabel extends Label { export default class Purposes extends Component { state = { selectedTab: TAB_PUBLISHER_INFO, - renderedTabIndices: new Set() + renderedTabIndices: new Set(), + // TODO - MOCK - to be reworked + legitInterestList: [true,true,true,true,true,true,true,true,true,true] }; static defaultProps = { onShowVendors: () => {}, purposes: [], features: [], + specialPurposes: [], + specialFeatures: [], customPurposes: [], selectedPurposeIds: new Set(), selectedStandardPurposeIds: new Set(), @@ -63,6 +67,14 @@ export default class Purposes extends Component { return (data) => this.handleSelectPurpose(data, isPublisher); }; + handleSelectLegitInterest = ({dataId}) => { + let legitList = this.state.legitInterestList; + if(legitList[dataId]) {legitList[dataId] =!legitList[dataId]} else legitList[dataId] = true; + this.setState({ + legitInterestList: legitList + }); + }; + getAllPurposes = () => { const { purposes, @@ -103,6 +115,8 @@ export default class Purposes extends Component { selectedCustomPurposeIds, purposes, features, + specialPurposes, + specialFeatures, persistedVendorConsentData, persistedPublisherConsentData, initialVendorsRejection @@ -124,6 +138,8 @@ export default class Purposes extends Component { (isPublisher ? selectedStandardPurposeIds : selectedPurposeIds).has(purpose.id) ); + const isLegitimateInterestActive = (id) => !!this.state.legitInterestList[id]; + const purposeIsTechnical = (purpose) => config.legIntPurposeIds && config.contractPurposeIds && purpose && !purpose.custom && @@ -210,10 +226,24 @@ export default class Purposes extends Component { index={index} purpose={purpose} isActive={purposeIsActive(purpose)} + isLegitimateInterestActive={isLegitimateInterestActive(index)} isTechnical={false} createOnShowVendors={this.createOnShowVendors.bind(this)} + onToggleLegitInterest={this.handleSelectLegitInterest.bind(this)} onToggle={this.createHandleSelectPurpose()}/>)} + {specialPurposes && !!specialPurposes.length &&
    + Special purposes + {specialPurposes.map((purpose, index) => )} +
    }
    Features {features.map((feature, index) => )}
    + {specialFeatures && !!specialFeatures.length &&
    + Special features + {specialFeatures.map((feature, index) => + )} +
    } )} diff --git a/src/components/popup/details/purposes/purposes.test.js b/src/components/popup/details/purposes/purposes.test.js index fcfbfa72..c80afddd 100644 --- a/src/components/popup/details/purposes/purposes.test.js +++ b/src/components/popup/details/purposes/purposes.test.js @@ -124,4 +124,30 @@ describe('Purposes and Features', () => { }; purposes.handleSelectTab(1)(); }); + + it('should deselect default selection of legitimate interest', () => { + const isLegitimateInterestActive = true; + const onToggleLegitInterest = jest.fn(); + let persistedVendorConsentData = {}; + let persistedPublisherConsentData = {}; + + let purposes; + render( purposes = ref} + purposes={[ + { id: 1, name: 'Purpose 1' }, + { id: 2, name: 'Purpose 2' } + ]} + isLegitimateInterestActive={isLegitimateInterestActive} + onToggleLegitInterest={onToggleLegitInterest} + persistedVendorConsentData={persistedVendorConsentData} + persistedPublisherConsentData={persistedPublisherConsentData} + />, scratch); + + purposes.handleSelectLegitInterest({isSelected: false, dataId: 2}); + purposes.handleSelectLegitInterest({isSelected: false, dataId: 1}); + + expect(purposes.state.legitInterestList[1]).to.equal(false); + expect(purposes.state.legitInterestList[2]).to.equal(false); + }); }); diff --git a/src/components/popup/details/vendors/vendor.jsx b/src/components/popup/details/vendors/vendor.jsx index d7b57809..7a203b0c 100644 --- a/src/components/popup/details/vendors/vendor.jsx +++ b/src/components/popup/details/vendors/vendor.jsx @@ -21,7 +21,9 @@ export default class Vendor extends Component { policyUrl, purposes, legIntPurposes, - features + features, + specialPurposes, + specialFeatures } = this.props; return
    @@ -41,11 +43,21 @@ export default class Vendor extends Component { Legitimate interest purposes{': '} {legIntPurposes}{'. '} } + {specialPurposes && !!specialPurposes.length && + + Special purposes{': '} + {specialPurposes}{'. '} + } {features && !!features.length && Features{': '} {features}{'. '} } + {specialFeatures && !!specialFeatures.length && + + Special features{': '} + {specialFeatures}{'. '} + }
    } diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 6fa4f719..a684aad1 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -40,6 +40,10 @@ export default class Vendors extends Component { this.props.selectVendor(dataId, isSelected); }; + handleLegitInterest = ({ dataId, isSelected }) => { + this.props.selectVendorLegitimateInterest(dataId, isSelected); + }; + handleMoreChoices = () => { const {vendorConsentCreated, initialVendorsRejection} = this.props; if (!vendorConsentCreated) { @@ -74,6 +78,7 @@ export default class Vendors extends Component { const { vendors, selectedVendorIds, + selectedLegitimateInterestsIds, purposes, features } = props; @@ -104,9 +109,10 @@ export default class Vendors extends Component {
    {editingConsents && - - + +
    -
    - {name} - {policyUrl && - - } -
    -
    - {purposeIds && !!purposeIds.length && - - Purposes{': '} - {this.getActiveAttributesNameElements(purposes, purposeIds, 'purposes.purpose')}{'. '} - - } - {legIntPurposeIds && !!legIntPurposeIds.length && - - Legitimate interest purposes{': '} - {this.getActiveAttributesNameElements(purposes, legIntPurposeIds, 'purposes.purpose')}{'. '} - - } - {featureIds && !!featureIds.length && - - Features{': '} - {this.getActiveAttributesNameElements(features, featureIds, 'features.feature')}{'. '} - - } -
    +
    From 8284b8579fd9b2060588d5e61b8cd1c30a3a6c8d Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Thu, 5 Dec 2019 08:37:15 +0100 Subject: [PATCH 162/540] Remove unnecessary method used in development --- .../popup/details/vendors/vendor.jsx | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/components/popup/details/vendors/vendor.jsx b/src/components/popup/details/vendors/vendor.jsx index 4d238376..d7b57809 100644 --- a/src/components/popup/details/vendors/vendor.jsx +++ b/src/components/popup/details/vendors/vendor.jsx @@ -1,4 +1,4 @@ -import {h, Component, Fragment} from "preact"; +import {h, Component} from "preact"; import style from "./vendors.less"; import ExternalLinkIcon from "../../../externallinkicon/externallinkicon"; @@ -15,25 +15,20 @@ export default class Vendor extends Component { return false; } - componentDidUpdate(prevProps, prevState) { - Object.entries(this.props).forEach(([key, val]) => - prevProps[key] !== val && console.log(`Prop '${key}' changed`) - ); - if (this.state) { - Object.entries(this.state).forEach(([key, val]) => - prevState[key] !== val && console.log(`State '${key}' changed`) - ); - } - } - render() { - const {purposes, legIntPurposes, features} = this.props; + const { + name, + policyUrl, + purposes, + legIntPurposes, + features + } = this.props; return
    - {this.props.name} - {this.props.policyUrl && - } + {name} + {policyUrl && + }
    {purposes && !!purposes.length && From 2e0ad3802b9776aa274c33e8a30720d703dfd0ae Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Thu, 5 Dec 2019 09:38:46 +0100 Subject: [PATCH 163/540] Refactor tests --- .../popup/details/vendors/vendors.test.js | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index 31b0a1f3..5054dbc9 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -4,6 +4,8 @@ import { expect } from 'chai'; import style from './vendors.less'; import Vendors from './vendors'; +import Vendor from './vendor'; +import Label from "../../../label/label"; describe('Vendors', () => { let scratch; @@ -31,11 +33,40 @@ describe('Vendors', () => { />, scratch); const vendorRows = vendors.querySelectorAll(`.${style.vendorContent} tr`); - const firstVendorAttributes = vendorRows[0].querySelectorAll(`.${style.vendorDescription} span`); - const secondVendorAttributes = vendorRows[1].querySelectorAll(`.${style.vendorDescription} span`); expect(vendorRows.length).to.equal(4); - expect(firstVendorAttributes.length).to.equal(6); - expect(secondVendorAttributes.length).to.equal(3); + }); + + it('should render vendor with all possible attributes', () => { + const vendor = render(Purpose 1]} + legIntPurposes={[]} + features={[]} + />, scratch); + + const vendorRows = vendor.querySelectorAll(`div`); + const vendorDescriptionRecords = vendor.querySelectorAll(`div > span > span`); + expect(vendorRows.length).to.equal(2); + expect(vendorDescriptionRecords.length).to.equal(6); + }); + + it('should render vendor without features', () => { + const vendor = render(Purpose 1, + + ]} + legIntPurposes={[]} + features={[]} + />, scratch); + + const vendorRows = vendor.querySelectorAll(`div`); + const vendorDescriptionRecords = vendor.querySelectorAll(`div > span > span`); + expect(vendorRows.length).to.equal(2); + expect(vendorDescriptionRecords.length).to.equal(5); }); it('should handle selecting a vendor', () => { From aaeb84b9828057e7f92b94af1db58cab1b0637b8 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Mon, 9 Dec 2019 08:26:27 +0100 Subject: [PATCH 164/540] Update cmp ID --- src/lib/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/init.js b/src/lib/init.js index 463101b4..3c34ac6c 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -9,7 +9,7 @@ import pack from '../../package.json'; import config from './config'; const CMP_VERSION = 1; -const CMP_ID = 1; +const CMP_ID = 280; const COOKIE_VERSION = 1; function readExternalConsentData(config) { From 7253cc38c10f3996734c35ec8647e21eb371ab43 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Mon, 9 Dec 2019 12:37:23 +0100 Subject: [PATCH 165/540] Update tests after merge --- src/components/popup/details/vendors/vendors.test.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index 6c8d3d1a..b68bff83 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -158,7 +158,7 @@ describe('Vendors', () => { vendors.handleFullConsentChange({isSelected: true}); - expect(selectAllVendors.mock.calls[0][0]).to.equal(true); + expect(selectAllVendors.mock.calls[1][0]).to.equal(true); }); it('should handle rejecting all vendors', () => { @@ -219,7 +219,9 @@ describe('Vendors', () => { }); it('should return true if all vendors are accepted', () => { + const selectAllVendors = jest.fn(); let vendors; + render( vendors = ref} vendors={[ @@ -237,6 +239,7 @@ describe('Vendors', () => { {id: 2, name: 'Feature 2'}, ]} selectedVendorIds={new Set([1, 2, 3, 4])} + selectAllVendors={selectAllVendors} />, scratch); const result = vendors.isFullVendorsConsentChosen(); @@ -244,7 +247,9 @@ describe('Vendors', () => { }); it('should return false if some vendors are rejected', () => { + const selectAllVendors = jest.fn(); let vendors; + render( vendors = ref} vendors={[ @@ -262,6 +267,7 @@ describe('Vendors', () => { {id: 2, name: 'Feature 2'}, ]} selectedVendorIds={new Set([1])} + selectAllVendors={selectAllVendors} />, scratch); const result = vendors.isFullVendorsConsentChosen(); From 399c070e43254e57555d4a803b6040b114834ed8 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Tue, 10 Dec 2019 13:14:09 +0100 Subject: [PATCH 166/540] Add all vendors rejection on purposes tab first visit --- src/components/popup/details/details.jsx | 7 ++++-- .../popup/details/purposes/purposes.jsx | 4 +++- .../popup/details/vendors/vendors.jsx | 13 +++++++---- src/lib/store.js | 23 +++++++++++++++++++ 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 1c71a4b3..93de68d2 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -78,8 +78,9 @@ export default class Details extends Component { selectPurpose, selectStandardPurpose, selectCustomPurpose, - selectAllVendors, + selectVendors, selectVendor, + initialVendorsRejection, persistedVendorConsentData = {}, persistedPublisherConsentData = {}, subsection @@ -112,14 +113,16 @@ export default class Details extends Component { selectPurpose={selectPurpose} selectStandardPurpose={selectStandardPurpose} selectCustomPurpose={selectCustomPurpose} + initialVendorsRejection={initialVendorsRejection} onShowVendors={this.handleShowVendors} persistedVendorConsentData={persistedVendorConsentData} persistedPublisherConsentData={persistedPublisherConsentData} /> { this.handleSelectPurpose({isSelected: false, dataId: index}); }); + initialVendorsRejection(); } if (!publisherConsentCreated) { allPurposes.forEach((purpose, index) => { diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 62639e20..53e103cd 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -27,17 +27,20 @@ export default class Vendors extends Component { }; componentDidMount() { - if (!this.props.vendorConsentCreated) { - this.handleRejectAll(); + const {vendorConsentCreated, initialVendorsRejection} = this.props; + if (!vendorConsentCreated) { + initialVendorsRejection(); } }; handleAcceptAll = () => { - this.props.selectAllVendors(true); + const {vendors, selectVendors} = this.props; + selectVendors(vendors.map(({id}) => id), true) }; handleRejectAll = () => { - this.props.selectAllVendors(false); + const {vendors, selectVendors} = this.props; + selectVendors(vendors.map(({id}) => id), false); }; handleSelectVendor = ({ dataId, isSelected }) => { @@ -52,7 +55,7 @@ export default class Vendors extends Component { isFullVendorsConsentChosen = () => { const {vendors, selectedVendorIds} = this.props; - return vendors.length === selectedVendorIds.size; + return !vendors.filter(({id}) => !selectedVendorIds.has(id)).length; }; handleFullConsentChange = ({isSelected}) => { diff --git a/src/lib/store.js b/src/lib/store.js index 9e1a7942..c81d562a 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -72,6 +72,7 @@ export default class Store { this.isFooterShowing = false; this.section = SECTION_INTRO; this.subsection = SECTION_PURPOSES; + this.hasInitialVendorsRejectionOccurs = false; this.updateVendorList(vendorList); this.updateCustomPurposeList(customPurposeList); @@ -344,6 +345,21 @@ export default class Store { this.storeUpdate(); }; + selectVendors = (vendorIds, isSelected) => { + const {selectedVendorIds} = this.vendorConsentData; + if (isSelected) { + vendorIds.forEach(id => { + selectedVendorIds.add(id); + }); + } + else { + vendorIds.forEach(id => { + selectedVendorIds.delete(id); + }); + } + this.storeUpdate(); + }; + selectAllVendors = (isSelected) => { const {vendors = []} = this.vendorList || {}; const operation = isSelected ? 'add' : 'delete'; @@ -351,6 +367,13 @@ export default class Store { this.storeUpdate(); }; + initialVendorsRejection = () => { + if (!this.hasInitialVendorsRejectionOccurs) { + this.selectAllVendors(false); + this.hasInitialVendorsRejectionOccurs = true; + } + }; + selectPurpose = (purposeId, isSelected) => { const {selectedPurposeIds} = this.vendorConsentData; if (isSelected) { From 8c243fc388407cf5a3e24f858cb38afe689bb2a8 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Tue, 10 Dec 2019 14:32:55 +0100 Subject: [PATCH 167/540] Update test after add initial vendors rejection --- .../popup/details/vendors/vendors.test.js | 62 +++++++++++-------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index b68bff83..562aff9e 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -15,7 +15,7 @@ describe('Vendors', () => { }); it('should render the vendor list', () => { - const selectAllVendors = jest.fn(); + const initialVendorsRejection = jest.fn(); const vendors = render( { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} - selectAllVendors={selectAllVendors} + initialVendorsRejection={initialVendorsRejection} />, scratch); const vendorRows = vendors.querySelectorAll(`.${style.vendorContent} tr`); expect(vendorRows.length).to.equal(4); + expect(initialVendorsRejection.mock.calls.length).to.equal(1); }); it('should render vendor with all possible attributes', () => { @@ -74,7 +75,7 @@ describe('Vendors', () => { it('should handle selecting a vendor', () => { const selectVendor = jest.fn(); - const selectAllVendors = jest.fn(); + const initialVendorsRejection = jest.fn(); let vendors; render( { {id: 2, name: 'Feature 2'}, ]} selectVendor={selectVendor} - selectAllVendors={selectAllVendors} + initialVendorsRejection={initialVendorsRejection} />, scratch); vendors.handleSelectVendor({dataId: 2, isSelected: true}); - expect(selectAllVendors.mock.calls.length).to.equal(1); - expect(selectAllVendors.mock.calls[0][0]).to.equal(false); + expect(initialVendorsRejection.mock.calls.length).to.equal(1); expect(selectVendor.mock.calls[0][0]).to.equal(2); expect(selectVendor.mock.calls[0][1]).to.equal(true); }); it('should handle accepting all vendors', () => { - const selectAllVendors = jest.fn(); + const selectVendors = jest.fn(); + const initialVendorsRejection = jest.fn(); let vendors; render( { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} - selectAllVendors={selectAllVendors} + selectVendors={selectVendors} + initialVendorsRejection={initialVendorsRejection} />, scratch); vendors.handleAcceptAll(); - expect(selectAllVendors.mock.calls.length).to.equal(2); - expect(selectAllVendors.mock.calls[0][0]).to.equal(false); - expect(selectAllVendors.mock.calls[1][0]).to.equal(true); + expect(initialVendorsRejection.mock.calls.length).to.equal(1); + expect(selectVendors.mock.calls[0][0]).to.deep.equal([1, 2, 3, 4]); + expect(selectVendors.mock.calls[0][1]).to.equal(true); }); it('should handle accepting all vendors if some vendors are rejected', () => { - const selectAllVendors = jest.fn(); + const initialVendorsRejection = jest.fn(); + const selectVendors = jest.fn(); let vendors; render( { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} - selectAllVendors={selectAllVendors} + initialVendorsRejection={initialVendorsRejection} + selectVendors={selectVendors} />, scratch); vendors.handleFullConsentChange({isSelected: true}); - expect(selectAllVendors.mock.calls[1][0]).to.equal(true); + expect(initialVendorsRejection.mock.calls.length).to.equal(1); + expect(selectVendors.mock.calls[0][0]).to.deep.equal([1, 2, 3, 4]); + expect(selectVendors.mock.calls[0][1]).to.equal(true); }); it('should handle rejecting all vendors', () => { - const selectAllVendors = jest.fn(); + const initialVendorsRejection = jest.fn(); + const selectVendors = jest.fn(); let vendors; render( { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} - selectAllVendors={selectAllVendors} + initialVendorsRejection={initialVendorsRejection} + selectVendors={selectVendors} />, scratch); vendors.handleRejectAll(); - expect(selectAllVendors.mock.calls.length).to.equal(2); - expect(selectAllVendors.mock.calls[0][0]).to.equal(false); - expect(selectAllVendors.mock.calls[1][0]).to.equal(false); + expect(initialVendorsRejection.mock.calls.length).to.equal(1); + expect(selectVendors.mock.calls[0][0]).to.deep.equal([1, 2, 3, 4]); + expect(selectVendors.mock.calls[0][1]).to.equal(false); }); it('should handle rejecting all vendors if some vendors are selected', () => { - const selectAllVendors = jest.fn(); + const initialVendorsRejection = jest.fn(); + const selectVendors = jest.fn(); let vendors; render( { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} - selectAllVendors={selectAllVendors} + initialVendorsRejection={initialVendorsRejection} + selectVendors={selectVendors} />, scratch); vendors.handleFullConsentChange({isSelected: false}); - expect(selectAllVendors.mock.calls[0][0]).to.equal(false); + expect(initialVendorsRejection.mock.calls.length).to.equal(1); + expect(selectVendors.mock.calls[0][0]).to.deep.equal([1, 2, 3, 4]); + expect(selectVendors.mock.calls[0][1]).to.equal(false); }); it('should return true if all vendors are accepted', () => { - const selectAllVendors = jest.fn(); let vendors; render( { {id: 2, name: 'Feature 2'}, ]} selectedVendorIds={new Set([1, 2, 3, 4])} - selectAllVendors={selectAllVendors} + initialVendorsRejection={jest.fn()} />, scratch); const result = vendors.isFullVendorsConsentChosen(); @@ -247,7 +258,6 @@ describe('Vendors', () => { }); it('should return false if some vendors are rejected', () => { - const selectAllVendors = jest.fn(); let vendors; render( { {id: 2, name: 'Feature 2'}, ]} selectedVendorIds={new Set([1])} - selectAllVendors={selectAllVendors} + initialVendorsRejection={jest.fn()} />, scratch); const result = vendors.isFullVendorsConsentChosen(); From 8f5c898a9c9bc00e15b664275d1f1b3c88d51c2d Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 11 Dec 2019 11:26:21 +0100 Subject: [PATCH 168/540] Rename property in store and refactor method for better readability --- src/components/popup/details/vendors/vendors.jsx | 3 ++- src/lib/store.js | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 53e103cd..69c687aa 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -55,7 +55,8 @@ export default class Vendors extends Component { isFullVendorsConsentChosen = () => { const {vendors, selectedVendorIds} = this.props; - return !vendors.filter(({id}) => !selectedVendorIds.has(id)).length; + const isSelected = ({id}) => selectedVendorIds.has(id); + return vendors.every(isSelected); }; handleFullConsentChange = ({isSelected}) => { diff --git a/src/lib/store.js b/src/lib/store.js index c81d562a..fd4d64ae 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -72,7 +72,7 @@ export default class Store { this.isFooterShowing = false; this.section = SECTION_INTRO; this.subsection = SECTION_PURPOSES; - this.hasInitialVendorsRejectionOccurs = false; + this.hasInitialVendorsRejectionOccured = false; this.updateVendorList(vendorList); this.updateCustomPurposeList(customPurposeList); @@ -368,9 +368,9 @@ export default class Store { }; initialVendorsRejection = () => { - if (!this.hasInitialVendorsRejectionOccurs) { + if (!this.hasInitialVendorsRejectionOccured) { this.selectAllVendors(false); - this.hasInitialVendorsRejectionOccurs = true; + this.hasInitialVendorsRejectionOccured = true; } }; From 67bc5a84cf5479ad874e2fe411c652500fa2f09f Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 11 Dec 2019 11:54:33 +0100 Subject: [PATCH 169/540] Change occurrence of initial vendors rejection to view with editing vendors consent --- src/components/popup/details/vendors/vendors.jsx | 12 +++++------- src/lib/store.js | 2 ++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 69c687aa..a0135e3d 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -26,13 +26,6 @@ export default class Vendors extends Component { selectVendor: () => {} }; - componentDidMount() { - const {vendorConsentCreated, initialVendorsRejection} = this.props; - if (!vendorConsentCreated) { - initialVendorsRejection(); - } - }; - handleAcceptAll = () => { const {vendors, selectVendors} = this.props; selectVendors(vendors.map(({id}) => id), true) @@ -48,6 +41,11 @@ export default class Vendors extends Component { }; handleMoreChoices = () => { + const {vendorConsentCreated, initialVendorsRejection} = this.props; + if (!vendorConsentCreated) { + initialVendorsRejection(); + } + this.setState({ editingConsents: true }); diff --git a/src/lib/store.js b/src/lib/store.js index fd4d64ae..f93e4f23 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -368,6 +368,8 @@ export default class Store { }; initialVendorsRejection = () => { + //vendors rejection can occurs only once in the lifetime of application + //should only be called if user vendor consent has not been created yet if (!this.hasInitialVendorsRejectionOccured) { this.selectAllVendors(false); this.hasInitialVendorsRejectionOccured = true; From c3bc6c79366f02aa64a1fc4e3375249787791aac Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 11 Dec 2019 12:41:28 +0100 Subject: [PATCH 170/540] Update tests after changing the place of initial vendors rejection occurrence --- .../popup/details/vendors/vendors.test.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index 562aff9e..6211bfa2 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -15,8 +15,6 @@ describe('Vendors', () => { }); it('should render the vendor list', () => { - const initialVendorsRejection = jest.fn(); - const vendors = render( { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} - initialVendorsRejection={initialVendorsRejection} />, scratch); const vendorRows = vendors.querySelectorAll(`.${style.vendorContent} tr`); expect(vendorRows.length).to.equal(4); - expect(initialVendorsRejection.mock.calls.length).to.equal(1); }); - it('should render vendor with all possible attributes', () => { + it('should render vendor with purposes, legIntPurposes and features', () => { const vendor = render( { initialVendorsRejection={initialVendorsRejection} />, scratch); + vendors.handleMoreChoices(); vendors.handleSelectVendor({dataId: 2, isSelected: true}); expect(initialVendorsRejection.mock.calls.length).to.equal(1); expect(selectVendor.mock.calls[0][0]).to.equal(2); @@ -129,6 +126,7 @@ describe('Vendors', () => { initialVendorsRejection={initialVendorsRejection} />, scratch); + vendors.handleMoreChoices(); vendors.handleAcceptAll(); expect(initialVendorsRejection.mock.calls.length).to.equal(1); expect(selectVendors.mock.calls[0][0]).to.deep.equal([1, 2, 3, 4]); @@ -160,7 +158,7 @@ describe('Vendors', () => { selectVendors={selectVendors} />, scratch); - + vendors.handleMoreChoices(); vendors.handleFullConsentChange({isSelected: true}); expect(initialVendorsRejection.mock.calls.length).to.equal(1); expect(selectVendors.mock.calls[0][0]).to.deep.equal([1, 2, 3, 4]); @@ -192,6 +190,7 @@ describe('Vendors', () => { selectVendors={selectVendors} />, scratch); + vendors.handleMoreChoices(); vendors.handleRejectAll(); expect(initialVendorsRejection.mock.calls.length).to.equal(1); expect(selectVendors.mock.calls[0][0]).to.deep.equal([1, 2, 3, 4]); @@ -223,7 +222,7 @@ describe('Vendors', () => { selectVendors={selectVendors} />, scratch); - + vendors.handleMoreChoices(); vendors.handleFullConsentChange({isSelected: false}); expect(initialVendorsRejection.mock.calls.length).to.equal(1); expect(selectVendors.mock.calls[0][0]).to.deep.equal([1, 2, 3, 4]); From a27d3e53eaf32be68560ecb6243db3813cefc070 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Thu, 12 Dec 2019 11:10:02 +0100 Subject: [PATCH 171/540] Fix policy link icon style --- src/components/popup/details/vendors/vendors.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/popup/details/vendors/vendors.less b/src/components/popup/details/vendors/vendors.less index b7c8b18a..1c3465c1 100644 --- a/src/components/popup/details/vendors/vendors.less +++ b/src/components/popup/details/vendors/vendors.less @@ -100,5 +100,6 @@ div.vendors { .policy { margin: 0 5px; display: flex; + flex-grow: 0; } } From f3ff5eea9fdfe1d31401ef31e8427d526bedff0b Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Thu, 12 Dec 2019 11:49:33 +0100 Subject: [PATCH 172/540] Fix policy link icon style --- src/components/popup/details/vendors/vendors.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/popup/details/vendors/vendors.less b/src/components/popup/details/vendors/vendors.less index 1c3465c1..199ae79a 100644 --- a/src/components/popup/details/vendors/vendors.less +++ b/src/components/popup/details/vendors/vendors.less @@ -100,6 +100,6 @@ div.vendors { .policy { margin: 0 5px; display: flex; - flex-grow: 0; + flex: 0 1 16px; } } From 71535ce666d2eda19dee71285913f8939bc8bc92 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Mon, 30 Dec 2019 09:16:06 +0100 Subject: [PATCH 173/540] Undo function refactor, because spread operator with set does not work properly --- src/lib/store.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 16fc0862..52b07425 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -562,9 +562,10 @@ export default class Store { }; mergePurposeConsentsFromGlobalCookie = () => { - this.vendorConsentData.selectedPurposeIds = new Set([...this.vendorConsentData.selectedPurposeIds].filter( - id => this.globalVendorConsentData.selectedPurposeIds.has(id) || config.legIntPurposeIds.includes(id) - )); + const selectedPurposeIds = Array.from(this.vendorConsentData.selectedPurposeIds); + this.vendorConsentData.selectedPurposeIds = new Set(selectedPurposeIds.filter( id => ( + this.globalVendorConsentData.selectedPurposeIds.has(id) || config.legIntPurposeIds.includes(id) + ))); }; mergePurposeConsentsToGlobalCookie = () => { From 2661dd0aaea4f462d2a004c9dc3ce0b7726ecece Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 8 Jan 2020 15:43:53 +0100 Subject: [PATCH 174/540] Remove fetching vendor list from global domain --- src/docs/assets/portal.js | 11 ----------- src/lib/vendor.js | 6 ------ 2 files changed, 17 deletions(-) diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index d6d2e672..dd8cc0ee 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -8,16 +8,6 @@ const COOKIE_DOMAIN = parts.length > 1 ? `;domain=.${parts.slice(-2).join('.')}` const COOKIE_MAX_AGE = 33696000; const COOKIE_NAME = 'euconsent'; -const readVendorListPromise = fetch('./vendorlist.json', { - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } -}) - .then(res => res.json()) - .catch(err => { - log.error(`Failed to load vendor list from vendors.json`, err); - }); function readCookie(name) { const value = '; ' + document.cookie; @@ -34,7 +24,6 @@ function writeCookie({ name, value, path = '/'}) { } const commands = { - readVendorList: () => readVendorListPromise, readVendorConsent: () => { return readCookie(COOKIE_NAME); diff --git a/src/lib/vendor.js b/src/lib/vendor.js index de8ced29..c2100687 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -59,9 +59,6 @@ function fetchGlobalVendorList() { reject(err); } }).catch(err => { - if (storeConsentGlobally && globalConsentLocation) { - return sendPortalCommand({command: 'readVendorList'}); - } log.error(`Failed to load global vendor list from configuration`, err); }); } @@ -70,9 +67,6 @@ function fetchGlobalVendorList() { Promise.reject('Missing globalVendorListLocation')) .then(res => res.json()) .catch(err => { - if (storeConsentGlobally && globalConsentLocation) { - return sendPortalCommand({command: 'readVendorList'}); - } log.error(`Failed to load global vendor list from ${globalVendorListLocation}`, err); }); } From fc22f4737cc221861a58616b114cd7970c6de50f Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Wed, 8 Jan 2020 16:03:22 +0100 Subject: [PATCH 175/540] Change Array.from to arrayFrom for browser compatybility --- src/lib/store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/store.js b/src/lib/store.js index 52b07425..0c2cffd0 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -562,7 +562,7 @@ export default class Store { }; mergePurposeConsentsFromGlobalCookie = () => { - const selectedPurposeIds = Array.from(this.vendorConsentData.selectedPurposeIds); + const selectedPurposeIds = arrayFrom(this.vendorConsentData.selectedPurposeIds); this.vendorConsentData.selectedPurposeIds = new Set(selectedPurposeIds.filter( id => ( this.globalVendorConsentData.selectedPurposeIds.has(id) || config.legIntPurposeIds.includes(id) ))); From a35ba9f231de4df828f7f2d0eec0faffd737c607 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Thu, 9 Jan 2020 16:22:26 +0100 Subject: [PATCH 176/540] Remove unnecessary imports --- src/docs/assets/portal.js | 1 - src/lib/vendor.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index dd8cc0ee..b8e059ae 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -1,6 +1,5 @@ import Promise from 'promise-polyfill'; import 'whatwg-fetch'; -import log from "../../lib/log"; const host = (window && window.location && window.location.hostname) || ''; const parts = host.split('.'); diff --git a/src/lib/vendor.js b/src/lib/vendor.js index c2100687..beb3ab12 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -1,7 +1,6 @@ import Promise from 'promise-polyfill'; import config from './config'; import log from './log'; -import { sendPortalCommand } from './portal'; const PUB_VENDOR_LOCATION = '/.well-known/pubvendors.json'; From df69fffa95f2c43bbd0e5129efe630ac3dd56359 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Thu, 9 Jan 2020 16:31:54 +0100 Subject: [PATCH 177/540] Remove unnecessary arguments --- src/lib/vendor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index beb3ab12..08790160 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -39,7 +39,7 @@ function fetchPubVendorList() { * Fetch the global vendor list if the location is configured */ function fetchGlobalVendorList() { - const {globalVendorListLocation, storeConsentGlobally, globalConsentLocation, getVendorList} = config; + const {globalVendorListLocation, getVendorList} = config; if (getVendorList) { return new Promise((resolve, reject) => { try { From d1c921eac3017462b2eb72a5c7dedf24b097d526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 10 Jan 2020 14:49:30 +0100 Subject: [PATCH 178/540] updated webpack config for bundling portal --- webpack.config.babel.js | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/webpack.config.babel.js b/webpack.config.babel.js index 025e5e7b..410310f6 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -170,7 +170,7 @@ module.exports = [ { entry: { cmp: './index.js', - 'cmp.complete': './complete.js' + 'cmp.complete': './complete.js', }, output: { @@ -191,7 +191,36 @@ module.exports = [ filename: 'index.html', template: 'index.html', chunks: ['cmp'] + }) + ]).concat(ENV === 'production' ? uglifyPlugin : []), + }, + // portal + { + entry: { + 'portal': './docs/assets/portal.js' + }, + + output: { + path: path.resolve(__dirname, 'build'), + publicPath: './', + filename: '[name].bundle.js' + }, + ...commonConfig, + plugins: ([ + new webpack.NoEmitOnErrorsPlugin(), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(ENV) }), + new webpack.ProvidePlugin({ + 'Promise': 'promise-polyfill' + }), + new HtmlWebpackPlugin({ + filename: 'portal.html', + template: './docs/assets/portal.html', + chunks: ['portal'], + inlineSource: '\\.(js|css)$' + }), + new HtmlWebpackInlineSourcePlugin(), ]).concat(ENV === 'production' ? uglifyPlugin : []), }, // Docs config From 36052387e94829924d615dedde2eb7bb7dd43792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 10 Jan 2020 15:00:08 +0100 Subject: [PATCH 179/540] refactored --- webpack.config.babel.js | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/webpack.config.babel.js b/webpack.config.babel.js index 410310f6..06bdc170 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -171,6 +171,7 @@ module.exports = [ entry: { cmp: './index.js', 'cmp.complete': './complete.js', + 'portal': './docs/assets/portal.js' }, output: { @@ -191,28 +192,6 @@ module.exports = [ filename: 'index.html', template: 'index.html', chunks: ['cmp'] - }) - ]).concat(ENV === 'production' ? uglifyPlugin : []), - }, - // portal - { - entry: { - 'portal': './docs/assets/portal.js' - }, - - output: { - path: path.resolve(__dirname, 'build'), - publicPath: './', - filename: '[name].bundle.js' - }, - ...commonConfig, - plugins: ([ - new webpack.NoEmitOnErrorsPlugin(), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(ENV) - }), - new webpack.ProvidePlugin({ - 'Promise': 'promise-polyfill' }), new HtmlWebpackPlugin({ filename: 'portal.html', From 24871bd76e2c093e4616028d49e1775a36285c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 10 Jan 2020 15:46:32 +0100 Subject: [PATCH 180/540] js only regex --- webpack.config.babel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.babel.js b/webpack.config.babel.js index 06bdc170..bb93ceb8 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -197,7 +197,7 @@ module.exports = [ filename: 'portal.html', template: './docs/assets/portal.html', chunks: ['portal'], - inlineSource: '\\.(js|css)$' + inlineSource: '\\.js$' }), new HtmlWebpackInlineSourcePlugin(), ]).concat(ENV === 'production' ? uglifyPlugin : []), From 662606a6f0e867c50d2c21e30eefece22a3ee484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 10 Jan 2020 15:50:07 +0100 Subject: [PATCH 181/540] without double quote marks --- webpack.config.babel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.babel.js b/webpack.config.babel.js index bb93ceb8..b1bcc859 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -171,7 +171,7 @@ module.exports = [ entry: { cmp: './index.js', 'cmp.complete': './complete.js', - 'portal': './docs/assets/portal.js' + portal: './docs/assets/portal.js' }, output: { From 3dbaf78673cba5f3c43162d78b19105d7a4cc585 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 10 Jan 2020 15:51:25 +0100 Subject: [PATCH 182/540] Update tests after readVendorListPromise removal --- src/lib/vendor.test.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/lib/vendor.test.js b/src/lib/vendor.test.js index 768ea176..3ef46294 100644 --- a/src/lib/vendor.test.js +++ b/src/lib/vendor.test.js @@ -46,21 +46,6 @@ describe('vendor', () => { }); }); - it('fetchGlobalVendorList returns nothing if globalVendorListLocation is empty', (done) => { - config.update({ - globalVendorListLocation: null, - storeConsentGlobally: true - }); - xhr.send = () => { - this.onerror(); - }; - fetchGlobalVendorList() - .then(() => { - expect(mockPortal.sendPortalCommand.mock.calls[0][0]).to.deep.equal({ command: 'readVendorList' }); - done(); - }); - }); - it('fetchPurposeList returns nothing if there is no customPurposeListLocation', (done) => { config.update({ customPurposeListLocation: undefined From ee6a3a2699bbbfdf95975c71c3bb010552c3ec61 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 10 Jan 2020 15:52:25 +0100 Subject: [PATCH 183/540] Refactor function mergeVendorConsentFromGlobalCookie --- src/lib/store.js | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 0c2cffd0..bf200004 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -528,25 +528,13 @@ export default class Store { }; mergeVendorConsentsFromGlobalCookie = () => { - const selectedLocalIdsOfGlobalVendorInGlobalCookie = new Set(); - const selectedLocalIdsOfGlobalVendorInLocalCookie = new Set(); const globalCookieMaxVendorId = this.persistedGlobalVendorConsentData.maxVendorId; - this.globalVendorIdsPresentOnList.forEach( (localId, globalId) => { - if (this.vendorConsentData.selectedVendorIds.has(localId) && globalId <= globalCookieMaxVendorId) { - selectedLocalIdsOfGlobalVendorInLocalCookie.add(localId); - } - if (this.globalVendorConsentData.selectedVendorIds.has(globalId)) { - selectedLocalIdsOfGlobalVendorInGlobalCookie.add(localId); - this.vendorConsentData.selectedVendorIds.add(localId); - } - }); - - selectedLocalIdsOfGlobalVendorInLocalCookie.forEach( localId => { - const isNewVendorOnList = this.persistedVendorConsentData && localId > this.persistedVendorConsentData.maxVendorId; - - if (!isNewVendorOnList && !selectedLocalIdsOfGlobalVendorInGlobalCookie.has(localId)) { - this.vendorConsentData.selectedVendorIds.delete(localId); + this.globalVendorIdsPresentOnList.forEach( (id, externalId) => { + if (this.globalVendorConsentData.selectedVendorIds.has(externalId)) { + this.vendorConsentData.selectedVendorIds.add(id); + } else if (this.vendorConsentData.selectedVendorIds.has(id) && externalId <= globalCookieMaxVendorId) { + this.vendorConsentData.selectedVendorIds.delete(id); } }); }; From 0769463412dd063276fe6cec91b17f29180e53d7 Mon Sep 17 00:00:00 2001 From: Oskar Szewczyk Date: Fri, 10 Jan 2020 15:54:03 +0100 Subject: [PATCH 184/540] Add tests of merging consent with global cookie --- src/lib/store.test.js | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 58374b16..7441fff7 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -28,26 +28,32 @@ const vendorList = { "vendors": [ { "id": 1, + "external_id": 1, "name": "Globex" }, { "id": 2, + "external_id": 2, "name": "Initech" }, { "id": 3, + "external_id": 3, "name": "CRS" }, { "id": 4, + "external_id": 4, "name": "Umbrella" }, { "id": 5, + "external_id": 5, "name": "Aperture" }, { "id": 6, + "external_id": 6, "name": "Pierce and Pierce" } ] @@ -313,4 +319,95 @@ describe('store', () => { expect(store.vendorConsentData.created).to.equal(created); expect(store.vendorConsentData.lastUpdated).to.be.above(lastUpdated); }); + + it('merge vendor consent from global cookie when consents are same', () => { + const store = new Store({ + vendorConsentData: { + selectedVendorIds: new Set([1, 2, 3, 4, 5, 6]), + }, + globalVendorConsentData: { + maxVendorId: 6, + selectedVendorIds: new Set([1, 2, 3, 4, 5, 6]), + }, + }); + store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); + + store.mergeVendorConsentsFromGlobalCookie(); + expect(Array.from(store.vendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedVendorIds)); + }); + + it('merge vendor consent from global cookie when consents differ', () => { + const store = new Store({ + vendorConsentData: { + selectedVendorIds: new Set([1, 2, 3]), + }, + globalVendorConsentData: { + maxVendorId: 6, + selectedVendorIds: new Set([3, 4, 5, 6]), + }, + }); + store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); + + store.mergeVendorConsentsFromGlobalCookie(); + expect(Array.from(store.vendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedVendorIds)); + }); + + it('merge vendor consent to global cookie', () => { + const store = new Store({ + vendorConsentData: { + selectedVendorIds: new Set([1, 2, 3, 4, 5]), + }, + globalVendorConsentData: { + selectedVendorIds: new Set([1, 2]), + }, + }); + store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); + + store.mergeVendorConsentsToGlobalCookie(); + expect(Array.from(store.globalVendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.vendorConsentData.selectedVendorIds)); + }); + + it('merge purpose consent from global cookie when consents are same', () => { + const store = new Store({ + vendorList, + vendorConsentData: { + selectedPurposeIds: new Set([1, 2, 3, 4]), + }, + globalVendorConsentData: { + selectedPurposeIds: new Set([1, 2, 3, 4]), + }, + }); + + store.mergePurposeConsentsFromGlobalCookie(); + expect(Array.from(store.vendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedPurposeIds)); + }); + + it('merge purpose consent from global cookie when consents differ', () => { + const store = new Store({ + vendorList, + vendorConsentData: { + selectedPurposeIds: new Set([1, 2]), + }, + globalVendorConsentData: { + selectedPurposeIds: new Set([2, 3, 4]), + }, + }); + + store.mergePurposeConsentsFromGlobalCookie(); + expect(Array.from(store.vendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedPurposeIds)); + }); + + it('merge purpose consent to global cookie', () => { + const store = new Store({ + vendorList, + vendorConsentData: { + selectedPurposeIds: new Set([1, 2, 4]), + }, + globalVendorConsentData: { + selectedPurposeIds: new Set([2, 3]), + }, + }); + + store.mergePurposeConsentsToGlobalCookie(); + expect(Array.from(store.globalVendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.vendorConsentData.selectedPurposeIds)); }); }); From 73ad19937fee1346d2922f946fc1ea9286acc5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 13 Jan 2020 15:41:49 +0100 Subject: [PATCH 185/540] proper portal location --- src/complete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/complete.js b/src/complete.js index 92bec7c2..4a28e16f 100644 --- a/src/complete.js +++ b/src/complete.js @@ -51,7 +51,7 @@ function checkConsent(cmp, store) { // Preserve any config options already set const {config} = window[CMP_GLOBAL_NAME] || {}; const configUpdates = { - globalConsentLocation: '//acdn.adnxs.com/cmp/docs/portal.html', + globalConsentLocation: 'https://rasp.mgr.consensu.org/portal.html', ...config }; From db4c05435ba9de4b9fd80b670abc13fde0160b76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 16 Jan 2020 16:20:31 +0100 Subject: [PATCH 186/540] samesite: none; secure --- src/docs/assets/portal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index b8e059ae..2a54a304 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -18,7 +18,7 @@ function readCookie(name) { } function writeCookie({ name, value, path = '/'}) { - document.cookie = `${name}=${value}${COOKIE_DOMAIN};path=${path};max-age=${COOKIE_MAX_AGE}`; + document.cookie = `${name}=${value}${COOKIE_DOMAIN};path=${path};max-age=${COOKIE_MAX_AGE};SameSite=None;Secure`; return Promise.resolve(); } From b7c551ed24ae638b64c211ce6dd8bfa7c7cc4080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 16 Jan 2020 16:32:46 +0100 Subject: [PATCH 187/540] semicolon --- src/docs/assets/portal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/assets/portal.js b/src/docs/assets/portal.js index 2a54a304..cfcbea1e 100644 --- a/src/docs/assets/portal.js +++ b/src/docs/assets/portal.js @@ -18,7 +18,7 @@ function readCookie(name) { } function writeCookie({ name, value, path = '/'}) { - document.cookie = `${name}=${value}${COOKIE_DOMAIN};path=${path};max-age=${COOKIE_MAX_AGE};SameSite=None;Secure`; + document.cookie = `${name}=${value}${COOKIE_DOMAIN};path=${path};max-age=${COOKIE_MAX_AGE};SameSite=None;Secure;`; return Promise.resolve(); } From b6d4ddb0deb323865c483e86d84258c777411dff Mon Sep 17 00:00:00 2001 From: apocentek Date: Wed, 19 Feb 2020 17:45:05 +0100 Subject: [PATCH 188/540] UI initial changes --- .../popup/details/purposes/purpose.jsx | 25 ++++++++++++----- .../popup/details/purposes/purposes.less | 2 ++ .../popup/details/vendors/vendors.jsx | 27 ++++++++++++++----- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/components/popup/details/purposes/purpose.jsx b/src/components/popup/details/purposes/purpose.jsx index 13b6ad9a..06db2cea 100644 --- a/src/components/popup/details/purposes/purpose.jsx +++ b/src/components/popup/details/purposes/purpose.jsx @@ -31,12 +31,25 @@ const Purpose = (props) => {
    {!isTechnical &&
    - {isActive ? 'Active' : 'Inactive'} - +
    + {isActive ? 'Active' : 'Inactive'} + +
    + +
    + Uzasadniony interes + +
    + +
    }
    diff --git a/src/components/popup/details/purposes/purposes.less b/src/components/popup/details/purposes/purposes.less index 8c324430..2253c8a7 100644 --- a/src/components/popup/details/purposes/purposes.less +++ b/src/components/popup/details/purposes/purposes.less @@ -109,6 +109,8 @@ font-weight: bold; display: flex; align-items: center; + width: 100%; + justify-content: space-between; @media @smartphone { flex: 1 1 auto; } diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index a0135e3d..6fa4f719 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -130,14 +130,27 @@ export default class Vendors extends Component { legIntPurposes={this.getActiveAttributesNameElements(purposes, legIntPurposeIds, 'purposes.purpose')} features={this.getActiveAttributesNameElements(features, featureIds, 'features.feature')}/>
    + Reject + + + } {editingConsents && - - - + Consent + +
    CompanyAllowUzasadniony interes prawny + Allow - {vendors.map(({ id, name, policyUrl, purposeIds=[], legIntPurposeIds=[], featureIds=[] }, index) => ( + {vendors.map(({ id, name, policyUrl, purposeIds=[], legIntPurposeIds=[], + featureIds=[], specialPurposes=[], specialFeatures=[] }, index) => ( - {editingConsents && id%2 === 0 && - - || - || } diff --git a/src/components/popup/details/vendors/vendors.less b/src/components/popup/details/vendors/vendors.less index 199ae79a..a01d51ec 100644 --- a/src/components/popup/details/vendors/vendors.less +++ b/src/components/popup/details/vendors/vendors.less @@ -65,6 +65,11 @@ div.vendors { } .vendorDescription { font-size: 10px; + text-align: left; + } + .vendorCenterSmall{ + font-size: 10px; + text-align: center; } table { width: 100%; @@ -80,9 +85,10 @@ div.vendors { min-height: 40px; th { font-weight: bold; + } td, th { - text-align: left; + text-align: center; padding: 5px; &:first-child { width: 100%; diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index 6211bfa2..3fc9e8cd 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -30,25 +30,35 @@ describe('Vendors', () => { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + specialPurposes={[ + {id: 1, name: 'Special Purpose 1'}, + {id: 2, name: 'Special Purpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'Special Feature 1'}, + {id: 2, name: 'Special Feature 2'}, + ]} />, scratch); const vendorRows = vendors.querySelectorAll(`.${style.vendorContent} tr`); expect(vendorRows.length).to.equal(4); }); - it('should render vendor with purposes, legIntPurposes and features', () => { + it('should render vendor with purposes, special purposes, legIntPurposes, features and special features', () => { const vendor = render(Purpose 1]} legIntPurposes={[]} features={[]} + specialPurposes={[]} + specialFeatures={[]} />, scratch); const vendorRows = vendor.querySelectorAll(`div`); const vendorDescriptionRecords = vendor.querySelectorAll(`div > span > span`); expect(vendorRows.length).to.equal(2); - expect(vendorDescriptionRecords.length).to.equal(6); + expect(vendorDescriptionRecords.length).to.equal(10); }); it('should render vendor without features', () => { diff --git a/src/lib/store.js b/src/lib/store.js index c6327a92..10ee56da 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -345,7 +345,6 @@ export default class Store { // Store the persisted data this.persistedVendorConsentData = copyData(vendorConsentData); this.persistedPublisherConsentData = copyData(publisherConsentData); - // Notify of date changes this.storeUpdate(); }; @@ -375,6 +374,20 @@ export default class Store { this.storeUpdate(); }; + selectVendorLegitimateInterest = (id) => { + console.log('vendor legit', id); + // const {vendorLegitimateInterest} = this.tcModel; + // vendorLegitimateInterest.set(id); + // vendorLegitimateInterest.unset(id); + }; + + /*selectPurposeLegitimateInterest = (id) => { + console.log('vendor legit', id); + // const {purposeLegitimateInterest} = this.tcModel; + // purposeLegitimateInterest.set(id); + // purposeLegitimateInterest.unset(id); + };*/ + selectVendors = (vendorIds, isSelected) => { const {selectedVendorIds} = this.vendorConsentData; if (isSelected) { diff --git a/src/lib/translations.js b/src/lib/translations.js index 52cc08d2..21ce7137 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,51 +8,51 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

    Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    - + description: `

    Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    +

    Zgoda

    - +

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    - +

    Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    - +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    - +

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    Administrator danych osobowych

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    - +

    Podstawa i cel przetwarzania

    - +

    Twoje dane przetwarzamy w następujących celach:


      - +
    • 1. Jeśli zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. Gdy zakładasz konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tego nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. Niepodanie takich danych uniemożliwi nam zawarcie i wykonanie umowy.
    • - +
    • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
    • - +
    • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
    - +

    Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania, czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy, przez czas jej wykonywania i ewentualnie okres przedawnienia roszczeń z niej (zwykle nie więcej niż 3 lata, a maksymalnie 6 lat), a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora, do czasu zgłoszenia przez Ciebie skutecznego sprzeciwu.

    - +

    Przekazywanie danych

    - +

    Administratorzy danych mogą powierzać Twoje dane podwykonawcom IT, księgowym, agencjom marketingowym etc. Zrobią to jedynie w niezbędnym zakresie i na podstawie umowy o powierzenie przetwarzania danych zobowiązującej taki podmiot do odpowiedniego zabezpieczenia danych i niekorzystania z nich do własnych celów.

    - +

    Cookies

    - +

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    - - + +

    Twoje uprawnienia

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    @@ -101,39 +101,81 @@ export default { showCustomVendors: 'Pokaż listę Zaufanych Partnerów', title: 'Cele', purpose1: { - title: 'Przechowywanie i dostęp do informacji', - description: '

    Przechowywanie informacji albo dostęp do informacji przechowywanych na urządzeniu użytkownika, w tym dostęp do identyfikatorów reklamowych, innych identyfikatorów urządzenia, wykorzystanie plików cookie oraz podobnych technologii.

    ' + title: 'Przechowywanie informacji na urządzeniu lub dostęp do nich', + description: '

    Pliki cookie, identyfikatory urządzeń lub inne informacje mogą być przechowywane na urządzeniu użytkownika lub udostępniane na nim w przedstawionych użytkownikowi celach.

    ' }, purpose2: { - title: 'Personalizacja', - description: '

    Gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji reklam lub treści dla użytkownika w innych kontekstach, na przykład w innych witrynach albo aplikacjach. Zazwyczaj treści w witrynie lub aplikacji są wykorzystywane do wyciągania wniosków na temat zainteresowań użytkownika, które zapewniają dane na potrzeby doboru reklam lub treści w przyszłości.

    ' + title: 'Wybór podstawowych reklam', + description: '

    Reklamy mogą być wyświetlane w oparciu o oglądaną treść, używaną aplikację, przybliżoną lokalizację lub typ urządzenia.

    ' }, purpose3: { - title: 'Wybór i dostarczanie reklam, tworzenie raportów na temat reklam', - description: '

    Gromadzenie informacji oraz przetwarzanie uprzednio zgromadzonych informacji w celu wyboru i dostarczenia użytkownikowi reklam oraz oceny dostarczania i skuteczności tych reklam. Obejmuje to wykorzystywanie uprzednio zgromadzonych informacji na temat zainteresowań użytkownika w celu wyboru reklam, przetwarzanie danych na temat wyświetlonych reklam, częstotliwości, czasu i miejsca ich wyświetlania, oraz informacji czy użytkownik podjął działania w związku z reklamą, np. klikając na reklamę albo dokonując zakupu. Nie obejmuje to Personalizacji, która obejmuje gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji reklam lub treści dla użytkownika w innych kontekstach, na przykład w witrynach albo aplikacjach.

    ' + title: 'Tworzenie profilu spersonalizowanych reklam', + description: '

    Profil może być zbudowany na temat użytkownika i jego zainteresowań, co pozwoli na pokazywanie spersonalizowanych reklam, które są dla użytkownika istotne.

    ' }, purpose4: { - title: 'Wybór i dostarczanie treści, tworzenie raportów na temat treści', - description: '

    Gromadzenie informacji oraz przetwarzanie uprzednio zgromadzonych informacji w celu wyboru i dostarczenia treści oraz oceny dostarczania i skuteczności tych treści. Obejmuje to wykorzystywanie uprzednio zgromadzonych informacji na temat zainteresowań użytkownika w celu wyboru treści, przetwarzanie danych na temat wyświetlonych treści, częstotliwości, czasu i miejsca ich wyświetlania, oraz informacji czy użytkownik podjął działania w związku z treścią, np. klikając na treść. Nie obejmuje to Personalizacji, która obejmuje gromadzenie i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji treści lub reklam dla użytkownika w innych kontekstach, na przykład w witrynach albo aplikacjach.

    ' + title: 'Wybór spersonalizowanych reklam', + description: '

    Spersonalizowane reklamy mogą być wyświetlane użytkownikowi na podstawie jego profilu.

    ' }, purpose5: { - title: 'Pomiary', - description: '

    Gromadzenie informacji na temat wykorzystywania treści przez użytkownika oraz przetwarzanie uprzednio zgromadzonych informacji w celu oceny, zrozumienia i tworzenia raportów na temat wykorzystywania usługi przez użytkownika. Nie obejmuje to Personalizacji, gromadzenia i przetwarzanie informacji na temat sposobu korzystania przez użytkownika z usługi, aby z czasem dokonać personalizacji treści lub reklam dla użytkownika w innych kontekstach, tj. w ramach usługi, na przykład w witrynach albo aplikacjach.

    ' + title: 'Tworzenie profilu spersonalizowanych treści', + description: '

    Profil może być zbudowany na temat użytkownika i jego zainteresowań, co pozwoli na pokazywanie spersonalizowanych treści, które są dla użytkownika istotne.

    ' + }, + purpose6: { + title: 'Wybór spersonalizowanych treści', + description: '

    Spersonalizowane treści mogą być wyświetlane użytkownikowi na podstawie jego profilu.

    ' + }, + purpose7: { + title: 'Pomiar wydajności reklam', + description: '

    Można zmierzyć wydajność i efektywność reklam, które użytkownik widzi lub na które reaguje.

    ' + }, + purpose8: { + title: 'Pomiar wydajności treści', + description: '

    można zmierzyć wydajność i efektywność treści, które użytkownik widzi lub na które reaguje.

    ' + }, + purpose9: { + title: 'Stosowanie badań rynkowych w celu generowania opinii odbiorców', + description: '

    Badania rynku mogą być wykorzystywane w celu uzyskania dalszych informacji na temat odbiorców, którzy odwiedzają strony/aplikacje i oglądają reklamy.

    ' + }, + purpose10: { + title: 'Opracowywanie i ulepszanie produktów', + description: '

    Dane użytkownika mogą być wykorzystywane do ulepszania istniejących systemów i oprogramowania oraz opracowania nowych produktów.

    ' + } + }, + specialPurposes: { + title: 'Cele specjalne', + purpose1: { + title: 'Zapewnienie bezpieczeństwa, zapobieganie oszustwom i usuwanie błędów', + description: '

    Dane użytkownika mogą być wykorzystywane do monitorowania i zapobiegania oszustwom oraz zapewnienia prawidłowego i bezpiecznego działania systemów i procesów.

    ' + }, + purpose2: { + title: 'Techniczne dostarczenie reklam lub treści', + description: '

    Urządzenie użytkownika może odbierać i wysyłać informacje, które umożliwiają przeglądanie reklam i treści oraz reagowanie na nie.

    ' } }, features: { title: 'Funkcje', feature1: { - title: 'Zestawianie danych offline', - description: '

    Łączenie danych ze źródeł offline, które zostały wyjściowo zgromadzone w kontekstach innych niż dane zgromadzone online na potrzeby realizacji jednego albo większej liczby celów.

    ' + title: 'Dopasowanie i połączenie źródeł danych offline', + description: '

    Dane ze źródeł danych offline mogą być łączone z aktywnością użytkownika online w ramach realizacji co najmniej jednego celu.

    ' }, feature2: { - title: 'Łączenie urządzeń', - description: '

    Przetwarzanie danych w celu powiązania ze sobą wielu urządzeń należących do tego samego użytkownika na potrzeby realizacji jednego albo większej liczby celów.

    ' + title: 'Łączenie różnych urządzeń', + description: '

    Różne urządzenia mogą być określane jako należące do użytkownika lub jego gospodarstwa domowego do realizacji co najmniej jednego celu.

    ' }, feature3: { - title: 'Dokładne dane dotyczące lokalizacji geograficznej', - description: '

    Gromadzenie i obsługa dokładnych danych dotyczących lokalizacji geograficznej na potrzeby realizacji jednego albo większej liczby celów.

    ' + title: 'Odbieranie i wykorzystywanie automatycznie wysłanej charakterystyki urządzenia do identyfikacji', + description: '

    Urządzenie może się odróżniać od innych urządzeń w oparciu o informacje, które automatycznie przesyła, takie jak adres IP lub typ przeglądarki.

    ' + } + }, + specialFeatures: { + title: 'Funkcje specjalne', + feature1: { + title: 'Użycie dokładnych danych geolokalizacyjnych', + description: '

    Dokładne dane geolokalizacyjne użytkownika mogą być wykorzystywane na potrzeby realizacji jednego albo większej liczby celów. Oznacza to, że lokalizacja użytkownika może być dokładna do kilku metrów.

    ' + }, + feature2: { + title: 'Aktywne skanowanie charakterystyki urządzenia do celów identyfikacji', + description: '

    Urządzenie użytkownika można zidentyfikować na podstawie skanu unikalnej kombinacji cech urządzenia.

    ' } }, vendors: { @@ -144,7 +186,10 @@ export default { moreChoices: 'Zmień ustawienia Zaufanych Partnerów', purposes: 'Cele przetwarzania', legitimateInterestPurposes: 'Cele przetwarzania na podstawie uzasadnionego interesu', - features: 'Funkcje' + features: 'Funkcje', + legitimateInterest: 'Uzasadniony interes prawny', + legitimateButton: 'UIP', + acceptButton: 'Zgoda' }, footer: { message: 'Zmień swoje ustawienia prywatności klikając', From 685d88329cfcea046bed72e207e7f1db74a214f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 28 Feb 2020 13:10:39 +0100 Subject: [PATCH 190/540] tcf_v2 --- package-lock.json | 15781 ++++++++++++++++ package.json | 2 + src/complete.js | 163 +- src/components/popup/details/details.jsx | 86 +- .../popup/details/purposes/purposes.jsx | 42 +- .../popup/details/vendors/vendors.jsx | 4 +- src/components/popup/popup.jsx | 6 +- src/lib/cmp.js | 3 + src/lib/config.js | 4 +- src/lib/cookie/cookie.js | 318 +- src/lib/init.js | 75 +- src/lib/store.js | 648 +- src/lib/translations.js | 36 +- src/lib/vendor.js | 35 +- src/lib/vendors-mock.json | 4199 ++++ 15 files changed, 20615 insertions(+), 787 deletions(-) create mode 100644 package-lock.json create mode 100644 src/lib/vendors-mock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..7b89a3ce --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15781 @@ +{ + "name": "appnexus-cmp", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", + "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + } + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@iabtcf/cmpapi": { + "version": "1.0.0-beta.8", + "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.8.tgz", + "integrity": "sha512-+iNRFy7DeneFyj0J0zNMOdo5F8T5uYjBTcfEh/5ICiFUXkwBcANcsbMfCHb3T+bd/kuOvCGJsyhd9VqvbynXtg==", + "requires": { + "@iabtcf/core": "1.0.0-beta.8", + "@iabtcf/util": "1.0.0-beta.8" + } + }, + "@iabtcf/core": { + "version": "1.0.0-beta.8", + "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.8.tgz", + "integrity": "sha512-RSf3K0OlOu0DRulJ7ES+iyrzJqqCqlwGjfbuB6U3PP5uZfDkO0MMc7zNdhnX7IvV0aMv7uOnAsdKlL7crHPYwA==", + "requires": { + "@iabtcf/util": "1.0.0-beta.8" + } + }, + "@iabtcf/util": { + "version": "1.0.0-beta.8", + "resolved": "https://registry.npmjs.org/@iabtcf/util/-/util-1.0.0-beta.8.tgz", + "integrity": "sha512-REShVRoTKHzD0Q2hB8sFkvrCta1HMtnFAda/eE1dvMXRLWUw2TG9fcIyDaoSGXrQ8XDwtNA/h8fPpcGeNjsyfA==" + }, + "@sinonjs/commons": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", + "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "dependencies": { + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + } + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" + }, + "arg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-2.0.0.tgz", + "integrity": "sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "args": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/args/-/args-4.0.0.tgz", + "integrity": "sha512-4b7lVF58nlo7sNtq8s2OueroOY/UHn0Nt/NVjsx9zn28u6yDVb9bQ/uy/5jKtHCbUDil4MlMyDLF5+OHEgnTug==", + "requires": { + "camelcase": "5.0.0", + "chalk": "2.3.2", + "leven": "2.1.0", + "mri": "1.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "babel": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz", + "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", + "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.4" + } + }, + "babel-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-do-expressions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", + "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-function-bind": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "dev": true, + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, + "babel-plugin-transform-do-expressions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", + "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", + "dev": true, + "requires": { + "babel-plugin-syntax-do-expressions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-function-bind": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", + "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", + "dev": true, + "requires": { + "babel-plugin-syntax-function-bind": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-assign": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz", + "integrity": "sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^22.4.4", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-preset-stage-0": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", + "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", + "dev": true, + "requires": { + "babel-plugin-transform-do-expressions": "^6.22.0", + "babel-plugin-transform-function-bind": "^6.22.0", + "babel-preset-stage-1": "^6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + } + } + }, + "caniuse-db": { + "version": "1.0.30001028", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001028.tgz", + "integrity": "sha512-GftV9qo57Glfh93TvXeLjQ74ubAwh1oicEKJMq3HAuavmcwfhpUJNQ7g8aqjUGCjJ3anpizh/ok1wr4oL9PIVA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001028", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", + "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clipboardy": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", + "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", + "requires": { + "arch": "^2.1.0", + "execa": "^0.8.0" + }, + "dependencies": { + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codemirror": { + "version": "5.51.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.51.0.tgz", + "integrity": "sha512-vyuYYRv3eXL0SCuZA4spRFlKNzQAewHcipRQCOKgRy7VNAvZxTKzbItdbCl4S5AgPZ5g3WkHp+ibWQwv9TLG7Q==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-env": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", + "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-loader": { + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + } + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "detect-port": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.2.3.tgz", + "integrity": "sha512-IDbrX6PxqnYy8jV4wSHBaJlErYKTJvW8OQb9F7xivl1iQLqiUYHGa+nZ61Do6+N5uuOn/pReXKNqI9rUn04vug==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.354", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.354.tgz", + "integrity": "sha512-24YMkNiZWOUeF6YeoscWfIGP0oMx+lJpU/miwI+lcu7plIDpyZn8Gx0lx0qTDlzGoz7hx+lpyD8QkbkX5L2Pqw==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "21.27.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.27.2.tgz", + "integrity": "sha512-0E4OIgBJVlAmf1KfYFtZ3gYxgUzC5Eb3Jzmrc9ikI1OY+/cM8Kh72Ti7KfpeHNeD3HJNf9SmEfmvQLIz44Hrhw==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.3.tgz", + "integrity": "sha512-Bt56LNHAQCoou88s8ViKRjMB2+36XRejCQ1VoLj716KI1MoE99HpTVvIThJ0rvFmG4E4Gsq+UgToEjn+j044Bg==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.14.2", + "string.prototype.matchall": "^4.0.2" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", + "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": ">=0.0.5" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "harmony-reflect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", + "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + } + } + }, + "html-webpack-inline-source-plugin": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/html-webpack-inline-source-plugin/-/html-webpack-inline-source-plugin-0.0.10.tgz", + "integrity": "sha512-0ZNU57u7283vrXSF5a4VDnVOMWiSwypKIp1z/XfXWoVHLA1r3Xmyxx5+Lz+mnthz/UvxL1OAf41w5UIF68Jngw==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "slash": "^1.0.0", + "source-map-url": "^0.4.0" + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immutability-helper": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-2.9.1.tgz", + "integrity": "sha512-r/RmRG8xO06s/k+PIaif2r5rGc3j4Yhc01jSBfwPCXDLYZwp/yxralI37Df1mwmuzcCsen/E/ITKcTEvc1PQmQ==", + "requires": { + "invariant": "^2.2.0" + } + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "^3.3.0" + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", + "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^22.4.4" + }, + "dependencies": { + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "jest-cli": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", + "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.2.0", + "jest-config": "^22.4.4", + "jest-environment-jsdom": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^22.4.2", + "jest-message-util": "^22.4.0", + "jest-regex-util": "^22.1.0", + "jest-resolve-dependencies": "^22.1.0", + "jest-runner": "^22.4.4", + "jest-runtime": "^22.4.4", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "jest-worker": "^22.2.2", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + } + } + }, + "jest-changed-files": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", + "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.1", + "jest-environment-node": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^22.4.4", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "pretty-format": "^22.4.0" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-docblock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", + "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.0", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.0", + "jest-matcher-utils": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "source-map-support": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "dev": true, + "requires": { + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" + } + }, + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "dev": true, + "requires": { + "jest-regex-util": "^22.4.3" + } + }, + "jest-runner": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", + "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "jest-config": "^22.4.4", + "jest-docblock": "^22.4.0", + "jest-haste-map": "^22.4.2", + "jest-jasmine2": "^22.4.4", + "jest-leak-detector": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-runtime": "^22.4.4", + "jest-util": "^22.4.1", + "jest-worker": "^22.2.2", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", + "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^22.4.4", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.4", + "jest-haste-map": "^22.4.2", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" + }, + "dependencies": { + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + } + } + }, + "jest-serializer": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "jest-validate": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", + "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-config": "^22.4.4", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^22.4.0" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-worker": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", + "dev": true + }, + "js-beautify": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.3.tgz", + "integrity": "sha512-wfk/IAWobz1TfApSdivH5PJ0miIHgDoYb1ugSqHcODPmaYu46rYe5FVuIEkhjg8IQiv6rDNPyhsqbsohI/C2vQ==", + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "~0.5.1", + "nopt": "~4.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "less": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", + "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "dev": true + }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-expression-evaluator": { + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz", + "integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==", + "dev": true + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micro": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.1.tgz", + "integrity": "sha512-83uimpPJqfwkfKvJl2WWontBlV3hmzrIgyJ+L2uhDXKNk7Ll+/ezK3zBz7TljubpKPqjM0JdT2Ker4MTPmhjgA==", + "requires": { + "arg": "2.0.0", + "chalk": "2.4.0", + "content-type": "1.0.4", + "is-stream": "1.1.0", + "raw-body": "2.3.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "micro-compress": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micro-compress/-/micro-compress-1.0.0.tgz", + "integrity": "sha1-U/WoC0rQMgyhZaVZtuPfFF1PcE8=", + "requires": { + "compression": "^1.6.2" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "mri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz", + "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-version": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.1.3.tgz", + "integrity": "sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg==" + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "dependencies": { + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "openssl-self-signed-certificate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/openssl-self-signed-certificate/-/openssl-self-signed-certificate-1.1.6.tgz", + "integrity": "sha1-nTpHdrGlfphHNQOSEUrS+RWoPdQ=" + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "^5.0.16" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", + "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "^5.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "preact": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-8.5.3.tgz", + "integrity": "sha512-O3kKP+1YdgqHOFsZF2a9JVdtqD+RPzCQc3rP+Ualf7V6rmRDchZ9MJbiGTT7LuyqFKZqlHSOyO/oMFmI2lVTsw==" + }, + "preact-compat": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/preact-compat/-/preact-compat-3.19.0.tgz", + "integrity": "sha512-f83A4hIhH8Uzhb9GbIcGk8SM19ffWlwP9mDaYwQdRnMdekZwcCA7eIAbeV4EMQaV9C0Yuy8iKgBAtyTKPZQt/Q==", + "requires": { + "immutability-helper": "^2.7.1", + "preact-context": "^1.1.3", + "preact-render-to-string": "^3.8.2", + "preact-transition-group": "^1.1.1", + "prop-types": "^15.6.2", + "standalone-react-addons-pure-render-mixin": "^0.1.1" + } + }, + "preact-context": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/preact-context/-/preact-context-1.1.4.tgz", + "integrity": "sha512-gcCjPJ65R0MiW9hDu8W/3WAmyTElIvwLyEO6oLQiM6/TbLKLxCpBCWV8GJjx52TTEyUr60HLDcmoCXZlslelzQ==" + }, + "preact-jsx-chai": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/preact-jsx-chai/-/preact-jsx-chai-2.3.2.tgz", + "integrity": "sha512-LIvtYOUgC7bdXnylosrRYM//06lsdIvnfmkM3vz6rzCSTMzIU30//9s/jQndA2/XxlQJxkR/H2VNYhLX9zRSiw==", + "dev": true, + "requires": { + "preact-render-to-string": "^4.1.0" + }, + "dependencies": { + "preact-render-to-string": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-4.1.0.tgz", + "integrity": "sha512-FlFBJRxo8z4cp6VsDmeYjIEx4ZK2clFJnKIvIj8K1IQCRm7ZgJ/SZ1+BotT86/Nc+V1pNtFabHoUi6gpjx5Pug==", + "dev": true, + "requires": { + "pretty-format": "^3.8.0" + } + } + } + }, + "preact-render-to-string": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-3.8.2.tgz", + "integrity": "sha512-przuZPajiurStGgxMoJP0EJeC4xj5CgHv+M7GfF3YxAdhGgEWAkhOSE0xympAFN20uMayntBZpttIZqqLl77fw==", + "requires": { + "pretty-format": "^3.5.1" + } + }, + "preact-transition-group": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/preact-transition-group/-/preact-transition-group-1.1.1.tgz", + "integrity": "sha1-8KSTJ+pRXs406ivoZMSn0p5dbhA=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-polyfill": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", + "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proptypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proptypes/-/proptypes-1.1.0.tgz", + "integrity": "sha1-eLOCilqmuxMIk54N48YETf1L0jk=" + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", + "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "react-codemirror2": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-4.3.0.tgz", + "integrity": "sha512-tC0n9CHgrQYc976pUlKOaVJYEHAAYTVMers04gNy6jbkFf4rbPlw72y7bbOAfkHHvu6COG5S629Fek30bvHe8w==" + }, + "react-is": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", + "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-bundle-webpack-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-bundle-webpack-plugin/-/replace-bundle-webpack-plugin-1.0.0.tgz", + "integrity": "sha1-VugfcOGm609T9TwSUi3xxvEhllg=", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + }, + "script-ext-html-webpack-plugin": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/script-ext-html-webpack-plugin/-/script-ext-html-webpack-plugin-1.8.8.tgz", + "integrity": "sha512-9mxSrvfX8on97tu4pUfLXQ9StKGxfHKSy3NXsYBi+4EpyhI4oUUhE3KEWUViDiTQHmY7u2ztLT5OfOjQRzmJaQ==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serve": { + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/serve/-/serve-6.5.8.tgz", + "integrity": "sha512-GZYlJz7f6E7Xq6xbg1rTSvQQV9x4v/yYB/sum6egzSBLa/mdk1PViDSX2JvL0Me83sxu3JpEpQELfakDKbGcrw==", + "requires": { + "args": "4.0.0", + "basic-auth": "2.0.0", + "bluebird": "3.5.1", + "boxen": "1.3.0", + "chalk": "2.4.1", + "clipboardy": "1.2.3", + "dargs": "5.1.0", + "detect-port": "1.2.3", + "filesize": "3.6.1", + "fs-extra": "6.0.1", + "handlebars": "4.0.11", + "ip": "1.1.5", + "micro": "9.3.1", + "micro-compress": "1.0.0", + "mime-types": "2.1.18", + "node-version": "1.1.3", + "openssl-self-signed-certificate": "1.1.6", + "opn": "5.3.0", + "path-is-inside": "1.0.2", + "path-type": "3.0.0", + "send": "0.16.2", + "update-check": "1.5.1" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sinon": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", + "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + } + }, + "sinon-chai": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", + "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "dev": true, + "requires": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "standalone-react-addons-pure-render-mixin": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/standalone-react-addons-pure-render-mixin/-/standalone-react-addons-pure-render-mixin-0.1.1.tgz", + "integrity": "sha1-PHQJ9MecQN6axyxhbPZ5qZTzdVE=" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-loader": { + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.20.3.tgz", + "integrity": "sha512-2I7AVP73MvK33U7B9TKlYZAqdROyMXDYSMvHLX43qy3GCOaJNiV6i0v/sv9idWIaQ42Yn2dNv79Q5mKXbKhAZg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "dev": true + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.0" + } + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-check": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.1.tgz", + "integrity": "sha512-M3rjq5KwSrWZrm2GVPIQIF+NXpIn5I9mIV67gGoydptQvzRjLp9ZbM6ctFJeNuaWSm5+mNP7aInELjSiLcIw6A==", + "requires": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "mime": "^1.4.1", + "schema-utils": "^0.3.0" + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", + "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^2.1.2", + "compression": "^1.7.3", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "^0.19.1", + "import-local": "^1.0.0", + "internal-ip": "1.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.5", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index d888ade7..49cb8c22 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,8 @@ "webpack-dev-server": "^2.4.4" }, "dependencies": { + "@iabtcf/cmpapi": "^1.0.0-beta.8", + "@iabtcf/core": "^1.0.0-beta.8", "classnames": "^2.2.5", "codemirror": "^5.34.0", "core-js": "^2.5.3", diff --git a/src/complete.js b/src/complete.js index 4a28e16f..631080ea 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,3 +1,118 @@ +// import 'core-js/fn/array/reduce'; +// import 'core-js/fn/array/fill'; +// import 'core-js/fn/array/map'; +// import 'core-js/fn/array/for-each'; +// import 'core-js/fn/array/filter'; +// import 'core-js/fn/set'; +// import log from './lib/log'; +// import { init } from './lib/init'; +// import { CMP_GLOBAL_NAME } from "./lib/cmp"; +// import configuration from "./lib/config"; +// +// function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion} = {}, {created, vendorListVersion} = {}) { +// if (!created) { +// log.debug('No consent data found. Showing consent tool'); +// configuration.autoDisplay && cmp('showConsentTool'); +// } +// else if (!listVersion) { +// log.debug('Could not determine vendor list version. Not showing consent tool'); +// } +// else if (vendorListVersion !== listVersion) { +// log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); +// configuration.autoDisplay && cmp('showConsentTool'); +// } +// else { +// log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); +// !isConsentToolShowing && configuration.autoDisplay && cmp('showFooter'); +// } +// } +// +// function checkConsent(cmp, store) { +// if (!cmp) { +// log.error('CMP failed to load'); +// } +// else if (!window.navigator.cookieEnabled) { +// log.warn('Cookies are disabled. Ignoring CMP consent check'); +// } +// else { +// cmp('getVendorList', null, vendorList => { +// const timeout = setTimeout(() => { +// handleConsentResult(cmp, store, vendorList); +// }, 100); +// +// cmp('getConsentFields', null, vendorConsents => { +// clearTimeout(timeout); +// handleConsentResult(cmp, store, vendorList, vendorConsents); +// }); +// }); +// } +// } +// +// // Preserve any config options already set +// const {config} = window[CMP_GLOBAL_NAME] || {}; +// const configUpdates = { +// globalConsentLocation: 'https://rasp.mgr.consensu.org/portal.html', +// ...config +// }; +// +// // Add locator frame +// function addLocatorFrame() { +// if (!window.frames['__cmpLocator']) { +// if (document.body) { +// const frame = document.createElement('iframe'); +// frame.style.display = 'none'; +// frame.name = '__cmpLocator'; +// document.body.appendChild(frame); +// } +// else { +// setTimeout(addLocatorFrame, 5); +// } +// } +// } +// +// addLocatorFrame(); +// +// // Add stub +// const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; +// const cmp = function (command, parameter, callback) { +// commandQueue.push({ +// command, +// parameter, +// callback +// }); +// }; +// cmp.commandQueue = commandQueue; +// cmp.receiveMessage = function (event) { +// const data = event && event.data && event.data.__cmpCall; +// if (data) { +// const {callId, command, parameter} = data; +// commandQueue.push({ +// callId, +// command, +// parameter, +// event +// }); +// } +// }; +// +// window.__cmp = cmp; +// +// // Listen for postMessage events +// function listen(type, listener, useCapture) { +// if (window.addEventListener) { +// window.addEventListener(type, listener, useCapture); +// } else if (window.attachEvent) { +// window.attachEvent('on' + type, listener); +// } +// } +// listen('message', event => { +// window.__cmp.receiveMessage(event); +// }, false); +// +// // Initialize CMP and then check if we need to ask for consent +// init(configUpdates).then((store) => checkConsent(window.__cmp, store)); +// + import 'core-js/fn/array/reduce'; import 'core-js/fn/array/fill'; import 'core-js/fn/array/map'; @@ -8,20 +123,21 @@ import log from './lib/log'; import { init } from './lib/init'; import { CMP_GLOBAL_NAME } from "./lib/cmp"; import configuration from "./lib/config"; +import {TCString} from "@iabtcf/core"; -function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion} = {}, {created, vendorListVersion} = {}) { +function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion} = {}, {created, vendorListVersion, policyVersion: consentPolicyVersion} = {}) { if (!created) { log.debug('No consent data found. Showing consent tool'); configuration.autoDisplay && cmp('showConsentTool'); - } - else if (!listVersion) { + } else if (!listVersion) { log.debug('Could not determine vendor list version. Not showing consent tool'); - } - else if (vendorListVersion !== listVersion) { + } else if (vendorListVersion !== listVersion) { log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); configuration.autoDisplay && cmp('showConsentTool'); - } - else { + } else if (consentPolicyVersion !== listPolicyVersion) { + log.debug(`Consent found for policy ${consentPolicyVersion}, but received vendor list with policy ${policyVersion}. Showing consent tool`); + configuration.autoDisplay && cmp('showConsentTool'); + } else { log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); !isConsentToolShowing && configuration.autoDisplay && cmp('showFooter'); } @@ -35,15 +151,31 @@ function checkConsent(cmp, store) { log.warn('Cookies are disabled. Ignoring CMP consent check'); } else { - cmp('getVendorList', null, vendorList => { - const timeout = setTimeout(() => { - handleConsentResult(cmp, store, vendorList); - }, 100); + __tcfapi('getVendorList', 2, (vendorList, success) => { + if (success) { + const timeout = setTimeout(() => { + console.log('in timeout'); + handleConsentResult(cmp, store, vendorList); + }, 100); - cmp('getConsentFields', null, vendorConsents => { - clearTimeout(timeout); - handleConsentResult(cmp, store, vendorList, vendorConsents); - }); + __tcfapi('getTCData', 2, (tcData, success) => { + if (success) { + let tcStringDecoded; + + try { + tcStringDecoded = TCString.decode(tcData.tcString); + console.log('consent was created'); + console.log(tcStringDecoded); + } catch (e) { + console.log('consent was not created'); + handleConsentResult(cmp, store, vendorList) + } finally { + clearTimeout(timeout); + handleConsentResult(cmp, store, vendorList, tcStringDecoded) + } + } + }) + } }); } } @@ -111,3 +243,4 @@ listen('message', event => { // Initialize CMP and then check if we need to ask for consent init(configUpdates).then((store) => checkConsent(window.__cmp, store)); + diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 93de68d2..33aad8a3 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -24,22 +24,28 @@ export default class Details extends Component { getVendors = () => { const { vendorList = {} } = this.props.store; - const { vendors = [] } = vendorList; - return vendors; + const { vendors = {} } = vendorList; + return Object.values(vendors); }; filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [] } = {}) => { + console.log('filter vendors'); return this.getVendors().filter(vendor => { + console.log(vendor); + + console.log(isCustom); if (isCustom !== null && (isCustom && vendor.external_id || !isCustom && !vendor.external_id)) { return false; } - const vendorPurposeIds = new Set([...(vendor.purposeIds || []), ...(vendor.legIntPurposeIds || [])]); + const vendorPurposeIds = new Set([...(vendor.purposes || []), ...(vendor.legIntPurposes || [])]); + console.log(vendorPurposeIds); if (!purposeIds.every(purposeId => vendorPurposeIds.has(purposeId))) { return false; } - const vendorFeatureIds = new Set(vendor.featureIds || []); + const vendorFeatureIds = new Set(vendor.features || []); + console.log(vendorFeatureIds); if (!featureIds.every(featureId => vendorFeatureIds.has(featureId))) { return false; } @@ -49,6 +55,8 @@ export default class Details extends Component { }; handleShowVendors = (filter) => { + console.log(this.filterVendors(filter)); + this.setState({ vendors: this.filterVendors(filter) }); @@ -65,6 +73,8 @@ export default class Details extends Component { }; render(props, state) { + console.log('details render'); + const { onSaveOrClose, store @@ -73,22 +83,38 @@ export default class Details extends Component { const { vendorList = {}, customPurposeList = {}, - vendorConsentData, - publisherConsentData, + tcModel, + selectPurpose, - selectStandardPurpose, - selectCustomPurpose, + selectPurposeLegitimateInterest, + selectSpecialFeature, selectVendors, selectVendor, + selectVendorLegitimateInterest, initialVendorsRejection, - persistedVendorConsentData = {}, - persistedPublisherConsentData = {}, + + selectPublisherPurpose, + selectPublisherLegitimateInterest, + selectPublisherCustomPurpose, + selectPublisherCustomLegitimateInterest, + + + persistedConsentData = {}, subsection } = store; - const { selectedPurposeIds, selectedVendorIds } = vendorConsentData; - const { selectedStandardPurposeIds, selectedCustomPurposeIds } = publisherConsentData; - const { created: vendorConsentCreated } = persistedVendorConsentData; - const { purposes = [], features = [] } = vendorList; + + const { + purposeConsents, + publisherConsents, + publisherCustomConsents, + vendorConsents, + } = tcModel; + + console.log('details '); + console.log(vendorList); + + const { created: consentCreated } = persistedConsentData; + const { purposes = {}, specialPurposes = {}, features = {}, specialFeatures = {}} = vendorList; const { purposes: customPurposes = [] } = customPurposeList; @@ -104,29 +130,35 @@ export default class Details extends Component {
    diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 77e68278..e92e2d73 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -41,24 +41,31 @@ export default class Purposes extends Component { handleSelectPurpose = ({isSelected, dataId}, isPublisher = false) => { const { selectPurpose, - selectStandardPurpose, - selectCustomPurpose + selectPublisherPurpose, + selectPublisherCustomPurpose } = this.props; + console.log('handleSelectPurpose'); + const allPurposes = this.getAllPurposes(); const selectedPurpose = allPurposes[dataId]; if (selectedPurpose) { if (selectedPurpose.custom) { - selectCustomPurpose(selectedPurpose.id, isSelected); + selectPublisherCustomPurpose(selectedPurpose.id, isSelected); } else if (isPublisher) { - selectStandardPurpose(selectedPurpose.id, isSelected); + selectPublisherPurpose(selectedPurpose.id, isSelected); } else { + console.log('should select iab purpose'); selectPurpose(selectedPurpose.id, isSelected); } } }; + handleSelectSpecialFeature = ({isSelected, dataId}) => { + this.props.selectSpecialFeature(dataId, isSelected); + }; + createHandleSelectPurpose = (isPublisher) => { return (data) => this.handleSelectPurpose(data, isPublisher); }; @@ -102,14 +109,16 @@ export default class Purposes extends Component { selectedStandardPurposeIds, selectedCustomPurposeIds, purposes, + specialPurposes, features, + specialFeatures, persistedVendorConsentData, persistedPublisherConsentData, + persistedConsentData, initialVendorsRejection } = props; - const {created: vendorConsentCreated} = persistedVendorConsentData; - const {created: publisherConsentCreated} = persistedPublisherConsentData; + const { created: consentCreated } = persistedConsentData; const { selectedTab, @@ -131,19 +140,24 @@ export default class Purposes extends Component { if (selectedTab === TAB_CONSENTS && !renderedTabIndices.has(selectedTab)) { renderedTabIndices.add(selectedTab); - if (!vendorConsentCreated) { + console.log('consent created? ' + consentCreated); + if (!consentCreated) { + console.log('should unselect all iab purposes'); purposes.forEach((purpose, index) => { this.handleSelectPurpose({isSelected: false, dataId: index}); }); - initialVendorsRejection(); - } - if (!publisherConsentCreated) { - allPurposes.forEach((purpose, index) => { - if (!purposeIsTechnical(purpose)) { - this.handleSelectPurpose({isSelected: false, dataId: index}, true); - } + specialFeatures.forEach((specialFeature, index) => { + this.handleSelectSpecialFeature({isSelected:false, dataId: index}) }); + initialVendorsRejection(); } + // if (!publisherConsentCreated) { + // allPurposes.forEach((purpose, index) => { + // if (!purposeIsTechnical(purpose)) { + // this.handleSelectPurpose({isSelected: false, dataId: index}, true); + // } + // }); + // } } return ( diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index a0135e3d..0db00108 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -41,8 +41,8 @@ export default class Vendors extends Component { }; handleMoreChoices = () => { - const {vendorConsentCreated, initialVendorsRejection} = this.props; - if (!vendorConsentCreated) { + const {consentCreated, initialVendorsRejection} = this.props; + if (!consentCreated) { initialVendorsRejection(); } diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index f412c46b..7cc22fa0 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -9,9 +9,11 @@ export default class Popup extends Component { onAcceptAll = () => { const { store, onSave } = this.props; store.selectAllVendors(true); + store.selectAllVendorsLegitimateInterest(true); store.selectAllPurposes(true); - store.selectAllStandardPurposes(true); - store.selectAllCustomPurposes(true); + store.selectAllPurposesLegitimateInterest(true); + store.selectAllSpecialFeaturesOptIns(true); + store.selectAllPublisherPurposes(true); onSave(); }; diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 237d59ba..fc3dea86 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -54,6 +54,7 @@ export default class Cmp { * @param {Array} vendorIds Array of vendor IDs to retrieve. If empty return all vendors. */ getVendorConsents: (vendorIds, callback = () => {}) => { + console.log('getVendorConsents'); const consent = { metadata: this.generateConsentString(), gdprApplies: config.gdprApplies, @@ -69,6 +70,8 @@ export default class Cmp { */ getConsentFields: (params = {}, callback = () => {}) => { const data = this.store.getConsentFieldsObject(); + console.log('cmp.getConsentFields.data'); + console.log(data); const now = new Date(); const consent = { metadata: this.generateConsentString({ diff --git a/src/lib/config.js b/src/lib/config.js index 3cdd8e1e..f2d24e8f 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,7 +6,7 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - logging: false, + logging: true, localization: {}, forceLocale: null, gdprApplies: true, @@ -40,6 +40,8 @@ class Config { return acc; }, { validUpdates: {}, invalidKeys: [] }); + console.log(validUpdates); + Object.assign(this, validUpdates); if (invalidKeys.length) { log.warn(`Invalid CMP config values not applied: ${invalidKeys.join(', ')}`); diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index d2c993b5..e923b97b 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -1,200 +1,9 @@ import Promise from 'promise-polyfill'; import log from '../log'; -import { - padRight, - encodeVendorCookieValue, - decodeVendorCookieValue, - encodePublisherCookieValue, - decodePublisherCookieValue -} from './cookieutils'; +import {TCString} from '@iabtcf/core'; -import { sendPortalCommand } from '../portal'; -import pack from '../../../package.json'; -import config from '../config'; -const arrayFrom = require('core-js/library/fn/array/from'); - -const PUBLISHER_CONSENT_COOKIE_NAME = 'pubconsent'; -const PUBLISHER_CONSENT_COOKIE_MAX_AGE = 33696000; - -const VENDOR_CONSENT_COOKIE_NAME = 'euconsent'; -const VENDOR_CONSENT_COOKIE_MAX_AGE = 33696000; - - -function encodeVendorIdsToBits(maxVendorId, selectedVendorIds = new Set()) { - let vendorString = ''; - for (let id = 1; id <= maxVendorId; id++) { - vendorString += (selectedVendorIds.has(id) ? '1' : '0'); - } - return padRight(vendorString, Math.max(0, maxVendorId - vendorString.length)); -} - -function encodePurposeIdsToBits(purposes, selectedPurposeIds = new Set()) { - const maxPurposeId = Math.max(0, - ...purposes.map(({id}) => id), - ...arrayFrom(selectedPurposeIds)); - let purposeString = ''; - for (let id = 1; id <= maxPurposeId; id++) { - purposeString += (selectedPurposeIds.has(id) ? '1' : '0'); - } - return purposeString; -} - -function decodeBitsToIds(bitString) { - return bitString.split('').reduce((acc, bit, index) => { - if (bit === '1') { - acc.add(index + 1); - } - return acc; - }, new Set()); -} - -function convertVendorsToRanges(maxVendorId, selectedIds) { - let range = []; - const ranges = []; - for (let id = 1; id <= maxVendorId; id++) { - if (selectedIds.has(id)) { - range.push(id); - } - - // If the range has ended or at the end of vendors add entry to the list - if ((!selectedIds.has(id) || id === maxVendorId) && range.length) { - const startVendorId = range.shift(); - const endVendorId = range.pop(); - range = []; - ranges.push({ - isRange: typeof endVendorId === 'number', - startVendorId, - endVendorId - }); - } - } - return ranges; -} - -function encodeVendorConsentData(vendorData) { - const {vendorList = {}, selectedPurposeIds, selectedVendorIds, maxVendorId} = vendorData; - const {purposes = []} = vendorList; - - // Encode the data with and without ranges and return the smallest encoded payload - const noRangesData = encodeVendorCookieValue({ - ...vendorData, - maxVendorId, - purposeIdBitString: encodePurposeIdsToBits(purposes, selectedPurposeIds), - isRange: false, - vendorIdBitString: encodeVendorIdsToBits(maxVendorId, selectedVendorIds) - }); - - const vendorRangeList = convertVendorsToRanges(maxVendorId, selectedVendorIds); - const rangesData = encodeVendorCookieValue({ - ...vendorData, - maxVendorId, - purposeIdBitString: encodePurposeIdsToBits(purposes, selectedPurposeIds), - isRange: true, - defaultConsent: false, - numEntries: vendorRangeList.length, - vendorRangeList - }); - - return noRangesData.length < rangesData.length ? noRangesData : rangesData; -} - -function decodeVendorConsentData(cookieValue) { - const { - cookieVersion, - cmpId, - cmpVersion, - consentScreen, - consentLanguage, - vendorListVersion, - purposeIdBitString, - maxVendorId, - created, - lastUpdated, - isRange, - defaultConsent, - vendorIdBitString, - vendorRangeList - } = decodeVendorCookieValue(cookieValue); - - const cookieData = { - cookieVersion, - cmpId, - cmpVersion, - consentScreen, - consentLanguage, - vendorListVersion, - selectedPurposeIds: decodeBitsToIds(purposeIdBitString), - maxVendorId, - created, - lastUpdated - }; - - if (isRange) { - const idMap = vendorRangeList.reduce((acc, {isRange, startVendorId, endVendorId}) => { - const lastVendorId = isRange ? endVendorId : startVendorId; - for (let i = startVendorId; i <= lastVendorId; i++) { - acc[i] = true; - } - return acc; - }, {}); - - cookieData.selectedVendorIds = new Set(); - for (let i = 0; i <= maxVendorId; i++) { - if ((defaultConsent && !idMap[i]) || - (!defaultConsent && idMap[i])) { - cookieData.selectedVendorIds.add(i); - } - } - } - else { - cookieData.selectedVendorIds = decodeBitsToIds(vendorIdBitString); - } - - return cookieData; -} - -function encodePublisherConsentData(publisherData) { - const { - vendorList = {}, - customPurposeList = {}, - selectedStandardPurposeIds, - selectedCustomPurposeIds - } = publisherData; - const {purposes: customPurposes = []} = customPurposeList; - const {purposes = []} = vendorList; - - return encodePublisherCookieValue({ - ...publisherData, - numCustomPurposes: customPurposes.length, - standardPurposeIdBitString: encodePurposeIdsToBits(purposes, selectedStandardPurposeIds), - customPurposeIdBitString: encodePurposeIdsToBits(customPurposes, selectedCustomPurposeIds) - }); -} - -function decodePublisherConsentData(cookieValue) { - const { - cookieVersion, - cmpId, - vendorListVersion, - publisherPurposeVersion, - created, - lastUpdated, - standardPurposeIdBitString, - customPurposeIdBitString - } = decodePublisherCookieValue(cookieValue); - - return { - cookieVersion, - cmpId, - vendorListVersion, - publisherPurposeVersion, - created, - lastUpdated, - selectedStandardPurposeIds: decodeBitsToIds(standardPurposeIdBitString), - selectedCustomPurposeIds: decodeBitsToIds(customPurposeIdBitString) - }; - -} +const CONSENT_COOKIE = 'adpconsent'; +const CONSENT_COOKIE_MAX_AGE = 33696000; function readCookie(name) { const value = `; ${document.cookie}`; @@ -210,120 +19,31 @@ function writeCookie(name, value, maxAgeSeconds, path = '/') { document.cookie = `${name}=${value};path=${path}${maxAge}`; } -function readPublisherConsentCookie() { - // If configured try to read publisher cookie - if (config.storePublisherData) { - const cookie = readCookie(PUBLISHER_CONSENT_COOKIE_NAME); - log.debug('Read publisher consent data from local cookie', cookie); - if (cookie) { - return decodePublisherConsentData(cookie); - } - } -} - -function writePublisherConsentCookie(publisherConsentData) { - log.debug('Write publisher consent data to local cookie', publisherConsentData); - writeCookie(PUBLISHER_CONSENT_COOKIE_NAME, - encodePublisherConsentData(publisherConsentData), - PUBLISHER_CONSENT_COOKIE_MAX_AGE, - '/'); +function decodeConsentData (encoded) { + return TCString.decode(encoded); } - -/** - * Read vendor consent data from third-party cookie on the - * global vendor list domain. - * - * @returns Promise resolved with decoded cookie object - */ -function readGlobalVendorConsentCookie() { - log.debug('Request consent data from global cookie'); - return sendPortalCommand({ - command: 'readVendorConsent', - }).then(result => { - log.debug('Read consent data from global cookie', result); - if (result) { - return decodeVendorConsentData(result); - } - }).catch(err => { - log.error('Failed reading global vendor consent cookie', err); - }); +function encodeConsentData (decoded) { + return TCString.encode(decoded); } -/** - * Write vendor consent data to third-party cookie on the - * global vendor list domain. - * - * @returns Promise resolved after cookie is written - */ -function writeGlobalVendorConsentCookie(vendorConsentData) { - log.debug('Write consent data to global cookie', vendorConsentData); - return sendPortalCommand({ - command: 'writeVendorConsent', - encodedValue: encodeVendorConsentData(vendorConsentData), - vendorConsentData, - cmpVersion: pack.version - }).catch(err => { - log.error('Failed writing global vendor consent cookie', err); - }); -} - -/** - * Read vendor consent data from first-party cookie on the - * local domain. - * - * @returns Promise resolved with decoded cookie object - */ -function readLocalVendorConsentCookie() { - const cookie = readCookie(VENDOR_CONSENT_COOKIE_NAME); +function readConsentCookie () { + const cookie = readCookie(CONSENT_COOKIE); log.debug('Read consent data from local cookie', cookie); - return Promise.resolve(cookie && decodeVendorConsentData(cookie)); -} - -/** - * Write vendor consent data to first-party cookie on the - * local domain. - * - * @returns Promise resolved after cookie is written - */ -function writeLocalVendorConsentCookie(vendorConsentData) { - log.debug('Write consent data to local cookie', vendorConsentData); - return Promise.resolve(writeCookie(VENDOR_CONSENT_COOKIE_NAME, - encodeVendorConsentData(vendorConsentData), - VENDOR_CONSENT_COOKIE_MAX_AGE, - '/')); -} - -function readVendorConsentCookie() { - return config.storeConsentGlobally ? - readGlobalVendorConsentCookie() : readLocalVendorConsentCookie(); + if (cookie) { + return TCString.decode(cookie); + } } -function writeVendorConsentCookie(vendorConsentData) { - return config.storeConsentGlobally ? - writeGlobalVendorConsentCookie(vendorConsentData) : writeLocalVendorConsentCookie(vendorConsentData); +function writeConsentCookie(encodedConsent) { + log.debug('Write consent data to local cookie'); + return Promise.resolve(writeCookie(CONSENT_COOKIE, encodedConsent, CONSENT_COOKIE_MAX_AGE, '/')); } export { writeCookie, - encodeVendorConsentData, - decodeVendorConsentData, - - convertVendorsToRanges, - - encodePublisherConsentData, - decodePublisherConsentData, - - readGlobalVendorConsentCookie, - writeGlobalVendorConsentCookie, - readLocalVendorConsentCookie, - writeLocalVendorConsentCookie, - readVendorConsentCookie, - writeVendorConsentCookie, - - readPublisherConsentCookie, - writePublisherConsentCookie, - - PUBLISHER_CONSENT_COOKIE_NAME, - VENDOR_CONSENT_COOKIE_NAME + decodeConsentData, + encodeConsentData, + readConsentCookie, + writeConsentCookie, }; diff --git a/src/lib/init.js b/src/lib/init.js index 3f441efc..d9b806a0 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -1,16 +1,19 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; +// do zaorania import Cmp, { CMP_GLOBAL_NAME } from './cmp'; -import { readVendorConsentCookie, readPublisherConsentCookie, decodeVendorConsentData, decodePublisherConsentData } from './cookie/cookie'; -import { fetchPubVendorList, fetchGlobalVendorList, fetchPurposeList } from './vendor'; +import {Vector} from '@iabtcf/core'; +import {CmpApi} from '@iabtcf/cmpapi'; +import { fetchGlobalVendorList } from './vendor'; +import { decodeConsentData, readConsentCookie } from './cookie/cookie'; import log from './log'; import pack from '../../package.json'; import config from './config'; -const CMP_VERSION = 1; +const CMP_VERSION = 2; const CMP_ID = 280; -const COOKIE_VERSION = 1; +const COOKIE_VERSION = 2; function readExternalConsentData(config) { return new Promise((resolve, reject) => { @@ -20,11 +23,7 @@ function readExternalConsentData(config) { reject(err); } else { try { - resolve([ - data.vendor && decodeVendorConsentData(data.vendor) || undefined, - undefined, - data.publisher && decodePublisherConsentData(data.publisher) || undefined - ]); + resolve(data.vendor && decodeConsentData(data.vendor) || undefined); } catch (err) { reject(err); } @@ -36,47 +35,36 @@ function readExternalConsentData(config) { }); } -function readInternalConsentData() { - return Promise.all([ - [ - readVendorConsentCookie(), - fetchPubVendorList(), - readPublisherConsentCookie() - ] - ]); -} - -function readGlobalAndExternalConsentData(config) { - return Promise.all([ - readExternalConsentData(config), - readVendorConsentCookie() - ]); -} - export function init(configUpdates) { config.update(configUpdates); log.debug('Using configuration:', config); // Fetch the current vendor consent before initializing - return ((config.getConsentData) ? readGlobalAndExternalConsentData(config) : readInternalConsentData()) - .then(([[vendorConsentData, pubVendorsList, publisherConsentData], globalVendorConsentData]) => { - const {vendors} = pubVendorsList || {}; - - // Check config for allowedVendorIds then the pubVendorList - const {allowedVendorIds: configVendorIds} = config; - const allowedVendorIds = configVendorIds instanceof Array && configVendorIds.length ? configVendorIds : - vendors && vendors.map(vendor => vendor.id); + return ((config.getConsentData) ? readExternalConsentData(config) : readConsentCookie()) + .then((consentData) => { + const { vendorConsents = new Vector() } = consentData || {}; + + // console.log(consentData); + // + // // Check config for allowedVendorIds then the pubVendorList + // const {allowedVendorIds: configVendorIds} = config; + // + // const vendorIdsPresentOnList = []; + // vendorConsents && vendorConsents.forEach((hasConsent, vendorId) => { + // vendorIdsPresentOnList.push(vendorId); + // }); + // + // const allowedVendorIds = configVendorIds instanceof Array && configVendorIds.length ? configVendorIds : vendorIdsPresentOnList; + + const cmpApi = new CmpApi(CMP_ID, CMP_VERSION); // Initialize the store with all of our consent data const store = new Store({ cmpVersion: CMP_VERSION, cmpId: CMP_ID, cookieVersion: COOKIE_VERSION, - vendorConsentData, - globalVendorConsentData, - publisherConsentData, - pubVendorsList, - allowedVendorIds + consentData, + cmpApi }); // Pull queued command from __cmp stub @@ -112,15 +100,8 @@ export function init(configUpdates) { // Request lists return Promise.all([ store, - fetchGlobalVendorList().then(store.updateVendorList), - fetchPurposeList().then(store.updateCustomPurposeList) + fetchGlobalVendorList().then(store.updateVendorList) ]).then((params) => { - //Update consent data if cookie on global domain exists - if (store.persistedGlobalVendorConsentData) { - store.mergeVendorConsentsFromGlobalCookie(); - store.mergePurposeConsentsFromGlobalCookie(); - } - cmp.cmpReady = true; cmp.notify('cmpReady'); return params[0]; diff --git a/src/lib/store.js b/src/lib/store.js index c6327a92..31e2cfd2 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -1,7 +1,8 @@ -import { writePublisherConsentCookie, writeVendorConsentCookie, encodePublisherConsentData, encodeVendorConsentData } from "./cookie/cookie"; +import { writeConsentCookie } from "./cookie/cookie"; import config from './config'; import { findLocale } from './localize'; import log from './log'; +import {TCString, Vector, GVL, TCModel} from '@iabtcf/core'; const arrayFrom = require('core-js/library/fn/array/from'); export const SECTION_INTRO = 0; @@ -29,73 +30,48 @@ function copyData(dataObject) { export default class Store { constructor({ cmpId = 1, - cmpVersion = 1, - cookieVersion = 1, - vendorConsentData, - globalVendorConsentData, - publisherConsentData, + cmpVersion = 2, + cookieVersion = 2, + consentData, vendorList, - customPurposeList, - pubVendorsList, - allowedVendorIds + cmpApi } = {}) { + + console.log('config'); + console.log(config); // Keep track of data that has already been persisted - this.persistedVendorConsentData = copyData(vendorConsentData); - this.persistedPublisherConsentData = copyData(publisherConsentData); - this.persistedGlobalVendorConsentData = copyData(globalVendorConsentData); + consentData = consentData || {}; + this.persistedConsentData = copyData(consentData); + // console.log(this.persistedConsentData); const consentLanguage = findLocale().substr(0, 2).toUpperCase(); - this.vendorConsentData = Object.assign( - { - selectedPurposeIds: new Set(), - selectedVendorIds: new Set() - }, - vendorConsentData, - { - cookieVersion, - cmpId, - cmpVersion, - consentLanguage - }); + const tcModel = new TCModel(); + tcModel.cmpId = cmpId; + tcModel.cmpVersion = cmpVersion; - this.globalVendorConsentData = Object.assign( - { - selectedPurposeIds: new Set(), - selectedVendorIds: new Set() - }, - globalVendorConsentData, + this.tcModel = Object.assign( + tcModel, + consentData, { cookieVersion, cmpId, cmpVersion, consentLanguage - } - ); - - this.publisherConsentData = Object.assign( - { - selectedStandardPurposeIds: new Set(), - selectedCustomPurposeIds: new Set() - }, - publisherConsentData, - { - cookieVersion, - cmpId }); - this.globalVendorIdsPresentOnList = new Map(); - this.pubVendorsList = pubVendorsList; - this.allowedVendorIds = new Set(allowedVendorIds); - this.isConsentToolShowing = false; + + this.cmpApi = cmpApi; + this.isConsentToolShowing = this.cmpApi.uiVisible = false; this.isFooterShowing = false; this.section = SECTION_INTRO; this.subsection = SECTION_PURPOSES; this.hasInitialVendorsRejectionOccured = false; - - this.updateVendorList(vendorList); - this.updateCustomPurposeList(customPurposeList); } - isAllSetTrue = obj => Object.keys(obj).map(key => obj[key]).every((value) => value === true); + isAllSetTrue = obj => { + console.log(obj); + console.log('isAllSetTrue'); + return Object.keys(obj).map(key => obj[key]).every((value) => value === true); + }; /** * Build vendor consent object from data that has already been persisted. This @@ -105,58 +81,84 @@ export default class Store { getVendorConsentsObject = (vendorIds) => { const { vendorList = {}, - persistedVendorConsentData = {}, - pubVendorsList = {}, - allowedVendorIds, + persistedConsentData, } = this; const { - publisherVendorsVersion, - globalVendorListVersion - } = pubVendorsList; - - const { - cookieVersion, + version_: cookieVersion, created, lastUpdated, - cmpId, - cmpVersion, - consentScreen, - consentLanguage, - vendorListVersion, - maxVendorId = 0, - selectedVendorIds = new Set(), - selectedPurposeIds = new Set() - } = persistedVendorConsentData; - - const {purposes = [], vendors = []} = vendorList; + cmpId_: cmpId, + cmpVersion_: cmpVersion, + consentScreen_: consentScreen, + consentLanguage_: consentLanguage, + vendorListVersion_: vendorListVersion, + vendorConsents = new Vector(), + purposeConsents = new Vector(), + purposeLegitimateInterest = new Vector(), + vendorLegitimateInterest = new Vector(), + specialFeatureOptIns = new Vector() + + } = persistedConsentData; + + const {purposes = {}, vendors = {}, specialFeatures={}} = vendorList; + const maxVendorId = vendorConsents.maxId; + const maxPurposeId = purposeConsents.maxId; + const maxLegIntId = purposeLegitimateInterest.maxId; + const maxSpecialFeatureOptInsId = specialFeatureOptIns.maxId; // Map requested vendorIds const vendorMap = {}; + const vendorLegIntMap = {}; + + if (vendorIds && vendorIds.length) { - vendorIds.forEach(id => vendorMap[id] = selectedVendorIds.has(id) && (!allowedVendorIds.size || allowedVendorIds.has(id))); - } - else { + vendorIds.forEach(id => { + vendorMap[id] = vendorConsents.has(id); + vendorLegIntMap[id] = vendorLegitimateInterest.has(id); + }); + } else { // In case the vendor list has not been loaded yet find the highest // vendor ID to map any consent data we already have const lastVendorId = Math.max(maxVendorId, - ...vendors.map(({id}) => id), - ...arrayFrom(selectedVendorIds)); + ...Object.values(vendors).map(({id}) => id) + ); // Map all IDs up to the highest vendor ID found for (let i = 1; i <= lastVendorId; i++) { - vendorMap[i] = selectedVendorIds.has(i) && (!allowedVendorIds.size || allowedVendorIds.has(i)); + vendorMap[i] = vendorConsents.has(i); + vendorLegIntMap[i] = vendorLegitimateInterest.has(i); } } - // Map all purpose IDs const lastPurposeId = Math.max( - ...purposes.map(({id}) => id), - ...arrayFrom(selectedPurposeIds)); + ...[maxPurposeId], + ...Object.values(purposes).map(({id}) => id), + ); const purposeMap = {}; for (let i = 1; i <= lastPurposeId; i++) { - purposeMap[i] = selectedPurposeIds.has(i); + purposeMap[i] = purposeConsents.has(i); + } + + const lastLegIntId = Math.max( + ...[maxLegIntId], + ...Object.values(purposes).map(({id}) => id), + ); + + const legIntMap = {}; + for (let i = 1; i <= lastLegIntId; i++) { + legIntMap[i] = purposeLegitimateInterest.has(i); + } + + const lastSpecialFeatureOptInsId = Math.max( + ...[maxSpecialFeatureOptInsId], + ...Object.values(specialFeatures).map(({id}) => id), + ); + + const specialFeatureOptInsMap = {}; + for (let i = 1; i <= lastSpecialFeatureOptInsId; i++) { + specialFeatureOptInsMap[i] = specialFeatureOptIns.has(i); } return { @@ -167,12 +169,12 @@ export default class Store { cmpVersion, consentScreen, consentLanguage, - publisherVendorsVersion, - globalVendorListVersion, vendorListVersion, - maxVendorId, purposeConsents: purposeMap, - vendorConsents: vendorMap + purposeLegitimateInterest: legIntMap, + specialFeatureOptIns: specialFeatureOptInsMap, + vendorConsents: vendorMap, + vendorLegitimateInterest: vendorLegIntMap }; }; @@ -183,40 +185,70 @@ export default class Store { getPublisherConsentsObject = () => { const { vendorList = {}, - customPurposeList = {}, - persistedPublisherConsentData = {} + persistedConsentData = {} } = this; const { - cookieVersion, + version_: cookieVersion, created, lastUpdated, - cmpId, - vendorListVersion, - publisherPurposeVersion, - selectedStandardPurposeIds = new Set(), - selectedCustomPurposeIds = new Set() - } = persistedPublisherConsentData; - - const {purposes = []} = vendorList; - const {purposes: customPurposes = []} = customPurposeList; - - const lastStandardPurposeId = Math.max( - ...purposes.map(({id}) => id), - ...arrayFrom(selectedStandardPurposeIds)); - - const lastCustomPurposeId = Math.max( - ...customPurposes.map(({id}) => id), - ...arrayFrom(selectedStandardPurposeIds)); - - // Map all purpose IDs - const standardPurposeMap = {}; - for (let i = 1; i <= lastStandardPurposeId; i++) { - standardPurposeMap[i] = selectedStandardPurposeIds.has(i); + cmpId_: cmpId, + vendorListVersion_: vendorListVersion, + publisherConsents = new Vector(), + publisherLegitimateInterest = new Vector(), + publisherCustomConsents = new Vector(), + publisherCustomLegitimateInterest = new Vector(), + } = persistedConsentData; + + const {purposes = {}} = vendorList; + let publisherCustomPurposesMap = {}; + let publisherCustomLegIntMap = {}; + + const maxPersistedPublisherPurposeId = publisherConsents.maxId; + const maxPersistedPublisherLegIntId = publisherLegitimateInterest.maxId; + + const lastPublisherPurposeId = Math.max( + ...Object.values(purposes).map(({id}) => id), + ...[maxPersistedPublisherPurposeId]); + + const publisherPurposesMap = {}; + for (let i = 1; i <= lastPublisherPurposeId; i++) { + publisherPurposesMap[i] = publisherConsents.has(i); + } + + const lastPublisherLegIntId = Math.max( + ...Object.values(purposes).map(({id}) => id), + ...[maxPersistedPublisherLegIntId]); + + const publisherLegIntMap= {}; + for (let i = 1; i <= lastPublisherLegIntId; i++) { + publisherLegIntMap[i] = publisherLegitimateInterest.has(i); + } + + if (publisherCustomConsents.size) { + const maxPersistedPublisherCustomPurposeId = publisherCustomConsents.maxId; + + const lastPublisherCustomPurposeId = Math.max( + ...Object.values(purposes).map(({id}) => id), + ...[maxPersistedPublisherCustomPurposeId]); + + publisherCustomPurposesMap = {}; + for (let i = 1; i <= lastPublisherCustomPurposeId; i++) { + publisherCustomPurposesMap[i] = publisherCustomConsents.has(i); + } } - const customPurposeMap = {}; - for (let i = 1; i <= lastCustomPurposeId; i++) { - customPurposeMap[i] = selectedCustomPurposeIds.has(i); + + if (publisherCustomLegitimateInterest.size) { + const maxPersistedPublisherCustomLegIntId = publisherCustomLegitimateInterest.maxId; + + const lastPublisherCustomLegIntId = Math.max( + ...Object.values(purposes).map(({id}) => id), + ...[maxPersistedPublisherCustomLegIntId]); + + publisherCustomLegIntMap = {}; + for (let i = 1; i <= lastPublisherCustomLegIntId; i++) { + publisherCustomLegIntMap[i] = publisherCustomLegitimateInterest.has(i); + } } return { @@ -225,9 +257,10 @@ export default class Store { lastUpdated, cmpId, vendorListVersion, - publisherPurposeVersion, - standardPurposes: standardPurposeMap, - customPurposes: customPurposeMap + publisherConsents: publisherPurposesMap, + publisherLegitimateInterest: publisherLegIntMap, + publisherCustomConsents: publisherCustomPurposesMap, + publisherCustomLegitimateInterest: publisherCustomLegIntMap }; }; @@ -235,37 +268,38 @@ export default class Store { * Build consent fields object from data that has already been persisted. */ getConsentFieldsObject = () => { - const { - persistedVendorConsentData = {}, - vendorConsentData = {} - } = this; - const { - cmpId, - cmpVersion, - consentLanguage, - consentScreen = 0, - cookieVersion, - created, - globalVendorListVersion, - lastUpdated, - publisherVendorsVersion, - vendorListVersion - } = { - ...vendorConsentData, - ...persistedVendorConsentData - }; - return { - cmpId, - cmpVersion, - consentLanguage, - consentScreen, - cookieVersion, - created, - globalVendorListVersion, - vendorListVersion, - lastUpdated, - publisherVendorsVersion - }; + // console.log('getConsentFieldsObject'); + // const { + // persistedConsentData = {}, + // tcModel + // } = this; + // + // const { + // version_: cookieVersion, + // created, + // lastUpdated, + // cmpId_: cmpId, + // cmpVersion_: cmpVersion, + // consentScreen_: consentScreen, + // consentLanguage_: consentLanguage, + // vendorListVersion_: vendorListVersion, + // globalVendorListVersion, + // } = { + // ...tcModel, + // persistedConsentData + // }; + // + // return { + // cmpId, + // cmpVersion, + // consentLanguage, + // consentScreen, + // cookieVersion, + // created, + // globalVendorListVersion, + // vendorListVersion, + // lastUpdated, + // }; }; /** * Persist all consent data to the cookie. This data will NOT be filtered @@ -274,47 +308,26 @@ export default class Store { */ persist = () => { const { - vendorConsentData, - globalVendorConsentData, - publisherConsentData, vendorList, - customPurposeList + tcModel } = this; const { vendorListVersion = 1, - globalVendorListVersion = 1 } = vendorList || {}; - // Update modification dates and write the cookies const now = new Date(); - vendorConsentData.created = vendorConsentData.created || now; - vendorConsentData.lastUpdated = now; - globalVendorConsentData.created = globalVendorConsentData.created || now; - globalVendorConsentData.lastUpdated = now; - - // Update version of list to one we are using - vendorConsentData.vendorListVersion = vendorListVersion; - globalVendorConsentData.vendorListVersion = globalVendorListVersion; - publisherConsentData.vendorListVersion = vendorListVersion; - - publisherConsentData.created = publisherConsentData.created || now; - publisherConsentData.lastUpdated = now; - - const vendorConsents = {...vendorConsentData, vendorList}; - const publisherConsents = { - ...vendorConsentData, - ...publisherConsentData, - vendorList, - customPurposeList - }; + tcModel.created = tcModel.created || now; + tcModel.lastUpdated = now; + tcModel.vendorListVersion = vendorListVersion; + + let encodedConsent = TCString.encode(this.tcModel); + if (config.setConsentData) { let consentData = { - vendor: encodeVendorConsentData(vendorConsents) + vendor: encodedConsent, + publisher: 'aaa' }; - if (config.storePublisherData) { - consentData.publisher = encodePublisherConsentData(publisherConsents); - } try { config.setConsentData(consentData, err => { if (err) { @@ -324,27 +337,15 @@ export default class Store { } catch (err) { log.error('Failed writing external consent data', err); } - // Write vendor cookie to appropriate domain - this.mergeVendorConsentsToGlobalCookie(); - this.mergePurposeConsentsToGlobalCookie(); - - const globalVendorConsents = {...globalVendorConsentData, vendorList}; - writeVendorConsentCookie(globalVendorConsents); - - this.persistedGlobalVendorConsentData = copyData(globalVendorConsentData); } else { - // Write vendor cookie to appropriate domain - writeVendorConsentCookie(vendorConsents); - - // Write publisher cookie if enabled - if (config.storePublisherData) { - writePublisherConsentCookie(publisherConsents); - } + writeConsentCookie(encodedConsent) } - // Store the persisted data - this.persistedVendorConsentData = copyData(vendorConsentData); - this.persistedPublisherConsentData = copyData(publisherConsentData); + this.persistedConsentData = TCString.decode(encodedConsent); + + + console.log(JSON.parse(JSON.stringify(this.tcModel))); + console.log(JSON.parse(JSON.stringify(this.persistedConsentData))); // Notify of date changes this.storeUpdate(); @@ -362,38 +363,54 @@ export default class Store { storeUpdate = () => { this.listeners.forEach(callback => callback(this)); + this.cmpApi.tcModel = this.tcModel; }; selectVendor = (vendorId, isSelected) => { - const {selectedVendorIds} = this.vendorConsentData; + const {vendorConsents} = this.tcModel; if (isSelected) { - selectedVendorIds.add(vendorId); + vendorConsents.set(vendorId); } else { - selectedVendorIds.delete(vendorId); + vendorConsents.unset(vendorId); } this.storeUpdate(); }; selectVendors = (vendorIds, isSelected) => { - const {selectedVendorIds} = this.vendorConsentData; + const {vendorConsents} = this.tcModel; if (isSelected) { vendorIds.forEach(id => { - selectedVendorIds.add(id); + vendorConsents.set(id); }); - } - else { + } else { vendorIds.forEach(id => { - selectedVendorIds.delete(id); + vendorConsents.unset(id); }); } this.storeUpdate(); }; selectAllVendors = (isSelected) => { - const {vendors = []} = this.vendorList || {}; - const operation = isSelected ? 'add' : 'delete'; - vendors.forEach(({id}) => this.vendorConsentData.selectedVendorIds[operation](id)); + const operation = isSelected ? 'setAllVendorConsents' : 'unsetAllVendorConsents'; + this.tcModel[operation](); + this.storeUpdate(); + }; + + selectVendorLegitimateInterest = (vendorId, isSelected) => { + const {vendorLegitimateInterest} = this.tcModel; + if (isSelected) { + vendorLegitimateInterest.set(vendorId); + } + else { + vendorLegitimateInterest.unset(vendorId); + } + this.storeUpdate(); + }; + + selectAllVendorsLegitimateInterest = (isSelected) => { + const operation = isSelected ? 'setAllVendorLegitimateInterest' : 'unsetAllVendorLegitimateInterest'; + this.tcModel[operation](); this.storeUpdate(); }; @@ -407,72 +424,122 @@ export default class Store { }; selectPurpose = (purposeId, isSelected) => { - const {selectedPurposeIds} = this.vendorConsentData; + const {purposeConsents} = this.tcModel; if (isSelected) { - selectedPurposeIds.add(purposeId); + purposeConsents.set(purposeId); } else { - selectedPurposeIds.delete(purposeId); + purposeConsents.unset(purposeId); } this.storeUpdate(); }; selectAllPurposes = (isSelected) => { - const {purposes = []} = this.vendorList || {}; - const operation = isSelected ? 'add' : 'delete'; - purposes.forEach(({id}) => this.vendorConsentData.selectedPurposeIds[operation](id)); + const operation = isSelected ? 'setAllPurposeConsents' : 'unsetAllPurposeConsents'; + this.tcModel[operation](); this.storeUpdate(); }; - selectStandardPurpose = (purposeId, isSelected) => { - const {selectedStandardPurposeIds} = this.publisherConsentData; + selectPurposeLegitimateInterest = (purposeId, isSelected) => { + const {purposeLegitimateInterest} = this.tcModel; if (isSelected) { - selectedStandardPurposeIds.add(purposeId); + purposeLegitimateInterest.set(purposeId); } else { - selectedStandardPurposeIds.delete(purposeId); + purposeLegitimateInterest.unset(purposeId); } this.storeUpdate(); }; - selectAllStandardPurposes = (isSelected) => { - const {purposes = []} = this.vendorList || {}; - const operation = isSelected ? 'add' : 'delete'; - purposes.forEach(({id}) => this.publisherConsentData.selectedStandardPurposeIds[operation](id)); + selectAllPurposesLegitimateInterest = (isSelected) => { + const operation = isSelected ? 'setAllPurposeLegitimateInterest' : 'unsetAllPurposeLegitimateInterest'; + this.tcModel[operation](); this.storeUpdate(); }; - selectCustomPurpose = (purposeId, isSelected) => { - const {selectedCustomPurposeIds} = this.publisherConsentData; + selectSpecialFeature = (specialFeatureId, isSelected) => { + const { specialFeatureOptIns } = this.tcModel; if (isSelected) { - selectedCustomPurposeIds.add(purposeId); + specialFeatureOptIns.set(specialFeatureId); + } else { + specialFeatureOptIns.unset(specialFeatureId); + } + }; + + selectAllSpecialFeaturesOptIns = (isSelected) => { + const operation = isSelected ? 'setAllSpecialFeatureOptIns' : 'unsetAllSpecialFeatureOptIns'; + this.tcModel[operation](); + this.storeUpdate(); + }; + + selectPublisherPurpose = (purposeId, isSelected) => { + const {publisherConsents} = this.tcModel; + if (isSelected) { + publisherConsents.set(purposeId); } else { - selectedCustomPurposeIds.delete(purposeId); + publisherConsents.unset(purposeId); } this.storeUpdate(); }; - selectAllCustomPurposes = (isSelected) => { - const {purposes = []} = this.customPurposeList || {}; - const operation = isSelected ? 'add' : 'delete'; - purposes.forEach(({id}) => this.publisherConsentData.selectedCustomPurposeIds[operation](id)); + selectAllPublisherPurposes = (isSelected) => { + const {purposes = {}} = this.vendorList || {}; + const operation = isSelected ? 'set' : 'unset'; + const {legIntPurposeIds, contractPurposeIds} = config; + const publisherLegitimateInterests = [...legIntPurposeIds, ...contractPurposeIds]; + const availablePurposes = Object.values(purposes).map(({id}) => id).filter((purposeId) => !publisherLegitimateInterests.includes(purposeId)); + + Object.values(purposes).forEach(({id}) => { + if (availablePurposes.includes(id)) { + this.tcModel.publisherConsents[operation](id); + } + }); + + this.storeUpdate(); + }; + + selectPublisherLegitimateInterest = (purposeId, isSelected) => { + const {publisherLegitimateInterest} = this.tcModel; + if (isSelected) { + publisherLegitimateInterest.set(purposeId); + } + else { + publisherLegitimateInterest.unset(purposeId); + } + this.storeUpdate(); + }; + + selectAllPublisherLegitimateInterests = (isSelected) => { + const {purposes = {}} = this.vendorList || {}; + const {legIntPurposeIds, contractPurposeIds} = config; + const operation = isSelected ? 'set' : 'unset'; + const publisherLegitimateInterests = [...legIntPurposeIds, ...contractPurposeIds]; + + Object.values(purposes).forEach(({id}) => { + if (publisherLegitimateInterests.includes(id)) { + this.tcModel.publisherLegitimateInterest[operation](id) + } + }); + this.storeUpdate(); }; toggleConsentToolShowing = (isShown) => { - this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; + this.isConsentToolShowing = this.cmpApi.uiVisible = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; this.isFooterShowing = false; this.storeUpdate(); }; toggleFooterShowing = (isShown) => { const vendorConsentsObject = this.getVendorConsentsObject(); + const publisherConsentsObject = this.getPublisherConsentsObject(); + if (this.isAllSetTrue(vendorConsentsObject.purposeConsents)) { let vendorConsents; if (this.vendorList) { const {vendors = {}} = this.vendorList; - const vendorIds = new Set(vendors.map(({id}) => id)); + const vendorIds = new Set(Object.values(vendors).map(({id}) => id)); vendorConsents = {}; Object.keys(vendorConsentsObject.vendorConsents).filter(id => vendorIds.has(Number(id))).forEach(id => { vendorConsents[id] = vendorConsentsObject.vendorConsents[id]; @@ -485,7 +552,7 @@ export default class Store { } } this.isFooterShowing = typeof isShown === 'boolean' ? isShown : !this.isFooterShowing; - this.isConsentToolShowing = false; + this.isConsentToolShowing = this.cmpApi.uiVisible = false; this.storeUpdate(); }; @@ -499,124 +566,41 @@ export default class Store { this.storeUpdate(); }; - updateVendorList = vendorList => { - const { - pubVendorsList = {}, - allowedVendorIds - } = this; - + updateVendorList = (vendorList) => { + console.log('updateVendorList'); const { created, - maxVendorId = 0 - } = this.vendorConsentData; + } = this.persistedConsentData || {}; - if (vendorList) { - // Filter vendors in vendorList by allowedVendorIds - if (vendorList.vendors && allowedVendorIds.size) { - vendorList.vendors = vendorList.vendors.filter(({id}) => allowedVendorIds.has(id)); - } - - // If a pubVendorList is applied make the vendor list version = 0 - const { publisherVendorsVersion } = pubVendorsList; - vendorList.vendorListVersion = publisherVendorsVersion ? 0 : vendorList.vendorListVersion; - } + const persistedMaxVendorId = this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; const { - vendors = [], - purposes = [], + vendors = {}, } = vendorList || {}; - //collection of global and local vendor ids [global id, local id] - this.globalVendorIdsPresentOnList = new Map(vendors.filter(vendor => vendor.external_id).map( - vendor => [vendor.external_id, vendor.id] - )); + const gvl = new GVL(vendorList); + this.tcModel.gvl = gvl; + this.vendorList = vendorList; - // If vendor consent data has never been persisted set default selected status + // If vendor and publisher consent data has never been persisted set default selected status if (!created) { - this.vendorConsentData.selectedPurposeIds = new Set(purposes.map(p => p.id)); - this.vendorConsentData.selectedVendorIds = new Set(vendors.map(v => v.id)); - } + this.selectAllPurposes(true); + this.selectAllVendors(true); + this.selectAllVendorsLegitimateInterest(true); + this.selectAllSpecialFeaturesOptIns(true); + this.selectAllPublisherPurposes(true); + this.selectAllPublisherLegitimateInterests(true); + } // If vendor consent data has already been persisted set default selected status only for new vendors else { - vendors.forEach(v => { - if (v.id > this.persistedVendorConsentData.maxVendorId) { - this.vendorConsentData.selectedVendorIds.add(v.id); + Object.values(vendors).forEach(v => { + if (v.id > persistedMaxVendorId) { + this.tcModel.vendorConsents.set(v.id); } }); } - const {created: publisherConsentCreated} = this.publisherConsentData; - - // If publisher consent has never been persisted set the default selected status - if (!publisherConsentCreated) { - this.publisherConsentData.selectedStandardPurposeIds = new Set(purposes.map(p => p.id)); - } - - const {selectedVendorIds = new Set()} = this.vendorConsentData; - const { - selectedVendorIds : selectedGlobalVendorIds = new Set(), - maxVendorId : maxGlobalVendorId = 0 } = this.globalVendorConsentData; - - //Find the maxVendorId for globalVendor - this.globalVendorConsentData.maxVendorId = Math.max(maxGlobalVendorId, - ...vendors.map(({external_id}) => external_id || 0), - ...arrayFrom(selectedGlobalVendorIds)); - - // Find the maxVendorId out of the vendor list and selectedVendorIds - this.vendorConsentData.maxVendorId = Math.max(maxVendorId, - ...vendors.map(({id}) => id), - ...arrayFrom(selectedVendorIds)); - this.vendorList = vendorList; - this.storeUpdate(); - }; - - updateCustomPurposeList = customPurposeList => { - const {created} = this.publisherConsentData; - - // If publisher consent has never been persisted set the default selected status - if (!created) { - const {purposes = []} = customPurposeList || {}; - this.publisherConsentData.selectedCustomPurposeIds = new Set(purposes.map(p => p.id)); - } - - const {version = 1} = customPurposeList || {}; - this.publisherConsentData.publisherPurposeVersion = version; - - this.customPurposeList = customPurposeList; this.storeUpdate(); }; - - mergeVendorConsentsFromGlobalCookie = () => { - const globalCookieMaxVendorId = this.persistedGlobalVendorConsentData.maxVendorId; - - this.globalVendorIdsPresentOnList.forEach( (id, externalId) => { - if (this.globalVendorConsentData.selectedVendorIds.has(externalId)) { - this.vendorConsentData.selectedVendorIds.add(id); - } else if (this.vendorConsentData.selectedVendorIds.has(id) && externalId <= globalCookieMaxVendorId) { - this.vendorConsentData.selectedVendorIds.delete(id); - } - }); - }; - - mergeVendorConsentsToGlobalCookie = () => { - this.globalVendorIdsPresentOnList.forEach( (localId, globalId) => { - if (this.vendorConsentData.selectedVendorIds.has(localId)) { - this.globalVendorConsentData.selectedVendorIds.add(globalId); - } else { - this.globalVendorConsentData.selectedVendorIds.delete(globalId); - } - }); - }; - - mergePurposeConsentsFromGlobalCookie = () => { - const selectedPurposeIds = arrayFrom(this.vendorConsentData.selectedPurposeIds); - this.vendorConsentData.selectedPurposeIds = new Set(selectedPurposeIds.filter( id => ( - this.globalVendorConsentData.selectedPurposeIds.has(id) || config.legIntPurposeIds.includes(id) - ))); - }; - - mergePurposeConsentsToGlobalCookie = () => { - this.globalVendorConsentData.selectedPurposeIds = this.vendorConsentData.selectedPurposeIds; - }; } diff --git a/src/lib/translations.js b/src/lib/translations.js index 52cc08d2..3f6bbf45 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,51 +8,51 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

    Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    - + description: `

    DEV Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    +

    Zgoda

    - +

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    - +

    Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    - +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    - +

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    Administrator danych osobowych

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    - +

    Podstawa i cel przetwarzania

    - +

    Twoje dane przetwarzamy w następujących celach:


      - +
    • 1. Jeśli zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. Gdy zakładasz konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tego nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. Niepodanie takich danych uniemożliwi nam zawarcie i wykonanie umowy.
    • - +
    • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
    • - +
    • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
    - +

    Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania, czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy, przez czas jej wykonywania i ewentualnie okres przedawnienia roszczeń z niej (zwykle nie więcej niż 3 lata, a maksymalnie 6 lat), a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora, do czasu zgłoszenia przez Ciebie skutecznego sprzeciwu.

    - +

    Przekazywanie danych

    - +

    Administratorzy danych mogą powierzać Twoje dane podwykonawcom IT, księgowym, agencjom marketingowym etc. Zrobią to jedynie w niezbędnym zakresie i na podstawie umowy o powierzenie przetwarzania danych zobowiązującej taki podmiot do odpowiedniego zabezpieczenia danych i niekorzystania z nich do własnych celów.

    - +

    Cookies

    - +

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    - - + +

    Twoje uprawnienia

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 08790160..42782c03 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -1,10 +1,7 @@ import Promise from 'promise-polyfill'; import config from './config'; import log from './log'; - - -const PUB_VENDOR_LOCATION = '/.well-known/pubvendors.json'; - +import vendorList from './vendors-mock'; function fetch(url) { return new Promise((resolve, reject) => { @@ -25,16 +22,6 @@ function fetch(url) { }); } - -/** - * Fetch the pubvendors.json from the local domain - */ -function fetchPubVendorList() { - return fetch(PUB_VENDOR_LOCATION) - .then(res => res.json()) - .catch(() => {}); -} - /** * Fetch the global vendor list if the location is configured */ @@ -48,7 +35,9 @@ function fetchGlobalVendorList() { reject(err); } else { try { - resolve(data); + console.log('fetchGlobalVendorList resolve'); + resolve(vendorList); + // resolve(data); } catch (err) { reject(err); } @@ -58,7 +47,7 @@ function fetchGlobalVendorList() { reject(err); } }).catch(err => { - log.error(`Failed to load global vendor list from configuration`, err); + log.error(`Failed to load global vendor list ftrom configuration`, err); }); } return (globalVendorListLocation ? @@ -70,20 +59,6 @@ function fetchGlobalVendorList() { }); } -function fetchPurposeList() { - if (!config.storePublisherData || !config.customPurposeListLocation) { - return Promise.resolve(); - } - - return fetch(config.customPurposeListLocation) - .then(res => res.json()) - .catch(err => { - log.error(`Failed to load custom purposes list from ${config.customPurposeListLocation}`, err); - }); -} - export { fetchGlobalVendorList, - fetchPubVendorList, - fetchPurposeList }; diff --git a/src/lib/vendors-mock.json b/src/lib/vendors-mock.json new file mode 100644 index 00000000..7161de22 --- /dev/null +++ b/src/lib/vendors-mock.json @@ -0,0 +1,4199 @@ +{ + "gvlSpecificationVersion": 2, + "vendorListVersion": 26, + "tcfPolicyVersion": 2, + "lastUpdated": "2020-02-20T16:05:20Z", + "purposes": { + "1": { + "id": 1, + "name": "Store and/or access information on a device", + "description": "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", + "descriptionLegal": "Vendors can:\n* Store and access information on the device such as cookies and device identifiers presented to a user." + }, + "2": { + "id": 2, + "name": "Select basic ads", + "description": "Ads can be shown to you based on the content you\u2019re viewing, the app you\u2019re using, your approximate location, or your device type.", + "descriptionLegal": "To do basic ad selection vendors can:\n* Use real-time information about the context in which the ad will be shown, to show the ad, including information about the content and the device, such as: device type and capabilities, user agent, URL, IP address\n* Use a user\u2019s non-precise geolocation data\n* Control the frequency of ads shown to a user.\n* Sequence the order in which ads are shown to a user.\n* Prevent an ad from serving in an unsuitable editorial (brand-unsafe) context\nVendors cannot:\n* Create a personalised ads profile using this information for the selection of future ads.\n* N.B. Non-precise means only an approximate location involving at least a radius of 500 meters is permitted." + }, + "3": { + "id": 3, + "name": "Create a personalised ads profile", + "description": "A profile can be built about you and your interests to show you personalised ads that are relevant to you.", + "descriptionLegal": "To create a personalised ads profile vendors can:\n* Collect information about a user, including a user's activity, interests, demographic information, or location, to create or edit a user profile for use in personalised advertising.\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalised advertising." + }, + "4": { + "id": 4, + "name": "Select personalised ads", + "description": "Personalised ads can be shown to you based on a profile about you.", + "descriptionLegal": "To select personalised ads vendors can:\n* Select personalised ads based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." + }, + "5": { + "id": 5, + "name": "Create a personalised content profile", + "description": "A profile can be built about you and your interests to show you personalised content that is relevant to you.", + "descriptionLegal": "To create a personalised content profile vendors can:\n* Collect information about a user, including a user's activity, interests, visits to sites or apps, demographic information, or location, to create or edit a user profile for personalising content.\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalising content." + }, + "6": { + "id": 6, + "name": "Select personalised content", + "description": "Personalised content can be shown to you based on a profile about you.", + "descriptionLegal": "To select personalised content vendors can:\n* Select personalised content based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." + }, + "7": { + "id": 7, + "name": "Measure ad performance", + "description": "The performance and effectiveness of ads that you see or interact with can be measured.", + "descriptionLegal": "To measure ad performance vendors can:\n* Measure whether and how ads were delivered to and interacted with by a user\n* Provide reporting about ads including their effectiveness and performance\n* Provide reporting about users who interacted with ads using data observed during the course of the user's interaction with that ad\n* Provide reporting to publishers about the ads displayed on their property\n* Measure whether an ad is serving in a suitable editorial environment (brand-safe) context\n* Determine the percentage of the ad that had the opportunity to be seen and the duration of that opportunity\n* Combine this information with other information previously collected, including from across websites and apps\nVendors cannot:\n*Apply panel- or similarly-derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" + }, + "8": { + "id": 8, + "name": "Measure content performance", + "description": "The performance and effectiveness of content that you see or interact with can be measured.", + "descriptionLegal": "To measure content performance vendors can:\n* Measure and report on how content was delivered to and interacted with by users.\n* Provide reporting, using directly measurable or known information, about users who interacted with the content\n* Combine this information with other information previously collected, including from across websites and apps.\nVendors cannot:\n* Measure whether and how ads (including native ads) were delivered to and interacted with by a user.\n* Apply panel- or similarly derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" + }, + "9": { + "id": 9, + "name": "Apply market research to generate audience insights", + "description": "Market research can be used to learn more about the audiences who visit sites/apps and view ads.", + "descriptionLegal": "To apply market research to generate audience insights vendors can:\n* Provide aggregate reporting to advertisers or their representatives about the audiences reached by their ads, through panel-based and similarly derived insights.\n* Provide aggregate reporting to publishers about the audiences that were served or interacted with content and/or ads on their property by applying panel-based and similarly derived insights.\n* Associate offline data with an online user for the purposes of market research to generate audience insights if vendors have declared to match and combine offline data sources (Feature 1)\n* Combine this information with other information previously collected including from across websites and apps. \nVendors cannot:\n* Measure the performance and effectiveness of ads that a specific user was served or interacted with, without a Legal Basis to measure ad performance.\n* Measure which content a specific user was served and how they interacted with it, without a Legal Basis to measure content performance." + }, + "10": { + "id": 10, + "name": "Develop and improve products", + "description": "Your data can be used to improve existing systems and software, and to develop new products", + "descriptionLegal": "To develop new products and improve products vendors can:\n* Use information to improve their existing products with new features and to develop new products\n* Create new models and algorithms through machine learning\nVendors cannot:\n* Conduct any other data processing operation allowed under a different purpose under this purpose" + } + }, + "specialPurposes": { + "1": { + "id": 1, + "name": "Ensure security, prevent fraud, and debug", + "description": "Your data can be used to monitor for and prevent fraudulent activity, and ensure systems and processes work properly and securely.", + "descriptionLegal": "To ensure security, prevent fraud and debug vendors can:\n* Ensure data are securely transmitted\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\nVendors cannot:\n* Conduct any other data processing operation allowed under a different purpose under this purpose." + }, + "2": { + "id": 2, + "name": "Technically deliver ads or content", + "description": "Your device can receive and send information that allows you to see and interact with ads and content.", + "descriptionLegal": "To deliver information and respond to technical requests vendors can:\n* Use a user\u2019s IP address to deliver an ad over the internet\n* Respond to a user\u2019s interaction with an ad by sending the user to a landing page\n* Use a user\u2019s IP address to deliver content over the internet\n* Respond to a user\u2019s interaction with content by sending the user to a landing page\n* Use information about the device type and capabilities for delivering ads or content, for example, to deliver the right size ad creative or video file in a format supported by the device\nVendors cannot:\n* Conduct any other data processing operation allowed under a different purpose under this purpose" + } + }, + "features": { + "1": { + "id": 1, + "name": "Match and combine offline data sources", + "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", + "descriptionLegal": "Vendors can:\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes." + }, + "2": { + "id": 2, + "name": "Link different devices", + "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", + "descriptionLegal": "Vendors can:\n* Deterministically determine that two or more devices belong to the same user or household\n* Probabilistically determine that two or more devices belong to the same user or household\n* Actively scan device characteristics for identification for probabilistic identification if users have allowed vendors to actively scan device characteristics for identification (Special Feature 2)" + }, + "3": { + "id": 3, + "name": "Receive and use automatically-sent device characteristics for identification", + "description": "Your device might be distinguished from other devices based on information it automatically sends, such as IP address or browser type.", + "descriptionLegal": "Vendors can:\n* Create an identifier using data collected automatically from a device for specific characteristics, e.g. IP address, user-agent string.\n* Use such an identifier to attempt to re-identify a device.\nVendors cannot:\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed font or screen resolution without users\u2019 separate opt-in to actively scanning device characteristics for identification.\n* Use such an identifier to re-identify a device." + } + }, + "specialFeatures": { + "1": { + "id": 1, + "name": "Use precise geolocation data", + "description": "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", + "descriptionLegal": "Vendors can:\n* Collect and process precise geolocation data in support of one or more purposes.\nN.B. Precise geolocation means that there are no restrictions on the precision of a user\u2019s location; this can be accurate to within several meters." + }, + "2": { + "id": 2, + "name": "Actively scan device characteristics for identification", + "description": "Your device can be identified based on a scan of your device's unique combination of characteristics.", + "descriptionLegal": "Vendors can:\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed fonts or screen resolution.\n* Use such an identifier to re-identify a device." + } + }, + "stacks": { + "1": { + "id": 1, + "purposes": [], + "specialFeatures": [ + 1, + 2 + ], + "name": "Precise geolocation data, and identification through device scanning", + "description": "Precise geolocation and information about device characteristics can be used." + }, + "2": { + "id": 2, + "purposes": [ + 2, + 7 + ], + "specialFeatures": [], + "name": "Basic ads, and ad measurement", + "description": "Basic ads can be served. Ad performance can be measured." + }, + "3": { + "id": 3, + "purposes": [ + 2, + 3, + 4 + ], + "specialFeatures": [], + "name": "Personalised ads", + "description": "Ads can be personalised based on a profile. More data can be added to better personalise ads." + }, + "4": { + "id": 4, + "purposes": [ + 2, + 7, + 9 + ], + "specialFeatures": [], + "name": "Basic ads, and ad measurement", + "description": "Basic ads can be served. Ad performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "5": { + "id": 5, + "purposes": [ + 2, + 3, + 7 + ], + "specialFeatures": [], + "name": "Basic ads, personalised ads profile, and ad measurement", + "description": "Basic ads can be served. More data can be added to better personalise ads. Ad performance can be measured." + }, + "6": { + "id": 6, + "purposes": [ + 2, + 4, + 7 + ], + "specialFeatures": [], + "name": "Personalised ads display, and measurement", + "description": "Ads can be personalised based on a profile. Ad performance can be measured." + }, + "7": { + "id": 7, + "purposes": [ + 2, + 4, + 7, + 9 + ], + "specialFeatures": [], + "name": "Personalised ads display, ad measurement, and audience insights", + "description": "Ads can be personalised based on a profile. Ad performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "8": { + "id": 8, + "purposes": [ + 2, + 3, + 4, + 7 + ], + "specialFeatures": [], + "name": "Personalised ads, and ad measurement", + "description": "Ads can be personalised based on a profile. More data can be added to better personalise ads. Ad performance can be measured." + }, + "9": { + "id": 9, + "purposes": [ + 2, + 3, + 4, + 7, + 9 + ], + "specialFeatures": [], + "name": "Personalised ads, ad measurement, and audience insights", + "description": "Ads can be personalised based on a profile. More data can be added to better personalise ads. Ad performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "10": { + "id": 10, + "purposes": [ + 3, + 4 + ], + "specialFeatures": [], + "name": "Personalised ads profile and display", + "description": "Ads can be personalised based on a profile. More data can be added to better personalise ads." + }, + "11": { + "id": 11, + "purposes": [ + 5, + 6 + ], + "specialFeatures": [], + "name": "Personalised content", + "description": "Content can be personalised based on a profile. More data can be added to better personalise content." + }, + "12": { + "id": 12, + "purposes": [ + 6, + 8 + ], + "specialFeatures": [], + "name": "Personalised content display, and content measurement", + "description": "Content can be personalised based on a profile. Content performance can be measured." + }, + "13": { + "id": 13, + "purposes": [ + 6, + 8, + 9 + ], + "specialFeatures": [], + "name": "Personalised content display, content measurement and audience insights", + "description": "Content can be personalised based on a profile. Content performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "14": { + "id": 14, + "purposes": [ + 5, + 6, + 8 + ], + "specialFeatures": [], + "name": "Personalised content, and content measurement", + "description": "Content can be personalised based on a profile. More data can be added to better personalise content. Content performance can be measured." + }, + "15": { + "id": 15, + "purposes": [ + 5, + 6, + 8, + 9 + ], + "specialFeatures": [], + "name": "Personalised content, content measurement and audience insights", + "description": "Content can be personalised based on a profile. More data can be added to better personalise content. Content performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "16": { + "id": 16, + "purposes": [ + 5, + 6, + 8, + 9, + 10 + ], + "specialFeatures": [], + "name": "Personalised content, content measurement, audience insights, and product development", + "description": "Content can be personalised based on a profile. More data can be added to better personalise content. Content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software" + }, + "17": { + "id": 17, + "purposes": [ + 7, + 8, + 9 + ], + "specialFeatures": [], + "name": "Ad and content measurement, and audience insights", + "description": "Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "18": { + "id": 18, + "purposes": [ + 7, + 8 + ], + "specialFeatures": [], + "name": "Ad and content measurement", + "description": "Ad and content performance can be measured." + }, + "19": { + "id": 19, + "purposes": [ + 7, + 9 + ], + "specialFeatures": [], + "name": "Ad measurement, and audience insights", + "description": "Ad can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "20": { + "id": 20, + "purposes": [ + 7, + 8, + 9, + 10 + ], + "specialFeatures": [], + "name": "Ad and content measurement, audience insights, and product development", + "description": "Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software. Insights about the audiences who saw the ads and content can be derived." + }, + "21": { + "id": 21, + "purposes": [ + 8, + 9, + 10 + ], + "specialFeatures": [], + "name": "Content measurement, audience insights, and product development.", + "description": "Content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." + }, + "22": { + "id": 22, + "purposes": [ + 8, + 10 + ], + "specialFeatures": [], + "name": "Content measurement, and product development", + "description": "Content performance can be measured. Data can be used to build or improve user experience, systems, and software." + }, + "23": { + "id": 23, + "purposes": [ + 2, + 4, + 6, + 7, + 8 + ], + "specialFeatures": [], + "name": "Personalised ads and content display, ad and content measurement", + "description": "Ads and content can be personalised based on a profile. Ad and content performance can be measured." + }, + "24": { + "id": 24, + "purposes": [ + 2, + 4, + 6, + 7, + 8, + 9 + ], + "specialFeatures": [], + "name": "Personalised ads and content display, ad and content measurement, and audience insights", + "description": "Ads and content can be personalised based on a profile. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." + }, + "25": { + "id": 25, + "purposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "specialFeatures": [], + "name": "Personalised ads and content, ad and content measurement", + "description": "Ads and content can be personalised based on a profile. More data can be added to better personalise ads and content. Ad and content performance can be measured." + }, + "26": { + "id": 26, + "purposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "specialFeatures": [], + "name": "Personalised ads and content, ad and content measurement, and audience insights", + "description": "Ads and content can be personalised based on a profile. More data can be added to better personalise ads and content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "27": { + "id": 27, + "purposes": [ + 3, + 5 + ], + "specialFeatures": [], + "name": "Personalised ads, and content profile", + "description": "More data can be added to personalise ads and content." + }, + "28": { + "id": 28, + "purposes": [ + 2, + 4, + 6 + ], + "specialFeatures": [], + "name": "Personalised ads and content display", + "description": "Ads and content can be personalised based on a profile." + }, + "29": { + "id": 29, + "purposes": [ + 2, + 7, + 8, + 9 + ], + "specialFeatures": [], + "name": "Basic ads, ad and content measurement, and audience insights", + "description": "Basic ads can be served. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "30": { + "id": 30, + "purposes": [ + 2, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "specialFeatures": [], + "name": "Personalised ads display, personalised content, ad and content measurement, and audience insights", + "description": "Ads and content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "31": { + "id": 31, + "purposes": [ + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "specialFeatures": [], + "name": "Personalised ads display, personalised content, ad and content measurement, audience insights, and product development", + "description": "Ads and content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." + }, + "32": { + "id": 32, + "purposes": [ + 2, + 5, + 6, + 7, + 8, + 9 + ], + "specialFeatures": [], + "name": "Basic ads, personalised content, ad and content measurement, and audience insights", + "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "33": { + "id": 33, + "purposes": [ + 2, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "specialFeatures": [], + "name": "Basic ads, personalised content, ad and content measurement, audience insights, and product development", + "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." + }, + "34": { + "id": 34, + "purposes": [ + 2, + 5, + 6, + 8, + 9 + ], + "specialFeatures": [], + "name": "Basic ads, personalised content, content measurement, and audience insights", + "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." + }, + "35": { + "id": 35, + "purposes": [ + 2, + 5, + 6, + 8, + 9, + 10 + ], + "specialFeatures": [], + "name": "Basic ads, personalised content, content measurement, audience insights, and product development", + "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." + }, + "36": { + "id": 36, + "purposes": [ + 2, + 5, + 6, + 7 + ], + "specialFeatures": [], + "name": "Basic ads, personalised content, and ad measurement", + "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad performance can be measured." + }, + "37": { + "id": 37, + "purposes": [ + 2, + 5, + 6, + 7, + 10 + ], + "specialFeatures": [], + "name": "Basic ads, personalised content, ad measurement, and product development", + "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad performance can be measured. Data can be used to build or improve user experience, systems, and software." + } + }, + "vendors": { + "8": { + "id": 8, + "name": "Emerse Sverige AB", + "purposes": [ + 1, + 3, + 4 + ], + "legIntPurposes": [ + 2, + 7, + 8, + 9 + ], + "flexiblePurposes": [ + 2, + 9 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2 + ], + "specialFeatures": [], + "policyUrl": "https://www.emerse.com/privacy-policy/" + }, + "9": { + "id": 9, + "name": "AdMaxim Inc.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://www.admaxim.com/admaxim-privacy-policy/" + }, + "12": { + "id": 12, + "name": "BeeswaxIO Corporation", + "purposes": [ + 1, + 2, + 3, + 4, + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.beeswax.com/privacy/" + }, + "6": { + "id": 6, + "name": "AdSpirit GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "http://www.adspirit.de/privacy", + "overflow": { + "httpGetLimit": 32 + } + }, + "15": { + "id": 15, + "name": "Adikteev / Emoteev", + "purposes": [ + 1, + 3, + 4, + 5, + 6, + 8, + 9, + 10 + ], + "legIntPurposes": [ + 2, + 7 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "https://www.adikteev.com/privacy-policy-eng/" + }, + "2": { + "id": 2, + "name": "Captify Technologies Limited", + "purposes": [ + 1, + 2, + 3, + 4 + ], + "legIntPurposes": [ + 7, + 9, + 10 + ], + "flexiblePurposes": [ + 2 + ], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" + }, + "37": { + "id": 37, + "name": "NEURAL.ONE", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 7, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://web.neural.one/privacy-policy/" + }, + "94": { + "id": 94, + "name": "Blis Media Limited", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://www.blis.com/privacy/" + }, + "53": { + "id": 53, + "name": "Sirdata", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.sirdata.com/privacy/" + }, + "80": { + "id": 80, + "name": "Sharethrough, Inc", + "purposes": [ + 1, + 2, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 4, + 7, + 9, + 10 + ], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://platform-cdn.sharethrough.com/privacy-policy" + }, + "23": { + "id": 23, + "name": "Amobee, Inc. ", + "purposes": [ + 1, + 2, + 3, + 4 + ], + "legIntPurposes": [ + 7, + 9, + 10 + ], + "flexiblePurposes": [ + 2, + 3, + 4, + 7, + 9, + 10 + ], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.amobee.com/trust/privacy-guidelines" + }, + "68": { + "id": 68, + "name": "Sizmek", + "purposes": [ + 1, + 3, + 4 + ], + "legIntPurposes": [ + 2, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "https://www.sizmek.com/privacy-policy/" + }, + "61": { + "id": 61, + "name": "GumGum, Inc.", + "purposes": [ + 1, + 2, + 3, + 4, + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "https://gumgum.com/privacy-policy" + }, + "89": { + "id": 89, + "name": "Tapad, Inc.", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "https://www.tapad.com/eu-privacy-policy" + }, + "66": { + "id": 66, + "name": "adsquare GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 9, + 10 + ], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.adsquare.com/privacy" + }, + "48": { + "id": 48, + "name": "NetSuccess, s.r.o.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.inres.sk/pp/" + }, + "100": { + "id": 100, + "name": "Fifty Technology Limited", + "purposes": [ + 1, + 2, + 3, + 4 + ], + "legIntPurposes": [ + 7, + 9, + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://fifty.io/privacy-policy.php" + }, + "42": { + "id": 42, + "name": "Taboola Europe Limited", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 10 + ], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.taboola.com/privacy-policy" + }, + "93": { + "id": 93, + "name": "Adloox SA", + "purposes": [], + "legIntPurposes": [ + 7 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 1 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "http://adloox.com/disclaimer", + "overflow": { + "httpGetLimit": 128 + } + }, + "18": { + "id": 18, + "name": "Widespace AB", + "purposes": [ + 1, + 2, + 3, + 4, + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 7 + ], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.widespace.com/legal/privacy-policy-notice/" + }, + "72": { + "id": 72, + "name": "Nano Interactive GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "http://www.nanointeractive.com/privacy" + }, + "127": { + "id": 127, + "name": "PIXIMEDIA SAS", + "purposes": [ + 1, + 3, + 4, + 5, + 6, + 9, + 10 + ], + "legIntPurposes": [ + 2, + 7, + 8 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://piximedia.com/privacy/", + "overflow": { + "httpGetLimit": 128 + } + }, + "153": { + "id": 153, + "name": "MADVERTISE MEDIA", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 5, + 6, + 10 + ], + "specialPurposes": [ + 2 + ], + "features": [], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://madvertise.com/en/gdpr/", + "overflow": { + "httpGetLimit": 128 + } + }, + "147": { + "id": 147, + "name": "Adacado Technologies Inc. (DBA Adacado)", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 7, + 8, + 9, + 10 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.adacado.com/privacy-policy-april-25-2018/" + }, + "130": { + "id": 130, + "name": "NextRoll, Inc.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 2 + ], + "policyUrl": "https://www.nextroll.com/privacy" + }, + "129": { + "id": 129, + "name": "IPONWEB GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.iponweb.com/privacy-policy/" + }, + "128": { + "id": 128, + "name": "BIDSWITCH GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://www.bidswitch.com/privacy-policy/" + }, + "163": { + "id": 163, + "name": "Bombora Inc.", + "purposes": [ + 1, + 3, + 8 + ], + "legIntPurposes": [ + 7, + 10 + ], + "flexiblePurposes": [ + 7, + 10 + ], + "specialPurposes": [], + "features": [ + 1 + ], + "specialFeatures": [], + "policyUrl": "https://bombora.com/privacy" + }, + "88": { + "id": 88, + "name": "TreSensa, Inc.", + "purposes": [ + 1, + 3, + 4 + ], + "legIntPurposes": [ + 2, + 7, + 10 + ], + "flexiblePurposes": [ + 2, + 3, + 4, + 7, + 10 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.tresensa.com/eu-privacy" + }, + "78": { + "id": 78, + "name": "Flashtalking, Inc.", + "purposes": [ + 1, + 2, + 3, + 4, + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "http://www.flashtalking.com/privacypolicy/" + }, + "114": { + "id": 114, + "name": "Sublime", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 9 + ], + "legIntPurposes": [ + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "http://ayads.co/privacy.php" + }, + "133": { + "id": 133, + "name": "digitalAudience", + "purposes": [ + 1, + 3, + 5, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2 + ], + "specialFeatures": [], + "policyUrl": "https://digitalaudience.io/legal/privacy-cookies/" + }, + "90": { + "id": 90, + "name": "Teroa S.A.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.e-planning.net/en/privacy.html" + }, + "65": { + "id": 65, + "name": "Location Sciences AI Ltd", + "purposes": [ + 1, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.locationsciences.ai/privacy-policy/" + }, + "205": { + "id": 205, + "name": "Adssets AB", + "purposes": [ + 2, + 4 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "http://adssets.com/policy/" + }, + "115": { + "id": 115, + "name": "smartclip Europe GmbH", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 3, + 4, + 7, + 10 + ], + "flexiblePurposes": [ + 2, + 3, + 4, + 7, + 10 + ], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://privacy-portal.smartclip.net/", + "overflow": { + "httpGetLimit": 32 + } + }, + "126": { + "id": 126, + "name": "DoubleVerify Inc.\u200b", + "purposes": [ + 2, + 7, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.doubleverify.com/privacy/" + }, + "224": { + "id": 224, + "name": "adrule mobile GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 8 + ], + "legIntPurposes": [ + 7 + ], + "flexiblePurposes": [ + 2, + 3, + 4, + 7, + 8 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.adrule.net/de/datenschutz/" + }, + "174": { + "id": 174, + "name": "A Million Ads Ltd", + "purposes": [], + "legIntPurposes": [ + 2, + 4 + ], + "flexiblePurposes": [ + 2, + 4 + ], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.amillionads.com/privacy-policy" + }, + "192": { + "id": 192, + "name": "remerge GmbH", + "purposes": [ + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://remerge.io/privacy-policy.html" + }, + "215": { + "id": 215, + "name": "ARMIS SAS", + "purposes": [ + 1, + 2, + 7 + ], + "legIntPurposes": [ + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "https://armis.tech/en/armis-personal-data-privacy-policy/" + }, + "167": { + "id": 167, + "name": "Audiens S.r.l.", + "purposes": [ + 1, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "http://www.audiens.com/privacy" + }, + "235": { + "id": 235, + "name": "Bucksense Inc", + "purposes": [ + 2, + 3, + 4, + 7, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 7, + 9 + ], + "specialPurposes": [], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://www.bucksense.com/platform-privacy-policy/" + }, + "279": { + "id": 279, + "name": "Mirando GmbH & Co KG", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 7 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://wwwmirando.de/datenschutz/" + }, + "203": { + "id": 203, + "name": "Revcontent, LLC", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6 + ], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://intercom.help/revcontent2/en/articles/2290675-revcontent-s-privacy-policy" + }, + "177": { + "id": 177, + "name": "plista GmbH", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 7, + 8, + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.plista.com/about/privacy/" + }, + "248": { + "id": 248, + "name": "Converge-Digital", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2 + ], + "flexiblePurposes": [ + 2 + ], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "https://converge-digital.com/privacy-policy/", + "overflow": { + "httpGetLimit": 32 + } + }, + "285": { + "id": 285, + "name": "Comcast International France SAS", + "purposes": [ + 1 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.freewheel.com/privacy-policy" + }, + "228": { + "id": 228, + "name": "McCann Discipline LTD", + "purposes": [ + 1, + 2, + 5, + 6, + 7, + 8 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.primis.tech/wp-content/uploads/2020/01/Primis-Privacy-Policy.pdf" + }, + "304": { + "id": 304, + "name": "On Device Research Limited", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://s.on-device.com/privacyPolicy" + }, + "314": { + "id": 314, + "name": "Keymantics", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.keymantics.com/assets/privacy-policy.pdf" + }, + "47": { + "id": 47, + "name": "ADMAN - Phaistos Networks, S.A.", + "purposes": [ + 1, + 2, + 4, + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "http://www.adman.gr/privacy" + }, + "325": { + "id": 325, + "name": "Knorex Pte Ltd", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.knorex.com/privacy" + }, + "318": { + "id": 318, + "name": "Accorp Sp. z o.o.", + "purposes": [ + 1, + 3, + 4, + 9 + ], + "legIntPurposes": [ + 7, + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "http://www.instytut-pollster.pl/privacy-policy/" + }, + "199": { + "id": 199, + "name": "ADUX", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "http://www.adux.com/donnees-personelles/" + }, + "294": { + "id": 294, + "name": "Jivox Corporation", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.jivox.com/privacy" + }, + "302": { + "id": 302, + "name": "Mobile Professionals BV", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 7, + 8, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 3, + 5, + 7, + 8 + ], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://mobpro.com/privacy.html" + }, + "44": { + "id": 44, + "name": "The ADEX GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://theadex.com/privacy-opt-out/" + }, + "262": { + "id": 262, + "name": "Fyber ", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.fyber.com/legal/privacy-policy/" + }, + "328": { + "id": 328, + "name": "Gemius SA", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.gemius.com/cookie-policy.html" + }, + "281": { + "id": 281, + "name": "Wizaly", + "purposes": [ + 1, + 7, + 8, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2 + ], + "specialFeatures": [], + "policyUrl": "https://www.wizaly.com/terms-of-use#privacy-policy" + }, + "303": { + "id": 303, + "name": "Orion Semantics", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "http://static.orion-semantics.com/privacy.html" + }, + "358": { + "id": 358, + "name": "MGID Inc.", + "purposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.mgid.com/privacy-policy" + }, + "371": { + "id": 371, + "name": "Seeding Alliance GmbH", + "purposes": [], + "legIntPurposes": [ + 2, + 7 + ], + "flexiblePurposes": [ + 7 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://seeding-alliance.de/datenschutz" + }, + "350": { + "id": 350, + "name": "Free Stream Media Corp. dba Samba TV", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://samba.tv/legal/privacy-policy/", + "overflow": { + "httpGetLimit": 128 + } + }, + "351": { + "id": 351, + "name": "Samba TV UK Limited", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://samba.tv/legal/privacy-policy/", + "overflow": { + "httpGetLimit": 128 + } + }, + "387": { + "id": 387, + "name": "Triapodi Ltd.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://appreciate.mobi/page.html#/end-user-privacy-policy" + }, + "402": { + "id": 402, + "name": "Effiliation", + "purposes": [ + 1, + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://inter.effiliation.com/politique-confidentialite.html" + }, + "413": { + "id": 413, + "name": "Eulerian Technologies", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.eulerian.com/en/privacy/" + }, + "415": { + "id": 415, + "name": "Seenthis AB", + "purposes": [], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "https://seenthis.co/privacy-notice-2018-04-18.pdf" + }, + "422": { + "id": 422, + "name": "Brand Metrics Sweden AB", + "purposes": [ + 1, + 6, + 7, + 8, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://collector.brandmetrics.com/brandmetrics_privacypolicy.pdf" + }, + "243": { + "id": 243, + "name": "Cloud Technologies S.A.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.cloudtechnologies.pl/en/internet-advertising-privacy-policy" + }, + "436": { + "id": 436, + "name": "INVIBES GROUP", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10 + ], + "legIntPurposes": [ + 7, + 8 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "http://www.invibes.com/terms" + }, + "429": { + "id": 429, + "name": "Signals", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://signalsdata.com/platform-cookie-policy/" + }, + "450": { + "id": 450, + "name": "Neodata Group srl", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.neodatagroup.com/en/security-policy", + "overflow": { + "httpGetLimit": 32 + } + }, + "447": { + "id": 447, + "name": "Adludio Ltd", + "purposes": [ + 2, + 3, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.adludio.com/privacy-policy/" + }, + "466": { + "id": 466, + "name": "TACTIC\u2122 Real-Time Marketing AS", + "purposes": [], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://tacticrealtime.com/privacy/" + }, + "440": { + "id": 440, + "name": "DEFINE MEDIA GMBH", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 4, + 9, + 10 + ], + "flexiblePurposes": [ + 4 + ], + "specialPurposes": [ + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "http://www.definemedia.de/datenschutz-conative/" + }, + "486": { + "id": 486, + "name": "Madington", + "purposes": [], + "legIntPurposes": [ + 7, + 8, + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "https://delivered-by-madington.com/dat-privacy-policy/" + }, + "495": { + "id": 495, + "name": "Arcspire Limited", + "purposes": [ + 2, + 3, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://public.arcspire.io/docs/ARCSPIRE-PrivacyPolicy_v1.0.pdf", + "overflow": { + "httpGetLimit": 128 + } + }, + "424": { + "id": 424, + "name": "KUPONA GmbH", + "purposes": [ + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.kupona.de/dsgvo/" + }, + "467": { + "id": 467, + "name": "Haensel AMS GmbH", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 7 + ], + "flexiblePurposes": [ + 7 + ], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "https://haensel-ams.com/data-privacy/" + }, + "490": { + "id": 490, + "name": "PLAYGROUND XYZ EMEA LTD", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 7 + ], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://playground.xyz/privacy" + }, + "491": { + "id": 491, + "name": "Triboo Data Analytics", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.shinystat.com/it/informativa_sito.html" + }, + "502": { + "id": 502, + "name": "NEXD", + "purposes": [ + 7, + 10 + ], + "legIntPurposes": [ + 9 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://nexd.com/privacy-policy", + "overflow": { + "httpGetLimit": 128 + } + }, + "512": { + "id": 512, + "name": "PubNative GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 8, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [ + 2 + ], + "policyUrl": "https://pubnative.net/privacy-notice/" + }, + "516": { + "id": 516, + "name": "Pexi B.V.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://pexi.nl/privacy-policy/" + }, + "507": { + "id": 507, + "name": "AdsWizz Inc.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.adswizz.com/our-privacy-policy/" + }, + "524": { + "id": 524, + "name": "The Ozone Project Limited", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://ozoneproject.com/privacy-policy" + }, + "535": { + "id": 535, + "name": "INNITY", + "purposes": [ + 1, + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2 + ], + "specialFeatures": [], + "policyUrl": "https://www.innity.com/privacy-policy.php" + }, + "543": { + "id": 543, + "name": "PaperG, Inc. dba Thunder Industries", + "purposes": [ + 1, + 3, + 4, + 5, + 6 + ], + "legIntPurposes": [ + 2, + 7, + 8 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.makethunder.com/privacy" + }, + "546": { + "id": 546, + "name": "Smart Traffik", + "purposes": [ + 1, + 8 + ], + "legIntPurposes": [ + 7 + ], + "flexiblePurposes": [ + 7, + 8 + ], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://smart-traffik.io/politique-de-confidentialite" + }, + "439": { + "id": 439, + "name": "Bit Q Holdings Limited", + "purposes": [ + 1, + 7, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.rippll.com/privacy" + }, + "553": { + "id": 553, + "name": "Adhese", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://adhese.com/privacy-and-cookie-policy" + }, + "556": { + "id": 556, + "name": "adhood.com", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://v3.adhood.com/en/site/politikavekurallar/gizlilik.php?lang=en" + }, + "550": { + "id": 550, + "name": "Happydemics", + "purposes": [ + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.iubenda.com/privacy-policy/69056167/full-legal" + }, + "554": { + "id": 554, + "name": "RMSi Radio Marketing Service interactive GmbH", + "purposes": [ + 1, + 3, + 4 + ], + "legIntPurposes": [ + 2, + 7, + 9 + ], + "flexiblePurposes": [ + 2 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.rms.de/datenschutz/" + }, + "498": { + "id": 498, + "name": "Dr. Banner", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "legIntPurposes": [ + 9, + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://drbanner.com/privacypolicy_en/" + }, + "571": { + "id": 571, + "name": "ViewPay", + "purposes": [ + 1, + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "http://viewpay.tv/mentions-legales/" + }, + "568": { + "id": 568, + "name": "Jointag S.r.l.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.jointag.com/privacy/kariboo/publisher/third/" + }, + "587": { + "id": 587, + "name": "Localsensor B.V.", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.localsensor.com/privacy.html" + }, + "593": { + "id": 593, + "name": "Programatica de publicidad S.L.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://datmean.com/politica-privacidad/" + }, + "612": { + "id": 612, + "name": "Adnami Aps", + "purposes": [ + 1 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.adnami.io/privacy" + }, + "607": { + "id": 607, + "name": "ucfunnel Co., Ltd.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.ucfunnel.com/privacy-policy" + }, + "609": { + "id": 609, + "name": "Predicio", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "http://www.predic.io/privacy", + "overflow": { + "httpGetLimit": 128 + } + }, + "618": { + "id": 618, + "name": "BEINTOO SPA", + "purposes": [ + 1, + 2, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://www.beintoo.com/privacy-cookie-policy/" + }, + "628": { + "id": 628, + "name": ": Tappx", + "purposes": [ + 1, + 2, + 4, + 7, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 2 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.tappx.com/en/privacy-policy/" + }, + "626": { + "id": 626, + "name": "Hivestack Inc.", + "purposes": [ + 1, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://hivestack.com/privacy-policy" + }, + "653": { + "id": 653, + "name": "Smartme Analytics", + "purposes": [ + 7, + 8, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 3 + ], + "specialFeatures": [], + "policyUrl": "http://smartmeapp.com/info/smartme/aviso_legal.php" + }, + "613": { + "id": 613, + "name": "Adserve.zone / Artworx AS", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 7 + ], + "flexiblePurposes": [ + 2 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "http://adserve.zone/adserveprivacypolicy.html" + }, + "652": { + "id": 652, + "name": "Skaze", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://www.skaze.fr/rgpd/" + }, + "648": { + "id": 648, + "name": "TrueData Solutions, Inc.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.truedata.co/privacy-policy/" + }, + "659": { + "id": 659, + "name": "Research and Analysis of Media in Sweden AB", + "purposes": [], + "legIntPurposes": [ + 7, + 8, + 9 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "https://www2.rampanel.com/privacy-policy/" + }, + "656": { + "id": 656, + "name": "Think Clever Media", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 9 + ], + "legIntPurposes": [ + 7, + 8, + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.contentignite.com/privacy-policy/" + }, + "657": { + "id": 657, + "name": "GP One GmbH", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 3, + 4 + ], + "flexiblePurposes": [ + 2, + 3, + 4 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.gsi-one.org/de/privacy-policy.html" + }, + "665": { + "id": 665, + "name": "Digital East GmbH", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.digitaleast.mobi/en/legal/privacy-policy/" + }, + "668": { + "id": 668, + "name": "WhatRocks Inc. ", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.whatrocks.co/en/privacy-policy " + }, + "676": { + "id": 676, + "name": "BusinessClick", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.businessclick.com/documents/RegulaminProgramuBusinessClick-2019.pdf" + }, + "684": { + "id": 684, + "name": "Blue Billywig BV", + "purposes": [], + "legIntPurposes": [ + 7 + ], + "flexiblePurposes": [ + 7 + ], + "specialPurposes": [ + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.bluebillywig.com/privacy-statement/" + }, + "686": { + "id": 686, + "name": "The MediaGrid Inc.", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2 + ], + "specialFeatures": [], + "policyUrl": "https://www.themediagrid.com/privacy-policy/" + }, + "687": { + "id": 687, + "name": "MISSENA", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2 + ], + "specialPurposes": [ + 2 + ], + "features": [], + "specialFeatures": [], + "policyUrl": "http://missena.com/confidentialite/" + }, + "690": { + "id": 690, + "name": "Go.pl sp. z o.o.", + "purposes": [ + 1, + 2, + 3, + 4 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://go.pl/polityka-prywatnosci/" + }, + "691": { + "id": 691, + "name": "Lifesight Pte. Ltd.", + "purposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.lifesight.io/privacy-policy/" + }, + "699": { + "id": 699, + "name": "HyperTV Inc.", + "purposes": [ + 1, + 2, + 4, + 9 + ], + "legIntPurposes": [ + 7, + 10 + ], + "flexiblePurposes": [], + "specialPurposes": [ + 2 + ], + "features": [ + 1 + ], + "specialFeatures": [], + "policyUrl": "https://www.hypertvx.com/privacy/" + }, + "703": { + "id": 703, + "name": "MindTake Research GmbH", + "purposes": [ + 1, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1 + ], + "features": [ + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.mindtake.com/en/reppublika-privacy-policy" + }, + "681": { + "id": 681, + "name": "MyTraffic", + "purposes": [ + 1, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 9 + ], + "specialPurposes": [], + "features": [], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.mytraffic.io/en/privacy" + }, + "711": { + "id": 711, + "name": "SITU8ED SA", + "purposes": [ + 1, + 3, + 4, + 5, + 6, + 7, + 8, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.situ8ed.com/privacy-policy/" + }, + "712": { + "id": 712, + "name": "Inspired Mobile Limited", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://byinspired.com/privacypolicy.pdf" + }, + "688": { + "id": 688, + "name": "Effinity", + "purposes": [], + "legIntPurposes": [ + 2 + ], + "flexiblePurposes": [ + 2, + 7 + ], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.effiliation.com/politique-de-confidentialite/", + "overflow": { + "httpGetLimit": 128 + } + }, + "702": { + "id": 702, + "name": "Kwanko", + "purposes": [ + 1, + 2, + 7, + 8 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 7, + 8 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.kwanko.com/fr/rgpd/" + }, + "714": { + "id": 714, + "name": "Survata Inc.", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 7, + 9 + ], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://www.survata.com/respondent-privacy-policy/", + "overflow": { + "httpGetLimit": 128 + } + }, + "713": { + "id": 713, + "name": "Dataseat Ltd", + "purposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 7, + 8 + ], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "https://dataseat.com/privacy-policy" + }, + "716": { + "id": 716, + "name": "OnAudience Ltd", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.onaudience.com/internet-advertising-privacy-policy" + }, + "708": { + "id": 708, + "name": "Dugout Limited ", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://dugout.com/privacy-policy" + }, + "694": { + "id": 694, + "name": "Snapupp Technologies SL", + "purposes": [ + 2, + 3, + 4, + 5, + 6, + 9 + ], + "legIntPurposes": [ + 7, + 8, + 10 + ], + "flexiblePurposes": [ + 10 + ], + "specialPurposes": [], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "https://www.enterprise.noddus.com/privacy-policy", + "overflow": { + "httpGetLimit": 128 + } + }, + "683": { + "id": 683, + "name": "Cookie Market LTD", + "purposes": [ + 1, + 3, + 4, + 9 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "http://cookie.market/privacyPolicy.php" + }, + "720": { + "id": 720, + "name": "AAX LLC", + "purposes": [ + 1, + 3, + 4 + ], + "legIntPurposes": [ + 2, + 7 + ], + "flexiblePurposes": [ + 3, + 4, + 7 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 3 + ], + "specialFeatures": [], + "policyUrl": "https://aax.media/privacy/", + "overflow": { + "httpGetLimit": 32 + } + }, + "719": { + "id": 719, + "name": "Online Advertising Network Sp. z o.o.", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 2, + 3 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://www.oan.pl/en/privacy-policy" + }, + "707": { + "id": 707, + "name": "Dentsu Aegis Network Italia SpA", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 1, + 2 + ], + "policyUrl": "https://www.dentsuaegisnetwork.com/it/it/policies/info-cookie" + }, + "726": { + "id": 726, + "name": "YouGov", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [ + 2, + 3, + 4, + 7, + 8, + 9, + 10 + ], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "https://yougov.co.uk/about/terms-combined/#/privacy" + }, + "729": { + "id": 729, + "name": "Cavai AS & UK ", + "purposes": [], + "legIntPurposes": [ + 7, + 8 + ], + "flexiblePurposes": [ + 7, + 8 + ], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://cav.ai/privacy-policy/" + }, + "722": { + "id": 722, + "name": "agof services gmbh", + "purposes": [], + "legIntPurposes": [ + 3, + 5, + 7, + 8, + 9, + 10 + ], + "flexiblePurposes": [ + 5, + 8, + 9, + 10 + ], + "specialPurposes": [ + 1 + ], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [ + 2 + ], + "policyUrl": "http://www.agof.de/datenschutz/" + }, + "723": { + "id": 723, + "name": "Adzymic Pte Ltd", + "purposes": [ + 1, + 2, + 3, + 4, + 7, + 8 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 2 + ], + "specialFeatures": [], + "policyUrl": "http://www.adzymic.co/privacy", + "overflow": { + "httpGetLimit": 128 + } + }, + "725": { + "id": 725, + "name": "Pubfinity LLC", + "purposes": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://pubfinity.com/privacy-policy/", + "overflow": { + "httpGetLimit": 128 + } + }, + "733": { + "id": 733, + "name": "Anzu Virtual reality LTD", + "purposes": [ + 1, + 2, + 4, + 7, + 9, + 10 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [ + 1, + 2 + ], + "specialFeatures": [ + 1 + ], + "policyUrl": "https://anzu.io/privacy/" + }, + "737": { + "id": 737, + "name": "Monet Engine Inc", + "purposes": [ + 1, + 2, + 7 + ], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [], + "specialFeatures": [], + "policyUrl": "https://appmonet.com/privacy-policy/" + }, + "740": { + "id": 740, + "name": "6Sense Insights, Inc.", + "purposes": [ + 1 + ], + "legIntPurposes": [ + 2, + 3, + 4, + 5, + 7, + 8, + 10 + ], + "flexiblePurposes": [ + 2, + 3, + 4, + 5, + 7, + 8, + 10 + ], + "specialPurposes": [], + "features": [ + 1, + 2, + 3 + ], + "specialFeatures": [], + "policyUrl": "https://6sense.com/privacy-policy/", + "overflow": { + "httpGetLimit": 128 + } + }, + "744": { + "id": 744, + "name": "Vidazoo Ltd", + "purposes": [ + 3, + 4 + ], + "legIntPurposes": [ + 2, + 7, + 8, + 10 + ], + "flexiblePurposes": [ + 3, + 4 + ], + "specialPurposes": [ + 1, + 2 + ], + "features": [ + 2 + ], + "specialFeatures": [ + 2 + ], + "policyUrl": "https://vidazoo.gitbook.io/vidazoo-legal/privacy-policy", + "overflow": { + "httpGetLimit": 128 + } + } + } +} From ed2424a5352d5658f1bdac57b74ef615cef0b75f Mon Sep 17 00:00:00 2001 From: apocentek Date: Fri, 28 Feb 2020 15:11:03 +0100 Subject: [PATCH 191/540] resolvin some conflicts manually --- src/components/popup/details/details.jsx | 1 - src/components/popup/details/purposes/purposes.jsx | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 6418d30c..f7c4fcf1 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -143,7 +143,6 @@ export default class Details extends Component { /> { if (!purposeIsTechnical(purpose)) { this.handleSelectPurpose({isSelected: false, dataId: index}, true); } }); - } + }*/ } return ( From 2b358506caf27f85890d7e70965d3f520c57c1f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 28 Feb 2020 16:27:24 +0100 Subject: [PATCH 192/540] cleaning --- src/complete.js | 122 +----------------- src/components/popup/details/details.jsx | 21 +-- .../popup/details/purposes/purposes.jsx | 38 +++--- src/lib/cmp.js | 1 - src/lib/config.js | 2 - src/lib/store.js | 74 +++++------ 6 files changed, 51 insertions(+), 207 deletions(-) diff --git a/src/complete.js b/src/complete.js index 631080ea..b73755c7 100644 --- a/src/complete.js +++ b/src/complete.js @@ -1,118 +1,3 @@ -// import 'core-js/fn/array/reduce'; -// import 'core-js/fn/array/fill'; -// import 'core-js/fn/array/map'; -// import 'core-js/fn/array/for-each'; -// import 'core-js/fn/array/filter'; -// import 'core-js/fn/set'; -// import log from './lib/log'; -// import { init } from './lib/init'; -// import { CMP_GLOBAL_NAME } from "./lib/cmp"; -// import configuration from "./lib/config"; -// -// function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion} = {}, {created, vendorListVersion} = {}) { -// if (!created) { -// log.debug('No consent data found. Showing consent tool'); -// configuration.autoDisplay && cmp('showConsentTool'); -// } -// else if (!listVersion) { -// log.debug('Could not determine vendor list version. Not showing consent tool'); -// } -// else if (vendorListVersion !== listVersion) { -// log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); -// configuration.autoDisplay && cmp('showConsentTool'); -// } -// else { -// log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); -// !isConsentToolShowing && configuration.autoDisplay && cmp('showFooter'); -// } -// } -// -// function checkConsent(cmp, store) { -// if (!cmp) { -// log.error('CMP failed to load'); -// } -// else if (!window.navigator.cookieEnabled) { -// log.warn('Cookies are disabled. Ignoring CMP consent check'); -// } -// else { -// cmp('getVendorList', null, vendorList => { -// const timeout = setTimeout(() => { -// handleConsentResult(cmp, store, vendorList); -// }, 100); -// -// cmp('getConsentFields', null, vendorConsents => { -// clearTimeout(timeout); -// handleConsentResult(cmp, store, vendorList, vendorConsents); -// }); -// }); -// } -// } -// -// // Preserve any config options already set -// const {config} = window[CMP_GLOBAL_NAME] || {}; -// const configUpdates = { -// globalConsentLocation: 'https://rasp.mgr.consensu.org/portal.html', -// ...config -// }; -// -// // Add locator frame -// function addLocatorFrame() { -// if (!window.frames['__cmpLocator']) { -// if (document.body) { -// const frame = document.createElement('iframe'); -// frame.style.display = 'none'; -// frame.name = '__cmpLocator'; -// document.body.appendChild(frame); -// } -// else { -// setTimeout(addLocatorFrame, 5); -// } -// } -// } -// -// addLocatorFrame(); -// -// // Add stub -// const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; -// const cmp = function (command, parameter, callback) { -// commandQueue.push({ -// command, -// parameter, -// callback -// }); -// }; -// cmp.commandQueue = commandQueue; -// cmp.receiveMessage = function (event) { -// const data = event && event.data && event.data.__cmpCall; -// if (data) { -// const {callId, command, parameter} = data; -// commandQueue.push({ -// callId, -// command, -// parameter, -// event -// }); -// } -// }; -// -// window.__cmp = cmp; -// -// // Listen for postMessage events -// function listen(type, listener, useCapture) { -// if (window.addEventListener) { -// window.addEventListener(type, listener, useCapture); -// } else if (window.attachEvent) { -// window.attachEvent('on' + type, listener); -// } -// } -// listen('message', event => { -// window.__cmp.receiveMessage(event); -// }, false); -// -// // Initialize CMP and then check if we need to ask for consent -// init(configUpdates).then((store) => checkConsent(window.__cmp, store)); -// - import 'core-js/fn/array/reduce'; import 'core-js/fn/array/fill'; import 'core-js/fn/array/map'; @@ -154,7 +39,6 @@ function checkConsent(cmp, store) { __tcfapi('getVendorList', 2, (vendorList, success) => { if (success) { const timeout = setTimeout(() => { - console.log('in timeout'); handleConsentResult(cmp, store, vendorList); }, 100); @@ -164,11 +48,8 @@ function checkConsent(cmp, store) { try { tcStringDecoded = TCString.decode(tcData.tcString); - console.log('consent was created'); - console.log(tcStringDecoded); } catch (e) { - console.log('consent was not created'); - handleConsentResult(cmp, store, vendorList) + // error ocurred during decoding TCString } finally { clearTimeout(timeout); handleConsentResult(cmp, store, vendorList, tcStringDecoded) @@ -243,4 +124,3 @@ listen('message', event => { // Initialize CMP and then check if we need to ask for consent init(configUpdates).then((store) => checkConsent(window.__cmp, store)); - diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 33aad8a3..2f0e78ca 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -29,23 +29,19 @@ export default class Details extends Component { }; filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [] } = {}) => { - console.log('filter vendors'); return this.getVendors().filter(vendor => { - console.log(vendor); - console.log(isCustom); if (isCustom !== null && (isCustom && vendor.external_id || !isCustom && !vendor.external_id)) { return false; } const vendorPurposeIds = new Set([...(vendor.purposes || []), ...(vendor.legIntPurposes || [])]); - console.log(vendorPurposeIds); + if (!purposeIds.every(purposeId => vendorPurposeIds.has(purposeId))) { return false; } const vendorFeatureIds = new Set(vendor.features || []); - console.log(vendorFeatureIds); if (!featureIds.every(featureId => vendorFeatureIds.has(featureId))) { return false; } @@ -55,8 +51,6 @@ export default class Details extends Component { }; handleShowVendors = (filter) => { - console.log(this.filterVendors(filter)); - this.setState({ vendors: this.filterVendors(filter) }); @@ -73,8 +67,6 @@ export default class Details extends Component { }; render(props, state) { - console.log('details render'); - const { onSaveOrClose, store @@ -95,9 +87,6 @@ export default class Details extends Component { selectPublisherPurpose, selectPublisherLegitimateInterest, - selectPublisherCustomPurpose, - selectPublisherCustomLegitimateInterest, - persistedConsentData = {}, subsection @@ -110,9 +99,6 @@ export default class Details extends Component { vendorConsents, } = tcModel; - console.log('details '); - console.log(vendorList); - const { created: consentCreated } = persistedConsentData; const { purposes = {}, specialPurposes = {}, features = {}, specialFeatures = {}} = vendorList; const { purposes: customPurposes = [] } = customPurposeList; @@ -136,15 +122,14 @@ export default class Details extends Component { specialFeatures={Object.values(specialFeatures)} customPurposes={customPurposes} selectedPurposeIds={purposeConsents} - selectedStandardPurposeIds={publisherConsents} - selectedCustomPurposeIds={publisherCustomConsents} + selectedPublisherPurposeIds={publisherConsents} + selectedPublisherCustomPurposeIds={publisherCustomConsents} selectPurpose={selectPurpose} selectPurposeLegitimateInterest={selectPurposeLegitimateInterest} selectSpecialFeature={selectSpecialFeature} initialVendorsRejection={initialVendorsRejection} selectPublisherPurpose={selectPublisherPurpose} selectPublisherLegitimateInterest={selectPublisherLegitimateInterest} - selectPublisherCustomPurpose={selectPublisherCustomPurpose} onShowVendors={this.handleShowVendors} persistedConsentData={persistedConsentData} /> diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index e92e2d73..23103241 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -26,7 +26,7 @@ export default class Purposes extends Component { features: [], customPurposes: [], selectedPurposeIds: new Set(), - selectedStandardPurposeIds: new Set(), + selectedPublisherPurposeIds: new Set(), selectedCustomPurposeIds: new Set() }; @@ -38,15 +38,14 @@ export default class Purposes extends Component { }; }; - handleSelectPurpose = ({isSelected, dataId}, isPublisher = false) => { + handleSelectPurpose = ({isSelected, dataId}, isPublisher = false, isLegInt = false) => { const { selectPurpose, + selectPurposeLegitimateInterest, selectPublisherPurpose, selectPublisherCustomPurpose } = this.props; - console.log('handleSelectPurpose'); - const allPurposes = this.getAllPurposes(); const selectedPurpose = allPurposes[dataId]; @@ -56,8 +55,11 @@ export default class Purposes extends Component { } else if (isPublisher) { selectPublisherPurpose(selectedPurpose.id, isSelected); } else { - console.log('should select iab purpose'); - selectPurpose(selectedPurpose.id, isSelected); + if (isLegInt) { + selectPurposeLegitimateInterest(selectedPurpose.id, isSelected); + } else { + selectPurpose(selectedPurpose.id, isSelected); + } } } }; @@ -106,14 +108,12 @@ export default class Purposes extends Component { const { selectedPurposeIds, - selectedStandardPurposeIds, + selectedPublisherPurposeIds, selectedCustomPurposeIds, purposes, specialPurposes, features, specialFeatures, - persistedVendorConsentData, - persistedPublisherConsentData, persistedConsentData, initialVendorsRejection } = props; @@ -130,7 +130,7 @@ export default class Purposes extends Component { const purposeIsActive = (purpose, isPublisher = false) => purpose && ( purpose.custom ? selectedCustomPurposeIds.has(purpose.id) : - (isPublisher ? selectedStandardPurposeIds : selectedPurposeIds).has(purpose.id) + (isPublisher ? selectedPublisherPurposeIds : selectedPurposeIds).has(purpose.id) ); const purposeIsTechnical = (purpose) => config.legIntPurposeIds && @@ -140,24 +140,22 @@ export default class Purposes extends Component { if (selectedTab === TAB_CONSENTS && !renderedTabIndices.has(selectedTab)) { renderedTabIndices.add(selectedTab); - console.log('consent created? ' + consentCreated); if (!consentCreated) { - console.log('should unselect all iab purposes'); purposes.forEach((purpose, index) => { + // iab purposes this.handleSelectPurpose({isSelected: false, dataId: index}); + + // iab leg ints + this.handleSelectPurpose({isSelected: false, dataId: index}, false, true); + + // publisher purposes + this.handleSelectPurpose({isSelected: false, dataId: index}, true, false); }); specialFeatures.forEach((specialFeature, index) => { - this.handleSelectSpecialFeature({isSelected:false, dataId: index}) + this.handleSelectSpecialFeature({isSelected:false, dataId: index+1}) }); initialVendorsRejection(); } - // if (!publisherConsentCreated) { - // allPurposes.forEach((purpose, index) => { - // if (!purposeIsTechnical(purpose)) { - // this.handleSelectPurpose({isSelected: false, dataId: index}, true); - // } - // }); - // } } return ( diff --git a/src/lib/cmp.js b/src/lib/cmp.js index fc3dea86..860da5a5 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -54,7 +54,6 @@ export default class Cmp { * @param {Array} vendorIds Array of vendor IDs to retrieve. If empty return all vendors. */ getVendorConsents: (vendorIds, callback = () => {}) => { - console.log('getVendorConsents'); const consent = { metadata: this.generateConsentString(), gdprApplies: config.gdprApplies, diff --git a/src/lib/config.js b/src/lib/config.js index f2d24e8f..fe8b4923 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -40,8 +40,6 @@ class Config { return acc; }, { validUpdates: {}, invalidKeys: [] }); - console.log(validUpdates); - Object.assign(this, validUpdates); if (invalidKeys.length) { log.warn(`Invalid CMP config values not applied: ${invalidKeys.join(', ')}`); diff --git a/src/lib/store.js b/src/lib/store.js index 31e2cfd2..f198a580 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -36,14 +36,9 @@ export default class Store { vendorList, cmpApi } = {}) { - - console.log('config'); - console.log(config); // Keep track of data that has already been persisted consentData = consentData || {}; this.persistedConsentData = copyData(consentData); - // console.log(this.persistedConsentData); - const consentLanguage = findLocale().substr(0, 2).toUpperCase(); const tcModel = new TCModel(); tcModel.cmpId = cmpId; @@ -68,8 +63,6 @@ export default class Store { } isAllSetTrue = obj => { - console.log(obj); - console.log('isAllSetTrue'); return Object.keys(obj).map(key => obj[key]).every((value) => value === true); }; @@ -268,38 +261,35 @@ export default class Store { * Build consent fields object from data that has already been persisted. */ getConsentFieldsObject = () => { - // console.log('getConsentFieldsObject'); - // const { - // persistedConsentData = {}, - // tcModel - // } = this; - // - // const { - // version_: cookieVersion, - // created, - // lastUpdated, - // cmpId_: cmpId, - // cmpVersion_: cmpVersion, - // consentScreen_: consentScreen, - // consentLanguage_: consentLanguage, - // vendorListVersion_: vendorListVersion, - // globalVendorListVersion, - // } = { - // ...tcModel, - // persistedConsentData - // }; - // - // return { - // cmpId, - // cmpVersion, - // consentLanguage, - // consentScreen, - // cookieVersion, - // created, - // globalVendorListVersion, - // vendorListVersion, - // lastUpdated, - // }; + const { + tcModel + } = this; + + const consentObject = TCString.decode(TCString.encode(tcModel)); + + const { + created, + lastUpdated, + cmpId, + cmpVersion, + consentScreen, + consentLanguage, + vendorListVersion, + globalVendorListVersion, + version + } = consentObject; + + return { + cmpId, + cmpVersion, + consentLanguage, + consentScreen, + created, + globalVendorListVersion, + vendorListVersion, + lastUpdated, + version + }; }; /** * Persist all consent data to the cookie. This data will NOT be filtered @@ -343,10 +333,6 @@ export default class Store { this.persistedConsentData = TCString.decode(encodedConsent); - - console.log(JSON.parse(JSON.stringify(this.tcModel))); - console.log(JSON.parse(JSON.stringify(this.persistedConsentData))); - // Notify of date changes this.storeUpdate(); }; @@ -533,7 +519,6 @@ export default class Store { toggleFooterShowing = (isShown) => { const vendorConsentsObject = this.getVendorConsentsObject(); - const publisherConsentsObject = this.getPublisherConsentsObject(); if (this.isAllSetTrue(vendorConsentsObject.purposeConsents)) { let vendorConsents; @@ -567,7 +552,6 @@ export default class Store { }; updateVendorList = (vendorList) => { - console.log('updateVendorList'); const { created, } = this.persistedConsentData || {}; From adddfbe5529e89280541808cc9fef0a4ecba21ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 11:32:26 +0100 Subject: [PATCH 193/540] cleaning --- src/lib/cmp.js | 2 -- src/lib/config.js | 2 +- src/lib/init.js | 1 - src/lib/translations.js | 2 +- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 860da5a5..237d59ba 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -69,8 +69,6 @@ export default class Cmp { */ getConsentFields: (params = {}, callback = () => {}) => { const data = this.store.getConsentFieldsObject(); - console.log('cmp.getConsentFields.data'); - console.log(data); const now = new Date(); const consent = { metadata: this.generateConsentString({ diff --git a/src/lib/config.js b/src/lib/config.js index fe8b4923..3cdd8e1e 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,7 +6,7 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - logging: true, + logging: false, localization: {}, forceLocale: null, gdprApplies: true, diff --git a/src/lib/init.js b/src/lib/init.js index d9b806a0..fd318652 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -1,7 +1,6 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; -// do zaorania import Cmp, { CMP_GLOBAL_NAME } from './cmp'; import {Vector} from '@iabtcf/core'; import {CmpApi} from '@iabtcf/cmpapi'; diff --git a/src/lib/translations.js b/src/lib/translations.js index 3f6bbf45..28717a95 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,7 +8,7 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

    DEV Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    + description: `

    Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    Zgoda

    From f72274797799fbe16b7f3e3756d44fd4d990d3d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 11:36:21 +0100 Subject: [PATCH 194/540] removed mock --- src/lib/vendor.js | 7 +- src/lib/vendors-mock.json | 4199 ------------------------------------- 2 files changed, 2 insertions(+), 4204 deletions(-) delete mode 100644 src/lib/vendors-mock.json diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 42782c03..1f8b1fca 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -1,7 +1,6 @@ import Promise from 'promise-polyfill'; import config from './config'; import log from './log'; -import vendorList from './vendors-mock'; function fetch(url) { return new Promise((resolve, reject) => { @@ -35,9 +34,7 @@ function fetchGlobalVendorList() { reject(err); } else { try { - console.log('fetchGlobalVendorList resolve'); - resolve(vendorList); - // resolve(data); + resolve(data); } catch (err) { reject(err); } @@ -47,7 +44,7 @@ function fetchGlobalVendorList() { reject(err); } }).catch(err => { - log.error(`Failed to load global vendor list ftrom configuration`, err); + log.error(`Failed to load global vendor list from configuration`, err); }); } return (globalVendorListLocation ? diff --git a/src/lib/vendors-mock.json b/src/lib/vendors-mock.json deleted file mode 100644 index 7161de22..00000000 --- a/src/lib/vendors-mock.json +++ /dev/null @@ -1,4199 +0,0 @@ -{ - "gvlSpecificationVersion": 2, - "vendorListVersion": 26, - "tcfPolicyVersion": 2, - "lastUpdated": "2020-02-20T16:05:20Z", - "purposes": { - "1": { - "id": 1, - "name": "Store and/or access information on a device", - "description": "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", - "descriptionLegal": "Vendors can:\n* Store and access information on the device such as cookies and device identifiers presented to a user." - }, - "2": { - "id": 2, - "name": "Select basic ads", - "description": "Ads can be shown to you based on the content you\u2019re viewing, the app you\u2019re using, your approximate location, or your device type.", - "descriptionLegal": "To do basic ad selection vendors can:\n* Use real-time information about the context in which the ad will be shown, to show the ad, including information about the content and the device, such as: device type and capabilities, user agent, URL, IP address\n* Use a user\u2019s non-precise geolocation data\n* Control the frequency of ads shown to a user.\n* Sequence the order in which ads are shown to a user.\n* Prevent an ad from serving in an unsuitable editorial (brand-unsafe) context\nVendors cannot:\n* Create a personalised ads profile using this information for the selection of future ads.\n* N.B. Non-precise means only an approximate location involving at least a radius of 500 meters is permitted." - }, - "3": { - "id": 3, - "name": "Create a personalised ads profile", - "description": "A profile can be built about you and your interests to show you personalised ads that are relevant to you.", - "descriptionLegal": "To create a personalised ads profile vendors can:\n* Collect information about a user, including a user's activity, interests, demographic information, or location, to create or edit a user profile for use in personalised advertising.\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalised advertising." - }, - "4": { - "id": 4, - "name": "Select personalised ads", - "description": "Personalised ads can be shown to you based on a profile about you.", - "descriptionLegal": "To select personalised ads vendors can:\n* Select personalised ads based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." - }, - "5": { - "id": 5, - "name": "Create a personalised content profile", - "description": "A profile can be built about you and your interests to show you personalised content that is relevant to you.", - "descriptionLegal": "To create a personalised content profile vendors can:\n* Collect information about a user, including a user's activity, interests, visits to sites or apps, demographic information, or location, to create or edit a user profile for personalising content.\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalising content." - }, - "6": { - "id": 6, - "name": "Select personalised content", - "description": "Personalised content can be shown to you based on a profile about you.", - "descriptionLegal": "To select personalised content vendors can:\n* Select personalised content based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." - }, - "7": { - "id": 7, - "name": "Measure ad performance", - "description": "The performance and effectiveness of ads that you see or interact with can be measured.", - "descriptionLegal": "To measure ad performance vendors can:\n* Measure whether and how ads were delivered to and interacted with by a user\n* Provide reporting about ads including their effectiveness and performance\n* Provide reporting about users who interacted with ads using data observed during the course of the user's interaction with that ad\n* Provide reporting to publishers about the ads displayed on their property\n* Measure whether an ad is serving in a suitable editorial environment (brand-safe) context\n* Determine the percentage of the ad that had the opportunity to be seen and the duration of that opportunity\n* Combine this information with other information previously collected, including from across websites and apps\nVendors cannot:\n*Apply panel- or similarly-derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" - }, - "8": { - "id": 8, - "name": "Measure content performance", - "description": "The performance and effectiveness of content that you see or interact with can be measured.", - "descriptionLegal": "To measure content performance vendors can:\n* Measure and report on how content was delivered to and interacted with by users.\n* Provide reporting, using directly measurable or known information, about users who interacted with the content\n* Combine this information with other information previously collected, including from across websites and apps.\nVendors cannot:\n* Measure whether and how ads (including native ads) were delivered to and interacted with by a user.\n* Apply panel- or similarly derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" - }, - "9": { - "id": 9, - "name": "Apply market research to generate audience insights", - "description": "Market research can be used to learn more about the audiences who visit sites/apps and view ads.", - "descriptionLegal": "To apply market research to generate audience insights vendors can:\n* Provide aggregate reporting to advertisers or their representatives about the audiences reached by their ads, through panel-based and similarly derived insights.\n* Provide aggregate reporting to publishers about the audiences that were served or interacted with content and/or ads on their property by applying panel-based and similarly derived insights.\n* Associate offline data with an online user for the purposes of market research to generate audience insights if vendors have declared to match and combine offline data sources (Feature 1)\n* Combine this information with other information previously collected including from across websites and apps. \nVendors cannot:\n* Measure the performance and effectiveness of ads that a specific user was served or interacted with, without a Legal Basis to measure ad performance.\n* Measure which content a specific user was served and how they interacted with it, without a Legal Basis to measure content performance." - }, - "10": { - "id": 10, - "name": "Develop and improve products", - "description": "Your data can be used to improve existing systems and software, and to develop new products", - "descriptionLegal": "To develop new products and improve products vendors can:\n* Use information to improve their existing products with new features and to develop new products\n* Create new models and algorithms through machine learning\nVendors cannot:\n* Conduct any other data processing operation allowed under a different purpose under this purpose" - } - }, - "specialPurposes": { - "1": { - "id": 1, - "name": "Ensure security, prevent fraud, and debug", - "description": "Your data can be used to monitor for and prevent fraudulent activity, and ensure systems and processes work properly and securely.", - "descriptionLegal": "To ensure security, prevent fraud and debug vendors can:\n* Ensure data are securely transmitted\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\nVendors cannot:\n* Conduct any other data processing operation allowed under a different purpose under this purpose." - }, - "2": { - "id": 2, - "name": "Technically deliver ads or content", - "description": "Your device can receive and send information that allows you to see and interact with ads and content.", - "descriptionLegal": "To deliver information and respond to technical requests vendors can:\n* Use a user\u2019s IP address to deliver an ad over the internet\n* Respond to a user\u2019s interaction with an ad by sending the user to a landing page\n* Use a user\u2019s IP address to deliver content over the internet\n* Respond to a user\u2019s interaction with content by sending the user to a landing page\n* Use information about the device type and capabilities for delivering ads or content, for example, to deliver the right size ad creative or video file in a format supported by the device\nVendors cannot:\n* Conduct any other data processing operation allowed under a different purpose under this purpose" - } - }, - "features": { - "1": { - "id": 1, - "name": "Match and combine offline data sources", - "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", - "descriptionLegal": "Vendors can:\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes." - }, - "2": { - "id": 2, - "name": "Link different devices", - "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", - "descriptionLegal": "Vendors can:\n* Deterministically determine that two or more devices belong to the same user or household\n* Probabilistically determine that two or more devices belong to the same user or household\n* Actively scan device characteristics for identification for probabilistic identification if users have allowed vendors to actively scan device characteristics for identification (Special Feature 2)" - }, - "3": { - "id": 3, - "name": "Receive and use automatically-sent device characteristics for identification", - "description": "Your device might be distinguished from other devices based on information it automatically sends, such as IP address or browser type.", - "descriptionLegal": "Vendors can:\n* Create an identifier using data collected automatically from a device for specific characteristics, e.g. IP address, user-agent string.\n* Use such an identifier to attempt to re-identify a device.\nVendors cannot:\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed font or screen resolution without users\u2019 separate opt-in to actively scanning device characteristics for identification.\n* Use such an identifier to re-identify a device." - } - }, - "specialFeatures": { - "1": { - "id": 1, - "name": "Use precise geolocation data", - "description": "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", - "descriptionLegal": "Vendors can:\n* Collect and process precise geolocation data in support of one or more purposes.\nN.B. Precise geolocation means that there are no restrictions on the precision of a user\u2019s location; this can be accurate to within several meters." - }, - "2": { - "id": 2, - "name": "Actively scan device characteristics for identification", - "description": "Your device can be identified based on a scan of your device's unique combination of characteristics.", - "descriptionLegal": "Vendors can:\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed fonts or screen resolution.\n* Use such an identifier to re-identify a device." - } - }, - "stacks": { - "1": { - "id": 1, - "purposes": [], - "specialFeatures": [ - 1, - 2 - ], - "name": "Precise geolocation data, and identification through device scanning", - "description": "Precise geolocation and information about device characteristics can be used." - }, - "2": { - "id": 2, - "purposes": [ - 2, - 7 - ], - "specialFeatures": [], - "name": "Basic ads, and ad measurement", - "description": "Basic ads can be served. Ad performance can be measured." - }, - "3": { - "id": 3, - "purposes": [ - 2, - 3, - 4 - ], - "specialFeatures": [], - "name": "Personalised ads", - "description": "Ads can be personalised based on a profile. More data can be added to better personalise ads." - }, - "4": { - "id": 4, - "purposes": [ - 2, - 7, - 9 - ], - "specialFeatures": [], - "name": "Basic ads, and ad measurement", - "description": "Basic ads can be served. Ad performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "5": { - "id": 5, - "purposes": [ - 2, - 3, - 7 - ], - "specialFeatures": [], - "name": "Basic ads, personalised ads profile, and ad measurement", - "description": "Basic ads can be served. More data can be added to better personalise ads. Ad performance can be measured." - }, - "6": { - "id": 6, - "purposes": [ - 2, - 4, - 7 - ], - "specialFeatures": [], - "name": "Personalised ads display, and measurement", - "description": "Ads can be personalised based on a profile. Ad performance can be measured." - }, - "7": { - "id": 7, - "purposes": [ - 2, - 4, - 7, - 9 - ], - "specialFeatures": [], - "name": "Personalised ads display, ad measurement, and audience insights", - "description": "Ads can be personalised based on a profile. Ad performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "8": { - "id": 8, - "purposes": [ - 2, - 3, - 4, - 7 - ], - "specialFeatures": [], - "name": "Personalised ads, and ad measurement", - "description": "Ads can be personalised based on a profile. More data can be added to better personalise ads. Ad performance can be measured." - }, - "9": { - "id": 9, - "purposes": [ - 2, - 3, - 4, - 7, - 9 - ], - "specialFeatures": [], - "name": "Personalised ads, ad measurement, and audience insights", - "description": "Ads can be personalised based on a profile. More data can be added to better personalise ads. Ad performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "10": { - "id": 10, - "purposes": [ - 3, - 4 - ], - "specialFeatures": [], - "name": "Personalised ads profile and display", - "description": "Ads can be personalised based on a profile. More data can be added to better personalise ads." - }, - "11": { - "id": 11, - "purposes": [ - 5, - 6 - ], - "specialFeatures": [], - "name": "Personalised content", - "description": "Content can be personalised based on a profile. More data can be added to better personalise content." - }, - "12": { - "id": 12, - "purposes": [ - 6, - 8 - ], - "specialFeatures": [], - "name": "Personalised content display, and content measurement", - "description": "Content can be personalised based on a profile. Content performance can be measured." - }, - "13": { - "id": 13, - "purposes": [ - 6, - 8, - 9 - ], - "specialFeatures": [], - "name": "Personalised content display, content measurement and audience insights", - "description": "Content can be personalised based on a profile. Content performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "14": { - "id": 14, - "purposes": [ - 5, - 6, - 8 - ], - "specialFeatures": [], - "name": "Personalised content, and content measurement", - "description": "Content can be personalised based on a profile. More data can be added to better personalise content. Content performance can be measured." - }, - "15": { - "id": 15, - "purposes": [ - 5, - 6, - 8, - 9 - ], - "specialFeatures": [], - "name": "Personalised content, content measurement and audience insights", - "description": "Content can be personalised based on a profile. More data can be added to better personalise content. Content performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "16": { - "id": 16, - "purposes": [ - 5, - 6, - 8, - 9, - 10 - ], - "specialFeatures": [], - "name": "Personalised content, content measurement, audience insights, and product development", - "description": "Content can be personalised based on a profile. More data can be added to better personalise content. Content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software" - }, - "17": { - "id": 17, - "purposes": [ - 7, - 8, - 9 - ], - "specialFeatures": [], - "name": "Ad and content measurement, and audience insights", - "description": "Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "18": { - "id": 18, - "purposes": [ - 7, - 8 - ], - "specialFeatures": [], - "name": "Ad and content measurement", - "description": "Ad and content performance can be measured." - }, - "19": { - "id": 19, - "purposes": [ - 7, - 9 - ], - "specialFeatures": [], - "name": "Ad measurement, and audience insights", - "description": "Ad can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "20": { - "id": 20, - "purposes": [ - 7, - 8, - 9, - 10 - ], - "specialFeatures": [], - "name": "Ad and content measurement, audience insights, and product development", - "description": "Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software. Insights about the audiences who saw the ads and content can be derived." - }, - "21": { - "id": 21, - "purposes": [ - 8, - 9, - 10 - ], - "specialFeatures": [], - "name": "Content measurement, audience insights, and product development.", - "description": "Content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." - }, - "22": { - "id": 22, - "purposes": [ - 8, - 10 - ], - "specialFeatures": [], - "name": "Content measurement, and product development", - "description": "Content performance can be measured. Data can be used to build or improve user experience, systems, and software." - }, - "23": { - "id": 23, - "purposes": [ - 2, - 4, - 6, - 7, - 8 - ], - "specialFeatures": [], - "name": "Personalised ads and content display, ad and content measurement", - "description": "Ads and content can be personalised based on a profile. Ad and content performance can be measured." - }, - "24": { - "id": 24, - "purposes": [ - 2, - 4, - 6, - 7, - 8, - 9 - ], - "specialFeatures": [], - "name": "Personalised ads and content display, ad and content measurement, and audience insights", - "description": "Ads and content can be personalised based on a profile. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." - }, - "25": { - "id": 25, - "purposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ], - "specialFeatures": [], - "name": "Personalised ads and content, ad and content measurement", - "description": "Ads and content can be personalised based on a profile. More data can be added to better personalise ads and content. Ad and content performance can be measured." - }, - "26": { - "id": 26, - "purposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "specialFeatures": [], - "name": "Personalised ads and content, ad and content measurement, and audience insights", - "description": "Ads and content can be personalised based on a profile. More data can be added to better personalise ads and content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "27": { - "id": 27, - "purposes": [ - 3, - 5 - ], - "specialFeatures": [], - "name": "Personalised ads, and content profile", - "description": "More data can be added to personalise ads and content." - }, - "28": { - "id": 28, - "purposes": [ - 2, - 4, - 6 - ], - "specialFeatures": [], - "name": "Personalised ads and content display", - "description": "Ads and content can be personalised based on a profile." - }, - "29": { - "id": 29, - "purposes": [ - 2, - 7, - 8, - 9 - ], - "specialFeatures": [], - "name": "Basic ads, ad and content measurement, and audience insights", - "description": "Basic ads can be served. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "30": { - "id": 30, - "purposes": [ - 2, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "specialFeatures": [], - "name": "Personalised ads display, personalised content, ad and content measurement, and audience insights", - "description": "Ads and content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "31": { - "id": 31, - "purposes": [ - 2, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "specialFeatures": [], - "name": "Personalised ads display, personalised content, ad and content measurement, audience insights, and product development", - "description": "Ads and content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." - }, - "32": { - "id": 32, - "purposes": [ - 2, - 5, - 6, - 7, - 8, - 9 - ], - "specialFeatures": [], - "name": "Basic ads, personalised content, ad and content measurement, and audience insights", - "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "33": { - "id": 33, - "purposes": [ - 2, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "specialFeatures": [], - "name": "Basic ads, personalised content, ad and content measurement, audience insights, and product development", - "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." - }, - "34": { - "id": 34, - "purposes": [ - 2, - 5, - 6, - 8, - 9 - ], - "specialFeatures": [], - "name": "Basic ads, personalised content, content measurement, and audience insights", - "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad and content performance can be measured. Insights about the audiences who saw the ads and content can be derived." - }, - "35": { - "id": 35, - "purposes": [ - 2, - 5, - 6, - 8, - 9, - 10 - ], - "specialFeatures": [], - "name": "Basic ads, personalised content, content measurement, audience insights, and product development", - "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Content performance can be measured. Insights about the audiences who saw the ads and content can be derived. Data can be used to build or improve user experience, systems, and software." - }, - "36": { - "id": 36, - "purposes": [ - 2, - 5, - 6, - 7 - ], - "specialFeatures": [], - "name": "Basic ads, personalised content, and ad measurement", - "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad performance can be measured." - }, - "37": { - "id": 37, - "purposes": [ - 2, - 5, - 6, - 7, - 10 - ], - "specialFeatures": [], - "name": "Basic ads, personalised content, ad measurement, and product development", - "description": "Basic ads can be served. Content can be personalised based on a profile. More data can be added to better personalise content. Ad performance can be measured. Data can be used to build or improve user experience, systems, and software." - } - }, - "vendors": { - "8": { - "id": 8, - "name": "Emerse Sverige AB", - "purposes": [ - 1, - 3, - 4 - ], - "legIntPurposes": [ - 2, - 7, - 8, - 9 - ], - "flexiblePurposes": [ - 2, - 9 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2 - ], - "specialFeatures": [], - "policyUrl": "https://www.emerse.com/privacy-policy/" - }, - "9": { - "id": 9, - "name": "AdMaxim Inc.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://www.admaxim.com/admaxim-privacy-policy/" - }, - "12": { - "id": 12, - "name": "BeeswaxIO Corporation", - "purposes": [ - 1, - 2, - 3, - 4, - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.beeswax.com/privacy/" - }, - "6": { - "id": 6, - "name": "AdSpirit GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "http://www.adspirit.de/privacy", - "overflow": { - "httpGetLimit": 32 - } - }, - "15": { - "id": 15, - "name": "Adikteev / Emoteev", - "purposes": [ - 1, - 3, - 4, - 5, - 6, - 8, - 9, - 10 - ], - "legIntPurposes": [ - 2, - 7 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "https://www.adikteev.com/privacy-policy-eng/" - }, - "2": { - "id": 2, - "name": "Captify Technologies Limited", - "purposes": [ - 1, - 2, - 3, - 4 - ], - "legIntPurposes": [ - 7, - 9, - 10 - ], - "flexiblePurposes": [ - 2 - ], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "http://www.captify.co.uk/privacy-policy/" - }, - "37": { - "id": 37, - "name": "NEURAL.ONE", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 7, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://web.neural.one/privacy-policy/" - }, - "94": { - "id": 94, - "name": "Blis Media Limited", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://www.blis.com/privacy/" - }, - "53": { - "id": 53, - "name": "Sirdata", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.sirdata.com/privacy/" - }, - "80": { - "id": 80, - "name": "Sharethrough, Inc", - "purposes": [ - 1, - 2, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 4, - 7, - 9, - 10 - ], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://platform-cdn.sharethrough.com/privacy-policy" - }, - "23": { - "id": 23, - "name": "Amobee, Inc. ", - "purposes": [ - 1, - 2, - 3, - 4 - ], - "legIntPurposes": [ - 7, - 9, - 10 - ], - "flexiblePurposes": [ - 2, - 3, - 4, - 7, - 9, - 10 - ], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.amobee.com/trust/privacy-guidelines" - }, - "68": { - "id": 68, - "name": "Sizmek", - "purposes": [ - 1, - 3, - 4 - ], - "legIntPurposes": [ - 2, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "https://www.sizmek.com/privacy-policy/" - }, - "61": { - "id": 61, - "name": "GumGum, Inc.", - "purposes": [ - 1, - 2, - 3, - 4, - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "https://gumgum.com/privacy-policy" - }, - "89": { - "id": 89, - "name": "Tapad, Inc.", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "https://www.tapad.com/eu-privacy-policy" - }, - "66": { - "id": 66, - "name": "adsquare GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 9, - 10 - ], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.adsquare.com/privacy" - }, - "48": { - "id": 48, - "name": "NetSuccess, s.r.o.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.inres.sk/pp/" - }, - "100": { - "id": 100, - "name": "Fifty Technology Limited", - "purposes": [ - 1, - 2, - 3, - 4 - ], - "legIntPurposes": [ - 7, - 9, - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://fifty.io/privacy-policy.php" - }, - "42": { - "id": 42, - "name": "Taboola Europe Limited", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 10 - ], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.taboola.com/privacy-policy" - }, - "93": { - "id": 93, - "name": "Adloox SA", - "purposes": [], - "legIntPurposes": [ - 7 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 1 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "http://adloox.com/disclaimer", - "overflow": { - "httpGetLimit": 128 - } - }, - "18": { - "id": 18, - "name": "Widespace AB", - "purposes": [ - 1, - 2, - 3, - 4, - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 7 - ], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.widespace.com/legal/privacy-policy-notice/" - }, - "72": { - "id": 72, - "name": "Nano Interactive GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "http://www.nanointeractive.com/privacy" - }, - "127": { - "id": 127, - "name": "PIXIMEDIA SAS", - "purposes": [ - 1, - 3, - 4, - 5, - 6, - 9, - 10 - ], - "legIntPurposes": [ - 2, - 7, - 8 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://piximedia.com/privacy/", - "overflow": { - "httpGetLimit": 128 - } - }, - "153": { - "id": 153, - "name": "MADVERTISE MEDIA", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 5, - 6, - 10 - ], - "specialPurposes": [ - 2 - ], - "features": [], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://madvertise.com/en/gdpr/", - "overflow": { - "httpGetLimit": 128 - } - }, - "147": { - "id": 147, - "name": "Adacado Technologies Inc. (DBA Adacado)", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 7, - 8, - 9, - 10 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.adacado.com/privacy-policy-april-25-2018/" - }, - "130": { - "id": 130, - "name": "NextRoll, Inc.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 2 - ], - "policyUrl": "https://www.nextroll.com/privacy" - }, - "129": { - "id": 129, - "name": "IPONWEB GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.iponweb.com/privacy-policy/" - }, - "128": { - "id": 128, - "name": "BIDSWITCH GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://www.bidswitch.com/privacy-policy/" - }, - "163": { - "id": 163, - "name": "Bombora Inc.", - "purposes": [ - 1, - 3, - 8 - ], - "legIntPurposes": [ - 7, - 10 - ], - "flexiblePurposes": [ - 7, - 10 - ], - "specialPurposes": [], - "features": [ - 1 - ], - "specialFeatures": [], - "policyUrl": "https://bombora.com/privacy" - }, - "88": { - "id": 88, - "name": "TreSensa, Inc.", - "purposes": [ - 1, - 3, - 4 - ], - "legIntPurposes": [ - 2, - 7, - 10 - ], - "flexiblePurposes": [ - 2, - 3, - 4, - 7, - 10 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.tresensa.com/eu-privacy" - }, - "78": { - "id": 78, - "name": "Flashtalking, Inc.", - "purposes": [ - 1, - 2, - 3, - 4, - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "http://www.flashtalking.com/privacypolicy/" - }, - "114": { - "id": 114, - "name": "Sublime", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 9 - ], - "legIntPurposes": [ - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "http://ayads.co/privacy.php" - }, - "133": { - "id": 133, - "name": "digitalAudience", - "purposes": [ - 1, - 3, - 5, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2 - ], - "specialFeatures": [], - "policyUrl": "https://digitalaudience.io/legal/privacy-cookies/" - }, - "90": { - "id": 90, - "name": "Teroa S.A.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.e-planning.net/en/privacy.html" - }, - "65": { - "id": 65, - "name": "Location Sciences AI Ltd", - "purposes": [ - 1, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.locationsciences.ai/privacy-policy/" - }, - "205": { - "id": 205, - "name": "Adssets AB", - "purposes": [ - 2, - 4 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "http://adssets.com/policy/" - }, - "115": { - "id": 115, - "name": "smartclip Europe GmbH", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 3, - 4, - 7, - 10 - ], - "flexiblePurposes": [ - 2, - 3, - 4, - 7, - 10 - ], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://privacy-portal.smartclip.net/", - "overflow": { - "httpGetLimit": 32 - } - }, - "126": { - "id": 126, - "name": "DoubleVerify Inc.\u200b", - "purposes": [ - 2, - 7, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.doubleverify.com/privacy/" - }, - "224": { - "id": 224, - "name": "adrule mobile GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 8 - ], - "legIntPurposes": [ - 7 - ], - "flexiblePurposes": [ - 2, - 3, - 4, - 7, - 8 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.adrule.net/de/datenschutz/" - }, - "174": { - "id": 174, - "name": "A Million Ads Ltd", - "purposes": [], - "legIntPurposes": [ - 2, - 4 - ], - "flexiblePurposes": [ - 2, - 4 - ], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.amillionads.com/privacy-policy" - }, - "192": { - "id": 192, - "name": "remerge GmbH", - "purposes": [ - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://remerge.io/privacy-policy.html" - }, - "215": { - "id": 215, - "name": "ARMIS SAS", - "purposes": [ - 1, - 2, - 7 - ], - "legIntPurposes": [ - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "https://armis.tech/en/armis-personal-data-privacy-policy/" - }, - "167": { - "id": 167, - "name": "Audiens S.r.l.", - "purposes": [ - 1, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "http://www.audiens.com/privacy" - }, - "235": { - "id": 235, - "name": "Bucksense Inc", - "purposes": [ - 2, - 3, - 4, - 7, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 7, - 9 - ], - "specialPurposes": [], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://www.bucksense.com/platform-privacy-policy/" - }, - "279": { - "id": 279, - "name": "Mirando GmbH & Co KG", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 7 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://wwwmirando.de/datenschutz/" - }, - "203": { - "id": 203, - "name": "Revcontent, LLC", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6 - ], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://intercom.help/revcontent2/en/articles/2290675-revcontent-s-privacy-policy" - }, - "177": { - "id": 177, - "name": "plista GmbH", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 7, - 8, - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.plista.com/about/privacy/" - }, - "248": { - "id": 248, - "name": "Converge-Digital", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2 - ], - "flexiblePurposes": [ - 2 - ], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "https://converge-digital.com/privacy-policy/", - "overflow": { - "httpGetLimit": 32 - } - }, - "285": { - "id": 285, - "name": "Comcast International France SAS", - "purposes": [ - 1 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.freewheel.com/privacy-policy" - }, - "228": { - "id": 228, - "name": "McCann Discipline LTD", - "purposes": [ - 1, - 2, - 5, - 6, - 7, - 8 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.primis.tech/wp-content/uploads/2020/01/Primis-Privacy-Policy.pdf" - }, - "304": { - "id": 304, - "name": "On Device Research Limited", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://s.on-device.com/privacyPolicy" - }, - "314": { - "id": 314, - "name": "Keymantics", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.keymantics.com/assets/privacy-policy.pdf" - }, - "47": { - "id": 47, - "name": "ADMAN - Phaistos Networks, S.A.", - "purposes": [ - 1, - 2, - 4, - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "http://www.adman.gr/privacy" - }, - "325": { - "id": 325, - "name": "Knorex Pte Ltd", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.knorex.com/privacy" - }, - "318": { - "id": 318, - "name": "Accorp Sp. z o.o.", - "purposes": [ - 1, - 3, - 4, - 9 - ], - "legIntPurposes": [ - 7, - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "http://www.instytut-pollster.pl/privacy-policy/" - }, - "199": { - "id": 199, - "name": "ADUX", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "http://www.adux.com/donnees-personelles/" - }, - "294": { - "id": 294, - "name": "Jivox Corporation", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.jivox.com/privacy" - }, - "302": { - "id": 302, - "name": "Mobile Professionals BV", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 7, - 8, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 3, - 5, - 7, - 8 - ], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://mobpro.com/privacy.html" - }, - "44": { - "id": 44, - "name": "The ADEX GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://theadex.com/privacy-opt-out/" - }, - "262": { - "id": 262, - "name": "Fyber ", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.fyber.com/legal/privacy-policy/" - }, - "328": { - "id": 328, - "name": "Gemius SA", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.gemius.com/cookie-policy.html" - }, - "281": { - "id": 281, - "name": "Wizaly", - "purposes": [ - 1, - 7, - 8, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2 - ], - "specialFeatures": [], - "policyUrl": "https://www.wizaly.com/terms-of-use#privacy-policy" - }, - "303": { - "id": 303, - "name": "Orion Semantics", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "http://static.orion-semantics.com/privacy.html" - }, - "358": { - "id": 358, - "name": "MGID Inc.", - "purposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.mgid.com/privacy-policy" - }, - "371": { - "id": 371, - "name": "Seeding Alliance GmbH", - "purposes": [], - "legIntPurposes": [ - 2, - 7 - ], - "flexiblePurposes": [ - 7 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://seeding-alliance.de/datenschutz" - }, - "350": { - "id": 350, - "name": "Free Stream Media Corp. dba Samba TV", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://samba.tv/legal/privacy-policy/", - "overflow": { - "httpGetLimit": 128 - } - }, - "351": { - "id": 351, - "name": "Samba TV UK Limited", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://samba.tv/legal/privacy-policy/", - "overflow": { - "httpGetLimit": 128 - } - }, - "387": { - "id": 387, - "name": "Triapodi Ltd.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://appreciate.mobi/page.html#/end-user-privacy-policy" - }, - "402": { - "id": 402, - "name": "Effiliation", - "purposes": [ - 1, - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://inter.effiliation.com/politique-confidentialite.html" - }, - "413": { - "id": 413, - "name": "Eulerian Technologies", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.eulerian.com/en/privacy/" - }, - "415": { - "id": 415, - "name": "Seenthis AB", - "purposes": [], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "https://seenthis.co/privacy-notice-2018-04-18.pdf" - }, - "422": { - "id": 422, - "name": "Brand Metrics Sweden AB", - "purposes": [ - 1, - 6, - 7, - 8, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://collector.brandmetrics.com/brandmetrics_privacypolicy.pdf" - }, - "243": { - "id": 243, - "name": "Cloud Technologies S.A.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.cloudtechnologies.pl/en/internet-advertising-privacy-policy" - }, - "436": { - "id": 436, - "name": "INVIBES GROUP", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 9, - 10 - ], - "legIntPurposes": [ - 7, - 8 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "http://www.invibes.com/terms" - }, - "429": { - "id": 429, - "name": "Signals", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://signalsdata.com/platform-cookie-policy/" - }, - "450": { - "id": 450, - "name": "Neodata Group srl", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.neodatagroup.com/en/security-policy", - "overflow": { - "httpGetLimit": 32 - } - }, - "447": { - "id": 447, - "name": "Adludio Ltd", - "purposes": [ - 2, - 3, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.adludio.com/privacy-policy/" - }, - "466": { - "id": 466, - "name": "TACTIC\u2122 Real-Time Marketing AS", - "purposes": [], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://tacticrealtime.com/privacy/" - }, - "440": { - "id": 440, - "name": "DEFINE MEDIA GMBH", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 4, - 9, - 10 - ], - "flexiblePurposes": [ - 4 - ], - "specialPurposes": [ - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "http://www.definemedia.de/datenschutz-conative/" - }, - "486": { - "id": 486, - "name": "Madington", - "purposes": [], - "legIntPurposes": [ - 7, - 8, - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "https://delivered-by-madington.com/dat-privacy-policy/" - }, - "495": { - "id": 495, - "name": "Arcspire Limited", - "purposes": [ - 2, - 3, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://public.arcspire.io/docs/ARCSPIRE-PrivacyPolicy_v1.0.pdf", - "overflow": { - "httpGetLimit": 128 - } - }, - "424": { - "id": 424, - "name": "KUPONA GmbH", - "purposes": [ - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.kupona.de/dsgvo/" - }, - "467": { - "id": 467, - "name": "Haensel AMS GmbH", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 7 - ], - "flexiblePurposes": [ - 7 - ], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "https://haensel-ams.com/data-privacy/" - }, - "490": { - "id": 490, - "name": "PLAYGROUND XYZ EMEA LTD", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 7 - ], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://playground.xyz/privacy" - }, - "491": { - "id": 491, - "name": "Triboo Data Analytics", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.shinystat.com/it/informativa_sito.html" - }, - "502": { - "id": 502, - "name": "NEXD", - "purposes": [ - 7, - 10 - ], - "legIntPurposes": [ - 9 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://nexd.com/privacy-policy", - "overflow": { - "httpGetLimit": 128 - } - }, - "512": { - "id": 512, - "name": "PubNative GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 8, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [ - 2 - ], - "policyUrl": "https://pubnative.net/privacy-notice/" - }, - "516": { - "id": 516, - "name": "Pexi B.V.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://pexi.nl/privacy-policy/" - }, - "507": { - "id": 507, - "name": "AdsWizz Inc.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.adswizz.com/our-privacy-policy/" - }, - "524": { - "id": 524, - "name": "The Ozone Project Limited", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://ozoneproject.com/privacy-policy" - }, - "535": { - "id": 535, - "name": "INNITY", - "purposes": [ - 1, - 2, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2 - ], - "specialFeatures": [], - "policyUrl": "https://www.innity.com/privacy-policy.php" - }, - "543": { - "id": 543, - "name": "PaperG, Inc. dba Thunder Industries", - "purposes": [ - 1, - 3, - 4, - 5, - 6 - ], - "legIntPurposes": [ - 2, - 7, - 8 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.makethunder.com/privacy" - }, - "546": { - "id": 546, - "name": "Smart Traffik", - "purposes": [ - 1, - 8 - ], - "legIntPurposes": [ - 7 - ], - "flexiblePurposes": [ - 7, - 8 - ], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://smart-traffik.io/politique-de-confidentialite" - }, - "439": { - "id": 439, - "name": "Bit Q Holdings Limited", - "purposes": [ - 1, - 7, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.rippll.com/privacy" - }, - "553": { - "id": 553, - "name": "Adhese", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://adhese.com/privacy-and-cookie-policy" - }, - "556": { - "id": 556, - "name": "adhood.com", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://v3.adhood.com/en/site/politikavekurallar/gizlilik.php?lang=en" - }, - "550": { - "id": 550, - "name": "Happydemics", - "purposes": [ - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.iubenda.com/privacy-policy/69056167/full-legal" - }, - "554": { - "id": 554, - "name": "RMSi Radio Marketing Service interactive GmbH", - "purposes": [ - 1, - 3, - 4 - ], - "legIntPurposes": [ - 2, - 7, - 9 - ], - "flexiblePurposes": [ - 2 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.rms.de/datenschutz/" - }, - "498": { - "id": 498, - "name": "Dr. Banner", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ], - "legIntPurposes": [ - 9, - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://drbanner.com/privacypolicy_en/" - }, - "571": { - "id": 571, - "name": "ViewPay", - "purposes": [ - 1, - 2, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "http://viewpay.tv/mentions-legales/" - }, - "568": { - "id": 568, - "name": "Jointag S.r.l.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.jointag.com/privacy/kariboo/publisher/third/" - }, - "587": { - "id": 587, - "name": "Localsensor B.V.", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.localsensor.com/privacy.html" - }, - "593": { - "id": 593, - "name": "Programatica de publicidad S.L.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://datmean.com/politica-privacidad/" - }, - "612": { - "id": 612, - "name": "Adnami Aps", - "purposes": [ - 1 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.adnami.io/privacy" - }, - "607": { - "id": 607, - "name": "ucfunnel Co., Ltd.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.ucfunnel.com/privacy-policy" - }, - "609": { - "id": 609, - "name": "Predicio", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "http://www.predic.io/privacy", - "overflow": { - "httpGetLimit": 128 - } - }, - "618": { - "id": 618, - "name": "BEINTOO SPA", - "purposes": [ - 1, - 2, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://www.beintoo.com/privacy-cookie-policy/" - }, - "628": { - "id": 628, - "name": ": Tappx", - "purposes": [ - 1, - 2, - 4, - 7, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 2 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.tappx.com/en/privacy-policy/" - }, - "626": { - "id": 626, - "name": "Hivestack Inc.", - "purposes": [ - 1, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://hivestack.com/privacy-policy" - }, - "653": { - "id": 653, - "name": "Smartme Analytics", - "purposes": [ - 7, - 8, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 3 - ], - "specialFeatures": [], - "policyUrl": "http://smartmeapp.com/info/smartme/aviso_legal.php" - }, - "613": { - "id": 613, - "name": "Adserve.zone / Artworx AS", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 7 - ], - "flexiblePurposes": [ - 2 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "http://adserve.zone/adserveprivacypolicy.html" - }, - "652": { - "id": 652, - "name": "Skaze", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://www.skaze.fr/rgpd/" - }, - "648": { - "id": 648, - "name": "TrueData Solutions, Inc.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.truedata.co/privacy-policy/" - }, - "659": { - "id": 659, - "name": "Research and Analysis of Media in Sweden AB", - "purposes": [], - "legIntPurposes": [ - 7, - 8, - 9 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "https://www2.rampanel.com/privacy-policy/" - }, - "656": { - "id": 656, - "name": "Think Clever Media", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 9 - ], - "legIntPurposes": [ - 7, - 8, - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.contentignite.com/privacy-policy/" - }, - "657": { - "id": 657, - "name": "GP One GmbH", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 3, - 4 - ], - "flexiblePurposes": [ - 2, - 3, - 4 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.gsi-one.org/de/privacy-policy.html" - }, - "665": { - "id": 665, - "name": "Digital East GmbH", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.digitaleast.mobi/en/legal/privacy-policy/" - }, - "668": { - "id": 668, - "name": "WhatRocks Inc. ", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.whatrocks.co/en/privacy-policy " - }, - "676": { - "id": 676, - "name": "BusinessClick", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.businessclick.com/documents/RegulaminProgramuBusinessClick-2019.pdf" - }, - "684": { - "id": 684, - "name": "Blue Billywig BV", - "purposes": [], - "legIntPurposes": [ - 7 - ], - "flexiblePurposes": [ - 7 - ], - "specialPurposes": [ - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.bluebillywig.com/privacy-statement/" - }, - "686": { - "id": 686, - "name": "The MediaGrid Inc.", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2 - ], - "specialFeatures": [], - "policyUrl": "https://www.themediagrid.com/privacy-policy/" - }, - "687": { - "id": 687, - "name": "MISSENA", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2 - ], - "specialPurposes": [ - 2 - ], - "features": [], - "specialFeatures": [], - "policyUrl": "http://missena.com/confidentialite/" - }, - "690": { - "id": 690, - "name": "Go.pl sp. z o.o.", - "purposes": [ - 1, - 2, - 3, - 4 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://go.pl/polityka-prywatnosci/" - }, - "691": { - "id": 691, - "name": "Lifesight Pte. Ltd.", - "purposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.lifesight.io/privacy-policy/" - }, - "699": { - "id": 699, - "name": "HyperTV Inc.", - "purposes": [ - 1, - 2, - 4, - 9 - ], - "legIntPurposes": [ - 7, - 10 - ], - "flexiblePurposes": [], - "specialPurposes": [ - 2 - ], - "features": [ - 1 - ], - "specialFeatures": [], - "policyUrl": "https://www.hypertvx.com/privacy/" - }, - "703": { - "id": 703, - "name": "MindTake Research GmbH", - "purposes": [ - 1, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1 - ], - "features": [ - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.mindtake.com/en/reppublika-privacy-policy" - }, - "681": { - "id": 681, - "name": "MyTraffic", - "purposes": [ - 1, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 9 - ], - "specialPurposes": [], - "features": [], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.mytraffic.io/en/privacy" - }, - "711": { - "id": 711, - "name": "SITU8ED SA", - "purposes": [ - 1, - 3, - 4, - 5, - 6, - 7, - 8, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.situ8ed.com/privacy-policy/" - }, - "712": { - "id": 712, - "name": "Inspired Mobile Limited", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://byinspired.com/privacypolicy.pdf" - }, - "688": { - "id": 688, - "name": "Effinity", - "purposes": [], - "legIntPurposes": [ - 2 - ], - "flexiblePurposes": [ - 2, - 7 - ], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.effiliation.com/politique-de-confidentialite/", - "overflow": { - "httpGetLimit": 128 - } - }, - "702": { - "id": 702, - "name": "Kwanko", - "purposes": [ - 1, - 2, - 7, - 8 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 7, - 8 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.kwanko.com/fr/rgpd/" - }, - "714": { - "id": 714, - "name": "Survata Inc.", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 7, - 9 - ], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://www.survata.com/respondent-privacy-policy/", - "overflow": { - "httpGetLimit": 128 - } - }, - "713": { - "id": 713, - "name": "Dataseat Ltd", - "purposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 7, - 8 - ], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "https://dataseat.com/privacy-policy" - }, - "716": { - "id": 716, - "name": "OnAudience Ltd", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.onaudience.com/internet-advertising-privacy-policy" - }, - "708": { - "id": 708, - "name": "Dugout Limited ", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://dugout.com/privacy-policy" - }, - "694": { - "id": 694, - "name": "Snapupp Technologies SL", - "purposes": [ - 2, - 3, - 4, - 5, - 6, - 9 - ], - "legIntPurposes": [ - 7, - 8, - 10 - ], - "flexiblePurposes": [ - 10 - ], - "specialPurposes": [], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "https://www.enterprise.noddus.com/privacy-policy", - "overflow": { - "httpGetLimit": 128 - } - }, - "683": { - "id": 683, - "name": "Cookie Market LTD", - "purposes": [ - 1, - 3, - 4, - 9 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "http://cookie.market/privacyPolicy.php" - }, - "720": { - "id": 720, - "name": "AAX LLC", - "purposes": [ - 1, - 3, - 4 - ], - "legIntPurposes": [ - 2, - 7 - ], - "flexiblePurposes": [ - 3, - 4, - 7 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 3 - ], - "specialFeatures": [], - "policyUrl": "https://aax.media/privacy/", - "overflow": { - "httpGetLimit": 32 - } - }, - "719": { - "id": 719, - "name": "Online Advertising Network Sp. z o.o.", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 2, - 3 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://www.oan.pl/en/privacy-policy" - }, - "707": { - "id": 707, - "name": "Dentsu Aegis Network Italia SpA", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 1, - 2 - ], - "policyUrl": "https://www.dentsuaegisnetwork.com/it/it/policies/info-cookie" - }, - "726": { - "id": 726, - "name": "YouGov", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [ - 2, - 3, - 4, - 7, - 8, - 9, - 10 - ], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "https://yougov.co.uk/about/terms-combined/#/privacy" - }, - "729": { - "id": 729, - "name": "Cavai AS & UK ", - "purposes": [], - "legIntPurposes": [ - 7, - 8 - ], - "flexiblePurposes": [ - 7, - 8 - ], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://cav.ai/privacy-policy/" - }, - "722": { - "id": 722, - "name": "agof services gmbh", - "purposes": [], - "legIntPurposes": [ - 3, - 5, - 7, - 8, - 9, - 10 - ], - "flexiblePurposes": [ - 5, - 8, - 9, - 10 - ], - "specialPurposes": [ - 1 - ], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [ - 2 - ], - "policyUrl": "http://www.agof.de/datenschutz/" - }, - "723": { - "id": 723, - "name": "Adzymic Pte Ltd", - "purposes": [ - 1, - 2, - 3, - 4, - 7, - 8 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 2 - ], - "specialFeatures": [], - "policyUrl": "http://www.adzymic.co/privacy", - "overflow": { - "httpGetLimit": 128 - } - }, - "725": { - "id": 725, - "name": "Pubfinity LLC", - "purposes": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://pubfinity.com/privacy-policy/", - "overflow": { - "httpGetLimit": 128 - } - }, - "733": { - "id": 733, - "name": "Anzu Virtual reality LTD", - "purposes": [ - 1, - 2, - 4, - 7, - 9, - 10 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [ - 1, - 2 - ], - "specialFeatures": [ - 1 - ], - "policyUrl": "https://anzu.io/privacy/" - }, - "737": { - "id": 737, - "name": "Monet Engine Inc", - "purposes": [ - 1, - 2, - 7 - ], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [], - "specialFeatures": [], - "policyUrl": "https://appmonet.com/privacy-policy/" - }, - "740": { - "id": 740, - "name": "6Sense Insights, Inc.", - "purposes": [ - 1 - ], - "legIntPurposes": [ - 2, - 3, - 4, - 5, - 7, - 8, - 10 - ], - "flexiblePurposes": [ - 2, - 3, - 4, - 5, - 7, - 8, - 10 - ], - "specialPurposes": [], - "features": [ - 1, - 2, - 3 - ], - "specialFeatures": [], - "policyUrl": "https://6sense.com/privacy-policy/", - "overflow": { - "httpGetLimit": 128 - } - }, - "744": { - "id": 744, - "name": "Vidazoo Ltd", - "purposes": [ - 3, - 4 - ], - "legIntPurposes": [ - 2, - 7, - 8, - 10 - ], - "flexiblePurposes": [ - 3, - 4 - ], - "specialPurposes": [ - 1, - 2 - ], - "features": [ - 2 - ], - "specialFeatures": [ - 2 - ], - "policyUrl": "https://vidazoo.gitbook.io/vidazoo-legal/privacy-policy", - "overflow": { - "httpGetLimit": 128 - } - } - } -} From 1792a801bd81d0ace7fdf5625153898e1f1b0255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 11:38:26 +0100 Subject: [PATCH 195/540] reverted translations --- src/lib/translations.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/lib/translations.js b/src/lib/translations.js index 28717a95..52cc08d2 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -9,50 +9,50 @@ export default { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', description: `

    Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    - +

    Zgoda

    - +

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    - +

    Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    - +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    - +

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    Administrator danych osobowych

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    - +

    Podstawa i cel przetwarzania

    - +

    Twoje dane przetwarzamy w następujących celach:


      - +
    • 1. Jeśli zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. Gdy zakładasz konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tego nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. Niepodanie takich danych uniemożliwi nam zawarcie i wykonanie umowy.
    • - +
    • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
    • - +
    • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
    - +

    Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania, czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy, przez czas jej wykonywania i ewentualnie okres przedawnienia roszczeń z niej (zwykle nie więcej niż 3 lata, a maksymalnie 6 lat), a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora, do czasu zgłoszenia przez Ciebie skutecznego sprzeciwu.

    - +

    Przekazywanie danych

    - +

    Administratorzy danych mogą powierzać Twoje dane podwykonawcom IT, księgowym, agencjom marketingowym etc. Zrobią to jedynie w niezbędnym zakresie i na podstawie umowy o powierzenie przetwarzania danych zobowiązującej taki podmiot do odpowiedniego zabezpieczenia danych i niekorzystania z nich do własnych celów.

    - +

    Cookies

    - +

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    - - + +

    Twoje uprawnienia

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    From 87ba9d71fd031235af6177a2988e3c05f06ae18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 11:48:11 +0100 Subject: [PATCH 196/540] iab libs update --- package-lock.json | 154 ++++++++++++++++++++++++---------------------- package.json | 4 +- 2 files changed, 82 insertions(+), 76 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b89a3ce..f447a6cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -190,31 +190,31 @@ } }, "@iabtcf/cmpapi": { - "version": "1.0.0-beta.8", - "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.8.tgz", - "integrity": "sha512-+iNRFy7DeneFyj0J0zNMOdo5F8T5uYjBTcfEh/5ICiFUXkwBcANcsbMfCHb3T+bd/kuOvCGJsyhd9VqvbynXtg==", + "version": "1.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.13.tgz", + "integrity": "sha512-5vm9Ggg5yHaDR5nWjxdtm8R6NAYbJa7sOeoyHJRpmy+7ETYG2hNRaZLCr2TjYdyI/vmdDl6w6h6dJwYj2fr+dw==", "requires": { - "@iabtcf/core": "1.0.0-beta.8", - "@iabtcf/util": "1.0.0-beta.8" + "@iabtcf/core": "1.0.0-beta.13", + "@iabtcf/util": "1.0.0-beta.13" } }, "@iabtcf/core": { - "version": "1.0.0-beta.8", - "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.8.tgz", - "integrity": "sha512-RSf3K0OlOu0DRulJ7ES+iyrzJqqCqlwGjfbuB6U3PP5uZfDkO0MMc7zNdhnX7IvV0aMv7uOnAsdKlL7crHPYwA==", + "version": "1.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.13.tgz", + "integrity": "sha512-hTQY++O6gr3N3qsxnbnL9DLySbuczIG2wGWf3SgLNtwp3/XTSwHLBXJ7YO5JrROFCyH1HdJGMtIPYJ2u4u7edg==", "requires": { - "@iabtcf/util": "1.0.0-beta.8" + "@iabtcf/util": "1.0.0-beta.13" } }, "@iabtcf/util": { - "version": "1.0.0-beta.8", - "resolved": "https://registry.npmjs.org/@iabtcf/util/-/util-1.0.0-beta.8.tgz", - "integrity": "sha512-REShVRoTKHzD0Q2hB8sFkvrCta1HMtnFAda/eE1dvMXRLWUw2TG9fcIyDaoSGXrQ8XDwtNA/h8fPpcGeNjsyfA==" + "version": "1.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@iabtcf/util/-/util-1.0.0-beta.13.tgz", + "integrity": "sha512-9VFrE4vo9JPwv/6bYQLz0AcNDvjTLBuFJcBokdETkiHE933MAYNOdacRhupp0usvuDvXTlTQbKOEFWnqigZcTQ==" }, "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -2579,15 +2579,15 @@ } }, "caniuse-db": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001028.tgz", - "integrity": "sha512-GftV9qo57Glfh93TvXeLjQ74ubAwh1oicEKJMq3HAuavmcwfhpUJNQ7g8aqjUGCjJ3anpizh/ok1wr4oL9PIVA==", + "version": "1.0.30001031", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001031.tgz", + "integrity": "sha512-tIRT8VWRiZ+lSwe5qEOBCAUsXmTqaZk7Tkec1ooSSfgvVkZrtfw0jfOV5r2Of8sA3VtDkpY+dJXQpTGg8n9zEA==", "dev": true }, "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", + "version": "1.0.30001031", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001031.tgz", + "integrity": "sha512-DpAP5a1NGRLgYfaNCaXIRyGARi+3tJA2quZXNNA1Du26VyVkqvy2tznNu5ANyN1Y5aX44QDotZSVSUSi2uMGjg==", "dev": true }, "capture-exit": { @@ -2994,9 +2994,9 @@ "dev": true }, "codemirror": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.51.0.tgz", - "integrity": "sha512-vyuYYRv3eXL0SCuZA4spRFlKNzQAewHcipRQCOKgRy7VNAvZxTKzbItdbCl4S5AgPZ5g3WkHp+ibWQwv9TLG7Q==" + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.52.0.tgz", + "integrity": "sha512-K2UB6zjscrfME03HeRe/IuOmCeqNpw7PLKGHThYpLbZEuKf+ZoujJPhxZN4hHJS1O7QyzEsV7JJZGxuQWVaFCg==" }, "collection-visit": { "version": "1.0.0", @@ -4172,9 +4172,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.354", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.354.tgz", - "integrity": "sha512-24YMkNiZWOUeF6YeoscWfIGP0oMx+lJpU/miwI+lcu7plIDpyZn8Gx0lx0qTDlzGoz7hx+lpyD8QkbkX5L2Pqw==", + "version": "1.3.364", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.364.tgz", + "integrity": "sha512-V6hyxQ9jzt6Jy6w8tAv4HHKhIaVS6psG/gmwtQ+2+itdkWMHJLHJ4m1sFep/fWkdKvfJcPXuywfnECRzfNa7gw==", "dev": true }, "elliptic": { @@ -4193,9 +4193,9 @@ } }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, "encodeurl": { @@ -4976,9 +4976,9 @@ }, "dependencies": { "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5952,9 +5952,9 @@ }, "dependencies": { "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -6146,9 +6146,9 @@ } }, "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "hpack.js": { @@ -6262,6 +6262,12 @@ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", @@ -6903,9 +6909,9 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, "is-absolute-url": { @@ -8056,9 +8062,9 @@ } }, "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, "killable": { @@ -8190,13 +8196,13 @@ "dev": true }, "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", + "emojis-list": "^3.0.0", "json5": "^1.0.1" }, "dependencies": { @@ -10330,9 +10336,9 @@ }, "dependencies": { "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -12003,13 +12009,13 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, "prr": { @@ -12189,9 +12195,9 @@ }, "dependencies": { "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -12255,9 +12261,9 @@ "integrity": "sha512-tC0n9CHgrQYc976pUlKOaVJYEHAAYTVMers04gNy6jbkFf4rbPlw72y7bbOAfkHHvu6COG5S629Fek30bvHe8w==" }, "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", + "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==" }, "react-router": { "version": "4.3.1", @@ -13070,9 +13076,9 @@ "dev": true }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "dev": true, "requires": { "is-promise": "^2.1.0" @@ -14337,9 +14343,9 @@ }, "dependencies": { "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14620,9 +14626,9 @@ "dev": true }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, "tty-browserify": { @@ -15118,9 +15124,9 @@ }, "dependencies": { "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", diff --git a/package.json b/package.json index 49cb8c22..26ed55b0 100644 --- a/package.json +++ b/package.json @@ -90,8 +90,8 @@ "webpack-dev-server": "^2.4.4" }, "dependencies": { - "@iabtcf/cmpapi": "^1.0.0-beta.8", - "@iabtcf/core": "^1.0.0-beta.8", + "@iabtcf/cmpapi": "^1.0.0-beta.13", + "@iabtcf/core": "^1.0.0-beta.13", "classnames": "^2.2.5", "codemirror": "^5.34.0", "core-js": "^2.5.3", From 7a08c55d3f30132255f9af59ee89987995e791e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 11:52:45 +0100 Subject: [PATCH 197/540] reverted keys from iab vendor list --- src/components/popup/details/details.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 2f0e78ca..a973e542 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -30,18 +30,17 @@ export default class Details extends Component { filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [] } = {}) => { return this.getVendors().filter(vendor => { - if (isCustom !== null && (isCustom && vendor.external_id || !isCustom && !vendor.external_id)) { return false; } - const vendorPurposeIds = new Set([...(vendor.purposes || []), ...(vendor.legIntPurposes || [])]); + const vendorPurposeIds = new Set([...(vendor.purposeIds || []), ...(vendor.legIntPurposeIds || [])]); if (!purposeIds.every(purposeId => vendorPurposeIds.has(purposeId))) { return false; } - const vendorFeatureIds = new Set(vendor.features || []); + const vendorFeatureIds = new Set(vendor.featureIds || []); if (!featureIds.every(featureId => vendorFeatureIds.has(featureId))) { return false; } From f5f4013e907bfacf4b3ba02fcfb71a12c3f950c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 11:54:10 +0100 Subject: [PATCH 198/540] removed blank line --- src/components/popup/details/details.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index a973e542..8891b9a3 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -35,7 +35,6 @@ export default class Details extends Component { } const vendorPurposeIds = new Set([...(vendor.purposeIds || []), ...(vendor.legIntPurposeIds || [])]); - if (!purposeIds.every(purposeId => vendorPurposeIds.has(purposeId))) { return false; } From 30786157fed0a8444e36e9f9bff79dac4ffa391e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 11:56:44 +0100 Subject: [PATCH 199/540] imports --- src/complete.js | 2 +- src/lib/init.js | 18 ++---------------- src/lib/store.js | 3 +-- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/complete.js b/src/complete.js index b73755c7..145053aa 100644 --- a/src/complete.js +++ b/src/complete.js @@ -8,7 +8,7 @@ import log from './lib/log'; import { init } from './lib/init'; import { CMP_GLOBAL_NAME } from "./lib/cmp"; import configuration from "./lib/config"; -import {TCString} from "@iabtcf/core"; +import { TCString } from "@iabtcf/core"; function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion} = {}, {created, vendorListVersion, policyVersion: consentPolicyVersion} = {}) { if (!created) { diff --git a/src/lib/init.js b/src/lib/init.js index fd318652..3c32e624 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -2,8 +2,8 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; import Cmp, { CMP_GLOBAL_NAME } from './cmp'; -import {Vector} from '@iabtcf/core'; -import {CmpApi} from '@iabtcf/cmpapi'; +import { Vector } from '@iabtcf/core'; +import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; import log from './log'; @@ -41,20 +41,6 @@ export function init(configUpdates) { // Fetch the current vendor consent before initializing return ((config.getConsentData) ? readExternalConsentData(config) : readConsentCookie()) .then((consentData) => { - const { vendorConsents = new Vector() } = consentData || {}; - - // console.log(consentData); - // - // // Check config for allowedVendorIds then the pubVendorList - // const {allowedVendorIds: configVendorIds} = config; - // - // const vendorIdsPresentOnList = []; - // vendorConsents && vendorConsents.forEach((hasConsent, vendorId) => { - // vendorIdsPresentOnList.push(vendorId); - // }); - // - // const allowedVendorIds = configVendorIds instanceof Array && configVendorIds.length ? configVendorIds : vendorIdsPresentOnList; - const cmpApi = new CmpApi(CMP_ID, CMP_VERSION); // Initialize the store with all of our consent data diff --git a/src/lib/store.js b/src/lib/store.js index f198a580..b0c08547 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -2,8 +2,7 @@ import { writeConsentCookie } from "./cookie/cookie"; import config from './config'; import { findLocale } from './localize'; import log from './log'; -import {TCString, Vector, GVL, TCModel} from '@iabtcf/core'; -const arrayFrom = require('core-js/library/fn/array/from'); +import { TCString, Vector, GVL, TCModel } from '@iabtcf/core'; export const SECTION_INTRO = 0; export const SECTION_DETAILS = 1; From aea533a39beaddcfe0ba57be35c33e111fc2347f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 11:58:09 +0100 Subject: [PATCH 200/540] removed vendorList from object destruct --- src/lib/store.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/store.js b/src/lib/store.js index b0c08547..d6207163 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -32,7 +32,6 @@ export default class Store { cmpVersion = 2, cookieVersion = 2, consentData, - vendorList, cmpApi } = {}) { // Keep track of data that has already been persisted From f0a6923439b889cf5b55e8a23150c53614058868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 12:00:46 +0100 Subject: [PATCH 201/540] removed unnecesary imports --- src/lib/init.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/init.js b/src/lib/init.js index 3c32e624..3923685e 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -2,7 +2,6 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; import Cmp, { CMP_GLOBAL_NAME } from './cmp'; -import { Vector } from '@iabtcf/core'; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; From 9e32ec69ac8a0ae89dc4dc959cae5a1e649750c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 14:29:14 +0100 Subject: [PATCH 202/540] naming consistency after version update --- src/complete.js | 2 +- src/components/popup/details/details.jsx | 12 +-- .../popup/details/purposes/purposes.jsx | 4 +- src/components/popup/popup.jsx | 6 +- src/lib/store.js | 87 ++++++++++--------- 5 files changed, 56 insertions(+), 55 deletions(-) diff --git a/src/complete.js b/src/complete.js index 145053aa..652f841b 100644 --- a/src/complete.js +++ b/src/complete.js @@ -20,7 +20,7 @@ function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: li log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); configuration.autoDisplay && cmp('showConsentTool'); } else if (consentPolicyVersion !== listPolicyVersion) { - log.debug(`Consent found for policy ${consentPolicyVersion}, but received vendor list with policy ${policyVersion}. Showing consent tool`); + log.debug(`Consent found for policy ${consentPolicyVersion}, but received vendor list with policy ${consentPolicyVersion}. Showing consent tool`); configuration.autoDisplay && cmp('showConsentTool'); } else { log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 8891b9a3..1e727c51 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -76,15 +76,15 @@ export default class Details extends Component { tcModel, selectPurpose, - selectPurposeLegitimateInterest, + selectPurposeLegitimateInterests, selectSpecialFeature, selectVendors, selectVendor, - selectVendorLegitimateInterest, + selectVendorLegitimateInterests, initialVendorsRejection, selectPublisherPurpose, - selectPublisherLegitimateInterest, + selectPublisherLegitimateInterests, persistedConsentData = {}, subsection @@ -123,11 +123,11 @@ export default class Details extends Component { selectedPublisherPurposeIds={publisherConsents} selectedPublisherCustomPurposeIds={publisherCustomConsents} selectPurpose={selectPurpose} - selectPurposeLegitimateInterest={selectPurposeLegitimateInterest} + selectPurposeLegitimateInterests={selectPurposeLegitimateInterests} selectSpecialFeature={selectSpecialFeature} initialVendorsRejection={initialVendorsRejection} selectPublisherPurpose={selectPublisherPurpose} - selectPublisherLegitimateInterest={selectPublisherLegitimateInterest} + selectPublisherLegitimateInterests={selectPublisherLegitimateInterests} onShowVendors={this.handleShowVendors} persistedConsentData={persistedConsentData} /> @@ -135,7 +135,7 @@ export default class Details extends Component { selectedVendorIds={vendorConsents} selectVendors={selectVendors} selectVendor={selectVendor} - selectVendorLegitimateInterest={selectVendorLegitimateInterest} + selectVendorLegitimateInterests={selectVendorLegitimateInterests} initialVendorsRejection={initialVendorsRejection} vendors={state.vendors} purposes={Object.values(purposes)} diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 23103241..6a473545 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -41,7 +41,7 @@ export default class Purposes extends Component { handleSelectPurpose = ({isSelected, dataId}, isPublisher = false, isLegInt = false) => { const { selectPurpose, - selectPurposeLegitimateInterest, + selectPurposeLegitimateInterests, selectPublisherPurpose, selectPublisherCustomPurpose } = this.props; @@ -56,7 +56,7 @@ export default class Purposes extends Component { selectPublisherPurpose(selectedPurpose.id, isSelected); } else { if (isLegInt) { - selectPurposeLegitimateInterest(selectedPurpose.id, isSelected); + selectPurposeLegitimateInterests(selectedPurpose.id, isSelected); } else { selectPurpose(selectedPurpose.id, isSelected); } diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index 7cc22fa0..290bc835 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -9,10 +9,10 @@ export default class Popup extends Component { onAcceptAll = () => { const { store, onSave } = this.props; store.selectAllVendors(true); - store.selectAllVendorsLegitimateInterest(true); + store.selectAllVendorLegitimateInterests(true); store.selectAllPurposes(true); - store.selectAllPurposesLegitimateInterest(true); - store.selectAllSpecialFeaturesOptIns(true); + store.selectAllPurposesLegitimateInterests(true); + store.selectAllSpecialFeatureOptIns(true); store.selectAllPublisherPurposes(true); onSave(); }; diff --git a/src/lib/store.js b/src/lib/store.js index d6207163..7deb6305 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -2,7 +2,7 @@ import { writeConsentCookie } from "./cookie/cookie"; import config from './config'; import { findLocale } from './localize'; import log from './log'; -import { TCString, Vector, GVL, TCModel } from '@iabtcf/core'; +import { GVL, TCModel, TCString, Vector } from '@iabtcf/core'; export const SECTION_INTRO = 0; export const SECTION_DETAILS = 1; @@ -86,16 +86,15 @@ export default class Store { vendorListVersion_: vendorListVersion, vendorConsents = new Vector(), purposeConsents = new Vector(), - purposeLegitimateInterest = new Vector(), - vendorLegitimateInterest = new Vector(), + purposeLegitimateInterests = new Vector(), + vendorLegitimateInterests = new Vector(), specialFeatureOptIns = new Vector() - } = persistedConsentData; const {purposes = {}, vendors = {}, specialFeatures={}} = vendorList; const maxVendorId = vendorConsents.maxId; const maxPurposeId = purposeConsents.maxId; - const maxLegIntId = purposeLegitimateInterest.maxId; + const maxLegIntId = purposeLegitimateInterests.maxId; const maxSpecialFeatureOptInsId = specialFeatureOptIns.maxId; // Map requested vendorIds @@ -106,7 +105,7 @@ export default class Store { if (vendorIds && vendorIds.length) { vendorIds.forEach(id => { vendorMap[id] = vendorConsents.has(id); - vendorLegIntMap[id] = vendorLegitimateInterest.has(id); + vendorLegIntMap[id] = vendorLegitimateInterests.has(id); }); } else { // In case the vendor list has not been loaded yet find the highest @@ -118,7 +117,7 @@ export default class Store { // Map all IDs up to the highest vendor ID found for (let i = 1; i <= lastVendorId; i++) { vendorMap[i] = vendorConsents.has(i); - vendorLegIntMap[i] = vendorLegitimateInterest.has(i); + vendorLegIntMap[i] = vendorLegitimateInterests.has(i); } } @@ -139,7 +138,7 @@ export default class Store { const legIntMap = {}; for (let i = 1; i <= lastLegIntId; i++) { - legIntMap[i] = purposeLegitimateInterest.has(i); + legIntMap[i] = purposeLegitimateInterests.has(i); } const lastSpecialFeatureOptInsId = Math.max( @@ -162,10 +161,10 @@ export default class Store { consentLanguage, vendorListVersion, purposeConsents: purposeMap, - purposeLegitimateInterest: legIntMap, + purposeLegitimateInterests: legIntMap, specialFeatureOptIns: specialFeatureOptInsMap, vendorConsents: vendorMap, - vendorLegitimateInterest: vendorLegIntMap + vendorLegitimateInterests: vendorLegIntMap }; }; @@ -186,9 +185,9 @@ export default class Store { cmpId_: cmpId, vendorListVersion_: vendorListVersion, publisherConsents = new Vector(), - publisherLegitimateInterest = new Vector(), + publisherLegitimateInterests = new Vector(), publisherCustomConsents = new Vector(), - publisherCustomLegitimateInterest = new Vector(), + publisherCustomLegitimateInterests = new Vector(), } = persistedConsentData; const {purposes = {}} = vendorList; @@ -196,7 +195,7 @@ export default class Store { let publisherCustomLegIntMap = {}; const maxPersistedPublisherPurposeId = publisherConsents.maxId; - const maxPersistedPublisherLegIntId = publisherLegitimateInterest.maxId; + const maxPersistedPublisherLegIntId = publisherLegitimateInterests.maxId; const lastPublisherPurposeId = Math.max( ...Object.values(purposes).map(({id}) => id), @@ -213,7 +212,7 @@ export default class Store { const publisherLegIntMap= {}; for (let i = 1; i <= lastPublisherLegIntId; i++) { - publisherLegIntMap[i] = publisherLegitimateInterest.has(i); + publisherLegIntMap[i] = publisherLegitimateInterests.has(i); } if (publisherCustomConsents.size) { @@ -229,8 +228,8 @@ export default class Store { } } - if (publisherCustomLegitimateInterest.size) { - const maxPersistedPublisherCustomLegIntId = publisherCustomLegitimateInterest.maxId; + if (publisherCustomLegitimateInterests.size) { + const maxPersistedPublisherCustomLegIntId = publisherCustomLegitimateInterests.maxId; const lastPublisherCustomLegIntId = Math.max( ...Object.values(purposes).map(({id}) => id), @@ -238,7 +237,7 @@ export default class Store { publisherCustomLegIntMap = {}; for (let i = 1; i <= lastPublisherCustomLegIntId; i++) { - publisherCustomLegIntMap[i] = publisherCustomLegitimateInterest.has(i); + publisherCustomLegIntMap[i] = publisherCustomLegitimateInterests.has(i); } } @@ -249,9 +248,9 @@ export default class Store { cmpId, vendorListVersion, publisherConsents: publisherPurposesMap, - publisherLegitimateInterest: publisherLegIntMap, + publisherLegitimateInterests: publisherLegIntMap, publisherCustomConsents: publisherCustomPurposesMap, - publisherCustomLegitimateInterest: publisherCustomLegIntMap + publisherCustomLegitimateInterests: publisherCustomLegIntMap }; }; @@ -381,19 +380,19 @@ export default class Store { this.storeUpdate(); }; - selectVendorLegitimateInterest = (vendorId, isSelected) => { - const {vendorLegitimateInterest} = this.tcModel; + selectVendorLegitimateInterests = (vendorId, isSelected) => { + const {vendorLegitimateInterests} = this.tcModel; if (isSelected) { - vendorLegitimateInterest.set(vendorId); + vendorLegitimateInterests.set(vendorId); } else { - vendorLegitimateInterest.unset(vendorId); + vendorLegitimateInterests.unset(vendorId); } this.storeUpdate(); }; - selectAllVendorsLegitimateInterest = (isSelected) => { - const operation = isSelected ? 'setAllVendorLegitimateInterest' : 'unsetAllVendorLegitimateInterest'; + selectAllVendorLegitimateInterests = (isSelected) => { + const operation = isSelected ? 'setAllVendorLegitimateInterests' : 'unsetAllVendorLegitimateInterests'; this.tcModel[operation](); this.storeUpdate(); }; @@ -424,19 +423,21 @@ export default class Store { this.storeUpdate(); }; - selectPurposeLegitimateInterest = (purposeId, isSelected) => { - const {purposeLegitimateInterest} = this.tcModel; + selectPurposeLegitimateInterests = (purposeId, isSelected) => { + const {purposeLegitimateInterests} = this.tcModel; + console.log(this.tcModel); + console.log(purposeId); if (isSelected) { - purposeLegitimateInterest.set(purposeId); + purposeLegitimateInterests.set(purposeId); } else { - purposeLegitimateInterest.unset(purposeId); + purposeLegitimateInterests.unset(purposeId); } this.storeUpdate(); }; - selectAllPurposesLegitimateInterest = (isSelected) => { - const operation = isSelected ? 'setAllPurposeLegitimateInterest' : 'unsetAllPurposeLegitimateInterest'; + selectAllPurposesLegitimateInterests = (isSelected) => { + const operation = isSelected ? 'setAllPurposeLegitimateInterests' : 'unsetAllPurposeLegitimateInterests'; this.tcModel[operation](); this.storeUpdate(); }; @@ -450,7 +451,7 @@ export default class Store { } }; - selectAllSpecialFeaturesOptIns = (isSelected) => { + selectAllSpecialFeatureOptIns = (isSelected) => { const operation = isSelected ? 'setAllSpecialFeatureOptIns' : 'unsetAllSpecialFeatureOptIns'; this.tcModel[operation](); this.storeUpdate(); @@ -483,13 +484,13 @@ export default class Store { this.storeUpdate(); }; - selectPublisherLegitimateInterest = (purposeId, isSelected) => { - const {publisherLegitimateInterest} = this.tcModel; + selectPublisherLegitimateInterests = (purposeId, isSelected) => { + const {publisherLegitimateInterests} = this.tcModel; if (isSelected) { - publisherLegitimateInterest.set(purposeId); + publisherLegitimateInterests.set(purposeId); } else { - publisherLegitimateInterest.unset(purposeId); + publisherLegitimateInterests.unset(purposeId); } this.storeUpdate(); }; @@ -502,7 +503,7 @@ export default class Store { Object.values(purposes).forEach(({id}) => { if (publisherLegitimateInterests.includes(id)) { - this.tcModel.publisherLegitimateInterest[operation](id) + this.tcModel.publisherLegitimateInterests[operation](id) } }); @@ -554,22 +555,22 @@ export default class Store { created, } = this.persistedConsentData || {}; - const persistedMaxVendorId = this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; - const { vendors = {}, } = vendorList || {}; - const gvl = new GVL(vendorList); - this.tcModel.gvl = gvl; + const persistedMaxVendorId = this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; + + this.tcModel.gvl = new GVL(vendorList); this.vendorList = vendorList; // If vendor and publisher consent data has never been persisted set default selected status if (!created) { this.selectAllPurposes(true); + this.selectAllPurposesLegitimateInterests(true); this.selectAllVendors(true); - this.selectAllVendorsLegitimateInterest(true); - this.selectAllSpecialFeaturesOptIns(true); + this.selectAllVendorLegitimateInterests(true); + this.selectAllSpecialFeatureOptIns(true); this.selectAllPublisherPurposes(true); this.selectAllPublisherLegitimateInterests(true); From 30b3981461c8c435febbbeceef4fe560e07a2bc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 16:23:36 +0100 Subject: [PATCH 203/540] defaults --- src/complete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/complete.js b/src/complete.js index 652f841b..34f82c25 100644 --- a/src/complete.js +++ b/src/complete.js @@ -10,7 +10,7 @@ import { CMP_GLOBAL_NAME } from "./lib/cmp"; import configuration from "./lib/config"; import { TCString } from "@iabtcf/core"; -function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion} = {}, {created, vendorListVersion, policyVersion: consentPolicyVersion} = {}) { +function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion = 1} = {}, {created, vendorListVersion, policyVersion: consentPolicyVersion = 1} = {}) { if (!created) { log.debug('No consent data found. Showing consent tool'); configuration.autoDisplay && cmp('showConsentTool'); From 2932353f30b940bce0cdd45cbd2f690ff51db2f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 2 Mar 2020 17:28:09 +0100 Subject: [PATCH 204/540] removed complete.js --- src/complete.js | 126 ---------------------------------------- src/lib/init.js | 62 ++++++++++++++++++++ webpack.config.babel.js | 1 - 3 files changed, 62 insertions(+), 127 deletions(-) delete mode 100644 src/complete.js diff --git a/src/complete.js b/src/complete.js deleted file mode 100644 index 34f82c25..00000000 --- a/src/complete.js +++ /dev/null @@ -1,126 +0,0 @@ -import 'core-js/fn/array/reduce'; -import 'core-js/fn/array/fill'; -import 'core-js/fn/array/map'; -import 'core-js/fn/array/for-each'; -import 'core-js/fn/array/filter'; -import 'core-js/fn/set'; -import log from './lib/log'; -import { init } from './lib/init'; -import { CMP_GLOBAL_NAME } from "./lib/cmp"; -import configuration from "./lib/config"; -import { TCString } from "@iabtcf/core"; - -function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion = 1} = {}, {created, vendorListVersion, policyVersion: consentPolicyVersion = 1} = {}) { - if (!created) { - log.debug('No consent data found. Showing consent tool'); - configuration.autoDisplay && cmp('showConsentTool'); - } else if (!listVersion) { - log.debug('Could not determine vendor list version. Not showing consent tool'); - } else if (vendorListVersion !== listVersion) { - log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); - configuration.autoDisplay && cmp('showConsentTool'); - } else if (consentPolicyVersion !== listPolicyVersion) { - log.debug(`Consent found for policy ${consentPolicyVersion}, but received vendor list with policy ${consentPolicyVersion}. Showing consent tool`); - configuration.autoDisplay && cmp('showConsentTool'); - } else { - log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); - !isConsentToolShowing && configuration.autoDisplay && cmp('showFooter'); - } -} - -function checkConsent(cmp, store) { - if (!cmp) { - log.error('CMP failed to load'); - } - else if (!window.navigator.cookieEnabled) { - log.warn('Cookies are disabled. Ignoring CMP consent check'); - } - else { - __tcfapi('getVendorList', 2, (vendorList, success) => { - if (success) { - const timeout = setTimeout(() => { - handleConsentResult(cmp, store, vendorList); - }, 100); - - __tcfapi('getTCData', 2, (tcData, success) => { - if (success) { - let tcStringDecoded; - - try { - tcStringDecoded = TCString.decode(tcData.tcString); - } catch (e) { - // error ocurred during decoding TCString - } finally { - clearTimeout(timeout); - handleConsentResult(cmp, store, vendorList, tcStringDecoded) - } - } - }) - } - }); - } -} - -// Preserve any config options already set -const {config} = window[CMP_GLOBAL_NAME] || {}; -const configUpdates = { - globalConsentLocation: 'https://rasp.mgr.consensu.org/portal.html', - ...config -}; - -// Add locator frame -function addLocatorFrame() { - if (!window.frames['__cmpLocator']) { - if (document.body) { - const frame = document.createElement('iframe'); - frame.style.display = 'none'; - frame.name = '__cmpLocator'; - document.body.appendChild(frame); - } - else { - setTimeout(addLocatorFrame, 5); - } - } -} - -addLocatorFrame(); - -// Add stub -const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; -const cmp = function (command, parameter, callback) { - commandQueue.push({ - command, - parameter, - callback - }); -}; -cmp.commandQueue = commandQueue; -cmp.receiveMessage = function (event) { - const data = event && event.data && event.data.__cmpCall; - if (data) { - const {callId, command, parameter} = data; - commandQueue.push({ - callId, - command, - parameter, - event - }); - } -}; - -window.__cmp = cmp; - -// Listen for postMessage events -function listen(type, listener, useCapture) { - if (window.addEventListener) { - window.addEventListener(type, listener, useCapture); - } else if (window.attachEvent) { - window.attachEvent('on' + type, listener); - } -} -listen('message', event => { - window.__cmp.receiveMessage(event); -}, false); - -// Initialize CMP and then check if we need to ask for consent -init(configUpdates).then((store) => checkConsent(window.__cmp, store)); diff --git a/src/lib/init.js b/src/lib/init.js index 3923685e..69097a1d 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -2,6 +2,7 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; import Cmp, { CMP_GLOBAL_NAME } from './cmp'; +import { TCString } from "@iabtcf/core"; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; @@ -13,6 +14,57 @@ const CMP_VERSION = 2; const CMP_ID = 280; const COOKIE_VERSION = 2; +function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion = 1} = {}, {created, vendorListVersion, policyVersion: consentPolicyVersion = 1} = {}) { + if (!created) { + log.debug('No consent data found. Showing consent tool'); + config.autoDisplay && cmp('showConsentTool'); + } else if (!listVersion) { + log.debug('Could not determine vendor list version. Not showing consent tool'); + } else if (vendorListVersion !== listVersion) { + log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); + config.autoDisplay && cmp('showConsentTool'); + } else if (consentPolicyVersion !== listPolicyVersion) { + log.debug(`Consent found for policy ${consentPolicyVersion}, but received vendor list with policy ${consentPolicyVersion}. Showing consent tool`); + config.autoDisplay && cmp('showConsentTool'); + } else { + log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); + !isConsentToolShowing && config.autoDisplay && cmp('showFooter'); + } +} + +function checkConsent(cmp, store) { + if (!cmp) { + log.error('CMP failed to load'); + } + else if (!window.navigator.cookieEnabled) { + log.warn('Cookies are disabled. Ignoring CMP consent check'); + } + else { + __tcfapi('getVendorList', 2, (vendorList, success) => { + if (success) { + const timeout = setTimeout(() => { + handleConsentResult(cmp, store, vendorList); + }, 100); + + __tcfapi('getTCData', 2, (tcData, success) => { + if (success) { + let tcStringDecoded; + + try { + tcStringDecoded = TCString.decode(tcData.tcString); + } catch (e) { + // error ocurred during decoding TCString + } finally { + clearTimeout(timeout); + handleConsentResult(cmp, store, vendorList, tcStringDecoded) + } + } + }) + } + }); + } +} + function readExternalConsentData(config) { return new Promise((resolve, reject) => { try { @@ -97,3 +149,13 @@ export function init(configUpdates) { log.error('Failed to load CMP', err); }); } + +// Preserve any config options already set +const {config: configuration} = window[CMP_GLOBAL_NAME] || {}; +const configUpdates = { + globalConsentLocation: 'https://rasp.mgr.consensu.org/portal.html', + ...configuration +}; + +init(configUpdates).then((store) => checkConsent(window.__cmp, store)); + diff --git a/webpack.config.babel.js b/webpack.config.babel.js index b1bcc859..af0b827f 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -170,7 +170,6 @@ module.exports = [ { entry: { cmp: './index.js', - 'cmp.complete': './complete.js', portal: './docs/assets/portal.js' }, From fbb0b093f4dc467cfeddb44b391d3686f18a51e0 Mon Sep 17 00:00:00 2001 From: apocentek Date: Tue, 3 Mar 2020 12:15:23 +0100 Subject: [PATCH 205/540] minor changes --- src/components/popup/details/details.jsx | 13 +++++++------ src/components/popup/details/purposes/purposes.jsx | 7 ------- src/components/popup/details/vendors/vendors.jsx | 13 ++++++++----- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index f7c4fcf1..a44e02c2 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -36,13 +36,13 @@ export default class Details extends Component { } const vendorPurposeIds = new Set([...(vendor.purposes || []), ...(vendor.legIntPurposes || [])]); - console.log(vendorPurposeIds); + if (!purposeIds.every(purposeId => vendorPurposeIds.has(purposeId))) { return false; } const vendorFeatureIds = new Set(vendor.features || []); - console.log(vendorFeatureIds); + if (!featureIds.every(featureId => vendorFeatureIds.has(featureId))) { return false; } @@ -91,6 +91,8 @@ export default class Details extends Component { selectPublisherCustomPurpose, selectPublisherCustomLegitimateInterest, + purposeLegitimateInterest, + vendorLegitimateInterest, persistedConsentData = {}, subsection @@ -103,9 +105,6 @@ export default class Details extends Component { vendorConsents, } = tcModel; - console.log('details '); - console.log(vendorList); - const { created: consentCreated } = persistedConsentData; const { purposes = {}, specialPurposes = {}, features = {}, specialFeatures = {}} = vendorList; const { purposes: customPurposes = [] } = customPurposeList; @@ -141,10 +140,11 @@ export default class Details extends Component { onShowVendors={this.handleShowVendors} persistedConsentData={persistedConsentData} /> + {console.log('vendorLegitimateInterest', vendorLegitimateInterest)} diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index e968f0d9..01aa4745 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -162,13 +162,6 @@ export default class Purposes extends Component { }); initialVendorsRejection(); } - /*if (!publisherConsentCreated) { - allPurposes.forEach((purpose, index) => { - if (!purposeIsTechnical(purpose)) { - this.handleSelectPurpose({isSelected: false, dataId: index}, true); - } - }); - }*/ } return ( diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 1e4f7f7f..7fd6ffb8 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -80,7 +80,9 @@ export default class Vendors extends Component { selectedVendorIds, selectedLegitimateInterestsIds, purposes, - features + features, + specialPurposes, + specialFeatures } = props; const { editingConsents } = this.state; @@ -127,8 +129,9 @@ export default class Vendors extends Component {
    + features={this.getActiveAttributesNameElements(features, featureIds, 'features.feature')} + specialPurposes={this.getActiveAttributesNameElements(specialPurposes, specialPurposes, 'specialPurposes.purpose')} + specialFeatures={this.getActiveAttributesNameElements(specialFeatures, specialFeatures, 'specialFeatures.feature')}/> - Reject + {editingConsents && legIntPurposeIds.length && + + UIP - - } + } {editingConsents && - - Consent + + Zgoda
    - {vendors.map(({ id, name, policyUrl, purposeIds=[], legIntPurposeIds=[], - featureIds=[], specialPurposes=[], specialFeatures=[] }, index) => ( + {vendors.map(({ id, name, policyUrl, purposes: purposeIds=[], legIntPurposeIds=[], + features: featureIds=[], specialPurposes: specialPurposeIds=[], + specialFeatures: specialFeatureIds=[] }, index) => ( {editingConsents && legIntPurposeIds.length &&
    + specialPurposes={this.getActiveAttributesNameElements(specialPurposes, specialPurposeIds, 'specialPurposes.purpose')} + specialFeatures={this.getActiveAttributesNameElements(specialFeatures, specialFeatureIds, 'specialFeatures.feature')}/> From 0222cdf00e76101416c8abe7277eb74eb020d736 Mon Sep 17 00:00:00 2001 From: apocentek Date: Tue, 3 Mar 2020 14:07:47 +0100 Subject: [PATCH 206/540] mock reconnected for dev purposes --- src/components/popup/details/details.jsx | 2 +- src/lib/init.js | 3 --- src/lib/store.js | 2 -- src/lib/vendor.js | 4 ++-- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 58ad7fd7..b95df2cb 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -134,7 +134,7 @@ export default class Details extends Component { /> { @@ -116,7 +115,6 @@ export function init(configUpdates) { log.debug(`Successfully loaded CMP version: ${pack.version}`); cmp.isLoaded = true; cmp.notify('isLoaded'); - // Render the UI const App = require('../components/app').default; render(, document.body); @@ -132,7 +130,6 @@ export function init(configUpdates) { cmp.notify('onToggleConsentToolShowing', isConsentToolShowing); } }); - // Request lists return Promise.all([ store, diff --git a/src/lib/store.js b/src/lib/store.js index 7deb6305..031d1bf6 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -425,8 +425,6 @@ export default class Store { selectPurposeLegitimateInterests = (purposeId, isSelected) => { const {purposeLegitimateInterests} = this.tcModel; - console.log(this.tcModel); - console.log(purposeId); if (isSelected) { purposeLegitimateInterests.set(purposeId); } diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 1f8b1fca..5e38d5e8 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -1,6 +1,7 @@ import Promise from 'promise-polyfill'; import config from './config'; import log from './log'; +import vendorList from './vendor-list' function fetch(url) { return new Promise((resolve, reject) => { @@ -34,9 +35,8 @@ function fetchGlobalVendorList() { reject(err); } else { try { - resolve(data); + resolve(vendorList); } catch (err) { - reject(err); } } }); From 319e1d9830ccdf0071d6a4dfee8327a90c3348bf Mon Sep 17 00:00:00 2001 From: apocentek Date: Tue, 3 Mar 2020 16:26:48 +0100 Subject: [PATCH 207/540] connect purposes and vendors to new store --- src/components/popup/details/details.jsx | 11 +++++--- .../popup/details/purposes/purposes.jsx | 25 ++++++++----------- .../popup/details/vendors/vendors.jsx | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index b95df2cb..661b7a3e 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -18,8 +18,7 @@ export default class Details extends Component { constructor(props) { super(props); this.state = { - vendors: this.getVendors(), - selectedLegitimateInterestsIds: new Set() + vendors: this.getVendors() }; } @@ -96,13 +95,15 @@ export default class Details extends Component { publisherConsents, publisherCustomConsents, vendorConsents, + vendorLegitimateInterests, + purposeLegitimateInterests, + publisherLegitimateInterests } = tcModel; const { created: consentCreated } = persistedConsentData; const { purposes = {}, specialPurposes = {}, features = {}, specialFeatures = {}} = vendorList; const { purposes: customPurposes = [] } = customPurposeList; - return (
    this.handleSelectPurpose(data, isPublisher); }; - handleSelectLegitInterest = ({dataId}) => { - let legitList = this.state.legitInterestList; - if(legitList[dataId]) {legitList[dataId] =!legitList[dataId]} else legitList[dataId] = true; - this.setState({ - legitInterestList: legitList - }); + handleSelectLegitInterest = ({dataId, isSelected}) => { + this.props.selectPurposeLegitimateInterests(dataId+1, isSelected); }; getAllPurposes = () => { @@ -127,7 +121,9 @@ export default class Purposes extends Component { features, specialFeatures, persistedConsentData, - initialVendorsRejection + initialVendorsRejection, + selectedPublisherLegitimateInterests, + selectedPurposeLegitimateInterests } = props; const { created: consentCreated } = persistedConsentData; @@ -145,7 +141,8 @@ export default class Purposes extends Component { (isPublisher ? selectedPublisherPurposeIds : selectedPurposeIds).has(purpose.id) ); - const isLegitimateInterestActive = (id) => !!this.state.legitInterestList[id]; + const isPublisherLegitimateInterestActive = (id) => selectedPublisherLegitimateInterests.has(id); + const isPurposeLegitimateInterestActive = (id) => selectedPurposeLegitimateInterests.has(id+1); const purposeIsTechnical = (purpose) => config.legIntPurposeIds && config.contractPurposeIds && @@ -236,7 +233,7 @@ export default class Purposes extends Component { index={index} purpose={purpose} isActive={purposeIsActive(purpose)} - isLegitimateInterestActive={isLegitimateInterestActive(index)} + isLegitimateInterestActive={isPurposeLegitimateInterestActive(index)} isTechnical={false} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggleLegitInterest={this.handleSelectLegitInterest.bind(this)} @@ -248,7 +245,7 @@ export default class Purposes extends Component { index={index} purpose={purpose} isActive={purposeIsActive(purpose)} - isLegitimateInterestActive={isLegitimateInterestActive(index)} + isLegitimateInterestActive={isPurposeLegitimateInterestActive(index)} isTechnical={false} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggleLegitInterest={this.handleSelectLegitInterest.bind(this)} @@ -262,7 +259,7 @@ export default class Purposes extends Component { )}
    {specialFeatures && !!specialFeatures.length &&
    - Special features + Special features {specialFeatures.map((feature, index) => diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 7fd6ffb8..5f6310a6 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -41,7 +41,7 @@ export default class Vendors extends Component { }; handleLegitInterest = ({ dataId, isSelected }) => { - this.props.selectVendorLegitimateInterest(dataId, isSelected); + this.props.selectVendorLegitimateInterests(dataId, isSelected); }; handleMoreChoices = () => { From 8d14a5fc93d7d7f15656390bb4fafc161dd6e6d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 3 Mar 2020 17:23:08 +0100 Subject: [PATCH 208/540] catching error when decoding consent string v1.1 --- src/lib/cookie/cookie.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index e923b97b..57f090f5 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -20,7 +20,13 @@ function writeCookie(name, value, maxAgeSeconds, path = '/') { } function decodeConsentData (encoded) { - return TCString.decode(encoded); + let decoded; + try { + decoded = TCString.decode(encoded); + } catch (e) { + log.debug('Consent string not compatible with TCF v2.0') + } + return decoded; } function encodeConsentData (decoded) { From 0eeab6f1c5da081547710155b741fa5d0b7ebc0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 3 Mar 2020 17:24:31 +0100 Subject: [PATCH 209/540] indent --- src/lib/cookie/cookie.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 57f090f5..03446a8e 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -1,6 +1,6 @@ import Promise from 'promise-polyfill'; import log from '../log'; -import {TCString} from '@iabtcf/core'; +import { TCString } from '@iabtcf/core'; const CONSENT_COOKIE = 'adpconsent'; const CONSENT_COOKIE_MAX_AGE = 33696000; From f253027f22b2275689393cffdfc8de0580cb7365 Mon Sep 17 00:00:00 2001 From: apocentek Date: Wed, 4 Mar 2020 16:57:31 +0100 Subject: [PATCH 210/540] new filter for vendors, naming conventions --- src/components/popup/details/details.jsx | 29 +++++++++++++++++-- .../popup/details/purposes/feature.jsx | 7 +++-- .../popup/details/purposes/purpose.jsx | 5 ++-- .../popup/details/purposes/purposes.jsx | 3 ++ .../popup/details/vendors/vendors.jsx | 6 ++-- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 661b7a3e..024a016c 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -28,8 +28,31 @@ export default class Details extends Component { return Object.values(vendors); }; - filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [] } = {}) => { - return this.getVendors().filter(vendor => { + filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [], specialPurpose=null, specialFeature=null } = {}) => { + const { gvl } = this.props.store.tcModel; + + console.log('isCustom', isCustom, 'purposeIds', purposeIds, 'featureIds', featureIds, + 'specialPurpose', specialPurpose, 'specialFeature', specialFeature); + + if(isCustom) { + + } else { + if(!!purposeIds.length) { + if(specialPurpose) { + return Object.values(gvl.getVendorsWithSpecialPurpose(purposeIds)) + } else { + return Object.values(gvl.getVendorsWithConsentPurpose(purposeIds)) + } + } else if(!!featureIds.length) { + if(specialFeature) { + return Object.values(gvl.getVendorsWithSpecialFeature(featureIds)) + } else { + return Object.values(gvl.getVendorsWithFeature(featureIds)) + } + } + } + + /*return this.getVendors().filter(vendor => { if (isCustom !== null && (isCustom && vendor.external_id || !isCustom && !vendor.external_id)) { return false; } @@ -45,7 +68,7 @@ export default class Details extends Component { } return true; - }); + });*/ }; handleShowVendors = (filter) => { diff --git a/src/components/popup/details/purposes/feature.jsx b/src/components/popup/details/purposes/feature.jsx index 016eee4d..661189f2 100644 --- a/src/components/popup/details/purposes/feature.jsx +++ b/src/components/popup/details/purposes/feature.jsx @@ -11,6 +11,7 @@ class LocalLabel extends Label { const Feature = (props) => { const { feature, + specialFeature, createOnShowVendors } = props; @@ -24,12 +25,14 @@ const Feature = (props) => {
    {feature.description} diff --git a/src/components/popup/details/purposes/purpose.jsx b/src/components/popup/details/purposes/purpose.jsx index 53c22180..de449328 100644 --- a/src/components/popup/details/purposes/purpose.jsx +++ b/src/components/popup/details/purposes/purpose.jsx @@ -20,6 +20,7 @@ const Purpose = (props) => { onToggleLegitInterest, createOnShowVendors, isTechnical, + specialPurpose, isPublisherPurpose = false } = props; @@ -60,13 +61,13 @@ const Purpose = (props) => {
    diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index f02fd5d1..d5ac9678 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -166,6 +166,7 @@ export default class Purposes extends Component { this.handleSelectSpecialFeature({isSelected:false, dataId: index+1}) }); initialVendorsRejection(); + // TODO - initialLegitInterestsAccept() } } @@ -247,6 +248,7 @@ export default class Purposes extends Component { isActive={purposeIsActive(purpose)} isLegitimateInterestActive={isPurposeLegitimateInterestActive(index)} isTechnical={false} + specialPurpose={true} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggleLegitInterest={this.handleSelectLegitInterest.bind(this)} onToggle={this.createHandleSelectPurpose()}/>)} @@ -262,6 +264,7 @@ export default class Purposes extends Component { Special features {specialFeatures.map((feature, index) => )}
    } diff --git a/src/components/popup/details/vendors/vendors.jsx b/src/components/popup/details/vendors/vendors.jsx index 5f6310a6..0428a5ca 100644 --- a/src/components/popup/details/vendors/vendors.jsx +++ b/src/components/popup/details/vendors/vendors.jsx @@ -129,7 +129,7 @@ export default class Vendors extends Component {
    - {vendors.map(({ id, name, policyUrl, purposes: purposeIds=[], legIntPurposeIds=[], + {vendors.map(({ id, name, policyUrl, purposes: purposeIds=[], legIntPurposes=[], features: featureIds=[], specialPurposes: specialPurposeIds=[], specialFeatures: specialFeatureIds=[] }, index) => ( @@ -137,12 +137,12 @@ export default class Vendors extends Component { - {editingConsents && legIntPurposeIds.length && + {editingConsents && legIntPurposes.length && +
    UIP Date: Thu, 5 Mar 2020 15:49:41 +0100 Subject: [PATCH 211/540] updating cmpApi.tcModel only on consent persist --- src/lib/init.js | 2 +- src/lib/store.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 69097a1d..4b5e3965 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -59,7 +59,7 @@ function checkConsent(cmp, store) { handleConsentResult(cmp, store, vendorList, tcStringDecoded) } } - }) + }) } }); } diff --git a/src/lib/store.js b/src/lib/store.js index 7deb6305..65020a03 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -329,6 +329,7 @@ export default class Store { } this.persistedConsentData = TCString.decode(encodedConsent); + this.cmpApi.tcModel = this.tcModel; // Notify of date changes this.storeUpdate(); @@ -346,7 +347,6 @@ export default class Store { storeUpdate = () => { this.listeners.forEach(callback => callback(this)); - this.cmpApi.tcModel = this.tcModel; }; selectVendor = (vendorId, isSelected) => { @@ -562,6 +562,7 @@ export default class Store { const persistedMaxVendorId = this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; this.tcModel.gvl = new GVL(vendorList); + this.cmpApi.tcModel = this.tcModel; this.vendorList = vendorList; // If vendor and publisher consent data has never been persisted set default selected status From 467327e39039d8d75ab31b2aac5b58bd0ad3a3a7 Mon Sep 17 00:00:00 2001 From: apocentek Date: Thu, 5 Mar 2020 16:33:48 +0100 Subject: [PATCH 212/540] specialPurposes added to publisher, specialPurposes for vendors shall not have buttons, correct storing of legintConstent --- src/components/popup/details/details.jsx | 7 ++----- .../popup/details/purposes/purposes.jsx | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 024a016c..31ef5313 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -31,12 +31,7 @@ export default class Details extends Component { filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [], specialPurpose=null, specialFeature=null } = {}) => { const { gvl } = this.props.store.tcModel; - console.log('isCustom', isCustom, 'purposeIds', purposeIds, 'featureIds', featureIds, - 'specialPurpose', specialPurpose, 'specialFeature', specialFeature); - if(isCustom) { - - } else { if(!!purposeIds.length) { if(specialPurpose) { return Object.values(gvl.getVendorsWithSpecialPurpose(purposeIds)) @@ -50,6 +45,8 @@ export default class Details extends Component { return Object.values(gvl.getVendorsWithFeature(featureIds)) } } + } else { + } /*return this.getVendors().filter(vendor => { diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index d5ac9678..917f35dc 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -157,7 +157,7 @@ export default class Purposes extends Component { this.handleSelectPurpose({isSelected: false, dataId: index}); // iab leg ints - this.handleSelectPurpose({isSelected: false, dataId: index}, false, true); + this.handleSelectPurpose({isSelected: true, dataId: index}, false, true); // publisher purposes this.handleSelectPurpose({isSelected: false, dataId: index}, true, false); @@ -219,6 +219,17 @@ export default class Purposes extends Component { isTechnical={purposeIsTechnical(purpose)} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggle={this.createHandleSelectPurpose(true)}/>)} + {specialPurposes && !!specialPurposes.length &&
    + Special purposes + {specialPurposes.map((purpose, index) => )} +
    }
    @@ -245,9 +256,9 @@ export default class Purposes extends Component { {specialPurposes.map((purpose, index) => Date: Fri, 6 Mar 2020 13:51:49 +0100 Subject: [PATCH 213/540] specialPurposes in publisher's filtered by config param --- src/components/popup/details/purposes/purposes.jsx | 8 +++++--- src/lib/config.js | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 917f35dc..1222b959 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -149,6 +149,9 @@ export default class Purposes extends Component { purpose && !purpose.custom && (config.legIntPurposeIds.indexOf(purpose.id) >= 0 || config.contractPurposeIds.indexOf(purpose.id) >= 0); + const selectedSpecialPurposes = config.specialPurposes && !!config.specialPurposes.length && + specialPurposes.filter((purpose, index) => config.specialPurposes.indexOf(index+1) !== -1); + if (selectedTab === TAB_CONSENTS && !renderedTabIndices.has(selectedTab)) { renderedTabIndices.add(selectedTab); if (!consentCreated) { @@ -166,7 +169,6 @@ export default class Purposes extends Component { this.handleSelectSpecialFeature({isSelected:false, dataId: index+1}) }); initialVendorsRejection(); - // TODO - initialLegitInterestsAccept() } } @@ -219,9 +221,9 @@ export default class Purposes extends Component { isTechnical={purposeIsTechnical(purpose)} createOnShowVendors={this.createOnShowVendors.bind(this)} onToggle={this.createHandleSelectPurpose(true)}/>)} - {specialPurposes && !!specialPurposes.length &&
    + {selectedSpecialPurposes && !!selectedSpecialPurposes.length &&
    Special purposes - {specialPurposes.map((purpose, index) => Date: Fri, 6 Mar 2020 15:13:06 +0100 Subject: [PATCH 214/540] translations, css, cleanup --- src/components/popup/details/details.jsx | 18 ------------------ .../popup/details/purposes/purpose.jsx | 2 +- .../popup/details/vendors/vendors.jsx | 2 +- .../popup/details/vendors/vendors.less | 4 ++++ src/lib/translations.js | 2 ++ 5 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 31ef5313..27f22c1a 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -48,24 +48,6 @@ export default class Details extends Component { } else { } - - /*return this.getVendors().filter(vendor => { - if (isCustom !== null && (isCustom && vendor.external_id || !isCustom && !vendor.external_id)) { - return false; - } - - const vendorPurposeIds = new Set([...(vendor.purposeIds || []), ...(vendor.legIntPurposeIds || [])]); - if (!purposeIds.every(purposeId => vendorPurposeIds.has(purposeId))) { - return false; - } - - const vendorFeatureIds = new Set(vendor.featureIds || []); - if (!featureIds.every(featureId => vendorFeatureIds.has(featureId))) { - return false; - } - - return true; - });*/ }; handleShowVendors = (filter) => { diff --git a/src/components/popup/details/purposes/purpose.jsx b/src/components/popup/details/purposes/purpose.jsx index de449328..6902a490 100644 --- a/src/components/popup/details/purposes/purpose.jsx +++ b/src/components/popup/details/purposes/purpose.jsx @@ -44,7 +44,7 @@ const Purpose = (props) => {
    - Uzasadniony interes + Uzasadniony interes Company {editingConsents && -
    Uzasadniony interes prawnyUzasadniony interes prawny Allow Date: Fri, 6 Mar 2020 15:41:33 +0100 Subject: [PATCH 215/540] isCustom - filter vendor list by globalId --- src/components/popup/details/details.jsx | 30 +++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 27f22c1a..6de84a6b 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -30,24 +30,26 @@ export default class Details extends Component { filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [], specialPurpose=null, specialFeature=null } = {}) => { const { gvl } = this.props.store.tcModel; + let vendList; - if(isCustom) { - if(!!purposeIds.length) { - if(specialPurpose) { - return Object.values(gvl.getVendorsWithSpecialPurpose(purposeIds)) - } else { - return Object.values(gvl.getVendorsWithConsentPurpose(purposeIds)) - } - } else if(!!featureIds.length) { - if(specialFeature) { - return Object.values(gvl.getVendorsWithSpecialFeature(featureIds)) - } else { - return Object.values(gvl.getVendorsWithFeature(featureIds)) - } + if(!!purposeIds.length) { + if(specialPurpose) { + vendList = Object.values(gvl.getVendorsWithSpecialPurpose(purposeIds)) + } else { + vendList = Object.values(gvl.getVendorsWithConsentPurpose(purposeIds)) + } + } else if(!!featureIds.length) { + if(specialFeature) { + vendList = Object.values(gvl.getVendorsWithSpecialFeature(featureIds)) + } else { + vendList = Object.values(gvl.getVendorsWithFeature(featureIds)) } - } else { + } + if(isCustom) { + vendList = vendList.filter(vendor => !!vendor.globalId) } + return vendList; }; handleShowVendors = (filter) => { From bc286adb08d553e1ee11e939a2c6172634130267 Mon Sep 17 00:00:00 2001 From: apocentek Date: Fri, 6 Mar 2020 16:00:42 +0100 Subject: [PATCH 216/540] Doc's --- src/docs/components/docs/configuration.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 6d04295d..facd5b42 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -123,6 +123,12 @@ export default class CmpApi extends Component { Default is set true. If true autoDisplay: true when initialize CMP the consent tool UI may be displayed automatically according to user's current consents. If is set false autoDisplay: false the consent tool UI will never be displayed when initialize CMP + + specialPurposes (Array): + + List of Ids allowing to display custom special purposes in Publishers purposes description + + ); From 6df985d881d0bbd270c99514e2a5d22d7fdcce12 Mon Sep 17 00:00:00 2001 From: apocentek Date: Fri, 6 Mar 2020 16:11:48 +0100 Subject: [PATCH 217/540] disconnect mock --- src/lib/vendor.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 5e38d5e8..41d8c2f1 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -1,7 +1,6 @@ import Promise from 'promise-polyfill'; import config from './config'; import log from './log'; -import vendorList from './vendor-list' function fetch(url) { return new Promise((resolve, reject) => { @@ -35,7 +34,7 @@ function fetchGlobalVendorList() { reject(err); } else { try { - resolve(vendorList); + resolve(data); } catch (err) { } } From 9f172251a645c7e858c14c74441c56a59bac1f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 9 Mar 2020 11:31:18 +0100 Subject: [PATCH 218/540] custom commands --- src/lib/commands.js | 66 +++++++++++++++++++++++++++++++++++++++++++++ src/lib/init.js | 11 ++++++-- src/lib/store.js | 6 +++-- 3 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 src/lib/commands.js diff --git a/src/lib/commands.js b/src/lib/commands.js new file mode 100644 index 00000000..7b80e629 --- /dev/null +++ b/src/lib/commands.js @@ -0,0 +1,66 @@ +import { TCModel, GVL, TCString } from "@iabtcf/core"; + +const COOKIE_VERSION = 2; +const CMP_ID = 280; +const CMP_VERSION = 2; + +const CommandsFactory = (store) => { + const getConsentObject = (callback, data) => { + const { + vendorListVersion, + ...tcModelFields + } = data; + + const { vendorList, persistedConsentData } = store; + const { vendors } = vendorList; + const globalVendorsObject = {}; + + for (let vendor of Object.values(vendors)) { + if (!vendor.globalId) { + continue; + } + + globalVendorsObject[vendor.globalId] = { + id: vendor.globalId, + name: vendor.name, + policyUrl: vendor.policyUrl, + purposes: vendor.purposes, + specialPurposes: vendor.specialPurposes, + legIntPurposes: vendor.legIntPurposes, + features: vendor.features, + specialFeatures: vendor.specialFeatures + } + } + + vendorList.vendors = globalVendorsObject; + vendorList.vendorListVersion = vendorListVersion; + + const tcModel = new TCModel(new GVL(vendorList)); + tcModel.cookieVersion = COOKIE_VERSION; + tcModel.cmpId = CMP_ID; + tcModel.cmpVersion = CMP_VERSION; + tcModel.created = persistedConsentData && persistedConsentData.created || new Date(); + tcModel.lastUpdated = persistedConsentData && persistedConsentData.lastUpdated || new Date(); + tcModel.vendorListVersion = tcModel.vendorListVersion_ = vendorListVersion; + tcModel.isServiceSpecific = true; + tcModel.supportOOB = false; + + for (let key of Object.keys(tcModelFields)) { + tcModel[key].set(data[key]); + } + + const encoded = TCString.encode(tcModel); + const decoded = TCString.decode(encoded); + + callback({ + tcString: encoded, + ...decoded + }, true); + }; + + return { + getConsentObject + } +}; + +export default CommandsFactory; diff --git a/src/lib/init.js b/src/lib/init.js index 4b5e3965..e8cba99d 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -6,6 +6,7 @@ import { TCString } from "@iabtcf/core"; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; +import CommandsFactory from './commands'; import log from './log'; import pack from '../../package.json'; import config from './config'; @@ -47,6 +48,8 @@ function checkConsent(cmp, store) { }, 100); __tcfapi('getTCData', 2, (tcData, success) => { + console.log('getTcData'); + console.log(tcData); if (success) { let tcStringDecoded; @@ -56,10 +59,10 @@ function checkConsent(cmp, store) { // error ocurred during decoding TCString } finally { clearTimeout(timeout); - handleConsentResult(cmp, store, vendorList, tcStringDecoded) + handleConsentResult(cmp, store, vendorList, tcStringDecoded); } } - }) + }); } }); } @@ -92,6 +95,8 @@ export function init(configUpdates) { // Fetch the current vendor consent before initializing return ((config.getConsentData) ? readExternalConsentData(config) : readConsentCookie()) .then((consentData) => { + // const customCommands = CommandsCreator(config.getVendorList); + const cmpApi = new CmpApi(CMP_ID, CMP_VERSION); // Initialize the store with all of our consent data @@ -103,6 +108,8 @@ export function init(configUpdates) { cmpApi }); + cmpApi.customCommands = CommandsFactory(store); + // Pull queued command from __cmp stub const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; diff --git a/src/lib/store.js b/src/lib/store.js index 65020a03..fcd8b8dc 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -41,6 +41,8 @@ export default class Store { const tcModel = new TCModel(); tcModel.cmpId = cmpId; tcModel.cmpVersion = cmpVersion; + tcModel.isServiceSpecific = true; + tcModel.supportOOB = false; this.tcModel = Object.assign( tcModel, @@ -325,7 +327,7 @@ export default class Store { log.error('Failed writing external consent data', err); } } else { - writeConsentCookie(encodedConsent) + writeConsentCookie(encodedConsent); } this.persistedConsentData = TCString.decode(encodedConsent); @@ -503,7 +505,7 @@ export default class Store { Object.values(purposes).forEach(({id}) => { if (publisherLegitimateInterests.includes(id)) { - this.tcModel.publisherLegitimateInterests[operation](id) + this.tcModel.publisherLegitimateInterests[operation](id); } }); From c90318fec1d46e329bfbe944c173a96baebf005b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 9 Mar 2020 12:26:29 +0100 Subject: [PATCH 219/540] removed console log --- src/lib/init.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index e8cba99d..937fc508 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -48,8 +48,6 @@ function checkConsent(cmp, store) { }, 100); __tcfapi('getTCData', 2, (tcData, success) => { - console.log('getTcData'); - console.log(tcData); if (success) { let tcStringDecoded; From 750c444d41c7198648859e33fa9c93f77d61a59d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 9 Mar 2020 12:48:19 +0100 Subject: [PATCH 220/540] checking if key exists in tcmodel --- src/lib/commands.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 7b80e629..7a063fbf 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -46,7 +46,7 @@ const CommandsFactory = (store) => { tcModel.supportOOB = false; for (let key of Object.keys(tcModelFields)) { - tcModel[key].set(data[key]); + tcModel[key] && tcModel[key].set(data[key]); } const encoded = TCString.encode(tcModel); From 0f527d0d57d191d155a8982ca43226e832807298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 9 Mar 2020 12:53:07 +0100 Subject: [PATCH 221/540] removed console log --- src/lib/init.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 937fc508..6d23debf 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -93,8 +93,6 @@ export function init(configUpdates) { // Fetch the current vendor consent before initializing return ((config.getConsentData) ? readExternalConsentData(config) : readConsentCookie()) .then((consentData) => { - // const customCommands = CommandsCreator(config.getVendorList); - const cmpApi = new CmpApi(CMP_ID, CMP_VERSION); // Initialize the store with all of our consent data From 34860f46a63223afb7fe2344cda7f3c8224307dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 9 Mar 2020 16:30:30 +0100 Subject: [PATCH 222/540] renamed function --- src/lib/commands.js | 4 ++-- src/lib/init.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 7a063fbf..311d088e 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -4,7 +4,7 @@ const COOKIE_VERSION = 2; const CMP_ID = 280; const CMP_VERSION = 2; -const CommandsFactory = (store) => { +const createCommands = (store) => { const getConsentObject = (callback, data) => { const { vendorListVersion, @@ -63,4 +63,4 @@ const CommandsFactory = (store) => { } }; -export default CommandsFactory; +export default createCommands; diff --git a/src/lib/init.js b/src/lib/init.js index 6d23debf..a5347a7d 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -6,7 +6,7 @@ import { TCString } from "@iabtcf/core"; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; -import CommandsFactory from './commands'; +import createCommands from './commands'; import log from './log'; import pack from '../../package.json'; import config from './config'; @@ -104,7 +104,7 @@ export function init(configUpdates) { cmpApi }); - cmpApi.customCommands = CommandsFactory(store); + cmpApi.customCommands = createCommands(store); // Pull queued command from __cmp stub const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; From 0dfcacf9277a32720baaadfaaee39de799d25f90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 9 Mar 2020 16:46:13 +0100 Subject: [PATCH 223/540] two functions refactored --- src/lib/store.js | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index fcd8b8dc..9f688807 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -62,9 +62,7 @@ export default class Store { this.hasInitialVendorsRejectionOccured = false; } - isAllSetTrue = obj => { - return Object.keys(obj).map(key => obj[key]).every((value) => value === true); - }; + isAllSetTrue = obj => Object.keys(obj).map(key => obj[key]).every((value) => value === true); /** * Build vendor consent object from data that has already been persisted. This @@ -261,22 +259,19 @@ export default class Store { */ getConsentFieldsObject = () => { const { - tcModel + persistedConsentData } = this; - const consentObject = TCString.decode(TCString.encode(tcModel)); - const { created, lastUpdated, - cmpId, - cmpVersion, - consentScreen, - consentLanguage, - vendorListVersion, - globalVendorListVersion, - version - } = consentObject; + cmpId_: cmpId, + cmpVersion_: cmpVersion, + consentScreen_: consentScreen, + consentLanguage_: consentLanguage, + vendorListVersion_: vendorListVersion, + version_: version + } = persistedConsentData; return { cmpId, @@ -284,7 +279,6 @@ export default class Store { consentLanguage, consentScreen, created, - globalVendorListVersion, vendorListVersion, lastUpdated, version From bc69894ea9979ac99b76772b4da3f03368c02c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 9 Mar 2020 17:11:38 +0100 Subject: [PATCH 224/540] deep copy of vendor list in custom commands --- src/lib/commands.js | 3 ++- src/lib/init.js | 5 ++--- src/lib/store.js | 2 -- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 311d088e..512fbc29 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -11,7 +11,8 @@ const createCommands = (store) => { ...tcModelFields } = data; - const { vendorList, persistedConsentData } = store; + const vendorList = JSON.parse(JSON.stringify(store.vendorList)); + const { persistedConsentData } = store; const { vendors } = vendorList; const globalVendorsObject = {}; diff --git a/src/lib/init.js b/src/lib/init.js index a5347a7d..03edae7c 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -6,10 +6,10 @@ import { TCString } from "@iabtcf/core"; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; -import createCommands from './commands'; import log from './log'; import pack from '../../package.json'; import config from './config'; +import createCommands from "./commands"; const CMP_VERSION = 2; const CMP_ID = 280; @@ -104,8 +104,6 @@ export function init(configUpdates) { cmpApi }); - cmpApi.customCommands = createCommands(store); - // Pull queued command from __cmp stub const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; @@ -141,6 +139,7 @@ export function init(configUpdates) { store, fetchGlobalVendorList().then(store.updateVendorList) ]).then((params) => { + cmpApi.customCommands = createCommands(store); cmp.cmpReady = true; cmp.notify('cmpReady'); return params[0]; diff --git a/src/lib/store.js b/src/lib/store.js index 9f688807..e0cffa3d 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -421,8 +421,6 @@ export default class Store { selectPurposeLegitimateInterests = (purposeId, isSelected) => { const {purposeLegitimateInterests} = this.tcModel; - console.log(this.tcModel); - console.log(purposeId); if (isSelected) { purposeLegitimateInterests.set(purposeId); } From b71f5bea5a97343980f8765a89ef4cb2e48aa2db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 9 Mar 2020 17:35:30 +0100 Subject: [PATCH 225/540] initial leg int selection --- src/components/popup/details/purposes/purposes.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 6a473545..34f0a457 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -146,7 +146,7 @@ export default class Purposes extends Component { this.handleSelectPurpose({isSelected: false, dataId: index}); // iab leg ints - this.handleSelectPurpose({isSelected: false, dataId: index}, false, true); + this.handleSelectPurpose({isSelected: true, dataId: index}, false, true); // publisher purposes this.handleSelectPurpose({isSelected: false, dataId: index}, true, false); From d3f8f7d7ac6912732aa7c7f876906d5dcb8e22e8 Mon Sep 17 00:00:00 2001 From: apocentek Date: Mon, 9 Mar 2020 17:42:44 +0100 Subject: [PATCH 226/540] init params broken into 3 lines --- src/lib/init.js | 4 +++- src/lib/translations.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index b825674c..3f7d547e 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -15,7 +15,9 @@ const CMP_VERSION = 2; const CMP_ID = 280; const COOKIE_VERSION = 2; -function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion = 1} = {}, {created, vendorListVersion, policyVersion: consentPolicyVersion = 1} = {}) { +function handleConsentResult(cmp, {isConsentToolShowing}, + {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion = 1} = {}, + {created, vendorListVersion, policyVersion: consentPolicyVersion = 1} = {}) { if (!created) { log.debug('No consent data found. Showing consent tool'); config.autoDisplay && cmp('showConsentTool'); diff --git a/src/lib/translations.js b/src/lib/translations.js index b7dbb317..72bd1b8c 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -8,7 +8,7 @@ export default { pl: { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', - description: `

    DEV Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    + description: `

    Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    Zgoda

    From 0f16a295b052bb0745fbc5ed44bd3df96fd106a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 10 Mar 2020 14:32:00 +0100 Subject: [PATCH 227/540] custom commands created earlier --- src/lib/commands.js | 182 +++++++++++++++++++++++++++++++++----------- src/lib/init.js | 3 +- 2 files changed, 138 insertions(+), 47 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 512fbc29..43d897b0 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -1,62 +1,152 @@ import { TCModel, GVL, TCString } from "@iabtcf/core"; +import config from "./config"; const COOKIE_VERSION = 2; const CMP_ID = 280; const CMP_VERSION = 2; const createCommands = (store) => { - const getConsentObject = (callback, data) => { - const { - vendorListVersion, - ...tcModelFields - } = data; - - const vendorList = JSON.parse(JSON.stringify(store.vendorList)); - const { persistedConsentData } = store; - const { vendors } = vendorList; - const globalVendorsObject = {}; - - for (let vendor of Object.values(vendors)) { - if (!vendor.globalId) { - continue; - } + let vendorList; + + const getVendorList = (callback) => { + if (vendorList) { + callback(vendorList); + } else if (store.vendorList && Object.keys(store.vendorList).length) { + vendorList = JSON.parse(JSON.stringify(store.vendorList)); + callback(vendorList); + } else { + const {getVendorList} = config; - globalVendorsObject[vendor.globalId] = { - id: vendor.globalId, - name: vendor.name, - policyUrl: vendor.policyUrl, - purposes: vendor.purposes, - specialPurposes: vendor.specialPurposes, - legIntPurposes: vendor.legIntPurposes, - features: vendor.features, - specialFeatures: vendor.specialFeatures + if (getVendorList) { + getVendorList((err, data) => { + if (err) { + callback({}, err) + } else { + vendorList = data; + callback(vendorList) + } + }) } } + }; - vendorList.vendors = globalVendorsObject; - vendorList.vendorListVersion = vendorListVersion; - - const tcModel = new TCModel(new GVL(vendorList)); - tcModel.cookieVersion = COOKIE_VERSION; - tcModel.cmpId = CMP_ID; - tcModel.cmpVersion = CMP_VERSION; - tcModel.created = persistedConsentData && persistedConsentData.created || new Date(); - tcModel.lastUpdated = persistedConsentData && persistedConsentData.lastUpdated || new Date(); - tcModel.vendorListVersion = tcModel.vendorListVersion_ = vendorListVersion; - tcModel.isServiceSpecific = true; - tcModel.supportOOB = false; - - for (let key of Object.keys(tcModelFields)) { - tcModel[key] && tcModel[key].set(data[key]); - } + const vectorToObject = (set) => { + let obj = {}; + + set.forEach((hasConsent, id) => { + obj[id] = hasConsent + }); + + return obj; + }; + + const getConsentObject = (callback, consents) => { + getVendorList((vendorList, err) => { + if (err) { + callback({}, false) + } + if (vendorList) { + vendorList = JSON.parse(JSON.stringify(vendorList)); + const { + vendorListVersion: consentsVendorListVersion, + ...tcModelFields + } = consents; + const {persistedConsentData} = store; + const {vendors} = vendorList; + const globalVendorsObject = {}; - const encoded = TCString.encode(tcModel); - const decoded = TCString.decode(encoded); + for (let vendor of Object.values(vendors)) { + if (!vendor.globalId) { + continue; + } - callback({ - tcString: encoded, - ...decoded - }, true); + globalVendorsObject[vendor.globalId] = { + id: vendor.globalId, + name: vendor.name, + policyUrl: vendor.policyUrl, + purposes: vendor.purposes, + specialPurposes: vendor.specialPurposes, + legIntPurposes: vendor.legIntPurposes, + features: vendor.features, + specialFeatures: vendor.specialFeatures + } + } + + vendorList.vendors = globalVendorsObject; + vendorList.vendorListVersion = consentsVendorListVersion; + + const tcModel = new TCModel(new GVL(vendorList)); + tcModel.cookieVersion = COOKIE_VERSION; + tcModel.cmpId = CMP_ID; + tcModel.cmpVersion = CMP_VERSION; + tcModel.created = persistedConsentData && persistedConsentData.created || new Date(); + tcModel.lastUpdated = persistedConsentData && persistedConsentData.lastUpdated || new Date(); + tcModel.vendorListVersion = tcModel.vendorListVersion_ = consentsVendorListVersion; + tcModel.isServiceSpecific = true; + tcModel.supportOOB = false; + + for (let key of Object.keys(tcModelFields)) { + tcModel[key] && tcModel[key].set(consents[key]); + } + + const encoded = TCString.encode(tcModel); + const decoded = TCString.decode(encoded); + + const { + cmpId_: cmpId, + cmpVersion_: cmpVersion, + policyVersion_: tcfPolicyVersion, + supportOOB_: supportOOB, + vendorListVersion_: vendorListVersion, + isServiceSpecific_: isServiceSpecific, + useNonStandardStacks_: useNonStandardStacks, + publisherCountryCode_: publisherCC, + purposeConsents, + purposeLegitimateInterests, + publisherConsents, + publisherLegitimateInterests, + vendorConsents, + vendorLegitimateInterests, + vendorsDisclosed, + vendorsAllowed, + specialFeatureOptIns, + created, + lastUpdated + } = decoded; + + + callback({ + tcString: encoded, + cmpId, + cmpVersion, + tcfPolicyVersion, + supportOOB, + vendorListVersion, + isServiceSpecific, + useNonStandardStacks, + publisherCC, + created, + lastUpdated, + outOfBand: { + allowedVendors: vectorToObject(vendorsAllowed), + disclosedVendors: vectorToObject(vendorsDisclosed) + }, + purpose: { + consents: vectorToObject(purposeConsents), + legitimateInterests: vectorToObject(purposeLegitimateInterests) + }, + vendor: { + consents: vectorToObject(vendorConsents), + legitimateInterests: vectorToObject(vendorLegitimateInterests) + }, + specialFeatureOptins: vectorToObject(specialFeatureOptIns), + publisher: { + consents: vectorToObject(publisherConsents), + legitimateInterests: vectorToObject(publisherLegitimateInterests) + } + }, true); + } + }) }; return { diff --git a/src/lib/init.js b/src/lib/init.js index 03edae7c..93c5ad42 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -104,6 +104,8 @@ export function init(configUpdates) { cmpApi }); + cmpApi.customCommands = createCommands(store); + // Pull queued command from __cmp stub const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; @@ -139,7 +141,6 @@ export function init(configUpdates) { store, fetchGlobalVendorList().then(store.updateVendorList) ]).then((params) => { - cmpApi.customCommands = createCommands(store); cmp.cmpReady = true; cmp.notify('cmpReady'); return params[0]; From 391b7d8aeb99db3abac41a0cbffaf3cf895374d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 10 Mar 2020 14:33:39 +0100 Subject: [PATCH 228/540] removed deep copy --- src/lib/commands.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 43d897b0..55b17e6d 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -46,7 +46,6 @@ const createCommands = (store) => { callback({}, false) } if (vendorList) { - vendorList = JSON.parse(JSON.stringify(vendorList)); const { vendorListVersion: consentsVendorListVersion, ...tcModelFields From e1a4d31fb70ace268c0960386106d9c7b1a8cc54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 10 Mar 2020 14:37:28 +0100 Subject: [PATCH 229/540] accessing only public properties --- src/lib/commands.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 55b17e6d..fecc04ad 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -92,14 +92,14 @@ const createCommands = (store) => { const decoded = TCString.decode(encoded); const { - cmpId_: cmpId, - cmpVersion_: cmpVersion, - policyVersion_: tcfPolicyVersion, - supportOOB_: supportOOB, - vendorListVersion_: vendorListVersion, - isServiceSpecific_: isServiceSpecific, - useNonStandardStacks_: useNonStandardStacks, - publisherCountryCode_: publisherCC, + cmpId, + cmpVersion, + policyVersion: tcfPolicyVersion, + supportOOB, + vendorListVersion, + isServiceSpecific, + useNonStandardStacks, + publisherCountryCode: publisherCC, purposeConsents, purposeLegitimateInterests, publisherConsents, @@ -113,7 +113,6 @@ const createCommands = (store) => { lastUpdated } = decoded; - callback({ tcString: encoded, cmpId, From 59a0de85a0bc4847cfa8290504187b796524d839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 10 Mar 2020 16:11:48 +0100 Subject: [PATCH 230/540] custom commands for getting consent string v1 - work in progress --- src/lib/commands.js | 87 ++++++++++++++++++++++++++++++++++++---- src/lib/cookie/cookie.js | 81 +++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 7 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index fecc04ad..522997a2 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -1,5 +1,7 @@ import { TCModel, GVL, TCString } from "@iabtcf/core"; import config from "./config"; +import { encodeVendorConsentData } from "./cookie/cookie"; +const arrayFrom = require('core-js/library/fn/array/from'); const COOKIE_VERSION = 2; const CMP_ID = 280; @@ -40,16 +42,63 @@ const createCommands = (store) => { return obj; }; - const getConsentObject = (callback, consents) => { + const generateConsentStringV1 = (data = {}, callback) => { + getVendorList((vendorList, err) => { if (err) { callback({}, false) } if (vendorList) { const { - vendorListVersion: consentsVendorListVersion, + persistedConsentData, + } = store; + + const allowedVendorIds = new Set(Object.keys(vendorList.vendors).map(v => parseInt(v, 10))); + + let selectedVendorIds = new Set(); + persistedConsentData.vendorConsents.forEach((hasConsent, id) => { + if (hasConsent) { + selectedVendorIds.add(id); + } + }); + + let selectedPurposeIds = new Set(); + persistedConsentData.purposeConsents.forEach((hasConsent, id) => { + if (hasConsent) { + selectedPurposeIds.add(id); + } + }); + + selectedVendorIds = data.selectedVendorIds ? data.selectedVendorIds : selectedVendorIds; + selectedPurposeIds = data.selectedPurposeIds ? data.selectedPurposeIds : selectedPurposeIds; + + const consentData = { + // ...persistedVendorConsentData, + vendorList, + ...data, + selectedVendorIds: new Set(arrayFrom(selectedVendorIds).filter(id => !allowedVendorIds.size || allowedVendorIds.has(id))), + selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)) + }; + + const valid = (data = {}) => [ + 'cmpId', 'cmpVersion', 'consentLanguage', 'consentScreen', 'cookieVersion', 'created', 'lastUpdated', + 'maxVendorId', 'selectedPurposeIds', 'selectedVendorIds', 'vendorListVersion' + ].every(prop => data.hasOwnProperty(prop)); + + callback(valid(consentData) ? encodeVendorConsentData(consentData) : undefined); + }}); + }; + + const getConsentObject = (callback, params) => { + getVendorList((vendorList, err) => { + if (err) { + callback({}, false) + } + if (vendorList) { + const { + vendorListVersion: paramsVendorListVersion, ...tcModelFields - } = consents; + } = params; const {persistedConsentData} = store; const {vendors} = vendorList; const globalVendorsObject = {}; @@ -72,7 +121,7 @@ const createCommands = (store) => { } vendorList.vendors = globalVendorsObject; - vendorList.vendorListVersion = consentsVendorListVersion; + vendorList.vendorListVersion = paramsVendorListVersion; const tcModel = new TCModel(new GVL(vendorList)); tcModel.cookieVersion = COOKIE_VERSION; @@ -80,12 +129,12 @@ const createCommands = (store) => { tcModel.cmpVersion = CMP_VERSION; tcModel.created = persistedConsentData && persistedConsentData.created || new Date(); tcModel.lastUpdated = persistedConsentData && persistedConsentData.lastUpdated || new Date(); - tcModel.vendorListVersion = tcModel.vendorListVersion_ = consentsVendorListVersion; + tcModel.vendorListVersion = tcModel.vendorListVersion_ = paramsVendorListVersion; tcModel.isServiceSpecific = true; tcModel.supportOOB = false; for (let key of Object.keys(tcModelFields)) { - tcModel[key] && tcModel[key].set(consents[key]); + tcModel[key] && tcModel[key].set(params[key]); } const encoded = TCString.encode(tcModel); @@ -125,6 +174,7 @@ const createCommands = (store) => { publisherCC, created, lastUpdated, + gdprApplies: config.gdprApplies, outOfBand: { allowedVendors: vectorToObject(vendorsAllowed), disclosedVendors: vectorToObject(vendorsDisclosed) @@ -147,8 +197,31 @@ const createCommands = (store) => { }) }; + const getConsentFieldsV1 = (callback, params) => { + const data = store.getConsentFieldsObject(); + const now = new Date(); + + generateConsentStringV1({ + created: now, + lastUpdated: now, + ...data, + ...params + }, (metadata) => { + + const consent = { + metadata: metadata, + gdprApplies: config.gdprApplies, + hasGlobalScope: config.storeConsentGlobally, + ...data + }; + + callback(consent, true); + }) + }; + return { - getConsentObject + getConsentObject, + getConsentFieldsV1 } }; diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 03446a8e..173891fc 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -2,6 +2,16 @@ import Promise from 'promise-polyfill'; import log from '../log'; import { TCString } from '@iabtcf/core'; +import { + padRight, + encodeVendorCookieValue, + decodeVendorCookieValue, + encodePublisherCookieValue, + decodePublisherCookieValue +} from './cookieutils'; +const arrayFrom = require('core-js/library/fn/array/from'); + + const CONSENT_COOKIE = 'adpconsent'; const CONSENT_COOKIE_MAX_AGE = 33696000; @@ -46,10 +56,81 @@ function writeConsentCookie(encodedConsent) { return Promise.resolve(writeCookie(CONSENT_COOKIE, encodedConsent, CONSENT_COOKIE_MAX_AGE, '/')); } +function encodePurposeIdsToBits(purposes, selectedPurposeIds = new Set()) { + const maxPurposeId = Math.max(0, + ...Object.values(purposes).map(({id}) => id), + ...arrayFrom(selectedPurposeIds)); + let purposeString = ''; + for (let id = 1; id <= maxPurposeId; id++) { + purposeString += (selectedPurposeIds.has(id) ? '1' : '0'); + } + return purposeString; +} + +function encodeVendorIdsToBits(maxVendorId, selectedVendorIds = new Set()) { + let vendorString = ''; + for (let id = 1; id <= maxVendorId; id++) { + vendorString += (selectedVendorIds.has(id) ? '1' : '0'); + } + return padRight(vendorString, Math.max(0, maxVendorId - vendorString.length)); +} + +function convertVendorsToRanges(maxVendorId, selectedIds) { + let range = []; + const ranges = []; + for (let id = 1; id <= maxVendorId; id++) { + if (selectedIds.has(id)) { + range.push(id); + } + + // If the range has ended or at the end of vendors add entry to the list + if ((!selectedIds.has(id) || id === maxVendorId) && range.length) { + const startVendorId = range.shift(); + const endVendorId = range.pop(); + range = []; + ranges.push({ + isRange: typeof endVendorId === 'number', + startVendorId, + endVendorId + }); + } + } + return ranges; +} + +function encodeVendorConsentData (vendorData) { + const {vendorList = {}, selectedPurposeIds, selectedVendorIds, maxVendorId} = vendorData; + const purposes = Object.values(vendorList.purposes); + + + // Encode the data with and without ranges and return the smallest encoded payload + const noRangesData = encodeVendorCookieValue({ + ...vendorData, + maxVendorId, + purposeIdBitString: encodePurposeIdsToBits(purposes, selectedPurposeIds), + isRange: false, + vendorIdBitString: encodeVendorIdsToBits(maxVendorId, selectedVendorIds) + }); + + const vendorRangeList = convertVendorsToRanges(maxVendorId, selectedVendorIds); + const rangesData = encodeVendorCookieValue({ + ...vendorData, + maxVendorId, + purposeIdBitString: encodePurposeIdsToBits(purposes, selectedPurposeIds), + isRange: true, + defaultConsent: false, + numEntries: vendorRangeList.length, + vendorRangeList + }); + + return noRangesData.length < rangesData.length ? noRangesData : rangesData; +} + export { writeCookie, decodeConsentData, encodeConsentData, readConsentCookie, writeConsentCookie, + encodeVendorConsentData }; From 989bf7e9dc14cdd2780acbbb0033ca4cc402e1b6 Mon Sep 17 00:00:00 2001 From: apocentek Date: Tue, 10 Mar 2020 16:26:22 +0100 Subject: [PATCH 231/540] some tests updated --- src/components/app.test.js | 12 +++++------ src/components/popup/details/details.test.js | 5 +++++ src/components/popup/popup.test.js | 21 ++++++++++++-------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/components/app.test.js b/src/components/app.test.js index 3e4d041f..565d73aa 100644 --- a/src/components/app.test.js +++ b/src/components/app.test.js @@ -25,18 +25,18 @@ describe('App', () => { it('should render app content', () => { - render(, scratch); + render(, scratch); expect(scratch.innerHTML).to.contain(style.gdpr); }); it('add a listener to the store to receive updates', () => { - const store = new Store(); + const store = new Store({cmpId: 280, cmpApi: {}}); render(, scratch); expect(store.listeners.size).to.equal(1); }); it('persist state on save', () => { - const store = new Store(); + const store = new Store({cmpId: 280, cmpApi: {}}); const notify = jest.fn(); store.persist = jest.fn(); store.toggleConsentToolShowing = jest.fn(); @@ -56,7 +56,7 @@ describe('App', () => { }); it('updates local state when store changes', () => { - const store = new Store(); + const store = new Store({cmpId: 280, cmpApi: {}}); let app; render( { ref={ref => app = ref} />, scratch); - expect(app.state.store.vendorConsentData.selectedVendorIds).to.deep.equal(new Set()); + expect(app.state.store.tcModel.vendorConsents.maxId).to.equal(0); store.selectVendor(1, true); - expect(app.state.store.vendorConsentData.selectedVendorIds).to.deep.equal(new Set([1])); + expect(app.state.store.tcModel.vendorConsents.maxId).to.equal(1); }); }); diff --git a/src/components/popup/details/details.test.js b/src/components/popup/details/details.test.js index 4c6b0c73..2f3bf9bf 100644 --- a/src/components/popup/details/details.test.js +++ b/src/components/popup/details/details.test.js @@ -15,6 +15,8 @@ describe('Details', () => { it('should render with purpose panel initially', () => { const store = new Store({ + cmpId: 280, + cmpApi: {}, vendorList: { purposes: [ { id: 1, name: 'Purpose 1' }, @@ -22,6 +24,7 @@ describe('Details', () => { ] } }); + store.isConsentToolShowing = false; const details =
    ; expect(details).to.contain(purposesStyle.purposes); @@ -30,6 +33,8 @@ describe('Details', () => { it('should switch between panel states', () => { const store = new Store({ + cmpId: 280, + cmpApi: {}, vendorList: { purposes: [ { id: 1, name: 'Purpose 1' }, diff --git a/src/components/popup/popup.test.js b/src/components/popup/popup.test.js index 5756e496..468a62a9 100644 --- a/src/components/popup/popup.test.js +++ b/src/components/popup/popup.test.js @@ -13,25 +13,28 @@ describe('Popup', () => { }); it('should render with overlay hidden', () => { - const store = new Store(); + const store = new Store({cmpId: 280, cmpApi: {}}); store.isConsentToolShowing = false; const popup = ; expect(popup).to.contain('display: none'); }); it('should render with overlay visible', () => { - const store = new Store(); + const store = new Store({cmpId: 280, cmpApi: {}}); store.isConsentToolShowing = true; const popup = ; expect(popup).to.contain('display: flex'); }); it('should handle accept all', (done) => { - const store = new Store(); + const store = new Store({cmpId: 280, cmpApi: {}}); + store.selectAllVendors = jest.fn(); + store.selectAllVendorLegitimateInterests = jest.fn(); store.selectAllPurposes = jest.fn(); - store.selectAllStandardPurposes = jest.fn(); - store.selectAllCustomPurposes = jest.fn(); + store.selectAllPurposesLegitimateInterests = jest.fn(); + store.selectAllSpecialFeatureOptIns = jest.fn(); + store.selectAllPublisherPurposes = jest.fn(); let popup; render( { ref={ref => popup = ref} onSave={() => { expect(store.selectAllVendors.mock.calls[0][0]).to.equal(true); + expect(store.selectAllVendorLegitimateInterests.mock.calls[0][0]).to.equal(true); expect(store.selectAllPurposes.mock.calls[0][0]).to.equal(true); - expect(store.selectAllStandardPurposes.mock.calls[0][0]).to.equal(true); - expect(store.selectAllCustomPurposes.mock.calls[0][0]).to.equal(true); + expect(store.selectAllPurposesLegitimateInterests.mock.calls[0][0]).to.equal(true); + expect(store.selectAllSpecialFeatureOptIns.mock.calls[0][0]).to.equal(true); + expect(store.selectAllPublisherPurposes.mock.calls[0][0]).to.equal(true); done(); }} />, scratch); @@ -50,7 +55,7 @@ describe('Popup', () => { }); it('should switch between panel states', () => { - const store = new Store(); + const store = new Store({cmpId: 280, cmpApi: {}}); let popup; render( Date: Tue, 10 Mar 2020 17:06:44 +0100 Subject: [PATCH 232/540] vendors.test updated --- .../popup/details/vendors/vendors.test.js | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index 3fc9e8cd..5ae093ff 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -100,6 +100,14 @@ describe('Vendors', () => { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + specialPurposes={[ + {id: 1, name: 'sPurpose 1'}, + {id: 2, name: 'sPurpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'sFeature 1'}, + {id: 2, name: 'sFeature 2'}, + ]} selectVendor={selectVendor} initialVendorsRejection={initialVendorsRejection} />, scratch); @@ -132,6 +140,14 @@ describe('Vendors', () => { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + specialPurposes={[ + {id: 1, name: 'sPurpose 1'}, + {id: 2, name: 'sPurpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'sFeature 1'}, + {id: 2, name: 'sFeature 2'}, + ]} selectVendors={selectVendors} initialVendorsRejection={initialVendorsRejection} />, scratch); @@ -164,6 +180,14 @@ describe('Vendors', () => { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + specialPurposes={[ + {id: 1, name: 'sPurpose 1'}, + {id: 2, name: 'sPurpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'sFeature 1'}, + {id: 2, name: 'sFeature 2'}, + ]} initialVendorsRejection={initialVendorsRejection} selectVendors={selectVendors} />, scratch); @@ -196,6 +220,14 @@ describe('Vendors', () => { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + specialPurposes={[ + {id: 1, name: 'sPurpose 1'}, + {id: 2, name: 'sPurpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'sFeature 1'}, + {id: 2, name: 'sFeature 2'}, + ]} initialVendorsRejection={initialVendorsRejection} selectVendors={selectVendors} />, scratch); @@ -228,6 +260,14 @@ describe('Vendors', () => { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + specialPurposes={[ + {id: 1, name: 'sPurpose 1'}, + {id: 2, name: 'sPurpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'sFeature 1'}, + {id: 2, name: 'sFeature 2'}, + ]} initialVendorsRejection={initialVendorsRejection} selectVendors={selectVendors} />, scratch); @@ -258,6 +298,14 @@ describe('Vendors', () => { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + specialPurposes={[ + {id: 1, name: 'sPurpose 1'}, + {id: 2, name: 'sPurpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'sFeature 1'}, + {id: 2, name: 'sFeature 2'}, + ]} selectedVendorIds={new Set([1, 2, 3, 4])} initialVendorsRejection={jest.fn()} />, scratch); @@ -285,6 +333,14 @@ describe('Vendors', () => { {id: 1, name: 'Feature 1'}, {id: 2, name: 'Feature 2'}, ]} + specialPurposes={[ + {id: 1, name: 'sPurpose 1'}, + {id: 2, name: 'sPurpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'sFeature 1'}, + {id: 2, name: 'sFeature 2'}, + ]} selectedVendorIds={new Set([1])} initialVendorsRejection={jest.fn()} />, scratch); From 189cd6a8768c331e4bddbcc3ddf0374631e9b49d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 11 Mar 2020 12:04:00 +0100 Subject: [PATCH 233/540] custom commands for getting consent string v1 --- src/lib/commands.js | 121 +++++++++++++++++++++++++-------------- src/lib/cookie/cookie.js | 20 +++---- src/lib/store.js | 30 ---------- 3 files changed, 85 insertions(+), 86 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 522997a2..f1d10e33 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -42,6 +42,35 @@ const createCommands = (store) => { return obj; }; + /** + * Build consent fields object v1 from data that has already been persisted. + */ + const getConsentFieldsObject = () => { + const { + persistedConsentData + } = store; + + const { + created = new Date(), + lastUpdated = new Date(), + cmpId_: cmpId = store.tcModel.cmpId, + cmpVersion_: cmpVersion = 1, + consentScreen_: consentScreen = store.tcModel.consentScreen, + consentLanguage_: consentLanguage = store.tcModel.consentLanguage, + vendorListVersion_: vendorListVersion, + } = persistedConsentData; + + return { + cmpId, + cmpVersion, + consentLanguage, + consentScreen, + created, + vendorListVersion, + lastUpdated, + }; + }; + const generateConsentStringV1 = (data = {}, callback) => { getVendorList((vendorList, err) => { @@ -53,30 +82,36 @@ const createCommands = (store) => { persistedConsentData, } = store; - const allowedVendorIds = new Set(Object.keys(vendorList.vendors).map(v => parseInt(v, 10))); - - let selectedVendorIds = new Set(); - persistedConsentData.vendorConsents.forEach((hasConsent, id) => { - if (hasConsent) { - selectedVendorIds.add(id); - } - }); - - let selectedPurposeIds = new Set(); - persistedConsentData.purposeConsents.forEach((hasConsent, id) => { - if (hasConsent) { - selectedPurposeIds.add(id); - } - }); + const { + created, + lastUpdated, + consentLanguage_: consentLanguage, + consentScreen_: consentScreen, + version_: version = 1, + cmpId_: cmpId = 280 + } = persistedConsentData; - selectedVendorIds = data.selectedVendorIds ? data.selectedVendorIds : selectedVendorIds; - selectedPurposeIds = data.selectedPurposeIds ? data.selectedPurposeIds : selectedPurposeIds; + const { + selectedVendorIds = [], + selectedPurposeIds = [], + maxVendorId, + cookieVersion, + vendorListVersion, + cmpVersion + } = data; const consentData = { - // ...persistedVendorConsentData, - vendorList, - ...data, - selectedVendorIds: new Set(arrayFrom(selectedVendorIds).filter(id => !allowedVendorIds.size || allowedVendorIds.has(id))), + cmpId, + maxVendorId, + cookieVersion, + cmpVersion, + vendorListVersion, + created, + lastUpdated, + consentLanguage, + consentScreen, + version, + selectedVendorIds: new Set(arrayFrom(selectedVendorIds)), selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)) }; @@ -89,6 +124,28 @@ const createCommands = (store) => { }}); }; + const getConsentFieldsV1 = (callback, params) => { + const data = getConsentFieldsObject(); + const now = new Date(); + + generateConsentStringV1({ + created: now, + lastUpdated: now, + ...data, + ...params + }, (metadata) => { + const consent = { + metadata: metadata, + gdprApplies: config.gdprApplies, + hasGlobalScope: config.storeConsentGlobally, + ...data, + vendorListVersion: params.vendorListVersion + }; + + callback(consent, true); + }) + }; + const getConsentObject = (callback, params) => { getVendorList((vendorList, err) => { if (err) { @@ -197,28 +254,6 @@ const createCommands = (store) => { }) }; - const getConsentFieldsV1 = (callback, params) => { - const data = store.getConsentFieldsObject(); - const now = new Date(); - - generateConsentStringV1({ - created: now, - lastUpdated: now, - ...data, - ...params - }, (metadata) => { - - const consent = { - metadata: metadata, - gdprApplies: config.gdprApplies, - hasGlobalScope: config.storeConsentGlobally, - ...data - }; - - callback(consent, true); - }) - }; - return { getConsentObject, getConsentFieldsV1 diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 173891fc..a53c66b1 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -1,19 +1,15 @@ import Promise from 'promise-polyfill'; import log from '../log'; import { TCString } from '@iabtcf/core'; - import { padRight, encodeVendorCookieValue, - decodeVendorCookieValue, - encodePublisherCookieValue, - decodePublisherCookieValue } from './cookieutils'; const arrayFrom = require('core-js/library/fn/array/from'); - const CONSENT_COOKIE = 'adpconsent'; const CONSENT_COOKIE_MAX_AGE = 33696000; +const MAX_PURPOSE_V1_ID = 5; function readCookie(name) { const value = `; ${document.cookie}`; @@ -56,10 +52,10 @@ function writeConsentCookie(encodedConsent) { return Promise.resolve(writeCookie(CONSENT_COOKIE, encodedConsent, CONSENT_COOKIE_MAX_AGE, '/')); } -function encodePurposeIdsToBits(purposes, selectedPurposeIds = new Set()) { +function encodePurposeIdsToBits(selectedPurposeIds = new Set()) { const maxPurposeId = Math.max(0, - ...Object.values(purposes).map(({id}) => id), - ...arrayFrom(selectedPurposeIds)); + ...arrayFrom(selectedPurposeIds), + MAX_PURPOSE_V1_ID); let purposeString = ''; for (let id = 1; id <= maxPurposeId; id++) { purposeString += (selectedPurposeIds.has(id) ? '1' : '0'); @@ -99,15 +95,13 @@ function convertVendorsToRanges(maxVendorId, selectedIds) { } function encodeVendorConsentData (vendorData) { - const {vendorList = {}, selectedPurposeIds, selectedVendorIds, maxVendorId} = vendorData; - const purposes = Object.values(vendorList.purposes); - + const { selectedPurposeIds, selectedVendorIds, maxVendorId } = vendorData; // Encode the data with and without ranges and return the smallest encoded payload const noRangesData = encodeVendorCookieValue({ ...vendorData, maxVendorId, - purposeIdBitString: encodePurposeIdsToBits(purposes, selectedPurposeIds), + purposeIdBitString: encodePurposeIdsToBits(selectedPurposeIds), isRange: false, vendorIdBitString: encodeVendorIdsToBits(maxVendorId, selectedVendorIds) }); @@ -116,7 +110,7 @@ function encodeVendorConsentData (vendorData) { const rangesData = encodeVendorCookieValue({ ...vendorData, maxVendorId, - purposeIdBitString: encodePurposeIdsToBits(purposes, selectedPurposeIds), + purposeIdBitString: encodePurposeIdsToBits(selectedPurposeIds), isRange: true, defaultConsent: false, numEntries: vendorRangeList.length, diff --git a/src/lib/store.js b/src/lib/store.js index e0cffa3d..bdee529f 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -254,36 +254,6 @@ export default class Store { }; }; - /** - * Build consent fields object from data that has already been persisted. - */ - getConsentFieldsObject = () => { - const { - persistedConsentData - } = this; - - const { - created, - lastUpdated, - cmpId_: cmpId, - cmpVersion_: cmpVersion, - consentScreen_: consentScreen, - consentLanguage_: consentLanguage, - vendorListVersion_: vendorListVersion, - version_: version - } = persistedConsentData; - - return { - cmpId, - cmpVersion, - consentLanguage, - consentScreen, - created, - vendorListVersion, - lastUpdated, - version - }; - }; /** * Persist all consent data to the cookie. This data will NOT be filtered * by the vendorList and will include global consents set no matter what From c4b616c87d75397478872fe2abca935037ea73d3 Mon Sep 17 00:00:00 2001 From: apocentek Date: Wed, 11 Mar 2020 14:04:16 +0100 Subject: [PATCH 234/540] purpose test rewritten --- .../popup/details/purposes/purposes.test.js | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/components/popup/details/purposes/purposes.test.js b/src/components/popup/details/purposes/purposes.test.js index c80afddd..c0173521 100644 --- a/src/components/popup/details/purposes/purposes.test.js +++ b/src/components/popup/details/purposes/purposes.test.js @@ -13,8 +13,7 @@ describe('Purposes and Features', () => { }); it('should render all standard, custom purposes for publisher and purposes and features for vendors', () => { - let persistedVendorConsentData = {}; - let persistedPublisherConsentData = {}; + let persistedConsentData = {}; const selectPurpose = jest.fn(); let purposesRef; const purposes = render( { customPurposes = {[ { id: 1, name: 'Custom Purpose 1' }, ]} - persistedVendorConsentData={persistedVendorConsentData} - persistedPublisherConsentData={persistedPublisherConsentData} + persistedConsentData={persistedConsentData} selectPurpose={selectPurpose} />, scratch); @@ -46,8 +44,7 @@ describe('Purposes and Features', () => { it('should select a standard purpose', () => { const selectPurpose = jest.fn(); const selectCustomPurpose = jest.fn(); - let persistedVendorConsentData = {}; - let persistedPublisherConsentData = {}; + let persistedConsentData = {}; let purposes; render( purposes = ref} @@ -57,8 +54,7 @@ describe('Purposes and Features', () => { ]} selectPurpose={selectPurpose} selectCustomPurpose={selectCustomPurpose} - persistedVendorConsentData={persistedVendorConsentData} - persistedPublisherConsentData={persistedPublisherConsentData} + persistedConsentData={persistedConsentData} />, scratch); purposes.handleSelectPurpose({isSelected: true, dataId: 0}); @@ -68,13 +64,14 @@ describe('Purposes and Features', () => { expect(selectCustomPurpose.mock.calls).to.be.empty; }); - it('should select a custom purpose', () => { + it('should select publisher custom purpose', () => { const selectPurpose = jest.fn(); - const selectCustomPurpose = jest.fn(); + const selectPublisherCustomPurpose = jest.fn(); + const selectPublisherPurpose = jest.fn(); + let purposes; - let persistedVendorConsentData = {}; - let persistedPublisherConsentData = {}; + let persistedConsentData = {}; render( purposes = ref} purposes={[ @@ -85,26 +82,27 @@ describe('Purposes and Features', () => { { id: 1, name: 'Custom Purpose 1' }, ]} selectPurpose={selectPurpose} - selectCustomPurpose={selectCustomPurpose} - persistedVendorConsentData={persistedVendorConsentData} - persistedPublisherConsentData={persistedPublisherConsentData} + selectPublisherCustomPurpose={selectPublisherCustomPurpose} + selectPublisherPurpose={selectPublisherPurpose} + + persistedConsentData={persistedConsentData} />, scratch); - purposes.handleSelectPurpose({isSelected: true, dataId: 2}); - purposes.handleSelectPurpose({isSelected: true, dataId: 1}); + purposes.handleSelectPurpose({isSelected: true, dataId: 2}, true, false); + purposes.handleSelectPurpose({isSelected: true, dataId: 1}, true, false); - expect(selectCustomPurpose.mock.calls[0][0]).to.equal(1); - expect(selectCustomPurpose.mock.calls[0][1]).to.equal(true); - expect(selectPurpose.mock.calls).not.to.be.empty; + expect(selectPublisherCustomPurpose.mock.calls[0][0]).to.equal(1); + expect(selectPublisherCustomPurpose.mock.calls[0][1]).to.equal(true); + expect(selectPurpose.mock.calls).to.be.empty; }); it('after selecting group of purposes with index 1, consent for those purposes should be withdrawn', () => { const selectPurpose = jest.fn(); - const selectCustomPurpose = jest.fn(); + const selectPublisherCustomPurpose = jest.fn(); let purposes; - let persistedVendorConsentData = {}; - let persistedPublisherConsentData = {}; + let persistedConsentData = {}; + render( purposes = ref} purposes={[ @@ -112,15 +110,16 @@ describe('Purposes and Features', () => { { id: 2, name: 'Purpose 2' } ]} selectPurpose={selectPurpose} - selectCustomPurpose={selectCustomPurpose} - persistedVendorConsentData={persistedVendorConsentData} - persistedPublisherConsentData={persistedPublisherConsentData} + selectPublisherCustomPurpose={selectPublisherCustomPurpose} + + persistedConsentData={persistedConsentData} + />, scratch); purposes.componentDidUpdate = () => { expect(selectPurpose.mock.calls[1][0]).to.equal(2); expect(selectPurpose.mock.calls[1][1]).to.equal(false); - expect(selectCustomPurpose.mock.calls).to.be.empty; + expect(selectPublisherCustomPurpose.mock.calls).to.be.empty; }; purposes.handleSelectTab(1)(); }); @@ -128,8 +127,8 @@ describe('Purposes and Features', () => { it('should deselect default selection of legitimate interest', () => { const isLegitimateInterestActive = true; const onToggleLegitInterest = jest.fn(); - let persistedVendorConsentData = {}; - let persistedPublisherConsentData = {}; + const selectPurposeLegitimateInterests = jest.fn(); + let persistedConsentData = {}; let purposes; render( { ]} isLegitimateInterestActive={isLegitimateInterestActive} onToggleLegitInterest={onToggleLegitInterest} - persistedVendorConsentData={persistedVendorConsentData} - persistedPublisherConsentData={persistedPublisherConsentData} + selectPurposeLegitimateInterests={selectPurposeLegitimateInterests} + persistedConsentData={persistedConsentData} + />, scratch); purposes.handleSelectLegitInterest({isSelected: false, dataId: 2}); purposes.handleSelectLegitInterest({isSelected: false, dataId: 1}); - expect(purposes.state.legitInterestList[1]).to.equal(false); - expect(purposes.state.legitInterestList[2]).to.equal(false); + expect(selectPurposeLegitimateInterests.mock.calls[0][1]).to.equal(false); + expect(selectPurposeLegitimateInterests.mock.calls[1][1]).to.equal(false); }); }); From 2e0b431a32673ce3c909e37670e96d8efcfbfbf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 11 Mar 2020 14:15:42 +0100 Subject: [PATCH 235/540] reorganized --- src/index.js | 79 +++++++++++++++++++++++++++++++++++++++++++-- src/lib/commands.js | 20 +++++++++--- src/lib/init.js | 64 +----------------------------------- src/lib/store.js | 12 ++++--- 4 files changed, 101 insertions(+), 74 deletions(-) diff --git a/src/index.js b/src/index.js index 7a0a54a9..845d2beb 100755 --- a/src/index.js +++ b/src/index.js @@ -6,10 +6,85 @@ import 'core-js/fn/array/filter'; import 'core-js/fn/set'; import {init} from './lib/init'; import { CMP_GLOBAL_NAME } from './lib/cmp'; +import log from "./lib/log"; +import config from "./lib/config"; +import { decodeConsentData } from "./lib/cookie/cookie"; + +function handleConsentResult(cmp, store = {}, vendorList, consentData = {}) { + const { isConsentToolShowing } = store; + + const { + vendorListVersion: listVersion, + tcfPolicyVersion: listPolicyVersion = 1 + } = vendorList; + + const { + created, + vendorListVersion, + policyVersion: consentPolicyVersion = 1 + } = consentData; + + if (!created) { + log.debug('No consent data found. Showing consent tool'); + config.autoDisplay && cmp('showConsentTool'); + } else if (!listVersion) { + log.debug('Could not determine vendor list version. Not showing consent tool'); + } else if (vendorListVersion !== listVersion) { + log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); + config.autoDisplay && cmp('showConsentTool'); + } else if (consentPolicyVersion !== listPolicyVersion) { + log.debug(`Consent found for policy ${consentPolicyVersion}, but received vendor list with policy ${consentPolicyVersion}. Showing consent tool`); + config.autoDisplay && cmp('showConsentTool'); + } else { + log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); + !isConsentToolShowing && config.autoDisplay && cmp('showFooter'); + } +} + +function checkConsent(cmp, store) { + if (!cmp) { + log.error('CMP failed to load'); + } + else if (!window.navigator.cookieEnabled) { + log.warn('Cookies are disabled. Ignoring CMP consent check'); + } + else { + // config.getVendorList + __tcfapi('getVendorList', 2, (vendorList, success) => { + if (success) { + const timeout = setTimeout(() => { + handleConsentResult(cmp, store, vendorList); + }, 100); + + // config.getTCData + __tcfapi('getTCData', 2, (tcData, success) => { + if (success) { + let tcStringDecoded; + + try { + tcStringDecoded = decodeConsentData(tcData.tcString); + } catch (e) { + // error ocurred during decoding TCString + } finally { + clearTimeout(timeout); + handleConsentResult(cmp, store, vendorList, tcStringDecoded); + } + } + }); + } + }); + } +} function start() { - const {config} = window[CMP_GLOBAL_NAME] || {}; - init(config); + // Preserve any config options already set + const { config } = window[CMP_GLOBAL_NAME] || {}; + const configUpdates = { + globalConsentLocation: 'https://rasp.mgr.consensu.org/portal.html', + ...config + }; + + init(configUpdates).then((store) => checkConsent(window.__cmp, store)); } start(); diff --git a/src/lib/commands.js b/src/lib/commands.js index f1d10e33..bb7eecdd 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -1,6 +1,10 @@ -import { TCModel, GVL, TCString } from "@iabtcf/core"; +import { TCModel, GVL } from "@iabtcf/core"; import config from "./config"; -import { encodeVendorConsentData } from "./cookie/cookie"; +import { + encodeVendorConsentData, + encodeConsentData, + decodeConsentData +} from "./cookie/cookie"; const arrayFrom = require('core-js/library/fn/array/from'); const COOKIE_VERSION = 2; @@ -194,8 +198,8 @@ const createCommands = (store) => { tcModel[key] && tcModel[key].set(params[key]); } - const encoded = TCString.encode(tcModel); - const decoded = TCString.decode(encoded); + const encoded = encodeConsentData(tcModel); + const decoded = decodeConsentData(encoded); const { cmpId, @@ -248,7 +252,13 @@ const createCommands = (store) => { publisher: { consents: vectorToObject(publisherConsents), legitimateInterests: vectorToObject(publisherLegitimateInterests) - } + }, + customPurposes: { + purposes: {}, + legitimateInterests: {} + }, + restrictions: {}, + listenerId: undefined }, true); } }) diff --git a/src/lib/init.js b/src/lib/init.js index 93c5ad42..b75fc876 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -2,7 +2,6 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; import Cmp, { CMP_GLOBAL_NAME } from './cmp'; -import { TCString } from "@iabtcf/core"; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; @@ -15,57 +14,6 @@ const CMP_VERSION = 2; const CMP_ID = 280; const COOKIE_VERSION = 2; -function handleConsentResult(cmp, {isConsentToolShowing}, {vendorListVersion: listVersion, tcfPolicyVersion: listPolicyVersion = 1} = {}, {created, vendorListVersion, policyVersion: consentPolicyVersion = 1} = {}) { - if (!created) { - log.debug('No consent data found. Showing consent tool'); - config.autoDisplay && cmp('showConsentTool'); - } else if (!listVersion) { - log.debug('Could not determine vendor list version. Not showing consent tool'); - } else if (vendorListVersion !== listVersion) { - log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); - config.autoDisplay && cmp('showConsentTool'); - } else if (consentPolicyVersion !== listPolicyVersion) { - log.debug(`Consent found for policy ${consentPolicyVersion}, but received vendor list with policy ${consentPolicyVersion}. Showing consent tool`); - config.autoDisplay && cmp('showConsentTool'); - } else { - log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); - !isConsentToolShowing && config.autoDisplay && cmp('showFooter'); - } -} - -function checkConsent(cmp, store) { - if (!cmp) { - log.error('CMP failed to load'); - } - else if (!window.navigator.cookieEnabled) { - log.warn('Cookies are disabled. Ignoring CMP consent check'); - } - else { - __tcfapi('getVendorList', 2, (vendorList, success) => { - if (success) { - const timeout = setTimeout(() => { - handleConsentResult(cmp, store, vendorList); - }, 100); - - __tcfapi('getTCData', 2, (tcData, success) => { - if (success) { - let tcStringDecoded; - - try { - tcStringDecoded = TCString.decode(tcData.tcString); - } catch (e) { - // error ocurred during decoding TCString - } finally { - clearTimeout(timeout); - handleConsentResult(cmp, store, vendorList, tcStringDecoded); - } - } - }); - } - }); - } -} - function readExternalConsentData(config) { return new Promise((resolve, reject) => { try { @@ -86,7 +34,7 @@ function readExternalConsentData(config) { }); } -export function init(configUpdates) { +export function init (configUpdates) { config.update(configUpdates); log.debug('Using configuration:', config); @@ -152,13 +100,3 @@ export function init(configUpdates) { log.error('Failed to load CMP', err); }); } - -// Preserve any config options already set -const {config: configuration} = window[CMP_GLOBAL_NAME] || {}; -const configUpdates = { - globalConsentLocation: 'https://rasp.mgr.consensu.org/portal.html', - ...configuration -}; - -init(configUpdates).then((store) => checkConsent(window.__cmp, store)); - diff --git a/src/lib/store.js b/src/lib/store.js index bdee529f..8db0fcb6 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -1,8 +1,12 @@ -import { writeConsentCookie } from "./cookie/cookie"; +import { + writeConsentCookie, + decodeConsentData, + encodeConsentData +} from "./cookie/cookie"; import config from './config'; import { findLocale } from './localize'; import log from './log'; -import { GVL, TCModel, TCString, Vector } from '@iabtcf/core'; +import { GVL, TCModel, Vector } from '@iabtcf/core'; export const SECTION_INTRO = 0; export const SECTION_DETAILS = 1; @@ -274,7 +278,7 @@ export default class Store { tcModel.lastUpdated = now; tcModel.vendorListVersion = vendorListVersion; - let encodedConsent = TCString.encode(this.tcModel); + let encodedConsent = encodeConsentData(this.tcModel); if (config.setConsentData) { let consentData = { @@ -294,7 +298,7 @@ export default class Store { writeConsentCookie(encodedConsent); } - this.persistedConsentData = TCString.decode(encodedConsent); + this.persistedConsentData = decodeConsentData(encodedConsent); this.cmpApi.tcModel = this.tcModel; // Notify of date changes From 54a18f309e1f1ee9646657026dc96a01eb98d5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 11 Mar 2020 15:40:09 +0100 Subject: [PATCH 236/540] customPurposes and restrictions inside publisher object --- src/lib/commands.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index bb7eecdd..f1a04497 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -251,13 +251,13 @@ const createCommands = (store) => { specialFeatureOptins: vectorToObject(specialFeatureOptIns), publisher: { consents: vectorToObject(publisherConsents), - legitimateInterests: vectorToObject(publisherLegitimateInterests) + legitimateInterests: vectorToObject(publisherLegitimateInterests), + customPurposes: { + purposes: {}, + legitimateInterests: {} + }, + restrictions: {}, }, - customPurposes: { - purposes: {}, - legitimateInterests: {} - }, - restrictions: {}, listenerId: undefined }, true); } From cc18d3c227efc35afbb8c2534ec0ac6005cb6c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 11 Mar 2020 17:37:07 +0100 Subject: [PATCH 237/540] integration with init --- src/index.js | 47 ++++++++++++++++++++-------------------- src/lib/commands.js | 46 +++++++++++++++++++-------------------- src/lib/config.js | 5 ++++- src/lib/cookie/cookie.js | 2 +- src/lib/init.js | 2 +- src/lib/store.js | 5 +---- src/lib/vendor.js | 2 +- 7 files changed, 55 insertions(+), 54 deletions(-) diff --git a/src/index.js b/src/index.js index 845d2beb..552a50d2 100755 --- a/src/index.js +++ b/src/index.js @@ -5,11 +5,12 @@ import 'core-js/fn/array/for-each'; import 'core-js/fn/array/filter'; import 'core-js/fn/set'; import {init} from './lib/init'; -import { CMP_GLOBAL_NAME } from './lib/cmp'; import log from "./lib/log"; import config from "./lib/config"; import { decodeConsentData } from "./lib/cookie/cookie"; +const TCF_CONFIG = '__tcfConfig'; + function handleConsentResult(cmp, store = {}, vendorList, consentData = {}) { const { isConsentToolShowing } = store; @@ -49,36 +50,36 @@ function checkConsent(cmp, store) { log.warn('Cookies are disabled. Ignoring CMP consent check'); } else { - // config.getVendorList - __tcfapi('getVendorList', 2, (vendorList, success) => { - if (success) { - const timeout = setTimeout(() => { - handleConsentResult(cmp, store, vendorList); - }, 100); + const { getVendorList, getTCData } = config; - // config.getTCData - __tcfapi('getTCData', 2, (tcData, success) => { - if (success) { - let tcStringDecoded; + if (getVendorList) { + getVendorList((err, vendorList) => { + if (err) { + log.error('Failed to get vendor list'); + } else { + const timeout = setTimeout(() => { + handleConsentResult(cmp, store, vendorList); + }, 100); - try { - tcStringDecoded = decodeConsentData(tcData.tcString); - } catch (e) { - // error ocurred during decoding TCString - } finally { - clearTimeout(timeout); - handleConsentResult(cmp, store, vendorList, tcStringDecoded); - } + if (getTCData) { + getTCData((tcData, success) => { + if (success) { + let tcStringDecoded = decodeConsentData(tcData.tcString); + clearTimeout(timeout); + handleConsentResult(cmp, store, vendorList, tcStringDecoded); + } + }) } - }); - } - }); + } + }); + } } } function start() { // Preserve any config options already set - const { config } = window[CMP_GLOBAL_NAME] || {}; + const config = window[TCF_CONFIG] || {}; + const configUpdates = { globalConsentLocation: 'https://rasp.mgr.consensu.org/portal.html', ...config diff --git a/src/lib/commands.js b/src/lib/commands.js index f1a04497..888d04df 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -21,17 +21,17 @@ const createCommands = (store) => { vendorList = JSON.parse(JSON.stringify(store.vendorList)); callback(vendorList); } else { - const {getVendorList} = config; + const { getVendorList } = config; if (getVendorList) { getVendorList((err, data) => { if (err) { - callback({}, err) + callback({}, err); } else { vendorList = data; - callback(vendorList) + callback(vendorList); } - }) + }); } } }; @@ -40,7 +40,7 @@ const createCommands = (store) => { let obj = {}; set.forEach((hasConsent, id) => { - obj[id] = hasConsent + obj[id] = hasConsent; }); return obj; @@ -79,7 +79,7 @@ const createCommands = (store) => { getVendorList((vendorList, err) => { if (err) { - callback({}, false) + callback({}, false); } if (vendorList) { const { @@ -133,27 +133,27 @@ const createCommands = (store) => { const now = new Date(); generateConsentStringV1({ - created: now, - lastUpdated: now, + created: now, + lastUpdated: now, + ...data, + ...params + }, (metadata) => { + const consent = { + metadata, + gdprApplies: config.gdprApplies, + hasGlobalScope: config.storeConsentGlobally, ...data, - ...params - }, (metadata) => { - const consent = { - metadata: metadata, - gdprApplies: config.gdprApplies, - hasGlobalScope: config.storeConsentGlobally, - ...data, - vendorListVersion: params.vendorListVersion - }; + vendorListVersion: params.vendorListVersion + }; - callback(consent, true); - }) + callback(consent, true); + }); }; const getConsentObject = (callback, params) => { getVendorList((vendorList, err) => { if (err) { - callback({}, false) + callback({}, false); } if (vendorList) { const { @@ -178,7 +178,7 @@ const createCommands = (store) => { legIntPurposes: vendor.legIntPurposes, features: vendor.features, specialFeatures: vendor.specialFeatures - } + }; } vendorList.vendors = globalVendorsObject; @@ -261,13 +261,13 @@ const createCommands = (store) => { listenerId: undefined }, true); } - }) + }); }; return { getConsentObject, getConsentFieldsV1 - } + }; }; export default createCommands; diff --git a/src/lib/config.js b/src/lib/config.js index 3cdd8e1e..fa60b4a4 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,13 +6,16 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - logging: false, + logging: true, localization: {}, forceLocale: null, gdprApplies: true, getConsentData: null, setConsentData: null, getVendorList: null, + decoratePageCallHandler: null, + getTCData: null, + onConsentToolShowing: null, legIntPurposeIds: [], contractPurposeIds: [], autoDisplay: true, diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index a53c66b1..329cd473 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -30,7 +30,7 @@ function decodeConsentData (encoded) { try { decoded = TCString.decode(encoded); } catch (e) { - log.debug('Consent string not compatible with TCF v2.0') + log.debug('Consent string not compatible with TCF v2.0'); } return decoded; } diff --git a/src/lib/init.js b/src/lib/init.js index b75fc876..68431b85 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -22,7 +22,7 @@ function readExternalConsentData(config) { reject(err); } else { try { - resolve(data.vendor && decodeConsentData(data.vendor) || undefined); + resolve(data.consent && decodeConsentData(data.consent) || undefined); } catch (err) { reject(err); } diff --git a/src/lib/store.js b/src/lib/store.js index 8db0fcb6..23c7393a 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -281,10 +281,7 @@ export default class Store { let encodedConsent = encodeConsentData(this.tcModel); if (config.setConsentData) { - let consentData = { - vendor: encodedConsent, - publisher: 'aaa' - }; + let consentData = encodedConsent; try { config.setConsentData(consentData, err => { if (err) { diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 1f8b1fca..16eaf9bf 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -25,7 +25,7 @@ function fetch(url) { * Fetch the global vendor list if the location is configured */ function fetchGlobalVendorList() { - const {globalVendorListLocation, getVendorList} = config; + const { globalVendorListLocation, getVendorList } = config; if (getVendorList) { return new Promise((resolve, reject) => { try { From 1e62d4cddfeebb1393626fb689185a5406d29ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 11 Mar 2020 17:38:31 +0100 Subject: [PATCH 238/540] logging: false --- src/lib/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/config.js b/src/lib/config.js index fa60b4a4..99d6f2bf 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,7 +6,7 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - logging: true, + logging: false, localization: {}, forceLocale: null, gdprApplies: true, From 88607a95d995c0326bc2f6ce3b3218d031a0b948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 12 Mar 2020 12:22:21 +0100 Subject: [PATCH 239/540] removed import --- src/lib/cmp.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 237d59ba..72cd71e6 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -2,7 +2,6 @@ import log from './log'; import config from './config'; import { encodeVendorConsentData, - encodePublisherConsentData } from './cookie/cookie'; import { SECTION_DETAILS, From f82b31d093606186239173a40e572b7645edabed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 12 Mar 2020 13:59:37 +0100 Subject: [PATCH 240/540] copying vector --- src/lib/store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 23c7393a..1b13ce99 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -23,8 +23,8 @@ function copyData(dataObject) { } const copy = {...dataObject}; for (let key in copy) { - if (copy.hasOwnProperty(key) && copy[key] instanceof Set) { - copy[key] = new Set(copy[key]); + if (copy.hasOwnProperty(key) && copy[key] instanceof Vector) { + copy[key] = new Vector(copy[key]); } } return copy; From 7d41f970ed9af14c262fe2967d7c6b6e6e7e0547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 12 Mar 2020 14:09:08 +0100 Subject: [PATCH 241/540] getConsentObject - getting values directly from tcModel --- src/lib/commands.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 888d04df..7eb26a5e 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -3,7 +3,6 @@ import config from "./config"; import { encodeVendorConsentData, encodeConsentData, - decodeConsentData } from "./cookie/cookie"; const arrayFrom = require('core-js/library/fn/array/from'); @@ -199,7 +198,6 @@ const createCommands = (store) => { } const encoded = encodeConsentData(tcModel); - const decoded = decodeConsentData(encoded); const { cmpId, @@ -221,7 +219,7 @@ const createCommands = (store) => { specialFeatureOptIns, created, lastUpdated - } = decoded; + } = tcModel; callback({ tcString: encoded, From c183efa8a4920ab50f7555999ba36b7e85f530eb Mon Sep 17 00:00:00 2001 From: apocentek Date: Thu, 12 Mar 2020 14:13:36 +0100 Subject: [PATCH 242/540] vendors.test for legitInterest --- .../popup/details/vendors/vendors.test.js | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/components/popup/details/vendors/vendors.test.js b/src/components/popup/details/vendors/vendors.test.js index 5ae093ff..807c408f 100644 --- a/src/components/popup/details/vendors/vendors.test.js +++ b/src/components/popup/details/vendors/vendors.test.js @@ -348,4 +348,44 @@ describe('Vendors', () => { const result = vendors.isFullVendorsConsentChosen(); expect(result).to.equal(false); }); + + it('should handle deselecting a legitimate interest', () => { + const selectVendorLegitimateInterests = jest.fn(); + const initialVendorsRejection = jest.fn(); + + let vendors; + render( vendors = ref} + vendors={[ + {id: 1, name: 'Vendor 1', purposeIds: [1], legIntPurposeIds: [2], featureIds: []}, + {id: 2, name: 'Vendor 2', purposeIds: [], legIntPurposeIds: [1], featureIds: []}, + {id: 3, name: 'Vendor 3', purposeIds: [1], legIntPurposeIds: [2], featureIds: [1]}, + {id: 4, name: 'Vendor 4', purposeIds: [2], legIntPurposeIds: [1], featureIds: [1, 2]} + ]} + purposes={[ + {id: 1, name: 'Purpose 1'}, + {id: 2, name: 'Purpose 2'}, + ]} + features={[ + {id: 1, name: 'Feature 1'}, + {id: 2, name: 'Feature 2'}, + ]} + specialPurposes={[ + {id: 1, name: 'sPurpose 1'}, + {id: 2, name: 'sPurpose 2'}, + ]} + specialFeatures={[ + {id: 1, name: 'sFeature 1'}, + {id: 2, name: 'sFeature 2'}, + ]} + selectVendorLegitimateInterests={selectVendorLegitimateInterests} + initialVendorsRejection={initialVendorsRejection} + + />, scratch); + + vendors.handleMoreChoices(); + vendors.handleLegitInterest({dataId: 2, isSelected: false}); + expect(selectVendorLegitimateInterests.mock.calls[0][0]).to.equal(2); + expect(selectVendorLegitimateInterests.mock.calls[0][1]).to.equal(false); + }); }); From 838bf70dbff7cc616cb3a39873bdb105c873d73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 12 Mar 2020 17:11:00 +0100 Subject: [PATCH 243/540] cookie test --- src/lib/cookie/cookie.test.js | 492 ++++++++++++++++++++-------------- 1 file changed, 295 insertions(+), 197 deletions(-) diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index 711c46c0..0035252e 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -1,73 +1,207 @@ -/* eslint-disable max-nested-callbacks */ +// /* eslint-disable max-nested-callbacks */ import { expect } from 'chai'; -import customPurposeList from '../../docs/assets/purposes.json'; -import config from '../config'; import { writeCookie, - encodeVendorConsentData, - decodeVendorConsentData, - encodePublisherConsentData, - decodePublisherConsentData, - writeVendorConsentCookie, - writePublisherConsentCookie, - readPublisherConsentCookie, - readVendorConsentCookie, convertVendorsToRanges, - PUBLISHER_CONSENT_COOKIE_NAME, - VENDOR_CONSENT_COOKIE_NAME + decodeConsentData, + encodeConsentData, + writeConsentCookie, + readConsentCookie, + CONSENT_COOKIE } from './cookie'; +import { GVL, TCModel } from "@iabtcf/core"; +import Promise from "promise-polyfill"; jest.mock('../portal'); const mockPortal = require('../portal'); const vendorList = { - "version": 1, - "origin": "http://ib.adnxs.com/vendors.json", - "purposes": [ - { + "gvlSpecificationVersion": 2, + "vendorListVersion": 100, + "globalVendorListVersion": 27, + "tcfPolicyVersion": 2, + "lastUpdated": "2020-03-03T15:37:46.511752+00:00", + "purposes": { + "1": { + "id": 1, + "name": "Store and/or access information on a device", + "description": "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", + "descriptionLegal": "Vendors can: \\n* Store and access information on the device such as cookies and device identifiers presented to a user." + }, + "2": { + "id": 2, + "name": "Select basic ads", + "description": "Ads can be shown to you based on the content you\u2019re viewing, the app you\u2019re using, your approximate location, or your device type.", + "descriptionLegal": "To do basic ad selection vendors can:\\n* Use real-time information about the context in which the ad will be shown, to show the ad, including information about the content and the device, such as: device type and capabilities, user agent, URL, IP address\\n* Use a user\u2019s non-precise geolocation data\\n* Control the frequency of ads shown to a user.\\n* Sequence the order in which ads are shown to a user.\\n* Prevent an ad from serving in an unsuitable editorial (brand-unsafe) context\\nVendors cannot:\\n* Create a personalised ads profile using this information for the selection of future ads.\\n* N.B. Non-precise means only an approximate location involving at least a radius of 500 meters is permitted." + }, + "3": { + "id": 3, + "name": "Create a personalised ads profile", + "description": "A profile can be built about you and your interests to show you personalised ads that are relevant to you.", + "descriptionLegal": "To create a personalised ads profile vendors can:\\n* Collect information about a user, including a user's activity, interests, demographic information, or location, to create or edit a user profile for use in personalised advertising.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalised advertising." + }, + "4": { + "id": 4, + "name": "Select personalised ads", + "description": "Personalised ads can be shown to you based on a profile about you.", + "descriptionLegal": "To select personalised ads vendors can:\\n* Select personalised ads based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." + }, + "5": { + "id": 5, + "name": "Create a personalised content profile", + "description": "A profile can be built about you and your interests to show you personalised content that is relevant to you.", + "descriptionLegal": "To create a personalised content profile vendors can:\\n* Collect information about a user, including a user's activity, interests, visits to sites or apps, demographic information, or location, to create or edit a user profile for personalising content.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalising content." + }, + "6": { + "id": 6, + "name": "Select personalised content", + "description": "Personalised content can be shown to you based on a profile about you.", + "descriptionLegal": "To select personalised content vendors can:\\n* Select personalised content based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." + }, + "7": { + "id": 7, + "name": "Measure ad performance", + "description": "The performance and effectiveness of ads that you see or interact with can be measured.", + "descriptionLegal": "To measure ad performance vendors can:\\n* Measure whether and how ads were delivered to and interacted with by a user\\n* Provide reporting about ads including their effectiveness and performance\\n* Provide reporting about users who interacted with ads using data observed during the course of the user's interaction with that ad\\n* Provide reporting to publishers about the ads displayed on their property\\n* Measure whether an ad is serving in a suitable editorial environment (brand-safe) context\\n* Determine the percentage of the ad that had the opportunity to be seen and the duration of that opportunity\\n* Combine this information with other information previously collected, including from across websites and apps\\nVendors cannot:\\n*Apply panel- or similarly-derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" + }, + "8": { + "id": 8, + "name": "Measure content performance", + "description": "The performance and effectiveness of content that you see or interact with can be measured.", + "descriptionLegal": "To measure content performance vendors can:\\n* Measure and report on how content was delivered to and interacted with by users.\\n* Provide reporting, using directly measurable or known information, about users who interacted with the content\\n* Combine this information with other information previously collected, including from across websites and apps.\\nVendors cannot:\\n* Measure whether and how ads (including native ads) were delivered to and interacted with by a user.\\n* Apply panel- or similarly derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" + }, + "9": { + "id": 9, + "name": "Apply market research to generate audience insights", + "description": "Market research can be used to learn more about the audiences who visit sites/apps and view ads.", + "descriptionLegal": "To apply market research to generate audience insights vendors can:\\n* Provide aggregate reporting to advertisers or their representatives about the audiences reached by their ads, through panel-based and similarly derived insights.\\n* Provide aggregate reporting to publishers about the audiences that were served or interacted with content and/or ads on their property by applying panel-based and similarly derived insights.\\n* Associate offline data with an online user for the purposes of market research to generate audience insights if vendors have declared to match and combine offline data sources (Feature 1)\\n* Combine this information with other information previously collected including from across websites and apps. \\nVendors cannot:\\n* Measure the performance and effectiveness of ads that a specific user was served or interacted with, without a Legal Basis to measure ad performance.\\n* Measure which content a specific user was served and how they interacted with it, without a Legal Basis to measure content performance." + }, + "10": { + "id": 10, + "name": "Develop and improve products", + "description": "Your data can be used to improve existing systems and software, and to develop new products", + "descriptionLegal": "To develop new products and improve products vendors can:\\n* Use information to improve their existing products with new features and to develop new products\\n* Create new models and algorithms through machine learning\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" + } + }, + "specialPurposes": { + "1": { + "id": 1, + "name": "Match and combine offline data sources", + "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", + "descriptionLegal": "To ensure security, prevent fraud and debug vendors can:\\n* Ensure data are securely transmitted\\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose." + }, + "2": { + "id": 2, + "name": "Link different devices", + "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", + "descriptionLegal": "To deliver information and respond to technical requests vendors can:\\n* Use a user\u2019s IP address to deliver an ad over the internet\\n* Respond to a user\u2019s interaction with an ad by sending the user to a landing page\\n* Use a user\u2019s IP address to deliver content over the internet\\n* Respond to a user\u2019s interaction with content by sending the user to a landing page\\n* Use information about the device type and capabilities for delivering ads or content, for example, to deliver the right size ad creative or video file in a format supported by the device\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" + } + }, + "features": { + "1": { + "id": 1, + "name": "Match and combine offline data sources", + "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", + "descriptionLegal": "Vendors can:\\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes." + }, + "2": { + "id": 2, + "name": "Link different devices", + "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", + "descriptionLegal": "Vendors can:\\n* Deterministically determine that two or more devices belong to the same user or household\\n* Probabilistically determine that two or more devices belong to the same user or household\\n* Actively scan device characteristics for identification for probabilistic identification if users have allowed vendors to actively scan device characteristics for identification (Special Feature 2)" + }, + "3": { + "id": 3, + "name": "Receive and use automatically-sent device characteristics for identification", + "description": "Your device might be distinguished from other devices based on information it automatically sends, such as IP address or browser type.", + "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected automatically from a device for specific characteristics, e.g. IP address, user-agent string.\\n* Use such an identifier to attempt to re-identify a device.\\nVendors cannot:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed font or screen resolution without users\u2019 separate opt-in to actively scanning device characteristics for identification.\\n* Use such an identifier to re-identify a device." + } + }, + "specialFeatures": { + "1": { + "id": 1, + "name": "Use precise geolocation data", + "description": "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", + "descriptionLegal": "Vendors can:\\n* Collect and process precise geolocation data in support of one or more purposes.\\nN.B. Precise geolocation means that there are no restrictions on the precision of a user\u2019s location; this can be accurate to within several meters." + }, + "2": { + "id": 2, + "name": "Actively scan device characteristics for identification", + "description": "Your device can be identified based on a scan of your device's unique combination of characteristics.", + "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed fonts or screen resolution.\\n* Use such an identifier to re-identify a device" + } + }, + "vendors": { + "1": { "id": 1, - "name": "Accessing a Device or Browser" + "name": "Globex", + "purposes": [ 1, 2, 3, 4], + "legIntPurposes": [7, 9, 10], + "flexiblePurposes": [ + 2 + ], + "specialPurposes": [], + "features": [2], + "specialFeatures": [ ], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" }, - { + "2": { "id": 2, - "name": "Advertising Personalisation" + "name": "Initech", + "purposes": [1, 2, 3, 4, 7, 10], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [1, 2], + "features": [3], + "specialFeatures": [ ], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" }, - { + "3": { "id": 3, - "name": "Analytics" + "name": "CRS", + "purposes": [ 1, 3, 4], + "legIntPurposes": [2, 7, 9, 10], + "flexiblePurposes": [2, 9], + "specialPurposes": [1, 2], + "features": [1, 2], + "specialFeatures": [1, 2], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" }, - { + "4": { "id": 4, - "name": "Content Personalisation" - } - ], - "vendors": [ - { - "id": 1, - "name": "Globex" - }, - { - "id": 2, - "name": "Initech" - }, - { - "id": 3, - "name": "CRS" - }, - { - "id": 4, - "name": "Umbrella" + "name": "Umbrella", + "purposes": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [3], + "specialFeatures": [1], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" }, - { + "10": { "id": 10, - "name": "Pierce and Pierce" + "name": "Pierce and Pierce", + "purposes": [ 1, 2, 3, 4, 7], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [2], + "features": [1, 3], + "specialFeatures": [1], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" }, - { + "8": { "id": 8, - "name": "Aperture" + "name": "Aperture", + "purposes": [ 1, 3, 4, 5, 6, 8, 9, 10], + "legIntPurposes": [2, 7], + "flexiblePurposes": [], + "specialPurposes": [1, 2], + "features": [2], + "specialFeatures": [], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" } - ] + } }; describe('cookie', () => { @@ -86,169 +220,133 @@ describe('cookie', () => { mockPortal.sendPortalCommand = jest.fn().mockImplementation(() => Promise.resolve()); }); - it('encodes and decodes the vendor cookie object back to original value', () => { - const vendorConsentData = { - cookieVersion: 1, - cmpId: 1, - cmpVersion: 1, - consentScreen: 2, - consentLanguage: 'DE', - vendorListVersion: 1, - maxVendorId: vendorList.vendors[vendorList.vendors.length - 1].id, - created: aDate, - lastUpdated: aDate, - selectedPurposeIds: new Set([1, 2]), - selectedVendorIds: new Set([1, 2, 4]) - }; - - const encodedString = encodeVendorConsentData({...vendorConsentData, vendorList}); - const decoded = decodeVendorConsentData(encodedString); - - expect(decoded).to.deep.equal(vendorConsentData); - }); + it('encodes and decodes the vendor cookie object back to original value', (done) => { + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(vendorList); - it('encodes and decodes the publisher cookie object back to original value', () => { - const vendorConsentData = { - cookieVersion: 1, - cmpId: 1, - vendorListVersion: 1, - created: aDate, - lastUpdated: aDate, - }; - - const publisherConsentData = { - cookieVersion: 1, - cmpId: 1, - vendorListVersion: 1, - publisherPurposeVersion: 1, - created: aDate, - lastUpdated: aDate, - selectedStandardPurposeIds: new Set([1, 4, 5]), - selectedCustomPurposeIds: new Set([2, 3]) - }; - - const encodedString = encodePublisherConsentData({ - ...vendorConsentData, ...publisherConsentData, - vendorList, - customPurposeList - }); - const decoded = decodePublisherConsentData(encodedString); + setTimeout(() => { + tcModel.purposeConsents.set([1, 3, 5, 7, 9]); + tcModel.purposeLegitimateInterests.set([2, 4, 6, 8, 10]); + tcModel.vendorConsents.set([1, 2, 3, 4, 8, 10]); + tcModel.vendorLegitimateInterests.set([1, 2, 3, 4]); + tcModel.publisherConsents.set([2, 4, 6, 8, 10]); + tcModel.publisherLegitimateInterests.set([1, 3, 5, 7, 9]); + tcModel.specialFeatureOptIns.set([1, 2, 3]); - expect(decoded).to.deep.equal({...vendorConsentData, ...publisherConsentData}); - }); + const encoded = encodeConsentData(tcModel); + const decoded = decodeConsentData(encoded); - it('writes and reads the local cookie when globalConsent = false', () => { - config.update({ - storeConsentGlobally: false - }); + const { + supportOOB, + isServiceSpecific, + useNonStandardStacks, + purposeOneTreatment, + publisherCountryCode, + version, + consentLanguage, + cmpId, + cmpVersion, + vendorListVersion, + purposeConsents, + purposeLegitimateInterests, + vendorConsents, + vendorLegitimateInterests, + publisherConsents, + publisherLegitimateInterests, + specialFeatureOptIns + } = decoded; - const vendorConsentData = { - cookieVersion: 1, - cmpId: 1, - vendorListVersion: 1, - created: aDate, - lastUpdated: aDate, - }; - - return writeVendorConsentCookie(vendorConsentData).then(() => { - return readVendorConsentCookie().then(fromCookie => { - expect(document.cookie).to.contain(VENDOR_CONSENT_COOKIE_NAME); - expect(fromCookie).to.deep.include(vendorConsentData); - }); - }); + expect(supportOOB).to.equal(tcModel.supportOOB); + expect(isServiceSpecific).to.equal(tcModel.isServiceSpecific); + expect(useNonStandardStacks).to.equal(tcModel.useNonStandardStacks); + expect(purposeOneTreatment).to.equal(tcModel.purposeOneTreatment); + expect(publisherCountryCode).to.equal(tcModel.publisherCountryCode); + expect(version).to.equal(tcModel.version); + expect(consentLanguage).to.equal(tcModel.consentLanguage); + expect(cmpId).to.equal(tcModel.cmpId); + expect(cmpVersion).to.equal(tcModel.cmpVersion); + expect(vendorListVersion).to.equal(tcModel.vendorListVersion); + expect(purposeConsents.maxId).to.equal(9); + expect(purposeLegitimateInterests.maxId).to.equal(10); + expect(vendorConsents.maxId).to.equal(10); + expect(vendorLegitimateInterests.maxId).to.equal(4); + expect(publisherConsents.maxId).to.equal(10); + expect(publisherLegitimateInterests.maxId).to.equal(9); + expect(specialFeatureOptIns.maxId).to.equal(3); + done(); + }, 0); }); - it('writes the global cookie when globalConsent = true', () => { - config.update({ - storeConsentGlobally: true - }); + it('writes and reads the local cookie when globalConsent = false', (done) => { + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(vendorList); - const vendorConsentData = { - cookieVersion: 1, - cmpId: 1, - vendorListVersion: 1, - created: aDate, - lastUpdated: aDate, - }; - - return writeVendorConsentCookie(vendorConsentData).then(() => { - expect(document.cookie).to.not.contain(VENDOR_CONSENT_COOKIE_NAME); - expect(mockPortal.sendPortalCommand.mock.calls[0][0].command).to.deep.equal('writeVendorConsent'); - }); - }); - - it('reads the global cookie when globalConsent = true', () => { - config.update({ - storeConsentGlobally: true - }); - - const vendorConsentData = { - cookieVersion: 1, - cmpId: 1, - vendorListVersion: 1, - created: aDate, - lastUpdated: aDate, - }; - - return readVendorConsentCookie(vendorConsentData).then(() => { - expect(mockPortal.sendPortalCommand.mock.calls[0][0].command).to.deep.equal('readVendorConsent'); - }); - }); - - it('writes and reads the publisher consent cookie', () => { - config.update({ - storeConsentGlobally: false, - storePublisherData: true - }); + setTimeout(() => { + tcModel.purposeConsents.set([1, 3, 5, 7, 9]); + tcModel.purposeLegitimateInterests.set([2, 4, 6, 8, 10]); + tcModel.vendorConsents.set([1, 2, 3, 4, 8, 10]); + tcModel.vendorLegitimateInterests.set([1, 2, 3, 4]); + tcModel.publisherConsents.set([2, 4, 6, 8, 10]); + tcModel.publisherLegitimateInterests.set([1, 3, 5, 7, 9]); + tcModel.specialFeatureOptIns.set([1, 2, 3]); - const publisherConsentData = { - cookieVersion: 1, - cmpId: 1, - vendorListVersion: 1, - publisherPurposeVersion: 1, - created: aDate, - lastUpdated: aDate, - }; + const encoded = encodeConsentData(tcModel); - writePublisherConsentCookie(publisherConsentData); - const fromCookie = readPublisherConsentCookie(); + return writeConsentCookie(encoded).then(() => { + const cookie = readConsentCookie(); + expect(document.cookie).to.contain(CONSENT_COOKIE); - expect(document.cookie).to.contain(PUBLISHER_CONSENT_COOKIE_NAME); - expect(fromCookie).to.deep.include(publisherConsentData); - }); + const decoded = decodeConsentData(encoded); - it('converts selected vendor list to a range', () => { - const maxVendorId = Math.max(...vendorList.vendors.map(vendor => vendor.id)); - const ranges = convertVendorsToRanges(maxVendorId, new Set([2, 3, 4])); + const { + supportOOB, + isServiceSpecific, + useNonStandardStacks, + purposeOneTreatment, + publisherCountryCode, + version, + consentLanguage, + cmpId, + cmpVersion, + vendorListVersion, + purposeConsents, + purposeLegitimateInterests, + vendorConsents, + vendorLegitimateInterests, + publisherConsents, + publisherLegitimateInterests, + specialFeatureOptIns + } = decoded; - expect(ranges).to.deep.equal([{ - isRange: true, - startVendorId: 2, - endVendorId: 4 - }]); + expect(supportOOB).to.equal(tcModel.supportOOB); + expect(isServiceSpecific).to.equal(tcModel.isServiceSpecific); + expect(useNonStandardStacks).to.equal(tcModel.useNonStandardStacks); + expect(purposeOneTreatment).to.equal(tcModel.purposeOneTreatment); + expect(publisherCountryCode).to.equal(tcModel.publisherCountryCode); + expect(version).to.equal(tcModel.version); + expect(consentLanguage).to.equal(tcModel.consentLanguage); + expect(cmpId).to.equal(tcModel.cmpId); + expect(cmpVersion).to.equal(tcModel.cmpVersion); + expect(vendorListVersion).to.equal(tcModel.vendorListVersion); + expect(purposeConsents.maxId).to.equal(9); + expect(purposeLegitimateInterests.maxId).to.equal(10); + expect(vendorConsents.maxId).to.equal(10); + expect(vendorLegitimateInterests.maxId).to.equal(4); + expect(publisherConsents.maxId).to.equal(10); + expect(publisherLegitimateInterests.maxId).to.equal(9); + expect(specialFeatureOptIns.maxId).to.equal(3); + done() + }); + }, 0) }); - - it('converts selected vendor list to multiple ranges', () => { - const maxVendorId = Math.max(...vendorList.vendors.map(vendor => vendor.id)); - const ranges = convertVendorsToRanges(maxVendorId, new Set([2, 3, 5, 6, 10])); - - expect(ranges).to.deep.equal([ - { - isRange: true, - startVendorId: 2, - endVendorId: 3 - }, - { - isRange: true, - startVendorId: 5, - endVendorId: 6 - }, - { - isRange: false, - startVendorId: 10, - endVendorId: undefined - } - ]); + it('It should return undefined when decoding v1 cookie', () => { + const cookie_v1 = 'BOEFEAyOEFEAyAHABDENAI4AAAB9vABAASA'; + const decoded = decodeConsentData(cookie_v1); + expect(decoded).to.be.undefined; }); }); From 007ba3287881eabcb0b1673696bafb5f852dffcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 12 Mar 2020 17:24:01 +0100 Subject: [PATCH 244/540] cookie test --- src/lib/cookie/cookie.test.js | 249 +++++++++++++++++----------------- 1 file changed, 122 insertions(+), 127 deletions(-) diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index 0035252e..d6e1a56c 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -1,9 +1,9 @@ -// /* eslint-disable max-nested-callbacks */ +/* eslint-disable max-nested-callbacks */ + import { expect } from 'chai'; import { writeCookie, - convertVendorsToRanges, decodeConsentData, encodeConsentData, writeConsentCookie, @@ -17,130 +17,130 @@ jest.mock('../portal'); const mockPortal = require('../portal'); const vendorList = { - "gvlSpecificationVersion": 2, - "vendorListVersion": 100, - "globalVendorListVersion": 27, - "tcfPolicyVersion": 2, - "lastUpdated": "2020-03-03T15:37:46.511752+00:00", - "purposes": { - "1": { - "id": 1, - "name": "Store and/or access information on a device", - "description": "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", - "descriptionLegal": "Vendors can: \\n* Store and access information on the device such as cookies and device identifiers presented to a user." - }, - "2": { - "id": 2, - "name": "Select basic ads", - "description": "Ads can be shown to you based on the content you\u2019re viewing, the app you\u2019re using, your approximate location, or your device type.", - "descriptionLegal": "To do basic ad selection vendors can:\\n* Use real-time information about the context in which the ad will be shown, to show the ad, including information about the content and the device, such as: device type and capabilities, user agent, URL, IP address\\n* Use a user\u2019s non-precise geolocation data\\n* Control the frequency of ads shown to a user.\\n* Sequence the order in which ads are shown to a user.\\n* Prevent an ad from serving in an unsuitable editorial (brand-unsafe) context\\nVendors cannot:\\n* Create a personalised ads profile using this information for the selection of future ads.\\n* N.B. Non-precise means only an approximate location involving at least a radius of 500 meters is permitted." - }, - "3": { - "id": 3, - "name": "Create a personalised ads profile", - "description": "A profile can be built about you and your interests to show you personalised ads that are relevant to you.", - "descriptionLegal": "To create a personalised ads profile vendors can:\\n* Collect information about a user, including a user's activity, interests, demographic information, or location, to create or edit a user profile for use in personalised advertising.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalised advertising." - }, - "4": { - "id": 4, - "name": "Select personalised ads", - "description": "Personalised ads can be shown to you based on a profile about you.", - "descriptionLegal": "To select personalised ads vendors can:\\n* Select personalised ads based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." - }, - "5": { - "id": 5, - "name": "Create a personalised content profile", - "description": "A profile can be built about you and your interests to show you personalised content that is relevant to you.", - "descriptionLegal": "To create a personalised content profile vendors can:\\n* Collect information about a user, including a user's activity, interests, visits to sites or apps, demographic information, or location, to create or edit a user profile for personalising content.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalising content." - }, - "6": { - "id": 6, - "name": "Select personalised content", - "description": "Personalised content can be shown to you based on a profile about you.", - "descriptionLegal": "To select personalised content vendors can:\\n* Select personalised content based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." - }, - "7": { - "id": 7, - "name": "Measure ad performance", - "description": "The performance and effectiveness of ads that you see or interact with can be measured.", - "descriptionLegal": "To measure ad performance vendors can:\\n* Measure whether and how ads were delivered to and interacted with by a user\\n* Provide reporting about ads including their effectiveness and performance\\n* Provide reporting about users who interacted with ads using data observed during the course of the user's interaction with that ad\\n* Provide reporting to publishers about the ads displayed on their property\\n* Measure whether an ad is serving in a suitable editorial environment (brand-safe) context\\n* Determine the percentage of the ad that had the opportunity to be seen and the duration of that opportunity\\n* Combine this information with other information previously collected, including from across websites and apps\\nVendors cannot:\\n*Apply panel- or similarly-derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" - }, - "8": { - "id": 8, - "name": "Measure content performance", - "description": "The performance and effectiveness of content that you see or interact with can be measured.", - "descriptionLegal": "To measure content performance vendors can:\\n* Measure and report on how content was delivered to and interacted with by users.\\n* Provide reporting, using directly measurable or known information, about users who interacted with the content\\n* Combine this information with other information previously collected, including from across websites and apps.\\nVendors cannot:\\n* Measure whether and how ads (including native ads) were delivered to and interacted with by a user.\\n* Apply panel- or similarly derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" - }, - "9": { - "id": 9, - "name": "Apply market research to generate audience insights", - "description": "Market research can be used to learn more about the audiences who visit sites/apps and view ads.", - "descriptionLegal": "To apply market research to generate audience insights vendors can:\\n* Provide aggregate reporting to advertisers or their representatives about the audiences reached by their ads, through panel-based and similarly derived insights.\\n* Provide aggregate reporting to publishers about the audiences that were served or interacted with content and/or ads on their property by applying panel-based and similarly derived insights.\\n* Associate offline data with an online user for the purposes of market research to generate audience insights if vendors have declared to match and combine offline data sources (Feature 1)\\n* Combine this information with other information previously collected including from across websites and apps. \\nVendors cannot:\\n* Measure the performance and effectiveness of ads that a specific user was served or interacted with, without a Legal Basis to measure ad performance.\\n* Measure which content a specific user was served and how they interacted with it, without a Legal Basis to measure content performance." - }, - "10": { - "id": 10, - "name": "Develop and improve products", - "description": "Your data can be used to improve existing systems and software, and to develop new products", - "descriptionLegal": "To develop new products and improve products vendors can:\\n* Use information to improve their existing products with new features and to develop new products\\n* Create new models and algorithms through machine learning\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" - } - }, - "specialPurposes": { - "1": { - "id": 1, - "name": "Match and combine offline data sources", - "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", - "descriptionLegal": "To ensure security, prevent fraud and debug vendors can:\\n* Ensure data are securely transmitted\\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose." - }, - "2": { - "id": 2, - "name": "Link different devices", - "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", - "descriptionLegal": "To deliver information and respond to technical requests vendors can:\\n* Use a user\u2019s IP address to deliver an ad over the internet\\n* Respond to a user\u2019s interaction with an ad by sending the user to a landing page\\n* Use a user\u2019s IP address to deliver content over the internet\\n* Respond to a user\u2019s interaction with content by sending the user to a landing page\\n* Use information about the device type and capabilities for delivering ads or content, for example, to deliver the right size ad creative or video file in a format supported by the device\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" - } - }, - "features": { - "1": { - "id": 1, - "name": "Match and combine offline data sources", - "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", - "descriptionLegal": "Vendors can:\\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes." - }, - "2": { - "id": 2, - "name": "Link different devices", - "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", - "descriptionLegal": "Vendors can:\\n* Deterministically determine that two or more devices belong to the same user or household\\n* Probabilistically determine that two or more devices belong to the same user or household\\n* Actively scan device characteristics for identification for probabilistic identification if users have allowed vendors to actively scan device characteristics for identification (Special Feature 2)" - }, - "3": { - "id": 3, - "name": "Receive and use automatically-sent device characteristics for identification", - "description": "Your device might be distinguished from other devices based on information it automatically sends, such as IP address or browser type.", - "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected automatically from a device for specific characteristics, e.g. IP address, user-agent string.\\n* Use such an identifier to attempt to re-identify a device.\\nVendors cannot:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed font or screen resolution without users\u2019 separate opt-in to actively scanning device characteristics for identification.\\n* Use such an identifier to re-identify a device." - } - }, - "specialFeatures": { - "1": { - "id": 1, - "name": "Use precise geolocation data", - "description": "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", - "descriptionLegal": "Vendors can:\\n* Collect and process precise geolocation data in support of one or more purposes.\\nN.B. Precise geolocation means that there are no restrictions on the precision of a user\u2019s location; this can be accurate to within several meters." - }, - "2": { - "id": 2, - "name": "Actively scan device characteristics for identification", - "description": "Your device can be identified based on a scan of your device's unique combination of characteristics.", - "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed fonts or screen resolution.\\n* Use such an identifier to re-identify a device" - } - }, + "gvlSpecificationVersion": 2, + "vendorListVersion": 100, + "globalVendorListVersion": 27, + "tcfPolicyVersion": 2, + "lastUpdated": "2020-03-03T15:37:46.511752+00:00", + "purposes": { + "1": { + "id": 1, + "name": "Store and/or access information on a device", + "description": "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", + "descriptionLegal": "Vendors can: \\n* Store and access information on the device such as cookies and device identifiers presented to a user." + }, + "2": { + "id": 2, + "name": "Select basic ads", + "description": "Ads can be shown to you based on the content you\u2019re viewing, the app you\u2019re using, your approximate location, or your device type.", + "descriptionLegal": "To do basic ad selection vendors can:\\n* Use real-time information about the context in which the ad will be shown, to show the ad, including information about the content and the device, such as: device type and capabilities, user agent, URL, IP address\\n* Use a user\u2019s non-precise geolocation data\\n* Control the frequency of ads shown to a user.\\n* Sequence the order in which ads are shown to a user.\\n* Prevent an ad from serving in an unsuitable editorial (brand-unsafe) context\\nVendors cannot:\\n* Create a personalised ads profile using this information for the selection of future ads.\\n* N.B. Non-precise means only an approximate location involving at least a radius of 500 meters is permitted." + }, + "3": { + "id": 3, + "name": "Create a personalised ads profile", + "description": "A profile can be built about you and your interests to show you personalised ads that are relevant to you.", + "descriptionLegal": "To create a personalised ads profile vendors can:\\n* Collect information about a user, including a user's activity, interests, demographic information, or location, to create or edit a user profile for use in personalised advertising.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalised advertising." + }, + "4": { + "id": 4, + "name": "Select personalised ads", + "description": "Personalised ads can be shown to you based on a profile about you.", + "descriptionLegal": "To select personalised ads vendors can:\\n* Select personalised ads based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." + }, + "5": { + "id": 5, + "name": "Create a personalised content profile", + "description": "A profile can be built about you and your interests to show you personalised content that is relevant to you.", + "descriptionLegal": "To create a personalised content profile vendors can:\\n* Collect information about a user, including a user's activity, interests, visits to sites or apps, demographic information, or location, to create or edit a user profile for personalising content.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalising content." + }, + "6": { + "id": 6, + "name": "Select personalised content", + "description": "Personalised content can be shown to you based on a profile about you.", + "descriptionLegal": "To select personalised content vendors can:\\n* Select personalised content based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." + }, + "7": { + "id": 7, + "name": "Measure ad performance", + "description": "The performance and effectiveness of ads that you see or interact with can be measured.", + "descriptionLegal": "To measure ad performance vendors can:\\n* Measure whether and how ads were delivered to and interacted with by a user\\n* Provide reporting about ads including their effectiveness and performance\\n* Provide reporting about users who interacted with ads using data observed during the course of the user's interaction with that ad\\n* Provide reporting to publishers about the ads displayed on their property\\n* Measure whether an ad is serving in a suitable editorial environment (brand-safe) context\\n* Determine the percentage of the ad that had the opportunity to be seen and the duration of that opportunity\\n* Combine this information with other information previously collected, including from across websites and apps\\nVendors cannot:\\n*Apply panel- or similarly-derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" + }, + "8": { + "id": 8, + "name": "Measure content performance", + "description": "The performance and effectiveness of content that you see or interact with can be measured.", + "descriptionLegal": "To measure content performance vendors can:\\n* Measure and report on how content was delivered to and interacted with by users.\\n* Provide reporting, using directly measurable or known information, about users who interacted with the content\\n* Combine this information with other information previously collected, including from across websites and apps.\\nVendors cannot:\\n* Measure whether and how ads (including native ads) were delivered to and interacted with by a user.\\n* Apply panel- or similarly derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" + }, + "9": { + "id": 9, + "name": "Apply market research to generate audience insights", + "description": "Market research can be used to learn more about the audiences who visit sites/apps and view ads.", + "descriptionLegal": "To apply market research to generate audience insights vendors can:\\n* Provide aggregate reporting to advertisers or their representatives about the audiences reached by their ads, through panel-based and similarly derived insights.\\n* Provide aggregate reporting to publishers about the audiences that were served or interacted with content and/or ads on their property by applying panel-based and similarly derived insights.\\n* Associate offline data with an online user for the purposes of market research to generate audience insights if vendors have declared to match and combine offline data sources (Feature 1)\\n* Combine this information with other information previously collected including from across websites and apps. \\nVendors cannot:\\n* Measure the performance and effectiveness of ads that a specific user was served or interacted with, without a Legal Basis to measure ad performance.\\n* Measure which content a specific user was served and how they interacted with it, without a Legal Basis to measure content performance." + }, + "10": { + "id": 10, + "name": "Develop and improve products", + "description": "Your data can be used to improve existing systems and software, and to develop new products", + "descriptionLegal": "To develop new products and improve products vendors can:\\n* Use information to improve their existing products with new features and to develop new products\\n* Create new models and algorithms through machine learning\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" + } + }, + "specialPurposes": { + "1": { + "id": 1, + "name": "Match and combine offline data sources", + "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", + "descriptionLegal": "To ensure security, prevent fraud and debug vendors can:\\n* Ensure data are securely transmitted\\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose." + }, + "2": { + "id": 2, + "name": "Link different devices", + "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", + "descriptionLegal": "To deliver information and respond to technical requests vendors can:\\n* Use a user\u2019s IP address to deliver an ad over the internet\\n* Respond to a user\u2019s interaction with an ad by sending the user to a landing page\\n* Use a user\u2019s IP address to deliver content over the internet\\n* Respond to a user\u2019s interaction with content by sending the user to a landing page\\n* Use information about the device type and capabilities for delivering ads or content, for example, to deliver the right size ad creative or video file in a format supported by the device\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" + } + }, + "features": { + "1": { + "id": 1, + "name": "Match and combine offline data sources", + "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", + "descriptionLegal": "Vendors can:\\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes." + }, + "2": { + "id": 2, + "name": "Link different devices", + "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", + "descriptionLegal": "Vendors can:\\n* Deterministically determine that two or more devices belong to the same user or household\\n* Probabilistically determine that two or more devices belong to the same user or household\\n* Actively scan device characteristics for identification for probabilistic identification if users have allowed vendors to actively scan device characteristics for identification (Special Feature 2)" + }, + "3": { + "id": 3, + "name": "Receive and use automatically-sent device characteristics for identification", + "description": "Your device might be distinguished from other devices based on information it automatically sends, such as IP address or browser type.", + "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected automatically from a device for specific characteristics, e.g. IP address, user-agent string.\\n* Use such an identifier to attempt to re-identify a device.\\nVendors cannot:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed font or screen resolution without users\u2019 separate opt-in to actively scanning device characteristics for identification.\\n* Use such an identifier to re-identify a device." + } + }, + "specialFeatures": { + "1": { + "id": 1, + "name": "Use precise geolocation data", + "description": "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", + "descriptionLegal": "Vendors can:\\n* Collect and process precise geolocation data in support of one or more purposes.\\nN.B. Precise geolocation means that there are no restrictions on the precision of a user\u2019s location; this can be accurate to within several meters." + }, + "2": { + "id": 2, + "name": "Actively scan device characteristics for identification", + "description": "Your device can be identified based on a scan of your device's unique combination of characteristics.", + "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed fonts or screen resolution.\\n* Use such an identifier to re-identify a device" + } + }, "vendors": { "1": { "id": 1, "name": "Globex", "purposes": [ 1, 2, 3, 4], "legIntPurposes": [7, 9, 10], - "flexiblePurposes": [ + "flexiblePurposes": [ 2 - ], + ], "specialPurposes": [], "features": [2], "specialFeatures": [ ], @@ -205,9 +205,6 @@ const vendorList = { }; describe('cookie', () => { - - const aDate = new Date('2018-07-15 PDT'); - beforeEach(() => { // Remove all cookies const value = document.cookie.split(';'); @@ -300,8 +297,6 @@ describe('cookie', () => { const cookie = readConsentCookie(); expect(document.cookie).to.contain(CONSENT_COOKIE); - const decoded = decodeConsentData(encoded); - const { supportOOB, isServiceSpecific, @@ -320,7 +315,7 @@ describe('cookie', () => { publisherConsents, publisherLegitimateInterests, specialFeatureOptIns - } = decoded; + } = cookie; expect(supportOOB).to.equal(tcModel.supportOOB); expect(isServiceSpecific).to.equal(tcModel.isServiceSpecific); @@ -339,9 +334,9 @@ describe('cookie', () => { expect(publisherConsents.maxId).to.equal(10); expect(publisherLegitimateInterests.maxId).to.equal(9); expect(specialFeatureOptIns.maxId).to.equal(3); - done() + done(); }); - }, 0) + }, 0); }); it('It should return undefined when decoding v1 cookie', () => { From d00a387cdeb5e68b85267c31213e9c0d269d0ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 13 Mar 2020 10:23:10 +0100 Subject: [PATCH 245/540] reverted cmp.js --- src/lib/cmp.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 72cd71e6..237d59ba 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -2,6 +2,7 @@ import log from './log'; import config from './config'; import { encodeVendorConsentData, + encodePublisherConsentData } from './cookie/cookie'; import { SECTION_DETAILS, From f43a93d00a5e76f5ee2ba1087c6225a969515a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 13 Mar 2020 12:46:24 +0100 Subject: [PATCH 246/540] removed copyData --- src/lib/store.js | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 1b13ce99..8015ca81 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -13,34 +13,18 @@ export const SECTION_DETAILS = 1; export const SECTION_PURPOSES = 0; export const SECTION_VENDORS = 1; -/** - * Copy a data object and make sure to replace references - * of Set objects with new ones. - */ -function copyData(dataObject) { - if (typeof dataObject !== 'object') { - return dataObject; - } - const copy = {...dataObject}; - for (let key in copy) { - if (copy.hasOwnProperty(key) && copy[key] instanceof Vector) { - copy[key] = new Vector(copy[key]); - } - } - return copy; -} - export default class Store { constructor({ - cmpId = 1, + cmpId = 280, cmpVersion = 2, cookieVersion = 2, + vendorList, consentData, cmpApi } = {}) { // Keep track of data that has already been persisted consentData = consentData || {}; - this.persistedConsentData = copyData(consentData); + this.persistedConsentData = consentData; const consentLanguage = findLocale().substr(0, 2).toUpperCase(); const tcModel = new TCModel(); tcModel.cmpId = cmpId; @@ -64,6 +48,11 @@ export default class Store { this.section = SECTION_INTRO; this.subsection = SECTION_PURPOSES; this.hasInitialVendorsRejectionOccured = false; + + if (vendorList) { + console.log('vendor list exists'); + this.updateVendorList(vendorList); + } } isAllSetTrue = obj => Object.keys(obj).map(key => obj[key]).every((value) => value === true); @@ -95,6 +84,9 @@ export default class Store { specialFeatureOptIns = new Vector() } = persistedConsentData; + + console.log(persistedConsentData); + const {purposes = {}, vendors = {}, specialFeatures={}} = vendorList; const maxVendorId = vendorConsents.maxId; const maxPurposeId = purposeConsents.maxId; @@ -281,6 +273,8 @@ export default class Store { let encodedConsent = encodeConsentData(this.tcModel); if (config.setConsentData) { + console.log('setConsentData'); + console.log(encodedConsent); let consentData = encodedConsent; try { config.setConsentData(consentData, err => { @@ -296,6 +290,9 @@ export default class Store { } this.persistedConsentData = decodeConsentData(encodedConsent); + console.log(JSON.parse(JSON.stringify(this.persistedConsentData))); + + console.log(JSON.parse(JSON.stringify(this.tcModel))); this.cmpApi.tcModel = this.tcModel; // Notify of date changes @@ -484,6 +481,10 @@ export default class Store { toggleFooterShowing = (isShown) => { const vendorConsentsObject = this.getVendorConsentsObject(); + console.log(vendorConsentsObject); + + console.log(this.isAllSetTrue(vendorConsentsObject.purposeConsents)); + if (this.isAllSetTrue(vendorConsentsObject.purposeConsents)) { let vendorConsents; if (this.vendorList) { @@ -516,6 +517,8 @@ export default class Store { }; updateVendorList = (vendorList) => { + console.log('updateVendorList'); + console.log(vendorList); const { created, } = this.persistedConsentData || {}; From ac89e4dd5320c395d414f8d11d4582bf2b2c922d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 13 Mar 2020 12:47:19 +0100 Subject: [PATCH 247/540] removed console.log --- src/lib/store.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/store.js b/src/lib/store.js index 8015ca81..9f0accdb 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -50,7 +50,6 @@ export default class Store { this.hasInitialVendorsRejectionOccured = false; if (vendorList) { - console.log('vendor list exists'); this.updateVendorList(vendorList); } } From d47a9eb0ab2d9f0e692b35ef107865db81c5e1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 13 Mar 2020 13:23:19 +0100 Subject: [PATCH 248/540] read local cookie returns promise --- src/lib/cookie/cookie.js | 7 +- src/lib/cookie/cookie.test.js | 272 ++++++---------------------------- src/lib/store.js | 14 -- test/vendorListMock.json | 187 +++++++++++++++++++++++ 4 files changed, 233 insertions(+), 247 deletions(-) create mode 100644 test/vendorListMock.json diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 329cd473..ff218307 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -42,9 +42,7 @@ function encodeConsentData (decoded) { function readConsentCookie () { const cookie = readCookie(CONSENT_COOKIE); log.debug('Read consent data from local cookie', cookie); - if (cookie) { - return TCString.decode(cookie); - } + return Promise.resolve(cookie && decodeConsentData(cookie)); } function writeConsentCookie(encodedConsent) { @@ -126,5 +124,6 @@ export { encodeConsentData, readConsentCookie, writeConsentCookie, - encodeVendorConsentData + encodeVendorConsentData, + CONSENT_COOKIE }; diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index d6e1a56c..e058d121 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -12,198 +12,11 @@ import { } from './cookie'; import { GVL, TCModel } from "@iabtcf/core"; import Promise from "promise-polyfill"; +import vendorList from "../../../test/vendorListMock.json"; jest.mock('../portal'); const mockPortal = require('../portal'); -const vendorList = { - "gvlSpecificationVersion": 2, - "vendorListVersion": 100, - "globalVendorListVersion": 27, - "tcfPolicyVersion": 2, - "lastUpdated": "2020-03-03T15:37:46.511752+00:00", - "purposes": { - "1": { - "id": 1, - "name": "Store and/or access information on a device", - "description": "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", - "descriptionLegal": "Vendors can: \\n* Store and access information on the device such as cookies and device identifiers presented to a user." - }, - "2": { - "id": 2, - "name": "Select basic ads", - "description": "Ads can be shown to you based on the content you\u2019re viewing, the app you\u2019re using, your approximate location, or your device type.", - "descriptionLegal": "To do basic ad selection vendors can:\\n* Use real-time information about the context in which the ad will be shown, to show the ad, including information about the content and the device, such as: device type and capabilities, user agent, URL, IP address\\n* Use a user\u2019s non-precise geolocation data\\n* Control the frequency of ads shown to a user.\\n* Sequence the order in which ads are shown to a user.\\n* Prevent an ad from serving in an unsuitable editorial (brand-unsafe) context\\nVendors cannot:\\n* Create a personalised ads profile using this information for the selection of future ads.\\n* N.B. Non-precise means only an approximate location involving at least a radius of 500 meters is permitted." - }, - "3": { - "id": 3, - "name": "Create a personalised ads profile", - "description": "A profile can be built about you and your interests to show you personalised ads that are relevant to you.", - "descriptionLegal": "To create a personalised ads profile vendors can:\\n* Collect information about a user, including a user's activity, interests, demographic information, or location, to create or edit a user profile for use in personalised advertising.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalised advertising." - }, - "4": { - "id": 4, - "name": "Select personalised ads", - "description": "Personalised ads can be shown to you based on a profile about you.", - "descriptionLegal": "To select personalised ads vendors can:\\n* Select personalised ads based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." - }, - "5": { - "id": 5, - "name": "Create a personalised content profile", - "description": "A profile can be built about you and your interests to show you personalised content that is relevant to you.", - "descriptionLegal": "To create a personalised content profile vendors can:\\n* Collect information about a user, including a user's activity, interests, visits to sites or apps, demographic information, or location, to create or edit a user profile for personalising content.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalising content." - }, - "6": { - "id": 6, - "name": "Select personalised content", - "description": "Personalised content can be shown to you based on a profile about you.", - "descriptionLegal": "To select personalised content vendors can:\\n* Select personalised content based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." - }, - "7": { - "id": 7, - "name": "Measure ad performance", - "description": "The performance and effectiveness of ads that you see or interact with can be measured.", - "descriptionLegal": "To measure ad performance vendors can:\\n* Measure whether and how ads were delivered to and interacted with by a user\\n* Provide reporting about ads including their effectiveness and performance\\n* Provide reporting about users who interacted with ads using data observed during the course of the user's interaction with that ad\\n* Provide reporting to publishers about the ads displayed on their property\\n* Measure whether an ad is serving in a suitable editorial environment (brand-safe) context\\n* Determine the percentage of the ad that had the opportunity to be seen and the duration of that opportunity\\n* Combine this information with other information previously collected, including from across websites and apps\\nVendors cannot:\\n*Apply panel- or similarly-derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" - }, - "8": { - "id": 8, - "name": "Measure content performance", - "description": "The performance and effectiveness of content that you see or interact with can be measured.", - "descriptionLegal": "To measure content performance vendors can:\\n* Measure and report on how content was delivered to and interacted with by users.\\n* Provide reporting, using directly measurable or known information, about users who interacted with the content\\n* Combine this information with other information previously collected, including from across websites and apps.\\nVendors cannot:\\n* Measure whether and how ads (including native ads) were delivered to and interacted with by a user.\\n* Apply panel- or similarly derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" - }, - "9": { - "id": 9, - "name": "Apply market research to generate audience insights", - "description": "Market research can be used to learn more about the audiences who visit sites/apps and view ads.", - "descriptionLegal": "To apply market research to generate audience insights vendors can:\\n* Provide aggregate reporting to advertisers or their representatives about the audiences reached by their ads, through panel-based and similarly derived insights.\\n* Provide aggregate reporting to publishers about the audiences that were served or interacted with content and/or ads on their property by applying panel-based and similarly derived insights.\\n* Associate offline data with an online user for the purposes of market research to generate audience insights if vendors have declared to match and combine offline data sources (Feature 1)\\n* Combine this information with other information previously collected including from across websites and apps. \\nVendors cannot:\\n* Measure the performance and effectiveness of ads that a specific user was served or interacted with, without a Legal Basis to measure ad performance.\\n* Measure which content a specific user was served and how they interacted with it, without a Legal Basis to measure content performance." - }, - "10": { - "id": 10, - "name": "Develop and improve products", - "description": "Your data can be used to improve existing systems and software, and to develop new products", - "descriptionLegal": "To develop new products and improve products vendors can:\\n* Use information to improve their existing products with new features and to develop new products\\n* Create new models and algorithms through machine learning\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" - } - }, - "specialPurposes": { - "1": { - "id": 1, - "name": "Match and combine offline data sources", - "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", - "descriptionLegal": "To ensure security, prevent fraud and debug vendors can:\\n* Ensure data are securely transmitted\\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose." - }, - "2": { - "id": 2, - "name": "Link different devices", - "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", - "descriptionLegal": "To deliver information and respond to technical requests vendors can:\\n* Use a user\u2019s IP address to deliver an ad over the internet\\n* Respond to a user\u2019s interaction with an ad by sending the user to a landing page\\n* Use a user\u2019s IP address to deliver content over the internet\\n* Respond to a user\u2019s interaction with content by sending the user to a landing page\\n* Use information about the device type and capabilities for delivering ads or content, for example, to deliver the right size ad creative or video file in a format supported by the device\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" - } - }, - "features": { - "1": { - "id": 1, - "name": "Match and combine offline data sources", - "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", - "descriptionLegal": "Vendors can:\\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes." - }, - "2": { - "id": 2, - "name": "Link different devices", - "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", - "descriptionLegal": "Vendors can:\\n* Deterministically determine that two or more devices belong to the same user or household\\n* Probabilistically determine that two or more devices belong to the same user or household\\n* Actively scan device characteristics for identification for probabilistic identification if users have allowed vendors to actively scan device characteristics for identification (Special Feature 2)" - }, - "3": { - "id": 3, - "name": "Receive and use automatically-sent device characteristics for identification", - "description": "Your device might be distinguished from other devices based on information it automatically sends, such as IP address or browser type.", - "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected automatically from a device for specific characteristics, e.g. IP address, user-agent string.\\n* Use such an identifier to attempt to re-identify a device.\\nVendors cannot:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed font or screen resolution without users\u2019 separate opt-in to actively scanning device characteristics for identification.\\n* Use such an identifier to re-identify a device." - } - }, - "specialFeatures": { - "1": { - "id": 1, - "name": "Use precise geolocation data", - "description": "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", - "descriptionLegal": "Vendors can:\\n* Collect and process precise geolocation data in support of one or more purposes.\\nN.B. Precise geolocation means that there are no restrictions on the precision of a user\u2019s location; this can be accurate to within several meters." - }, - "2": { - "id": 2, - "name": "Actively scan device characteristics for identification", - "description": "Your device can be identified based on a scan of your device's unique combination of characteristics.", - "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed fonts or screen resolution.\\n* Use such an identifier to re-identify a device" - } - }, - "vendors": { - "1": { - "id": 1, - "name": "Globex", - "purposes": [ 1, 2, 3, 4], - "legIntPurposes": [7, 9, 10], - "flexiblePurposes": [ - 2 - ], - "specialPurposes": [], - "features": [2], - "specialFeatures": [ ], - "policyUrl": "http://www.captify.co.uk/privacy-policy/" - }, - "2": { - "id": 2, - "name": "Initech", - "purposes": [1, 2, 3, 4, 7, 10], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [1, 2], - "features": [3], - "specialFeatures": [ ], - "policyUrl": "http://www.captify.co.uk/privacy-policy/" - }, - "3": { - "id": 3, - "name": "CRS", - "purposes": [ 1, 3, 4], - "legIntPurposes": [2, 7, 9, 10], - "flexiblePurposes": [2, 9], - "specialPurposes": [1, 2], - "features": [1, 2], - "specialFeatures": [1, 2], - "policyUrl": "http://www.captify.co.uk/privacy-policy/" - }, - "4": { - "id": 4, - "name": "Umbrella", - "purposes": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [], - "features": [3], - "specialFeatures": [1], - "policyUrl": "http://www.captify.co.uk/privacy-policy/" - }, - "10": { - "id": 10, - "name": "Pierce and Pierce", - "purposes": [ 1, 2, 3, 4, 7], - "legIntPurposes": [], - "flexiblePurposes": [], - "specialPurposes": [2], - "features": [1, 3], - "specialFeatures": [1], - "policyUrl": "http://www.captify.co.uk/privacy-policy/" - }, - "8": { - "id": 8, - "name": "Aperture", - "purposes": [ 1, 3, 4, 5, 6, 8, 9, 10], - "legIntPurposes": [2, 7], - "flexiblePurposes": [], - "specialPurposes": [1, 2], - "features": [2], - "specialFeatures": [], - "policyUrl": "http://www.captify.co.uk/privacy-policy/" - } - } -}; - describe('cookie', () => { beforeEach(() => { // Remove all cookies @@ -294,47 +107,48 @@ describe('cookie', () => { const encoded = encodeConsentData(tcModel); return writeConsentCookie(encoded).then(() => { - const cookie = readConsentCookie(); - expect(document.cookie).to.contain(CONSENT_COOKIE); - - const { - supportOOB, - isServiceSpecific, - useNonStandardStacks, - purposeOneTreatment, - publisherCountryCode, - version, - consentLanguage, - cmpId, - cmpVersion, - vendorListVersion, - purposeConsents, - purposeLegitimateInterests, - vendorConsents, - vendorLegitimateInterests, - publisherConsents, - publisherLegitimateInterests, - specialFeatureOptIns - } = cookie; - - expect(supportOOB).to.equal(tcModel.supportOOB); - expect(isServiceSpecific).to.equal(tcModel.isServiceSpecific); - expect(useNonStandardStacks).to.equal(tcModel.useNonStandardStacks); - expect(purposeOneTreatment).to.equal(tcModel.purposeOneTreatment); - expect(publisherCountryCode).to.equal(tcModel.publisherCountryCode); - expect(version).to.equal(tcModel.version); - expect(consentLanguage).to.equal(tcModel.consentLanguage); - expect(cmpId).to.equal(tcModel.cmpId); - expect(cmpVersion).to.equal(tcModel.cmpVersion); - expect(vendorListVersion).to.equal(tcModel.vendorListVersion); - expect(purposeConsents.maxId).to.equal(9); - expect(purposeLegitimateInterests.maxId).to.equal(10); - expect(vendorConsents.maxId).to.equal(10); - expect(vendorLegitimateInterests.maxId).to.equal(4); - expect(publisherConsents.maxId).to.equal(10); - expect(publisherLegitimateInterests.maxId).to.equal(9); - expect(specialFeatureOptIns.maxId).to.equal(3); - done(); + return readConsentCookie().then(fromCookie => { + expect(document.cookie).to.contain(CONSENT_COOKIE); + + const { + supportOOB, + isServiceSpecific, + useNonStandardStacks, + purposeOneTreatment, + publisherCountryCode, + version, + consentLanguage, + cmpId, + cmpVersion, + vendorListVersion, + purposeConsents, + purposeLegitimateInterests, + vendorConsents, + vendorLegitimateInterests, + publisherConsents, + publisherLegitimateInterests, + specialFeatureOptIns + } = fromCookie; + + expect(supportOOB).to.equal(tcModel.supportOOB); + expect(isServiceSpecific).to.equal(tcModel.isServiceSpecific); + expect(useNonStandardStacks).to.equal(tcModel.useNonStandardStacks); + expect(purposeOneTreatment).to.equal(tcModel.purposeOneTreatment); + expect(publisherCountryCode).to.equal(tcModel.publisherCountryCode); + expect(version).to.equal(tcModel.version); + expect(consentLanguage).to.equal(tcModel.consentLanguage); + expect(cmpId).to.equal(tcModel.cmpId); + expect(cmpVersion).to.equal(tcModel.cmpVersion); + expect(vendorListVersion).to.equal(tcModel.vendorListVersion); + expect(purposeConsents.maxId).to.equal(9); + expect(purposeLegitimateInterests.maxId).to.equal(10); + expect(vendorConsents.maxId).to.equal(10); + expect(vendorLegitimateInterests.maxId).to.equal(4); + expect(publisherConsents.maxId).to.equal(10); + expect(publisherLegitimateInterests.maxId).to.equal(9); + expect(specialFeatureOptIns.maxId).to.equal(3); + done(); + }); }); }, 0); }); diff --git a/src/lib/store.js b/src/lib/store.js index 9f0accdb..5306e304 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -83,9 +83,6 @@ export default class Store { specialFeatureOptIns = new Vector() } = persistedConsentData; - - console.log(persistedConsentData); - const {purposes = {}, vendors = {}, specialFeatures={}} = vendorList; const maxVendorId = vendorConsents.maxId; const maxPurposeId = purposeConsents.maxId; @@ -272,8 +269,6 @@ export default class Store { let encodedConsent = encodeConsentData(this.tcModel); if (config.setConsentData) { - console.log('setConsentData'); - console.log(encodedConsent); let consentData = encodedConsent; try { config.setConsentData(consentData, err => { @@ -289,9 +284,6 @@ export default class Store { } this.persistedConsentData = decodeConsentData(encodedConsent); - console.log(JSON.parse(JSON.stringify(this.persistedConsentData))); - - console.log(JSON.parse(JSON.stringify(this.tcModel))); this.cmpApi.tcModel = this.tcModel; // Notify of date changes @@ -480,10 +472,6 @@ export default class Store { toggleFooterShowing = (isShown) => { const vendorConsentsObject = this.getVendorConsentsObject(); - console.log(vendorConsentsObject); - - console.log(this.isAllSetTrue(vendorConsentsObject.purposeConsents)); - if (this.isAllSetTrue(vendorConsentsObject.purposeConsents)) { let vendorConsents; if (this.vendorList) { @@ -516,8 +504,6 @@ export default class Store { }; updateVendorList = (vendorList) => { - console.log('updateVendorList'); - console.log(vendorList); const { created, } = this.persistedConsentData || {}; diff --git a/test/vendorListMock.json b/test/vendorListMock.json new file mode 100644 index 00000000..4f7f838a --- /dev/null +++ b/test/vendorListMock.json @@ -0,0 +1,187 @@ +{ + "gvlSpecificationVersion": 2, + "vendorListVersion": 100, + "globalVendorListVersion": 27, + "tcfPolicyVersion": 2, + "lastUpdated": "2020-03-03T15:37:46.511752+00:00", + "purposes": { + "1": { + "id": 1, + "name": "Store and/or access information on a device", + "description": "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.", + "descriptionLegal": "Vendors can: \\n* Store and access information on the device such as cookies and device identifiers presented to a user." + }, + "2": { + "id": 2, + "name": "Select basic ads", + "description": "Ads can be shown to you based on the content you\u2019re viewing, the app you\u2019re using, your approximate location, or your device type.", + "descriptionLegal": "To do basic ad selection vendors can:\\n* Use real-time information about the context in which the ad will be shown, to show the ad, including information about the content and the device, such as: device type and capabilities, user agent, URL, IP address\\n* Use a user\u2019s non-precise geolocation data\\n* Control the frequency of ads shown to a user.\\n* Sequence the order in which ads are shown to a user.\\n* Prevent an ad from serving in an unsuitable editorial (brand-unsafe) context\\nVendors cannot:\\n* Create a personalised ads profile using this information for the selection of future ads.\\n* N.B. Non-precise means only an approximate location involving at least a radius of 500 meters is permitted." + }, + "3": { + "id": 3, + "name": "Create a personalised ads profile", + "description": "A profile can be built about you and your interests to show you personalised ads that are relevant to you.", + "descriptionLegal": "To create a personalised ads profile vendors can:\\n* Collect information about a user, including a user's activity, interests, demographic information, or location, to create or edit a user profile for use in personalised advertising.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalised advertising." + }, + "4": { + "id": 4, + "name": "Select personalised ads", + "description": "Personalised ads can be shown to you based on a profile about you.", + "descriptionLegal": "To select personalised ads vendors can:\\n* Select personalised ads based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." + }, + "5": { + "id": 5, + "name": "Create a personalised content profile", + "description": "A profile can be built about you and your interests to show you personalised content that is relevant to you.", + "descriptionLegal": "To create a personalised content profile vendors can:\\n* Collect information about a user, including a user's activity, interests, visits to sites or apps, demographic information, or location, to create or edit a user profile for personalising content.\\n* Combine this information with other information previously collected, including from across websites and apps, to create or edit a user profile for use in personalising content." + }, + "6": { + "id": 6, + "name": "Select personalised content", + "description": "Personalised content can be shown to you based on a profile about you.", + "descriptionLegal": "To select personalised content vendors can:\\n* Select personalised content based on a user profile or other historical user data, including a user\u2019s prior activity, interests, visits to sites or apps, location, or demographic information." + }, + "7": { + "id": 7, + "name": "Measure ad performance", + "description": "The performance and effectiveness of ads that you see or interact with can be measured.", + "descriptionLegal": "To measure ad performance vendors can:\\n* Measure whether and how ads were delivered to and interacted with by a user\\n* Provide reporting about ads including their effectiveness and performance\\n* Provide reporting about users who interacted with ads using data observed during the course of the user's interaction with that ad\\n* Provide reporting to publishers about the ads displayed on their property\\n* Measure whether an ad is serving in a suitable editorial environment (brand-safe) context\\n* Determine the percentage of the ad that had the opportunity to be seen and the duration of that opportunity\\n* Combine this information with other information previously collected, including from across websites and apps\\nVendors cannot:\\n*Apply panel- or similarly-derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" + }, + "8": { + "id": 8, + "name": "Measure content performance", + "description": "The performance and effectiveness of content that you see or interact with can be measured.", + "descriptionLegal": "To measure content performance vendors can:\\n* Measure and report on how content was delivered to and interacted with by users.\\n* Provide reporting, using directly measurable or known information, about users who interacted with the content\\n* Combine this information with other information previously collected, including from across websites and apps.\\nVendors cannot:\\n* Measure whether and how ads (including native ads) were delivered to and interacted with by a user.\\n* Apply panel- or similarly derived audience insights data to ad measurement data without a Legal Basis to apply market research to generate audience insights (Purpose 9)" + }, + "9": { + "id": 9, + "name": "Apply market research to generate audience insights", + "description": "Market research can be used to learn more about the audiences who visit sites/apps and view ads.", + "descriptionLegal": "To apply market research to generate audience insights vendors can:\\n* Provide aggregate reporting to advertisers or their representatives about the audiences reached by their ads, through panel-based and similarly derived insights.\\n* Provide aggregate reporting to publishers about the audiences that were served or interacted with content and/or ads on their property by applying panel-based and similarly derived insights.\\n* Associate offline data with an online user for the purposes of market research to generate audience insights if vendors have declared to match and combine offline data sources (Feature 1)\\n* Combine this information with other information previously collected including from across websites and apps. \\nVendors cannot:\\n* Measure the performance and effectiveness of ads that a specific user was served or interacted with, without a Legal Basis to measure ad performance.\\n* Measure which content a specific user was served and how they interacted with it, without a Legal Basis to measure content performance." + }, + "10": { + "id": 10, + "name": "Develop and improve products", + "description": "Your data can be used to improve existing systems and software, and to develop new products", + "descriptionLegal": "To develop new products and improve products vendors can:\\n* Use information to improve their existing products with new features and to develop new products\\n* Create new models and algorithms through machine learning\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" + } + }, + "specialPurposes": { + "1": { + "id": 1, + "name": "Match and combine offline data sources", + "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", + "descriptionLegal": "To ensure security, prevent fraud and debug vendors can:\\n* Ensure data are securely transmitted\\n* Detect and prevent malicious, fraudulent, invalid, or illegal activity.\\n* Ensure correct and efficient operation of systems and processes, including to monitor and enhance the performance of systems and processes engaged in permitted purposes\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose." + }, + "2": { + "id": 2, + "name": "Link different devices", + "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", + "descriptionLegal": "To deliver information and respond to technical requests vendors can:\\n* Use a user\u2019s IP address to deliver an ad over the internet\\n* Respond to a user\u2019s interaction with an ad by sending the user to a landing page\\n* Use a user\u2019s IP address to deliver content over the internet\\n* Respond to a user\u2019s interaction with content by sending the user to a landing page\\n* Use information about the device type and capabilities for delivering ads or content, for example, to deliver the right size ad creative or video file in a format supported by the device\\nVendors cannot:\\n* Conduct any other data processing operation allowed under a different purpose under this purpose" + } + }, + "features": { + "1": { + "id": 1, + "name": "Match and combine offline data sources", + "description": "Data from offline data sources can be combined with your online activity in support of one or more purposes", + "descriptionLegal": "Vendors can:\\n* Combine data obtained offline with data collected online in support of one or more Purposes or Special Purposes." + }, + "2": { + "id": 2, + "name": "Link different devices", + "description": "Different devices can be determined as belonging to you or your household in support of one or more of purposes.", + "descriptionLegal": "Vendors can:\\n* Deterministically determine that two or more devices belong to the same user or household\\n* Probabilistically determine that two or more devices belong to the same user or household\\n* Actively scan device characteristics for identification for probabilistic identification if users have allowed vendors to actively scan device characteristics for identification (Special Feature 2)" + }, + "3": { + "id": 3, + "name": "Receive and use automatically-sent device characteristics for identification", + "description": "Your device might be distinguished from other devices based on information it automatically sends, such as IP address or browser type.", + "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected automatically from a device for specific characteristics, e.g. IP address, user-agent string.\\n* Use such an identifier to attempt to re-identify a device.\\nVendors cannot:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed font or screen resolution without users\u2019 separate opt-in to actively scanning device characteristics for identification.\\n* Use such an identifier to re-identify a device." + } + }, + "specialFeatures": { + "1": { + "id": 1, + "name": "Use precise geolocation data", + "description": "Your precise geolocation data can be used in support of one or more purposes. This means your location can be accurate to within several meters.", + "descriptionLegal": "Vendors can:\\n* Collect and process precise geolocation data in support of one or more purposes.\\nN.B. Precise geolocation means that there are no restrictions on the precision of a user\u2019s location; this can be accurate to within several meters." + }, + "2": { + "id": 2, + "name": "Actively scan device characteristics for identification", + "description": "Your device can be identified based on a scan of your device's unique combination of characteristics.", + "descriptionLegal": "Vendors can:\\n* Create an identifier using data collected via actively scanning a device for specific characteristics, e.g. installed fonts or screen resolution.\\n* Use such an identifier to re-identify a device" + } + }, + "vendors": { + "1": { + "id": 1, + "name": "Globex", + "purposes": [ 1, 2, 3, 4], + "legIntPurposes": [7, 9, 10], + "flexiblePurposes": [ + 2 + ], + "specialPurposes": [], + "features": [2], + "specialFeatures": [ ], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" + }, + "2": { + "id": 2, + "name": "Initech", + "purposes": [1, 2, 3, 4, 7, 10], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [1, 2], + "features": [3], + "specialFeatures": [ ], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" + }, + "3": { + "id": 3, + "name": "CRS", + "purposes": [ 1, 3, 4], + "legIntPurposes": [2, 7, 9, 10], + "flexiblePurposes": [2, 9], + "specialPurposes": [1, 2], + "features": [1, 2], + "specialFeatures": [1, 2], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" + }, + "4": { + "id": 4, + "name": "Umbrella", + "purposes": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [], + "features": [3], + "specialFeatures": [1], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" + }, + "10": { + "id": 10, + "name": "Pierce and Pierce", + "purposes": [ 1, 2, 3, 4, 7], + "legIntPurposes": [], + "flexiblePurposes": [], + "specialPurposes": [2], + "features": [1, 3], + "specialFeatures": [1], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" + }, + "8": { + "id": 8, + "name": "Aperture", + "purposes": [ 1, 3, 4, 5, 6, 8, 9, 10], + "legIntPurposes": [2, 7], + "flexiblePurposes": [], + "specialPurposes": [1, 2], + "features": [2], + "specialFeatures": [], + "policyUrl": "http://www.captify.co.uk/privacy-policy/" + } + } +} From 490b8c4615fbc874dab6d83a9c8cae68b462901d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 13 Mar 2020 13:25:08 +0100 Subject: [PATCH 249/540] indent --- src/lib/cookie/cookie.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index ff218307..e7745662 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -42,7 +42,7 @@ function encodeConsentData (decoded) { function readConsentCookie () { const cookie = readCookie(CONSENT_COOKIE); log.debug('Read consent data from local cookie', cookie); - return Promise.resolve(cookie && decodeConsentData(cookie)); + return Promise.resolve(cookie && decodeConsentData(cookie)); } function writeConsentCookie(encodedConsent) { From b2096cae903c3e6f2f28c65ba9daab556e922d38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 13 Mar 2020 14:07:00 +0100 Subject: [PATCH 250/540] moved constants to separate file --- src/lib/cookie/cookie.test.js | 73 +++++++++++++--------- test/{vendorListMock.json => constants.js} | 21 ++++++- 2 files changed, 62 insertions(+), 32 deletions(-) rename test/{vendorListMock.json => constants.js} (96%) diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index e058d121..22b6d493 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -10,9 +10,20 @@ import { readConsentCookie, CONSENT_COOKIE } from './cookie'; + +import { + PURPOSE_CONSENTS, + PURPOSE_LEGITIMATE_INTERESTS, + VENDOR_CONSENTS, + VENDOR_LEGITIMATE_INTERESTS, + PUBLISHER_CONSENTS, + PUBLISHER_LEGITIMATE_INTERESTS, + SPECIAL_FEATURE_OPT_INS, + VENDOR_LIST +} from "../../../test/constants" + import { GVL, TCModel } from "@iabtcf/core"; import Promise from "promise-polyfill"; -import vendorList from "../../../test/vendorListMock.json"; jest.mock('../portal'); const mockPortal = require('../portal'); @@ -34,16 +45,16 @@ describe('cookie', () => { const tcModel = new TCModel(); tcModel.cmpId = 280; tcModel.cmpVersion = 2; - tcModel.gvl = new GVL(vendorList); + tcModel.gvl = new GVL(VENDOR_LIST); setTimeout(() => { - tcModel.purposeConsents.set([1, 3, 5, 7, 9]); - tcModel.purposeLegitimateInterests.set([2, 4, 6, 8, 10]); - tcModel.vendorConsents.set([1, 2, 3, 4, 8, 10]); - tcModel.vendorLegitimateInterests.set([1, 2, 3, 4]); - tcModel.publisherConsents.set([2, 4, 6, 8, 10]); - tcModel.publisherLegitimateInterests.set([1, 3, 5, 7, 9]); - tcModel.specialFeatureOptIns.set([1, 2, 3]); + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(VENDOR_CONSENTS); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); const decoded = decodeConsentData(encoded); @@ -78,13 +89,13 @@ describe('cookie', () => { expect(cmpId).to.equal(tcModel.cmpId); expect(cmpVersion).to.equal(tcModel.cmpVersion); expect(vendorListVersion).to.equal(tcModel.vendorListVersion); - expect(purposeConsents.maxId).to.equal(9); - expect(purposeLegitimateInterests.maxId).to.equal(10); - expect(vendorConsents.maxId).to.equal(10); - expect(vendorLegitimateInterests.maxId).to.equal(4); - expect(publisherConsents.maxId).to.equal(10); - expect(publisherLegitimateInterests.maxId).to.equal(9); - expect(specialFeatureOptIns.maxId).to.equal(3); + expect(purposeConsents.maxId).to.equal(Math.max(...PURPOSE_CONSENTS)); + expect(purposeLegitimateInterests.maxId).to.equal(Math.max(...PURPOSE_LEGITIMATE_INTERESTS)); + expect(vendorConsents.maxId).to.equal(Math.max(...VENDOR_CONSENTS)); + expect(vendorLegitimateInterests.maxId).to.equal(Math.max(...VENDOR_LEGITIMATE_INTERESTS)); + expect(publisherConsents.maxId).to.equal(Math.max(...PUBLISHER_CONSENTS)); + expect(publisherLegitimateInterests.maxId).to.equal(Math.max(...PUBLISHER_LEGITIMATE_INTERESTS)); + expect(specialFeatureOptIns.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); done(); }, 0); }); @@ -93,16 +104,16 @@ describe('cookie', () => { const tcModel = new TCModel(); tcModel.cmpId = 280; tcModel.cmpVersion = 2; - tcModel.gvl = new GVL(vendorList); + tcModel.gvl = new GVL(VENDOR_LIST); setTimeout(() => { - tcModel.purposeConsents.set([1, 3, 5, 7, 9]); - tcModel.purposeLegitimateInterests.set([2, 4, 6, 8, 10]); - tcModel.vendorConsents.set([1, 2, 3, 4, 8, 10]); - tcModel.vendorLegitimateInterests.set([1, 2, 3, 4]); - tcModel.publisherConsents.set([2, 4, 6, 8, 10]); - tcModel.publisherLegitimateInterests.set([1, 3, 5, 7, 9]); - tcModel.specialFeatureOptIns.set([1, 2, 3]); + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(VENDOR_CONSENTS); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); @@ -140,13 +151,13 @@ describe('cookie', () => { expect(cmpId).to.equal(tcModel.cmpId); expect(cmpVersion).to.equal(tcModel.cmpVersion); expect(vendorListVersion).to.equal(tcModel.vendorListVersion); - expect(purposeConsents.maxId).to.equal(9); - expect(purposeLegitimateInterests.maxId).to.equal(10); - expect(vendorConsents.maxId).to.equal(10); - expect(vendorLegitimateInterests.maxId).to.equal(4); - expect(publisherConsents.maxId).to.equal(10); - expect(publisherLegitimateInterests.maxId).to.equal(9); - expect(specialFeatureOptIns.maxId).to.equal(3); + expect(purposeConsents.maxId).to.equal(Math.max(...PURPOSE_CONSENTS)); + expect(purposeLegitimateInterests.maxId).to.equal(Math.max(...PURPOSE_LEGITIMATE_INTERESTS)); + expect(vendorConsents.maxId).to.equal(Math.max(...VENDOR_CONSENTS)); + expect(vendorLegitimateInterests.maxId).to.equal(Math.max(...VENDOR_LEGITIMATE_INTERESTS)); + expect(publisherConsents.maxId).to.equal(Math.max(...PUBLISHER_CONSENTS)); + expect(publisherLegitimateInterests.maxId).to.equal(Math.max(...PUBLISHER_LEGITIMATE_INTERESTS)); + expect(specialFeatureOptIns.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); done(); }); }); diff --git a/test/vendorListMock.json b/test/constants.js similarity index 96% rename from test/vendorListMock.json rename to test/constants.js index 4f7f838a..b94543e7 100644 --- a/test/vendorListMock.json +++ b/test/constants.js @@ -1,4 +1,12 @@ -{ +const PURPOSE_CONSENTS = [1, 3, 5, 7, 9]; +const PURPOSE_LEGITIMATE_INTERESTS = [2, 4, 6, 8, 10]; +const VENDOR_CONSENTS = [1, 2, 3, 4, 8, 10]; +const VENDOR_LEGITIMATE_INTERESTS = [1, 2, 3, 4]; +const PUBLISHER_CONSENTS = [2, 4, 6, 8, 10]; +const PUBLISHER_LEGITIMATE_INTERESTS = [1, 3, 5, 7, 9]; +const SPECIAL_FEATURE_OPT_INS = [1, 2, 3]; + +const VENDOR_LIST = { "gvlSpecificationVersion": 2, "vendorListVersion": 100, "globalVendorListVersion": 27, @@ -184,4 +192,15 @@ "policyUrl": "http://www.captify.co.uk/privacy-policy/" } } +}; + +export { + PURPOSE_CONSENTS, + PURPOSE_LEGITIMATE_INTERESTS, + VENDOR_CONSENTS, + VENDOR_LEGITIMATE_INTERESTS, + PUBLISHER_CONSENTS, + PUBLISHER_LEGITIMATE_INTERESTS, + SPECIAL_FEATURE_OPT_INS, + VENDOR_LIST } From 529953080c3aa2de086f389c1e75f84c1a094404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 13 Mar 2020 18:49:57 +0100 Subject: [PATCH 251/540] version update, tests in progress --- package-lock.json | 261 +++++++---- package.json | 4 +- src/index.js | 2 +- src/lib/cookie/cookie.test.js | 5 +- src/lib/init.js | 4 + src/lib/store.js | 2 +- src/lib/store.test.js | 847 +++++++++++++++++----------------- src/lib/vendor.test.js | 45 +- test/constants.js | 2 +- webpack.config.babel.js | 2 +- 10 files changed, 618 insertions(+), 556 deletions(-) diff --git a/package-lock.json b/package-lock.json index f447a6cc..e271bf78 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,17 +89,35 @@ } }, "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", + "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "@babel/runtime-corejs3": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.7.tgz", + "integrity": "sha512-sc7A+H4I8kTd7S61dgB9RomXu/C+F4IrRr4Ytze4dnfx7AXEpCrejSNpjx7vq6y/Bak9S6Kbk65a/WgMLtg43Q==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true } } }, @@ -190,26 +208,17 @@ } }, "@iabtcf/cmpapi": { - "version": "1.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.13.tgz", - "integrity": "sha512-5vm9Ggg5yHaDR5nWjxdtm8R6NAYbJa7sOeoyHJRpmy+7ETYG2hNRaZLCr2TjYdyI/vmdDl6w6h6dJwYj2fr+dw==", + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.19.tgz", + "integrity": "sha512-pijr/1Zpzg5cyJVEgSzzAcXJw5/gia0+8rojn4F1e4Lq1iWWN/n6g2DPFL/eojpZZzPyMfaXVbqO880UYfn3ug==", "requires": { - "@iabtcf/core": "1.0.0-beta.13", - "@iabtcf/util": "1.0.0-beta.13" + "@iabtcf/core": "1.0.0-beta.19" } }, "@iabtcf/core": { - "version": "1.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.13.tgz", - "integrity": "sha512-hTQY++O6gr3N3qsxnbnL9DLySbuczIG2wGWf3SgLNtwp3/XTSwHLBXJ7YO5JrROFCyH1HdJGMtIPYJ2u4u7edg==", - "requires": { - "@iabtcf/util": "1.0.0-beta.13" - } - }, - "@iabtcf/util": { - "version": "1.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@iabtcf/util/-/util-1.0.0-beta.13.tgz", - "integrity": "sha512-9VFrE4vo9JPwv/6bYQLz0AcNDvjTLBuFJcBokdETkiHE933MAYNOdacRhupp0usvuDvXTlTQbKOEFWnqigZcTQ==" + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.19.tgz", + "integrity": "sha512-oUZj7aglmN1Sq/sh6aUvinLyi2EdvOa4/CSOjtLuOCopgpxY4m9onEFm+bCr5Wvt7MBCRQeS1uorCbz+SDWSIg==" }, "@sinonjs/commons": { "version": "1.7.1", @@ -277,9 +286,9 @@ } }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "acorn-dynamic-import": { @@ -310,9 +319,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true } } @@ -2275,9 +2284,9 @@ "dev": true }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "browser-resolve": { @@ -2579,15 +2588,15 @@ } }, "caniuse-db": { - "version": "1.0.30001031", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001031.tgz", - "integrity": "sha512-tIRT8VWRiZ+lSwe5qEOBCAUsXmTqaZk7Tkec1ooSSfgvVkZrtfw0jfOV5r2Of8sA3VtDkpY+dJXQpTGg8n9zEA==", + "version": "1.0.30001035", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001035.tgz", + "integrity": "sha512-kLUON4XN3tq5Nwl7ZICDw+7/vMynSpRMVYDRkzLL31lgnpa6M2YXYdjst3h+xbzjMgdcveRTnRGE1h/1IcKK6A==", "dev": true }, "caniuse-lite": { - "version": "1.0.30001031", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001031.tgz", - "integrity": "sha512-DpAP5a1NGRLgYfaNCaXIRyGARi+3tJA2quZXNNA1Du26VyVkqvy2tznNu5ANyN1Y5aX44QDotZSVSUSi2uMGjg==", + "version": "1.0.30001035", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", + "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", "dev": true }, "capture-exit": { @@ -3258,6 +3267,12 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, + "core-js-pure": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", + "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3512,25 +3527,49 @@ } }, "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", "dev": true, "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" }, "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "jsesc": "~0.5.0" } } } @@ -3542,9 +3581,9 @@ "dev": true }, "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, "cssnano": { @@ -4172,9 +4211,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.364", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.364.tgz", - "integrity": "sha512-V6hyxQ9jzt6Jy6w8tAv4HHKhIaVS6psG/gmwtQ+2+itdkWMHJLHJ4m1sFep/fWkdKvfJcPXuywfnECRzfNa7gw==", + "version": "1.3.376", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz", + "integrity": "sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw==", "dev": true }, "elliptic": { @@ -4503,9 +4542,9 @@ "dev": true }, "eslint-plugin-react": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.3.tgz", - "integrity": "sha512-Bt56LNHAQCoou88s8ViKRjMB2+36XRejCQ1VoLj716KI1MoE99HpTVvIThJ0rvFmG4E4Gsq+UgToEjn+j044Bg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -4516,8 +4555,18 @@ "object.fromentries": "^2.0.2", "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.14.2", - "string.prototype.matchall": "^4.0.2" + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "eslint-scope": { @@ -8216,9 +8265,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } @@ -8432,9 +8481,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } @@ -8872,9 +8921,9 @@ "integrity": "sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg==" }, "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "requires": { "abbrev": "1", "osenv": "^0.1.4" @@ -12249,9 +12298,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" } } }, @@ -12716,6 +12765,15 @@ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -13426,9 +13484,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } @@ -14742,6 +14800,34 @@ } } }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -15024,12 +15110,12 @@ "dev": true }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "browser-process-hrtime": "^1.0.0" } }, "walker": { @@ -15060,9 +15146,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } @@ -15731,6 +15817,15 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 26ed55b0..0fa1e8b9 100644 --- a/package.json +++ b/package.json @@ -90,8 +90,8 @@ "webpack-dev-server": "^2.4.4" }, "dependencies": { - "@iabtcf/cmpapi": "^1.0.0-beta.13", - "@iabtcf/core": "^1.0.0-beta.13", + "@iabtcf/cmpapi": "^1.0.0-beta.19", + "@iabtcf/core": "^1.0.0-beta.19", "classnames": "^2.2.5", "codemirror": "^5.34.0", "core-js": "^2.5.3", diff --git a/src/index.js b/src/index.js index 552a50d2..20654274 100755 --- a/src/index.js +++ b/src/index.js @@ -68,7 +68,7 @@ function checkConsent(cmp, store) { clearTimeout(timeout); handleConsentResult(cmp, store, vendorList, tcStringDecoded); } - }) + }); } } }); diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index 22b6d493..e9e1ab41 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -1,7 +1,6 @@ /* eslint-disable max-nested-callbacks */ import { expect } from 'chai'; - import { writeCookie, decodeConsentData, @@ -10,7 +9,6 @@ import { readConsentCookie, CONSENT_COOKIE } from './cookie'; - import { PURPOSE_CONSENTS, PURPOSE_LEGITIMATE_INTERESTS, @@ -20,8 +18,7 @@ import { PUBLISHER_LEGITIMATE_INTERESTS, SPECIAL_FEATURE_OPT_INS, VENDOR_LIST -} from "../../../test/constants" - +} from "../../../test/constants"; import { GVL, TCModel } from "@iabtcf/core"; import Promise from "promise-polyfill"; diff --git a/src/lib/init.js b/src/lib/init.js index 68431b85..90a5c73a 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -43,6 +43,10 @@ export function init (configUpdates) { .then((consentData) => { const cmpApi = new CmpApi(CMP_ID, CMP_VERSION); + if (config.decoratePageCallHandler) { + config.decoratePageCallHandler(CmpApi, cmpApi); + } + // Initialize the store with all of our consent data const store = new Store({ cmpVersion: CMP_VERSION, diff --git a/src/lib/store.js b/src/lib/store.js index 5306e304..d327a2df 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -264,7 +264,7 @@ export default class Store { const now = new Date(); tcModel.created = tcModel.created || now; tcModel.lastUpdated = now; - tcModel.vendorListVersion = vendorListVersion; + tcModel.vendorListVersion = tcModel.vendorListVersion_ = vendorListVersion; let encodedConsent = encodeConsentData(this.tcModel); diff --git a/src/lib/store.test.js b/src/lib/store.test.js index e7d606d7..f8fab8d0 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -1,450 +1,459 @@ import { expect } from 'chai'; -import customPurposeList from '../docs/assets/purposes.json'; - import Store from './store'; - - -const vendorList = { - "version": 1, - "origin": "http://ib.adnxs.com/vendors.json", - "purposes": [ - { - "id": 1, - "name": "Accessing a Device or Browser" - }, - { - "id": 2, - "name": "Advertising Personalisation" - }, - { - "id": 3, - "name": "Analytics" - }, - { - "id": 4, - "name": "Content Personalisation" - } - ], - "vendors": [ - { - "id": 1, - "external_id": 1, - "name": "Globex" - }, - { - "id": 2, - "external_id": 2, - "name": "Initech" - }, - { - "id": 3, - "external_id": 3, - "name": "CRS" - }, - { - "id": 4, - "external_id": 4, - "name": "Umbrella" - }, - { - "id": 5, - "external_id": 5, - "name": "Aperture" - }, - { - "id": 6, - "external_id": 6, - "name": "Pierce and Pierce" - } - ] -}; +import { CmpApi } from "@iabtcf/cmpapi"; +import { decodeConsentData, encodeConsentData } from "./cookie/cookie"; +// import Promise from "promise-polyfill"; +import {GVL, TCModel} from "@iabtcf/core"; + +import { + PURPOSE_CONSENTS, + PURPOSE_LEGITIMATE_INTERESTS, + VENDOR_CONSENTS, + VENDOR_LEGITIMATE_INTERESTS, + PUBLISHER_CONSENTS, + PUBLISHER_LEGITIMATE_INTERESTS, + SPECIAL_FEATURE_OPT_INS, + VENDOR_LIST +} from "../../test/constants"; describe('store', () => { + let cmpApi; - it('initializes with default data', () => { - - const store = new Store(); - - expect(store.isConsentToolShowing).to.equal(false); - - expect(store.vendorConsentData.cookieVersion).to.equal(1); - expect(store.vendorConsentData.cmpId).to.equal(1); - - expect(store.publisherConsentData.cookieVersion).to.equal(1); - expect(store.publisherConsentData.cmpId).to.equal(1); - }); - - - it('initializes with vendorList', () => { - const store = new Store({ vendorList }); - - expect(store.vendorList).to.deep.equal(vendorList); - expect(store.vendorConsentData.selectedVendorIds.size).to.equal(vendorList.vendors.length); - expect(store.vendorConsentData.selectedPurposeIds.size).to.equal(vendorList.purposes.length); - }); - - it('initializes with customPurposeList', () => { - const store = new Store({ customPurposeList }); - expect(store.customPurposeList).to.deep.equal(customPurposeList); - expect(store.publisherConsentData.selectedCustomPurposeIds.size).to.equal(customPurposeList.purposes.length); - }); - - it('initializes with selected IDs', () => { - const selectedVendorIds = new Set([1, 2]); - const selectedPurposeIds = new Set([234]); - const store = new Store({ - vendorList, - vendorConsentData: { - created: new Date(), - selectedVendorIds, - selectedPurposeIds - } - }); - - expect(store.vendorConsentData.selectedVendorIds).to.deep.equal(selectedVendorIds); - expect(store.vendorConsentData.selectedPurposeIds).to.deep.equal(selectedPurposeIds); - }); - - it('initializes with new vendor list', () => { - const expected = new Set(vendorList.vendors.map(v => v.id)); - const selectedVendorIds = new Set([1, 2]); - const store = new Store({ - vendorConsentData: { - created: new Date(), - selectedVendorIds, - maxVendorId:2 - } - }); - store.updateVendorList(vendorList); - expect(store.vendorConsentData.selectedVendorIds).to.deep.equal(expected); - }); - - it('build correct vendor consents object', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - selectedVendorIds: new Set([4, 5]), - selectedPurposeIds: new Set([1, 4]) - } - }); - - const vendorObject = store.getVendorConsentsObject(); - const noConsentVendorCount = Object.keys(vendorObject.vendorConsents).filter(key => !vendorObject.vendorConsents[key]).length; - - expect(noConsentVendorCount).to.equal(vendorList.vendors.length - 2); - expect(vendorObject.vendorConsents['4']).to.be.true; - expect(vendorObject.vendorConsents['5']).to.be.true; - - expect(vendorObject.purposeConsents['1']).to.be.true; - expect(vendorObject.purposeConsents['4']).to.be.true; - }); - - it('returns consent=false for vendors that are not in the allowedVendors', () => { - const store = new Store({ - vendorList, - allowedVendorIds: [1,2,3,4,5,6], - vendorConsentData: { - selectedVendorIds: new Set([4, 5, 7, 8]), - selectedPurposeIds: new Set([1, 4]) - } - }); - - const vendorObject = store.getVendorConsentsObject(); - - - expect(vendorObject.vendorConsents['4']).to.be.true; - expect(vendorObject.vendorConsents['5']).to.be.true; - - expect(vendorObject.vendorConsents['7']).to.be.false; - expect(vendorObject.vendorConsents['8']).to.be.false; - }); - - it('selects vendor IDs', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - created: new Date(), - selectedVendorIds: new Set([2, 4]), - } - }); - - store.selectVendor(2, false); - store.selectVendor(3, true); - store.persist(); - - const vendorObject = store.getVendorConsentsObject(); - const selectedVendorIds = Object.keys(vendorObject.vendorConsents).filter(key => vendorObject.vendorConsents[key]); - - expect(selectedVendorIds).to.deep.equal(['3', '4']); - }); - - it('selects ALL vendor IDs', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - created: new Date(), - selectedVendorIds: new Set([2, 4]), - } - }); - - store.selectAllVendors(true); - store.persist(); - - const vendorObject = store.getVendorConsentsObject(); - const selectedVendorIds = Object.keys(vendorObject.vendorConsents).filter(key => vendorObject.vendorConsents[key]); - - expect(selectedVendorIds.length).to.equal(vendorList.vendors.length); - }); - - it('selects purpose IDs', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - created: new Date(), - selectedPurposeIds: new Set([0, 1, 2]), - } - }); - - - store.selectPurpose(0, false); - store.selectPurpose(4, true); - store.persist(); - - const vendorObject = store.getVendorConsentsObject(); - const selectedPurposeIds = Object.keys(vendorObject.purposeConsents).filter(key => vendorObject.purposeConsents[key]); - - expect(selectedPurposeIds).to.deep.equal(['1', '2', '4']); - }); - - it('selects ALL purpose IDs', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - created: new Date(), - selectedPurposeIds: new Set([0, 1, 2]), - } - }); - - - store.selectAllPurposes(true); - store.persist(); - - const vendorObject = store.getVendorConsentsObject(); - const selectedPurposeIds = Object.keys(vendorObject.purposeConsents).filter(key => vendorObject.purposeConsents[key]); - - expect(selectedPurposeIds.length).to.equal(vendorList.purposes.length); - }); - - it('selects standard purpose IDs', () => { - const store = new Store({ - vendorList, - publisherConsentData: { - created: new Date(), - selectedStandardPurposeIds: new Set([0, 2]), - } - }); - - store.selectStandardPurpose(0, false); - store.selectStandardPurpose(3, true); - store.persist(); - - const publisherObject = store.getPublisherConsentsObject(); - const selectedStandardPurposeIds = Object.keys(publisherObject.standardPurposes).filter(key => publisherObject.standardPurposes[key]); - - expect(selectedStandardPurposeIds).to.deep.equal(['2', '3']); + beforeEach(() => { + cmpApi = new CmpApi(280, 2); }); - it('selects ALL standard purpose IDs', () => { - const store = new Store({ - vendorList, - publisherConsentData: { - created: new Date(), - selectedStandardPurposeIds: new Set([0, 2]), - } - }); - - store.selectAllStandardPurposes(true); - store.persist(); - - const publisherObject = store.getPublisherConsentsObject(); - const selectedStandardPurposeIds = Object.keys(publisherObject.standardPurposes).filter(key => publisherObject.standardPurposes[key]); - - expect(selectedStandardPurposeIds.length).to.equal(vendorList.purposes.length); + afterEach(() => { + cmpApi = undefined; }); - it('selects custom purpose IDs', () => { - const store = new Store({ - customPurposeList, - publisherConsentData: { - created: new Date(), - selectedCustomPurposeIds: new Set([0, 2]), - } - }); - - store.selectCustomPurpose(0, false); - store.selectCustomPurpose(3, true); - store.persist(); - - const publisherObject = store.getPublisherConsentsObject(); - const selectedCustomPurposeIds = Object.keys(publisherObject.customPurposes).filter(key => publisherObject.customPurposes[key]); + it('initializes with default data', () => { + const store = new Store({ cmpApi }); - expect(selectedCustomPurposeIds).to.deep.equal(['2', '3']); + expect(store.isConsentToolShowing).to.equal(false); + expect(store.tcModel.cookieVersion).to.equal(2); + expect(store.tcModel.cmpId).to.equal(280); }); - it('selects ALL custom purpose IDs', () => { + it('initializes with vendorList', () => { const store = new Store({ - customPurposeList, - publisherConsentData: { - created: new Date(), - selectedCustomPurposeIds: new Set([0, 2]), - } + vendorList: VENDOR_LIST, + cmpApi }); - store.selectAllCustomPurposes(true); - store.persist(); - - const publisherObject = store.getPublisherConsentsObject(); - const selectedCustomPurposeIds = Object.keys(publisherObject.customPurposes).filter(key => publisherObject.customPurposes[key]); - - expect(selectedCustomPurposeIds.length).to.equal(customPurposeList.purposes.length); - }); - - it('toggle the consent modal', () => { - const store = new Store(); - - expect(store.isConsentToolShowing).to.be.false; - store.toggleConsentToolShowing(); - expect(store.isConsentToolShowing).to.be.true; + expect(store.vendorList).to.deep.equal(VENDOR_LIST); + expect(store.tcModel.vendorConsents.size).to.equal(Object.keys(VENDOR_LIST.vendors).length); + expect(store.tcModel.purposeConsents.size).to.equal(Object.keys(VENDOR_LIST.purposes).length); }); - it('calls event listeners on update', (done) => { - const store = new Store(); - - store.subscribe(() => { + it('initializes with consent data', (done) => { + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(VENDOR_LIST); + + setTimeout(() => { + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(VENDOR_CONSENTS); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + + const encoded = encodeConsentData(tcModel); + + const store = new Store({ + vendorList: VENDOR_LIST, + consentData: decodeConsentData(encoded), + cmpApi + }); + + // check if consents were applied to current state of tcModel + expect(store.tcModel.purposeConsents.maxId).to.equal(Math.max(...PURPOSE_CONSENTS)); + expect(store.tcModel.purposeLegitimateInterests.maxId).to.equal(Math.max(...PURPOSE_LEGITIMATE_INTERESTS)); + expect(store.tcModel.vendorConsents.maxId).to.equal(Math.max(...VENDOR_CONSENTS)); + expect(store.tcModel.vendorLegitimateInterests.maxId).to.equal(Math.max(...VENDOR_LEGITIMATE_INTERESTS)); + expect(store.tcModel.publisherConsents.maxId).to.equal(Math.max(...PUBLISHER_CONSENTS)); + expect(store.tcModel.publisherLegitimateInterests.maxId).to.equal(Math.max(...PUBLISHER_LEGITIMATE_INTERESTS)); + expect(store.tcModel.specialFeatureOptIns.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); done(); - }); - store.storeUpdate(); + }, 0); }); - it('removes event listeners', () => { - const store = new Store(); - - const event = () => {}; - store.subscribe(event); - store.unsubscribe(event); - - expect(store.listeners).to.be.empty; - }); - - it('updates timestamps on persist', () => { - const created = new Date('2018-01-01'); - const lastUpdated = created; - - const store = new Store({ - vendorConsentData: { - created, - lastUpdated - }, - publisherConsentData: { - created, - lastUpdated - } - }); - - store.persist(); - - expect(store.vendorConsentData.created).to.equal(created); - expect(store.vendorConsentData.lastUpdated).to.be.above(lastUpdated); - }); - - it('merge vendor consent from global cookie when consents are same', () => { - const store = new Store({ - vendorConsentData: { - selectedVendorIds: new Set([1, 2, 3, 4, 5, 6]), - }, - globalVendorConsentData: { - maxVendorId: 6, - selectedVendorIds: new Set([1, 2, 3, 4, 5, 6]), - }, - }); - store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); - - store.mergeVendorConsentsFromGlobalCookie(); - expect(Array.from(store.vendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedVendorIds)); + it('initializes with new vendor list', (done) => { + const vendorList = JSON.parse(JSON.stringify(VENDOR_LIST)); + vendorList.vendorListVersion = 101; + const deprecated = JSON.parse(JSON.stringify(VENDOR_LIST)); + delete deprecated.vendors["10"]; + + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(deprecated); + const deprecatedVendorConsents = [...VENDOR_CONSENTS].slice(0,-1); + + setTimeout(() => { + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(deprecatedVendorConsents); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + + + const encoded = encodeConsentData(tcModel); + const decoded = decodeConsentData(encoded); + + const store = new Store({ + consentData: decoded, + cmpApi + }); + + store.updateVendorList(vendorList); + + expect(store.tcModel.vendorConsents.size).to.equal(6); + expect(store.tcModel.vendorConsents.maxId).to.equal(10); + expect(store.tcModel.vendorConsents.has(10)).to.be.true; + done(); + }, 0); }); - it('merge vendor consent from global cookie when consents differ', () => { - const store = new Store({ - vendorConsentData: { - selectedVendorIds: new Set([1, 2, 3]), - }, - globalVendorConsentData: { - maxVendorId: 6, - selectedVendorIds: new Set([3, 4, 5, 6]), - }, - }); - store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); - - store.mergeVendorConsentsFromGlobalCookie(); - expect(Array.from(store.vendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedVendorIds)); - }); + it('build correct vendor consents object', (done) => { + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(VENDOR_LIST); + + setTimeout(() => { + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(VENDOR_CONSENTS); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + + const encoded = encodeConsentData(tcModel); + const decoded = decodeConsentData(encoded); + + const store = new Store({ + vendorList: VENDOR_LIST, + consentData: decoded, + cmpApi + }); + + const vendorConsentsObject = store.getVendorConsentsObject(); + const vendorsWithoutConsentCount = Object.values(vendorConsentsObject.vendorConsents).filter(consent => !consent).length; + + expect(vendorsWithoutConsentCount).to.equal(Object.keys(VENDOR_LIST.vendors).length - 2); + expect(vendorConsentsObject.vendorConsents['4']).to.be.true; + expect(vendorConsentsObject.vendorConsents['5']).to.be.false; + + expect(vendorConsentsObject.purposeConsents['1']).to.be.true; + expect(vendorConsentsObject.purposeConsents['3']).to.be.true; + expect(vendorConsentsObject.purposeConsents['2']).to.be.false; + expect(vendorConsentsObject.purposeConsents['4']).to.be.false; + + expect(vendorConsentsObject.purposeLegitimateInterests['2']).to.be.true; + expect(vendorConsentsObject.purposeLegitimateInterests['4']).to.be.true; + expect(vendorConsentsObject.purposeLegitimateInterests['1']).to.be.false; + expect(vendorConsentsObject.purposeLegitimateInterests['3']).to.be.false; - it('merge vendor consent to global cookie', () => { - const store = new Store({ - vendorConsentData: { - selectedVendorIds: new Set([1, 2, 3, 4, 5]), - }, - globalVendorConsentData: { - selectedVendorIds: new Set([1, 2]), - }, + done(); }); - store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); - - store.mergeVendorConsentsToGlobalCookie(); - expect(Array.from(store.globalVendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.vendorConsentData.selectedVendorIds)); }); - it('merge purpose consent from global cookie when consents are same', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - selectedPurposeIds: new Set([1, 2, 3, 4]), - }, - globalVendorConsentData: { - selectedPurposeIds: new Set([1, 2, 3, 4]), - }, - }); + it('selects vendor IDs', (done) => { + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(VENDOR_LIST); - store.mergePurposeConsentsFromGlobalCookie(); - expect(Array.from(store.vendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedPurposeIds)); - }); + setTimeout(() => { + const store = new Store({ + vendorList: VENDOR_LIST, + cmpApi + }); - it('merge purpose consent from global cookie when consents differ', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - selectedPurposeIds: new Set([1, 2]), - }, - globalVendorConsentData: { - selectedPurposeIds: new Set([2, 3, 4]), - }, - }); + store.selectVendor(2, false); + store.selectVendor(3, true); + store.persist(); - store.mergePurposeConsentsFromGlobalCookie(); - expect(Array.from(store.vendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedPurposeIds)); + const vendorConsentObject = store.getVendorConsentsObject(); + expect(vendorConsentObject.vendorConsents['3']).to.be.true; + done(); + }, 0); }); - - it('merge purpose consent to global cookie', () => { - const store = new Store({ - vendorList, - vendorConsentData: { - selectedPurposeIds: new Set([1, 2, 4]), - }, - globalVendorConsentData: { - selectedPurposeIds: new Set([2, 3]), - }, - }); - - store.mergePurposeConsentsToGlobalCookie(); - expect(Array.from(store.globalVendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.vendorConsentData.selectedPurposeIds)); }); + // + // it('selects ALL vendor IDs', () => { + // const store = new Store({ + // vendorList, + // vendorConsentData: { + // created: new Date(), + // selectedVendorIds: new Set([2, 4]), + // } + // }); + // + // store.selectAllVendors(true); + // store.persist(); + // + // const vendorObject = store.getVendorConsentsObject(); + // const selectedVendorIds = Object.keys(vendorObject.vendorConsents).filter(key => vendorObject.vendorConsents[key]); + // + // expect(selectedVendorIds.length).to.equal(vendorList.vendors.length); + // }); + // + // it('selects purpose IDs', () => { + // const store = new Store({ + // vendorList, + // vendorConsentData: { + // created: new Date(), + // selectedPurposeIds: new Set([0, 1, 2]), + // } + // }); + // + // + // store.selectPurpose(0, false); + // store.selectPurpose(4, true); + // store.persist(); + // + // const vendorObject = store.getVendorConsentsObject(); + // const selectedPurposeIds = Object.keys(vendorObject.purposeConsents).filter(key => vendorObject.purposeConsents[key]); + // + // expect(selectedPurposeIds).to.deep.equal(['1', '2', '4']); + // }); + // + // it('selects ALL purpose IDs', () => { + // const store = new Store({ + // vendorList, + // vendorConsentData: { + // created: new Date(), + // selectedPurposeIds: new Set([0, 1, 2]), + // } + // }); + // + // + // store.selectAllPurposes(true); + // store.persist(); + // + // const vendorObject = store.getVendorConsentsObject(); + // const selectedPurposeIds = Object.keys(vendorObject.purposeConsents).filter(key => vendorObject.purposeConsents[key]); + // + // expect(selectedPurposeIds.length).to.equal(vendorList.purposes.length); + // }); + // + // it('selects standard purpose IDs', () => { + // const store = new Store({ + // vendorList, + // publisherConsentData: { + // created: new Date(), + // selectedStandardPurposeIds: new Set([0, 2]), + // } + // }); + // + // store.selectStandardPurpose(0, false); + // store.selectStandardPurpose(3, true); + // store.persist(); + // + // const publisherObject = store.getPublisherConsentsObject(); + // const selectedStandardPurposeIds = Object.keys(publisherObject.standardPurposes).filter(key => publisherObject.standardPurposes[key]); + // + // expect(selectedStandardPurposeIds).to.deep.equal(['2', '3']); + // }); + // + // it('selects ALL standard purpose IDs', () => { + // const store = new Store({ + // vendorList, + // publisherConsentData: { + // created: new Date(), + // selectedStandardPurposeIds: new Set([0, 2]), + // } + // }); + // + // store.selectAllStandardPurposes(true); + // store.persist(); + // + // const publisherObject = store.getPublisherConsentsObject(); + // const selectedStandardPurposeIds = Object.keys(publisherObject.standardPurposes).filter(key => publisherObject.standardPurposes[key]); + // + // expect(selectedStandardPurposeIds.length).to.equal(vendorList.purposes.length); + // }); + // + // it('selects custom purpose IDs', () => { + // const store = new Store({ + // customPurposeList, + // publisherConsentData: { + // created: new Date(), + // selectedCustomPurposeIds: new Set([0, 2]), + // } + // }); + // + // store.selectCustomPurpose(0, false); + // store.selectCustomPurpose(3, true); + // store.persist(); + // + // const publisherObject = store.getPublisherConsentsObject(); + // const selectedCustomPurposeIds = Object.keys(publisherObject.customPurposes).filter(key => publisherObject.customPurposes[key]); + // + // expect(selectedCustomPurposeIds).to.deep.equal(['2', '3']); + // }); + // + // it('selects ALL custom purpose IDs', () => { + // const store = new Store({ + // customPurposeList, + // publisherConsentData: { + // created: new Date(), + // selectedCustomPurposeIds: new Set([0, 2]), + // } + // }); + // + // store.selectAllCustomPurposes(true); + // store.persist(); + // + // const publisherObject = store.getPublisherConsentsObject(); + // const selectedCustomPurposeIds = Object.keys(publisherObject.customPurposes).filter(key => publisherObject.customPurposes[key]); + // + // expect(selectedCustomPurposeIds.length).to.equal(customPurposeList.purposes.length); + // }); + // + // it('toggle the consent modal', () => { + // const store = new Store(); + // + // expect(store.isConsentToolShowing).to.be.false; + // store.toggleConsentToolShowing(); + // expect(store.isConsentToolShowing).to.be.true; + // }); + // + // it('calls event listeners on update', (done) => { + // const store = new Store(); + // + // store.subscribe(() => { + // done(); + // }); + // store.storeUpdate(); + // }); + // + // it('removes event listeners', () => { + // const store = new Store(); + // + // const event = () => {}; + // store.subscribe(event); + // store.unsubscribe(event); + // + // expect(store.listeners).to.be.empty; + // }); + // + // it('updates timestamps on persist', () => { + // const created = new Date('2018-01-01'); + // const lastUpdated = created; + // + // const store = new Store({ + // vendorConsentData: { + // created, + // lastUpdated + // }, + // publisherConsentData: { + // created, + // lastUpdated + // } + // }); + // + // store.persist(); + // + // expect(store.vendorConsentData.created).to.equal(created); + // expect(store.vendorConsentData.lastUpdated).to.be.above(lastUpdated); + // }); + // + // it('merge vendor consent from global cookie when consents are same', () => { + // const store = new Store({ + // vendorConsentData: { + // selectedVendorIds: new Set([1, 2, 3, 4, 5, 6]), + // }, + // globalVendorConsentData: { + // maxVendorId: 6, + // selectedVendorIds: new Set([1, 2, 3, 4, 5, 6]), + // }, + // }); + // store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); + // + // store.mergeVendorConsentsFromGlobalCookie(); + // expect(Array.from(store.vendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedVendorIds)); + // }); + // + // it('merge vendor consent from global cookie when consents differ', () => { + // const store = new Store({ + // vendorConsentData: { + // selectedVendorIds: new Set([1, 2, 3]), + // }, + // globalVendorConsentData: { + // maxVendorId: 6, + // selectedVendorIds: new Set([3, 4, 5, 6]), + // }, + // }); + // store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); + // + // store.mergeVendorConsentsFromGlobalCookie(); + // expect(Array.from(store.vendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedVendorIds)); + // }); + // + // it('merge vendor consent to global cookie', () => { + // const store = new Store({ + // vendorConsentData: { + // selectedVendorIds: new Set([1, 2, 3, 4, 5]), + // }, + // globalVendorConsentData: { + // selectedVendorIds: new Set([1, 2]), + // }, + // }); + // store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); + // + // store.mergeVendorConsentsToGlobalCookie(); + // expect(Array.from(store.globalVendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.vendorConsentData.selectedVendorIds)); + // }); + // + // it('merge purpose consent from global cookie when consents are same', () => { + // const store = new Store({ + // vendorList, + // vendorConsentData: { + // selectedPurposeIds: new Set([1, 2, 3, 4]), + // }, + // globalVendorConsentData: { + // selectedPurposeIds: new Set([1, 2, 3, 4]), + // }, + // }); + // + // store.mergePurposeConsentsFromGlobalCookie(); + // expect(Array.from(store.vendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedPurposeIds)); + // }); + // + // it('merge purpose consent from global cookie when consents differ', () => { + // const store = new Store({ + // vendorList, + // vendorConsentData: { + // selectedPurposeIds: new Set([1, 2]), + // }, + // globalVendorConsentData: { + // selectedPurposeIds: new Set([2, 3, 4]), + // }, + // }); + // + // store.mergePurposeConsentsFromGlobalCookie(); + // expect(Array.from(store.vendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedPurposeIds)); + // }); + // + // it('merge purpose consent to global cookie', () => { + // const store = new Store({ + // vendorList, + // vendorConsentData: { + // selectedPurposeIds: new Set([1, 2, 4]), + // }, + // globalVendorConsentData: { + // selectedPurposeIds: new Set([2, 3]), + // }, + // }); + // + // store.mergePurposeConsentsToGlobalCookie(); + // expect(Array.from(store.globalVendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.vendorConsentData.selectedPurposeIds)); }); }); diff --git a/src/lib/vendor.test.js b/src/lib/vendor.test.js index 3ef46294..9aaef966 100644 --- a/src/lib/vendor.test.js +++ b/src/lib/vendor.test.js @@ -7,7 +7,7 @@ import config from './config'; jest.mock('./portal'); const mockPortal = require('./portal'); -import { fetchPubVendorList, fetchGlobalVendorList, fetchPurposeList } from './vendor'; +import { fetchGlobalVendorList } from './vendor'; describe('vendor', () => { @@ -25,15 +25,6 @@ describe('vendor', () => { window.XMLHttpRequest = jest.fn(() => xhr); }); - - it('fetchPubVendorList fetches from `.well-known` URL', (done) => { - - fetchPubVendorList().then(() => { - expect(xhr.open.mock.calls[0][1]).to.equal('/.well-known/pubvendors.json'); - done(); - }); - }); - it('fetchGlobalVendorList fetches from configured globalVendorListLocation', (done) => { config.update({ globalVendorListLocation: 'globalpath.json', @@ -45,38 +36,4 @@ describe('vendor', () => { done(); }); }); - - it('fetchPurposeList returns nothing if there is no customPurposeListLocation', (done) => { - config.update({ - customPurposeListLocation: undefined - }); - - fetchPurposeList().then(() => { - expect(window.XMLHttpRequest.mock.calls).to.be.empty; - done(); - }); - }); - - it('fetchPurposeList returns nothing if storePublisherData = false', (done) => { - config.update({ - storePublisherData: true - }); - - fetchPurposeList().then(() => { - expect(window.XMLHttpRequest.mock.calls).to.be.empty; - done(); - }); - }); - - - it('fetchPurposeList fetches the configured URL', (done) => { - config.update({ - customPurposeListLocation: 'somepath.json' - }); - - fetchPurposeList().then(() => { - expect(xhr.open.mock.calls[0][0]).to.equal('GET', 'somepath.json', true); - done(); - }); - }); }); diff --git a/test/constants.js b/test/constants.js index b94543e7..d763af6a 100644 --- a/test/constants.js +++ b/test/constants.js @@ -203,4 +203,4 @@ export { PUBLISHER_LEGITIMATE_INTERESTS, SPECIAL_FEATURE_OPT_INS, VENDOR_LIST -} +}; diff --git a/webpack.config.babel.js b/webpack.config.babel.js index af0b827f..dec9d9d3 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -144,7 +144,7 @@ const commonConfig = { node: { global: true, process: false, - Buffer: false, + Buffer: true, __filename: false, __dirname: false, setImmediate: false From 32549c80282d84414dac6a102df67d8d50175516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 13:22:16 +0100 Subject: [PATCH 252/540] cmpApi setter to create commands during cmpApi initialization --- src/lib/init.js | 16 +++++++--------- src/lib/store.js | 14 ++++++-------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 90a5c73a..bb27b09b 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -41,22 +41,20 @@ export function init (configUpdates) { // Fetch the current vendor consent before initializing return ((config.getConsentData) ? readExternalConsentData(config) : readConsentCookie()) .then((consentData) => { - const cmpApi = new CmpApi(CMP_ID, CMP_VERSION); - - if (config.decoratePageCallHandler) { - config.decoratePageCallHandler(CmpApi, cmpApi); - } - - // Initialize the store with all of our consent data const store = new Store({ cmpVersion: CMP_VERSION, cmpId: CMP_ID, cookieVersion: COOKIE_VERSION, consentData, - cmpApi }); - cmpApi.customCommands = createCommands(store); + const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store)); + + store.setCmpApi(cmpApi); + + if (config.decoratePageCallHandler) { + config.decoratePageCallHandler(CmpApi, cmpApi); + } // Pull queued command from __cmp stub const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; diff --git a/src/lib/store.js b/src/lib/store.js index d327a2df..fd8e8eca 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -18,9 +18,7 @@ export default class Store { cmpId = 280, cmpVersion = 2, cookieVersion = 2, - vendorList, - consentData, - cmpApi + consentData } = {}) { // Keep track of data that has already been persisted consentData = consentData || {}; @@ -42,16 +40,16 @@ export default class Store { consentLanguage }); - this.cmpApi = cmpApi; - this.isConsentToolShowing = this.cmpApi.uiVisible = false; + this.isConsentToolShowing = false; this.isFooterShowing = false; this.section = SECTION_INTRO; this.subsection = SECTION_PURPOSES; this.hasInitialVendorsRejectionOccured = false; + } - if (vendorList) { - this.updateVendorList(vendorList); - } + setCmpApi (cmpApi) { + this.cmpApi = cmpApi; + this.cmpApi.uiVisible = this.isConsentToolShowing; } isAllSetTrue = obj => Object.keys(obj).map(key => obj[key]).every((value) => value === true); From 2d83308fc2638c28724ca6a3e59ce324cf970e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 15:50:07 +0100 Subject: [PATCH 253/540] store tests finished --- src/lib/store.js | 7 +- src/lib/store.test.js | 513 +++++++++++++++++++----------------------- 2 files changed, 229 insertions(+), 291 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index fd8e8eca..83534970 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -49,7 +49,6 @@ export default class Store { setCmpApi (cmpApi) { this.cmpApi = cmpApi; - this.cmpApi.uiVisible = this.isConsentToolShowing; } isAllSetTrue = obj => Object.keys(obj).map(key => obj[key]).every((value) => value === true); @@ -363,8 +362,7 @@ export default class Store { const {purposeConsents} = this.tcModel; if (isSelected) { purposeConsents.set(purposeId); - } - else { + } else { purposeConsents.unset(purposeId); } this.storeUpdate(); @@ -380,8 +378,7 @@ export default class Store { const {purposeLegitimateInterests} = this.tcModel; if (isSelected) { purposeLegitimateInterests.set(purposeId); - } - else { + } else { purposeLegitimateInterests.unset(purposeId); } this.storeUpdate(); diff --git a/src/lib/store.test.js b/src/lib/store.test.js index f8fab8d0..f385c496 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -1,8 +1,9 @@ -import { expect } from 'chai'; +/* eslint-disable max-nested-callbacks */ +import { expect, use } from 'chai'; +import datetime from 'chai-datetime' import Store from './store'; import { CmpApi } from "@iabtcf/cmpapi"; import { decodeConsentData, encodeConsentData } from "./cookie/cookie"; -// import Promise from "promise-polyfill"; import {GVL, TCModel} from "@iabtcf/core"; import { @@ -16,6 +17,8 @@ import { VENDOR_LIST } from "../../test/constants"; +use(datetime); + describe('store', () => { let cmpApi; @@ -37,10 +40,12 @@ describe('store', () => { it('initializes with vendorList', () => { const store = new Store({ - vendorList: VENDOR_LIST, cmpApi }); + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + expect(store.vendorList).to.deep.equal(VENDOR_LIST); expect(store.tcModel.vendorConsents.size).to.equal(Object.keys(VENDOR_LIST.vendors).length); expect(store.tcModel.purposeConsents.size).to.equal(Object.keys(VENDOR_LIST.purposes).length); @@ -64,11 +69,12 @@ describe('store', () => { const encoded = encodeConsentData(tcModel); const store = new Store({ - vendorList: VENDOR_LIST, consentData: decodeConsentData(encoded), - cmpApi }); + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + // check if consents were applied to current state of tcModel expect(store.tcModel.purposeConsents.maxId).to.equal(Math.max(...PURPOSE_CONSENTS)); expect(store.tcModel.purposeLegitimateInterests.maxId).to.equal(Math.max(...PURPOSE_LEGITIMATE_INTERESTS)); @@ -108,9 +114,9 @@ describe('store', () => { const store = new Store({ consentData: decoded, - cmpApi }); + store.setCmpApi(cmpApi); store.updateVendorList(vendorList); expect(store.tcModel.vendorConsents.size).to.equal(6); @@ -139,11 +145,12 @@ describe('store', () => { const decoded = decodeConsentData(encoded); const store = new Store({ - vendorList: VENDOR_LIST, consentData: decoded, - cmpApi }); + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + const vendorConsentsObject = store.getVendorConsentsObject(); const vendorsWithoutConsentCount = Object.values(vendorConsentsObject.vendorConsents).filter(consent => !consent).length; @@ -165,295 +172,229 @@ describe('store', () => { }); }); - it('selects vendor IDs', (done) => { + it('selects vendor IDs', () => { + const store = new Store({ + cmpApi + }); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectVendor(2, false); + store.selectVendor(3, true); + store.persist(); + + const vendorConsentObject = store.getVendorConsentsObject(); + expect(vendorConsentObject.vendorConsents['3']).to.be.true; + + }); + + it('selects ALL vendor IDs', () => { + const store = new Store({ + cmpApi + }); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectAllVendors(true); + store.persist(); + + const vendorConsentObject = store.getVendorConsentsObject(); + const vendorConsents = Object.keys(vendorConsentObject.vendorConsents).filter(key => vendorConsentObject.vendorConsents[key]); + + expect(vendorConsents.length).to.equal(Object.values(VENDOR_LIST.vendors).length); + }); + + it('selects purpose IDs', () => { + const store = new Store(); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectPurpose(1, false); + store.selectPurpose(2, false); + store.selectPurpose(3, true); + store.persist(); + + const vendorConsentObject = store.getVendorConsentsObject(); + const purposeConsents = Object.keys(vendorConsentObject.purposeConsents).filter(key => vendorConsentObject.purposeConsents[key]); + + expect(purposeConsents.length).to.equal(Object.values(VENDOR_LIST.purposes).length - 2); + }); + + it('selects ALL purpose IDs', () => { + const store = new Store(); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectAllPurposes(false); + store.persist(); + + const vendorConsentObject = store.getVendorConsentsObject(); + const purposeConsents = Object.keys(vendorConsentObject.purposeConsents).filter(key => vendorConsentObject.purposeConsents[key]); + + expect(purposeConsents.length).to.equal(0); + }); + + it('selects legitimate interests IDs', () => { + const store = new Store(); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectPurposeLegitimateInterests(1, false); + store.selectPurposeLegitimateInterests(2, false); + store.selectPurposeLegitimateInterests(3, true); + store.persist(); + + const vendorConsentObject = store.getVendorConsentsObject(); + const legIntConsents = Object.keys(vendorConsentObject.purposeLegitimateInterests).filter(key => vendorConsentObject.purposeLegitimateInterests[key]); + + expect(legIntConsents.length).to.equal(Object.values(VENDOR_LIST.purposes).length - 2); + }); + + it('selects ALL legitimate interests IDs', () => { + const store = new Store(); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectAllPurposesLegitimateInterests(false); + store.persist(); + + const vendorConsentObject = store.getVendorConsentsObject(); + const legIntConsents = Object.keys(vendorConsentObject.purposeLegitimateInterests).filter(key => vendorConsentObject.purposeLegitimateInterests[key]); + + expect(legIntConsents.length).to.equal(0); + }); + + it('selects special feature opt ins IDs', () => { + const store = new Store(); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectSpecialFeature(1, true); + store.selectSpecialFeature(2, false); + store.persist(); + + const vendorConsentsObject = store.getVendorConsentsObject(); + const specialFeatureConsents = Object.keys(vendorConsentsObject.specialFeatureOptIns).filter(key => vendorConsentsObject.specialFeatureOptIns[key]); + + expect(specialFeatureConsents.length).to.equal(Object.keys(VENDOR_LIST.specialFeatures).length - 1); + expect(vendorConsentsObject.specialFeatureOptIns['2']).to.be.false; + }); + + it('selects ALL special feature opt ins IDs', () => { + const store = new Store(); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectAllSpecialFeatureOptIns(false); + store.persist(); + + const vendorConsentsObject = store.getVendorConsentsObject(); + const specialFeatureConsents = Object.keys(vendorConsentsObject.specialFeatureOptIns).filter(key => vendorConsentsObject.specialFeatureOptIns[key]); + + expect(specialFeatureConsents.length).to.equal(0); + }); + + it('selects publisher purpose IDs', () => { + const store = new Store(); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectPublisherPurpose(1, false); + store.selectPublisherPurpose(3, false); + + + store.persist(); + + const publisherConsentObject = store.getPublisherConsentsObject(); + const publisherConsents = Object.keys(publisherConsentObject.publisherConsents).filter(key => publisherConsentObject.publisherConsents[key]); + + expect(publisherConsents.length).to.equal(Object.keys(VENDOR_LIST.purposes).length - 2); + expect(publisherConsentObject.publisherConsents['1']).to.be.false; + expect(publisherConsentObject.publisherConsents['3']).to.be.false; +}); + + it('selects ALL publisher purpose IDs', () => { + const store = new Store(); + + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + store.selectAllPublisherPurposes(true); + store.persist(); + + const publisherConsentObject = store.getPublisherConsentsObject(); + const publisherConsents = Object.keys(publisherConsentObject.publisherConsents).filter(key => publisherConsentObject.publisherConsents[key]); + + expect(publisherConsents.length).to.equal(Object.keys(VENDOR_LIST.purposes).length); + }); + + it('toggle the consent modal', () => { + const store = new Store(); + store.setCmpApi(cmpApi); + expect(store.isConsentToolShowing).to.be.false; + store.toggleConsentToolShowing(); + expect(store.isConsentToolShowing).to.be.true; + }); + + it('calls event listeners on update', (done) => { + const store = new Store(); + + store.subscribe(() => { + done(); + }); + store.storeUpdate(); + }); + + it('removes event listeners', () => { + const store = new Store(); + + const event = () => {}; + store.subscribe(event); + store.unsubscribe(event); + + expect(store.listeners).to.be.empty; + }); + + it('updates timestamps on persist', (done) => { const tcModel = new TCModel(); tcModel.cmpId = 280; tcModel.cmpVersion = 2; tcModel.gvl = new GVL(VENDOR_LIST); + const created = tcModel.created; + const lastUpdated = created; + setTimeout(() => { + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(VENDOR_CONSENTS); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + + const encoded = encodeConsentData(tcModel); + const store = new Store({ - vendorList: VENDOR_LIST, - cmpApi + consentData: decodeConsentData(encoded), }); - store.selectVendor(2, false); - store.selectVendor(3, true); + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); store.persist(); - const vendorConsentObject = store.getVendorConsentsObject(); - expect(vendorConsentObject.vendorConsents['3']).to.be.true; + expect(store.persistedConsentData.created).to.equalDate(created); + expect(store.persistedConsentData.lastUpdated).to.equalDate(lastUpdated); done(); - }, 0); + }, 5) }); - // - // it('selects ALL vendor IDs', () => { - // const store = new Store({ - // vendorList, - // vendorConsentData: { - // created: new Date(), - // selectedVendorIds: new Set([2, 4]), - // } - // }); - // - // store.selectAllVendors(true); - // store.persist(); - // - // const vendorObject = store.getVendorConsentsObject(); - // const selectedVendorIds = Object.keys(vendorObject.vendorConsents).filter(key => vendorObject.vendorConsents[key]); - // - // expect(selectedVendorIds.length).to.equal(vendorList.vendors.length); - // }); - // - // it('selects purpose IDs', () => { - // const store = new Store({ - // vendorList, - // vendorConsentData: { - // created: new Date(), - // selectedPurposeIds: new Set([0, 1, 2]), - // } - // }); - // - // - // store.selectPurpose(0, false); - // store.selectPurpose(4, true); - // store.persist(); - // - // const vendorObject = store.getVendorConsentsObject(); - // const selectedPurposeIds = Object.keys(vendorObject.purposeConsents).filter(key => vendorObject.purposeConsents[key]); - // - // expect(selectedPurposeIds).to.deep.equal(['1', '2', '4']); - // }); - // - // it('selects ALL purpose IDs', () => { - // const store = new Store({ - // vendorList, - // vendorConsentData: { - // created: new Date(), - // selectedPurposeIds: new Set([0, 1, 2]), - // } - // }); - // - // - // store.selectAllPurposes(true); - // store.persist(); - // - // const vendorObject = store.getVendorConsentsObject(); - // const selectedPurposeIds = Object.keys(vendorObject.purposeConsents).filter(key => vendorObject.purposeConsents[key]); - // - // expect(selectedPurposeIds.length).to.equal(vendorList.purposes.length); - // }); - // - // it('selects standard purpose IDs', () => { - // const store = new Store({ - // vendorList, - // publisherConsentData: { - // created: new Date(), - // selectedStandardPurposeIds: new Set([0, 2]), - // } - // }); - // - // store.selectStandardPurpose(0, false); - // store.selectStandardPurpose(3, true); - // store.persist(); - // - // const publisherObject = store.getPublisherConsentsObject(); - // const selectedStandardPurposeIds = Object.keys(publisherObject.standardPurposes).filter(key => publisherObject.standardPurposes[key]); - // - // expect(selectedStandardPurposeIds).to.deep.equal(['2', '3']); - // }); - // - // it('selects ALL standard purpose IDs', () => { - // const store = new Store({ - // vendorList, - // publisherConsentData: { - // created: new Date(), - // selectedStandardPurposeIds: new Set([0, 2]), - // } - // }); - // - // store.selectAllStandardPurposes(true); - // store.persist(); - // - // const publisherObject = store.getPublisherConsentsObject(); - // const selectedStandardPurposeIds = Object.keys(publisherObject.standardPurposes).filter(key => publisherObject.standardPurposes[key]); - // - // expect(selectedStandardPurposeIds.length).to.equal(vendorList.purposes.length); - // }); - // - // it('selects custom purpose IDs', () => { - // const store = new Store({ - // customPurposeList, - // publisherConsentData: { - // created: new Date(), - // selectedCustomPurposeIds: new Set([0, 2]), - // } - // }); - // - // store.selectCustomPurpose(0, false); - // store.selectCustomPurpose(3, true); - // store.persist(); - // - // const publisherObject = store.getPublisherConsentsObject(); - // const selectedCustomPurposeIds = Object.keys(publisherObject.customPurposes).filter(key => publisherObject.customPurposes[key]); - // - // expect(selectedCustomPurposeIds).to.deep.equal(['2', '3']); - // }); - // - // it('selects ALL custom purpose IDs', () => { - // const store = new Store({ - // customPurposeList, - // publisherConsentData: { - // created: new Date(), - // selectedCustomPurposeIds: new Set([0, 2]), - // } - // }); - // - // store.selectAllCustomPurposes(true); - // store.persist(); - // - // const publisherObject = store.getPublisherConsentsObject(); - // const selectedCustomPurposeIds = Object.keys(publisherObject.customPurposes).filter(key => publisherObject.customPurposes[key]); - // - // expect(selectedCustomPurposeIds.length).to.equal(customPurposeList.purposes.length); - // }); - // - // it('toggle the consent modal', () => { - // const store = new Store(); - // - // expect(store.isConsentToolShowing).to.be.false; - // store.toggleConsentToolShowing(); - // expect(store.isConsentToolShowing).to.be.true; - // }); - // - // it('calls event listeners on update', (done) => { - // const store = new Store(); - // - // store.subscribe(() => { - // done(); - // }); - // store.storeUpdate(); - // }); - // - // it('removes event listeners', () => { - // const store = new Store(); - // - // const event = () => {}; - // store.subscribe(event); - // store.unsubscribe(event); - // - // expect(store.listeners).to.be.empty; - // }); - // - // it('updates timestamps on persist', () => { - // const created = new Date('2018-01-01'); - // const lastUpdated = created; - // - // const store = new Store({ - // vendorConsentData: { - // created, - // lastUpdated - // }, - // publisherConsentData: { - // created, - // lastUpdated - // } - // }); - // - // store.persist(); - // - // expect(store.vendorConsentData.created).to.equal(created); - // expect(store.vendorConsentData.lastUpdated).to.be.above(lastUpdated); - // }); - // - // it('merge vendor consent from global cookie when consents are same', () => { - // const store = new Store({ - // vendorConsentData: { - // selectedVendorIds: new Set([1, 2, 3, 4, 5, 6]), - // }, - // globalVendorConsentData: { - // maxVendorId: 6, - // selectedVendorIds: new Set([1, 2, 3, 4, 5, 6]), - // }, - // }); - // store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); - // - // store.mergeVendorConsentsFromGlobalCookie(); - // expect(Array.from(store.vendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedVendorIds)); - // }); - // - // it('merge vendor consent from global cookie when consents differ', () => { - // const store = new Store({ - // vendorConsentData: { - // selectedVendorIds: new Set([1, 2, 3]), - // }, - // globalVendorConsentData: { - // maxVendorId: 6, - // selectedVendorIds: new Set([3, 4, 5, 6]), - // }, - // }); - // store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); - // - // store.mergeVendorConsentsFromGlobalCookie(); - // expect(Array.from(store.vendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedVendorIds)); - // }); - // - // it('merge vendor consent to global cookie', () => { - // const store = new Store({ - // vendorConsentData: { - // selectedVendorIds: new Set([1, 2, 3, 4, 5]), - // }, - // globalVendorConsentData: { - // selectedVendorIds: new Set([1, 2]), - // }, - // }); - // store.globalVendorIdsPresentOnList = new Map([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]); - // - // store.mergeVendorConsentsToGlobalCookie(); - // expect(Array.from(store.globalVendorConsentData.selectedVendorIds)).to.deep.equal(Array.from(store.vendorConsentData.selectedVendorIds)); - // }); - // - // it('merge purpose consent from global cookie when consents are same', () => { - // const store = new Store({ - // vendorList, - // vendorConsentData: { - // selectedPurposeIds: new Set([1, 2, 3, 4]), - // }, - // globalVendorConsentData: { - // selectedPurposeIds: new Set([1, 2, 3, 4]), - // }, - // }); - // - // store.mergePurposeConsentsFromGlobalCookie(); - // expect(Array.from(store.vendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedPurposeIds)); - // }); - // - // it('merge purpose consent from global cookie when consents differ', () => { - // const store = new Store({ - // vendorList, - // vendorConsentData: { - // selectedPurposeIds: new Set([1, 2]), - // }, - // globalVendorConsentData: { - // selectedPurposeIds: new Set([2, 3, 4]), - // }, - // }); - // - // store.mergePurposeConsentsFromGlobalCookie(); - // expect(Array.from(store.vendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.globalVendorConsentData.selectedPurposeIds)); - // }); - // - // it('merge purpose consent to global cookie', () => { - // const store = new Store({ - // vendorList, - // vendorConsentData: { - // selectedPurposeIds: new Set([1, 2, 4]), - // }, - // globalVendorConsentData: { - // selectedPurposeIds: new Set([2, 3]), - // }, - // }); - // - // store.mergePurposeConsentsToGlobalCookie(); - // expect(Array.from(store.globalVendorConsentData.selectedPurposeIds)).to.deep.equal(Array.from(store.vendorConsentData.selectedPurposeIds)); }); }); From f48b10834e2a8dc48a11af911ceb1400be9fd96f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 16:06:50 +0100 Subject: [PATCH 254/540] changed params order + invoking config fucntions --- src/index.js | 2 +- src/lib/commands.js | 2 +- src/lib/config.js | 2 +- src/lib/init.js | 6 ++---- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/index.js b/src/index.js index 20654274..c7038b74 100755 --- a/src/index.js +++ b/src/index.js @@ -53,7 +53,7 @@ function checkConsent(cmp, store) { const { getVendorList, getTCData } = config; if (getVendorList) { - getVendorList((err, vendorList) => { + getVendorList((vendorList, err) => { if (err) { log.error('Failed to get vendor list'); } else { diff --git a/src/lib/commands.js b/src/lib/commands.js index 7eb26a5e..b579f657 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -23,7 +23,7 @@ const createCommands = (store) => { const { getVendorList } = config; if (getVendorList) { - getVendorList((err, data) => { + getVendorList((data, err) => { if (err) { callback({}, err); } else { diff --git a/src/lib/config.js b/src/lib/config.js index 99d6f2bf..1f800710 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -14,8 +14,8 @@ const defaultConfig = { setConsentData: null, getVendorList: null, decoratePageCallHandler: null, + setPageCallHandlerContext: null, getTCData: null, - onConsentToolShowing: null, legIntPurposeIds: [], contractPurposeIds: [], autoDisplay: true, diff --git a/src/lib/init.js b/src/lib/init.js index bb27b09b..62347749 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -48,14 +48,12 @@ export function init (configUpdates) { consentData, }); + config.decoratePageCallHandler(CmpApi); const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store)); + config.setPageCallHandlerContext(cmpApi); store.setCmpApi(cmpApi); - if (config.decoratePageCallHandler) { - config.decoratePageCallHandler(CmpApi, cmpApi); - } - // Pull queued command from __cmp stub const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; From 1347447b2771133c9244624572669693d9dfbbdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 16:07:26 +0100 Subject: [PATCH 255/540] removed empty lines --- src/lib/store.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/store.test.js b/src/lib/store.test.js index f385c496..02c556a8 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -5,7 +5,6 @@ import Store from './store'; import { CmpApi } from "@iabtcf/cmpapi"; import { decodeConsentData, encodeConsentData } from "./cookie/cookie"; import {GVL, TCModel} from "@iabtcf/core"; - import { PURPOSE_CONSENTS, PURPOSE_LEGITIMATE_INTERESTS, From f3aa08d4921c256ba762689a55d62039a75d356d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 16:08:02 +0100 Subject: [PATCH 256/540] changed getVendorList params order --- src/lib/vendor.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 16eaf9bf..8d303f20 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -29,14 +29,14 @@ function fetchGlobalVendorList() { if (getVendorList) { return new Promise((resolve, reject) => { try { - getVendorList((err, data) => { + getVendorList((data, err) => { if (err) { reject(err); } else { try { resolve(data); - } catch (err) { - reject(err); + } catch (error) { + reject(error); } } }); From 6211ba3e767a6bce3738a6aaaa8799ab21e88efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 17:55:27 +0100 Subject: [PATCH 257/540] libs updated, additional custom commands, cmp class refactored --- package-lock.json | 9 ++ package.json | 1 + src/index.js | 26 ++-- src/lib/cmp.js | 311 +------------------------------------------- src/lib/commands.js | 57 +++++++- src/lib/config.js | 3 +- src/lib/init.js | 32 ++--- 7 files changed, 95 insertions(+), 344 deletions(-) diff --git a/package-lock.json b/package-lock.json index e271bf78..d29bac10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2637,6 +2637,15 @@ "type-detect": "^4.0.5" } }, + "chai-datetime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/chai-datetime/-/chai-datetime-1.5.0.tgz", + "integrity": "sha1-N0LxiwJMdbdqK37uKRZiMkRnWWw=", + "dev": true, + "requires": { + "chai": ">1.9.0" + } + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", diff --git a/package.json b/package.json index 0fa1e8b9..d9d7c2c4 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "babel-register": "^6.24.0", "babel-runtime": "^6.11.6", "chai": "^4.0.2", + "chai-datetime": "^1.5.0", "copy-webpack-plugin": "^4.3.1", "cross-env": "^5.0.1", "css-loader": "^0.28.0", diff --git a/src/index.js b/src/index.js index c7038b74..148b4460 100755 --- a/src/index.js +++ b/src/index.js @@ -11,7 +11,7 @@ import { decodeConsentData } from "./lib/cookie/cookie"; const TCF_CONFIG = '__tcfConfig'; -function handleConsentResult(cmp, store = {}, vendorList, consentData = {}) { +function handleConsentResult(tcfApi, store = {}, vendorList, consentData = {}) { const { isConsentToolShowing } = store; const { @@ -25,25 +25,29 @@ function handleConsentResult(cmp, store = {}, vendorList, consentData = {}) { policyVersion: consentPolicyVersion = 1 } = consentData; + const tcfApiCall = (command) => { + tcfApi(command, 2, () => {}); + }; + if (!created) { log.debug('No consent data found. Showing consent tool'); - config.autoDisplay && cmp('showConsentTool'); + config.autoDisplay && tcfApiCall('showConsentTool'); } else if (!listVersion) { log.debug('Could not determine vendor list version. Not showing consent tool'); } else if (vendorListVersion !== listVersion) { log.debug(`Consent found for version ${vendorListVersion}, but received vendor list version ${listVersion}. Showing consent tool`); - config.autoDisplay && cmp('showConsentTool'); + config.autoDisplay && tcfApiCall('showConsentTool'); } else if (consentPolicyVersion !== listPolicyVersion) { log.debug(`Consent found for policy ${consentPolicyVersion}, but received vendor list with policy ${consentPolicyVersion}. Showing consent tool`); - config.autoDisplay && cmp('showConsentTool'); + config.autoDisplay && tcfApiCall('showConsentTool'); } else { log.debug('Consent found. Not showing consent tool. Show footer when not all consents set to true'); - !isConsentToolShowing && config.autoDisplay && cmp('showFooter'); + !isConsentToolShowing && config.autoDisplay && tcfApiCall('showFooter'); } } -function checkConsent(cmp, store) { - if (!cmp) { +function checkConsent(tcfApi, store) { + if (!tcfApi) { log.error('CMP failed to load'); } else if (!window.navigator.cookieEnabled) { @@ -58,15 +62,15 @@ function checkConsent(cmp, store) { log.error('Failed to get vendor list'); } else { const timeout = setTimeout(() => { - handleConsentResult(cmp, store, vendorList); + handleConsentResult(tcfApi, store, vendorList); }, 100); if (getTCData) { - getTCData((tcData, success) => { + config.getTCData((tcData, success) => { if (success) { let tcStringDecoded = decodeConsentData(tcData.tcString); clearTimeout(timeout); - handleConsentResult(cmp, store, vendorList, tcStringDecoded); + handleConsentResult(tcfApi, store, vendorList, tcStringDecoded); } }); } @@ -85,7 +89,7 @@ function start() { ...config }; - init(configUpdates).then((store) => checkConsent(window.__cmp, store)); + init(configUpdates).then((store) => checkConsent(window.__tcfapi, store)); } start(); diff --git a/src/lib/cmp.js b/src/lib/cmp.js index 237d59ba..3c7ba7ac 100644 --- a/src/lib/cmp.js +++ b/src/lib/cmp.js @@ -1,318 +1,14 @@ import log from './log'; -import config from './config'; -import { - encodeVendorConsentData, - encodePublisherConsentData -} from './cookie/cookie'; -import { - SECTION_DETAILS, - SECTION_VENDORS -} from './store'; -const arrayFrom = require('core-js/library/fn/array/from'); - -export const CMP_GLOBAL_NAME = '__cmp'; export default class Cmp { - constructor(store) { + constructor () { this.isLoaded = false; this.cmpReady = false; this.openConsentTool = false; this.eventListeners = {}; - this.store = store; - this.processCommand.receiveMessage = this.receiveMessage; this.commandQueue = []; } - commands = { - /** - * Get all publisher consent data from the data store. - */ - getPublisherConsents: (purposeIds, callback = () => {}) => { - const { - persistedPublisherConsentData, - persistedVendorConsentData, - vendorList, - customPurposeList - } = this.store; - - const consent = { - metadata: encodePublisherConsentData({ - ...persistedPublisherConsentData, - ...persistedVendorConsentData, - vendorList, - customPurposeList - }), - gdprApplies: config.gdprApplies, - hasGlobalScope: config.storeConsentGlobally, - ...this.store.getPublisherConsentsObject() - }; - callback(consent, true); - }, - - /** - * Get all vendor consent data from the data store. - * @param {Array} vendorIds Array of vendor IDs to retrieve. If empty return all vendors. - */ - getVendorConsents: (vendorIds, callback = () => {}) => { - const consent = { - metadata: this.generateConsentString(), - gdprApplies: config.gdprApplies, - hasGlobalScope: config.storeConsentGlobally, - ...this.store.getVendorConsentsObject(vendorIds) - }; - - callback(consent, true); - }, - - /** - * Get the consent string value. - */ - getConsentFields: (params = {}, callback = () => {}) => { - const data = this.store.getConsentFieldsObject(); - const now = new Date(); - const consent = { - metadata: this.generateConsentString({ - created: now, - lastUpdated: now, - ...data, - ...params - }), - gdprApplies: config.gdprApplies, - hasGlobalScope: config.storeConsentGlobally, - ...data - }; - - callback(consent, true); - }, - - /** - * Get the encoded vendor consent data value. - */ - getConsentData: (_, callback = () => {}) => { - const consentData = { - gdprApplies: config.gdprApplies, - hasGlobalScope: config.storeConsentGlobally, - consentData: this.generateConsentString() - }; - callback(consentData, true); - }, - - /** - * Get the entire vendor list - */ - getVendorList: (vendorListVersion, callback = () => {}) => { - const {vendorList} = this.store; - const {vendorListVersion: listVersion} = vendorList || {}; - if (!vendorListVersion || vendorListVersion === listVersion) { - callback(vendorList, true); - } - else { - callback(null, false); - } - }, - - ping: (_, callback = () => {}) => { - const result = { - gdprAppliesGlobally: config.storeConsentGlobally, - cmpLoaded: true - }; - callback(result, true); - }, - - /** - * Add a callback to be fired on a specific event. - * @param {string} event Name of the event - */ - addEventListener: (event, callback) => { - const eventSet = this.eventListeners[event] || new Set(); - eventSet.add(callback); - this.eventListeners[event] = eventSet; - - // Trigger load events immediately if they have already occurred - if (event === 'isLoaded' && this.isLoaded) { - callback({event}); - } - if (event === 'cmpReady' && this.cmpReady) { - callback({event}); - } - if (event === 'openConsentTool' && this.openConsentTool) { - callback({event}); - } - }, - - /** - * Remove a callback for an event. - * @param {string} event Name of the event to remove callback from - */ - removeEventListener: (event, callback) => { - // If an event is supplied remove the specific listener - if (event) { - const eventSet = this.eventListeners[event] || new Set(); - // If a callback is supplied remove it - if (callback) { - eventSet.delete(callback); - } - // If no callback is supplied clear all listeners for this event - else { - eventSet.clear(); - } - this.eventListeners[event] = eventSet; - } - // If no event is supplied clear ALL listeners - else { - this.eventListeners = {}; - } - }, - - /** - * Trigger the consent tool UI to be shown - */ - showConsentTool: (_, callback = () => {}) => { - this.store.updateSection(); - this.store.toggleConsentToolShowing(true); - - this.openConsentTool = true; - this.notify('openConsentTool', { section: 'intro' }); - - callback(true); - }, - - /** - * Trigger the consent tool UI to be shown on Detail View - */ - showConsentDetailView: (_, callback = () => {}) => { - this.store.updateSection(SECTION_DETAILS); - this.store.toggleConsentToolShowing(true); - - this.openConsentTool = true; - this.notify('openConsentTool', { section: 'details' }); - - callback(true); - }, - - /** - * Trigger the vendors UI to be shown - */ - showVendors: (_, callback = () => {}) => { - this.store.updateSection(SECTION_DETAILS, SECTION_VENDORS); - this.store.toggleConsentToolShowing(true); - - this.openConsentTool = true; - this.notify('openConsentTool', { section: 'details' }); - - callback(true); - }, - - /** - * Trigger the footer UI to be shown - */ - showFooter: (_, callback = () => {}) => { - this.store.toggleFooterShowing(true); - callback(true); - } - }; - - generateConsentString = (data = {}) => { - const { - persistedVendorConsentData, - vendorList, - allowedVendorIds - } = this.store; - - const { - selectedVendorIds = new Set(), - selectedPurposeIds = new Set() - } = { - ...persistedVendorConsentData, - ...data - }; - - const consentData = { - ...persistedVendorConsentData, - vendorList, - ...data, - selectedVendorIds: new Set(arrayFrom(selectedVendorIds).filter(id => !allowedVendorIds.size || allowedVendorIds.has(id))), - selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)) - }; - - const valid = (data = {}) => [ - 'cmpId', 'cmpVersion', 'consentLanguage', 'consentScreen', 'cookieVersion', 'created', 'lastUpdated', - 'maxVendorId', 'selectedPurposeIds', 'selectedVendorIds', 'vendorListVersion' - ].every(prop => data.hasOwnProperty(prop)); - - // Encode the persisted data - return persistedVendorConsentData || valid(consentData) ? encodeVendorConsentData(consentData) : undefined; - }; - - processCommandQueue = () => { - const queue = [...this.commandQueue]; - if (queue.length) { - log.info(`Process ${queue.length} queued commands`); - this.commandQueue = []; - queue.forEach(({callId, command, parameter, callback, event}) => { - try { - // If command is queued with an event we will relay its result via postMessage - if (event) { - this.processCommand(command, parameter, returnValue => - event.source.postMessage({ - __cmpReturn: { - callId, - command, - returnValue - } - }, event.origin)); - } - else { - this.processCommand(command, parameter, callback); - } - } catch (err) { - log.error(`Invalid commandQueue element ${err}`); - } - }); - } - }; - - /** - * Handle a message event sent via postMessage to - * call `processCommand` - */ - receiveMessage = ({data, origin, source}) => { - const {__cmpCall: cmp} = data; - if (cmp) { - const {callId, command, parameter} = cmp; - this.processCommand(command, parameter, returnValue => - source.postMessage({__cmpReturn: {callId, command, returnValue}}, origin)); - } - }; - - /** - * Call one of the available commands. - * @param {string} command Name of the command - * @param {*} parameter Expected parameter for command - */ - processCommand = (command, parameter, callback) => { - if (typeof this.commands[command] !== 'function') { - log.error(`Invalid CMP command "${command}"`); - } - // Special case where we have the full CMP implementation loaded but - // we still queue these commands until there is data available. This - // behavior should be removed in future versions of the CMP spec - else if ( - (!this.store.persistedVendorConsentData && (command === 'getVendorConsents' || command === 'getConsentData')) || - (!this.store.persistedPublisherConsentData && command === 'getPublisherConsents')) { - log.info(`Queuing command: ${command} until consent data is available`); - this.commandQueue.push({ - command, - parameter, - callback - }); - } - else { - log.info(`Proccess command: ${command}, parameter: ${parameter}`); - this.commands[command](parameter, callback); - } - }; - /** * Trigger all event listener callbacks to be called. * @param {string} event Name of the event being triggered @@ -328,10 +24,5 @@ export default class Cmp { log.error(err); } }); - - // Process any queued commands that were waiting for consent data - if (event === 'onSubmit') { - this.processCommandQueue(); - } }; } diff --git a/src/lib/commands.js b/src/lib/commands.js index b579f657..486428c1 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -4,13 +4,14 @@ import { encodeVendorConsentData, encodeConsentData, } from "./cookie/cookie"; +import {SECTION_DETAILS, SECTION_VENDORS} from "./store"; const arrayFrom = require('core-js/library/fn/array/from'); const COOKIE_VERSION = 2; const CMP_ID = 280; const CMP_VERSION = 2; -const createCommands = (store) => { +const createCommands = (store, tcfManager) => { let vendorList; const getVendorList = (callback) => { @@ -262,9 +263,61 @@ const createCommands = (store) => { }); }; + + /** + * Trigger the consent tool UI to be shown + */ + const showConsentTool = (callback = () => {}) => { + store.updateSection(); + store.toggleConsentToolShowing(true); + + tcfManager.openConsentTool = true; + tcfManager.notify('openConsentTool', { section: 'intro' }); + + callback(true); + }; + + /** + * Trigger the consent tool UI to be shown on Detail View + */ + const showConsentDetailView = (callback = () => {}) => { + store.updateSection(SECTION_DETAILS); + store.toggleConsentToolShowing(true); + + tcfManager.openConsentTool = true; + tcfManager.notify('openConsentTool', { section: 'details' }); + + callback(true); + }; + + /** + * Trigger the vendors UI to be shown + */ + const showVendors = (callback = () => {}) => { + store.updateSection(SECTION_DETAILS, SECTION_VENDORS); + store.toggleConsentToolShowing(true); + + tcfManager.openConsentTool = true; + tcfManager.notify('openConsentTool', { section: 'details' }); + + callback(true); + }; + + /** + * Trigger the footer UI to be shown + * */ + const showFooter = (callback = () => {}) => { + store.toggleFooterShowing(true); + callback(true); + }; + return { getConsentObject, - getConsentFieldsV1 + getConsentFieldsV1, + showConsentTool, + showConsentDetailView, + showVendors, + showFooter }; }; diff --git a/src/lib/config.js b/src/lib/config.js index 1f800710..e0347362 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -19,7 +19,8 @@ const defaultConfig = { legIntPurposeIds: [], contractPurposeIds: [], autoDisplay: true, - allowedVendorIds: null + allowedVendorIds: null, + onConsentToolShowing: null }; class Config { diff --git a/src/lib/init.js b/src/lib/init.js index 62347749..3cf7dfde 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -22,6 +22,7 @@ function readExternalConsentData(config) { reject(err); } else { try { + console.log(data.consent); resolve(data.consent && decodeConsentData(data.consent) || undefined); } catch (err) { reject(err); @@ -48,39 +49,30 @@ export function init (configUpdates) { consentData, }); + // Replace the __cmp with our implementation + const tcfManager = new Cmp(store); + config.decoratePageCallHandler(CmpApi); - const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store)); + const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, tcfManager)); config.setPageCallHandlerContext(cmpApi); store.setCmpApi(cmpApi); - // Pull queued command from __cmp stub - const {commandQueue = []} = window[CMP_GLOBAL_NAME] || {}; - - // Replace the __cmp with our implementation - const cmp = new Cmp(store); - - // Expose `processCommand` as the CMP implementation - window[CMP_GLOBAL_NAME] = cmp.processCommand; - // Notify listeners that the CMP is loaded log.debug(`Successfully loaded CMP version: ${pack.version}`); - cmp.isLoaded = true; - cmp.notify('isLoaded'); + tcfManager.isLoaded = true; + tcfManager.notify('isLoaded'); // Render the UI const App = require('../components/app').default; - render(, document.body); - - // Execute any previously queued command - cmp.commandQueue = commandQueue; - cmp.processCommandQueue(); + render(, document.body); let isConsentToolShowing = store.isConsentToolShowing; store.subscribe(store => { if (store.isConsentToolShowing !== isConsentToolShowing) { isConsentToolShowing = store.isConsentToolShowing; - cmp.notify('onToggleConsentToolShowing', isConsentToolShowing); + // tcfManager.notify('onToggleConsentToolShowing', isConsentToolShowing); + isConsentToolShowing && config.onConsentToolShowing(); } }); @@ -89,8 +81,8 @@ export function init (configUpdates) { store, fetchGlobalVendorList().then(store.updateVendorList) ]).then((params) => { - cmp.cmpReady = true; - cmp.notify('cmpReady'); + tcfManager.cmpReady = true; + tcfManager.notify('cmpReady'); return params[0]; }).catch(err => { log.error('Failed to load lists. CMP not ready', err); From 7b967f432daa9f16d3a3a603cf859b3ae9fda8da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 18:08:13 +0100 Subject: [PATCH 258/540] getConsentFieldsV1 returns created: undefined and lastUpdated: undefined when consent was not persisted, exporting CMP_VERSION, CMP_ID, COOKIE_VERSION constants --- src/lib/commands.js | 16 +++++++--------- src/lib/init.js | 8 ++++---- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 486428c1..829cdf66 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -4,13 +4,14 @@ import { encodeVendorConsentData, encodeConsentData, } from "./cookie/cookie"; +import { + CMP_VERSION, + CMP_ID, + COOKIE_VERSION +} from "./init"; import {SECTION_DETAILS, SECTION_VENDORS} from "./store"; const arrayFrom = require('core-js/library/fn/array/from'); -const COOKIE_VERSION = 2; -const CMP_ID = 280; -const CMP_VERSION = 2; - const createCommands = (store, tcfManager) => { let vendorList; @@ -55,8 +56,8 @@ const createCommands = (store, tcfManager) => { } = store; const { - created = new Date(), - lastUpdated = new Date(), + created, + lastUpdated, cmpId_: cmpId = store.tcModel.cmpId, cmpVersion_: cmpVersion = 1, consentScreen_: consentScreen = store.tcModel.consentScreen, @@ -130,11 +131,8 @@ const createCommands = (store, tcfManager) => { const getConsentFieldsV1 = (callback, params) => { const data = getConsentFieldsObject(); - const now = new Date(); generateConsentStringV1({ - created: now, - lastUpdated: now, ...data, ...params }, (metadata) => { diff --git a/src/lib/init.js b/src/lib/init.js index 3cf7dfde..f0a1eaf2 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -1,7 +1,7 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; -import Cmp, { CMP_GLOBAL_NAME } from './cmp'; +import Cmp from './cmp'; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; @@ -10,9 +10,9 @@ import pack from '../../package.json'; import config from './config'; import createCommands from "./commands"; -const CMP_VERSION = 2; -const CMP_ID = 280; -const COOKIE_VERSION = 2; +export const CMP_VERSION = 2; +export const CMP_ID = 280; +export const COOKIE_VERSION = 2; function readExternalConsentData(config) { return new Promise((resolve, reject) => { From e4551eb80b2ce88d36184e733d86e9cc1a2a3d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 18:13:18 +0100 Subject: [PATCH 259/540] removed getVendorList function invocation in generateConsentStringV1 command --- src/lib/commands.js | 85 +++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 829cdf66..7608001f 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -77,56 +77,49 @@ const createCommands = (store, tcfManager) => { }; const generateConsentStringV1 = (data = {}, callback) => { + const { + persistedConsentData, + } = store; - getVendorList((vendorList, err) => { - if (err) { - callback({}, false); - } - if (vendorList) { - const { - persistedConsentData, - } = store; + const { + created, + lastUpdated, + consentLanguage_: consentLanguage, + consentScreen_: consentScreen, + version_: version = COOKIE_VERSION, + cmpId_: cmpId = CMP_ID + } = persistedConsentData; - const { - created, - lastUpdated, - consentLanguage_: consentLanguage, - consentScreen_: consentScreen, - version_: version = 1, - cmpId_: cmpId = 280 - } = persistedConsentData; + const { + selectedVendorIds = [], + selectedPurposeIds = [], + maxVendorId, + cookieVersion, + vendorListVersion, + cmpVersion + } = data; - const { - selectedVendorIds = [], - selectedPurposeIds = [], - maxVendorId, - cookieVersion, - vendorListVersion, - cmpVersion - } = data; + const consentData = { + cmpId, + maxVendorId, + cookieVersion, + cmpVersion, + vendorListVersion, + created, + lastUpdated, + consentLanguage, + consentScreen, + version, + selectedVendorIds: new Set(arrayFrom(selectedVendorIds)), + selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)) + }; - const consentData = { - cmpId, - maxVendorId, - cookieVersion, - cmpVersion, - vendorListVersion, - created, - lastUpdated, - consentLanguage, - consentScreen, - version, - selectedVendorIds: new Set(arrayFrom(selectedVendorIds)), - selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)) - }; - - const valid = (data = {}) => [ - 'cmpId', 'cmpVersion', 'consentLanguage', 'consentScreen', 'cookieVersion', 'created', 'lastUpdated', - 'maxVendorId', 'selectedPurposeIds', 'selectedVendorIds', 'vendorListVersion' - ].every(prop => data.hasOwnProperty(prop)); - - callback(valid(consentData) ? encodeVendorConsentData(consentData) : undefined); - }}); + const valid = (data = {}) => [ + 'cmpId', 'cmpVersion', 'consentLanguage', 'consentScreen', 'cookieVersion', 'created', 'lastUpdated', + 'maxVendorId', 'selectedPurposeIds', 'selectedVendorIds', 'vendorListVersion' + ].every(prop => data.hasOwnProperty(prop)); + + callback(valid(consentData) ? encodeVendorConsentData(consentData) : undefined); }; const getConsentFieldsV1 = (callback, params) => { From 8574b7d197212731d60516ad072e37b7963bfff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 16 Mar 2020 18:18:09 +0100 Subject: [PATCH 260/540] cookie version v1 --- src/lib/commands.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 7608001f..c7341eb5 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -10,7 +10,9 @@ import { COOKIE_VERSION } from "./init"; import {SECTION_DETAILS, SECTION_VENDORS} from "./store"; + const arrayFrom = require('core-js/library/fn/array/from'); +const COOKIE_VERSION_V1 = 1; const createCommands = (store, tcfManager) => { let vendorList; @@ -86,7 +88,7 @@ const createCommands = (store, tcfManager) => { lastUpdated, consentLanguage_: consentLanguage, consentScreen_: consentScreen, - version_: version = COOKIE_VERSION, + version_: version = COOKIE_VERSION_V1, cmpId_: cmpId = CMP_ID } = persistedConsentData; From d2800e9487ed26dd32dfb7a3fd0368461170bdf5 Mon Sep 17 00:00:00 2001 From: apocentek Date: Tue, 17 Mar 2020 10:40:59 +0100 Subject: [PATCH 261/540] disable mock --- src/lib/vendor.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 6130e80d..1f8b1fca 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -1,7 +1,6 @@ import Promise from 'promise-polyfill'; import config from './config'; import log from './log'; -import vendorList from './vendor-list'; function fetch(url) { return new Promise((resolve, reject) => { @@ -35,7 +34,7 @@ function fetchGlobalVendorList() { reject(err); } else { try { - resolve(vendorList); + resolve(data); } catch (err) { reject(err); } From 48b221b78e2efb8d3605ee984e007a4d3a0b7efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 17 Mar 2020 12:06:32 +0100 Subject: [PATCH 262/540] order of arguments changed, calling __tcfapi('getTcData') instead config.getTcData --- src/index.js | 22 +++++++++--------- src/lib/commands.js | 6 ++--- src/lib/config.js | 3 +-- src/lib/init.js | 4 +--- src/lib/store.js | 10 +++++---- src/lib/translations.js | 50 ++++++++++++++++++++--------------------- src/lib/vendor.js | 2 +- 7 files changed, 47 insertions(+), 50 deletions(-) diff --git a/src/index.js b/src/index.js index 148b4460..4b4095b0 100755 --- a/src/index.js +++ b/src/index.js @@ -26,7 +26,7 @@ function handleConsentResult(tcfApi, store = {}, vendorList, consentData = {}) { } = consentData; const tcfApiCall = (command) => { - tcfApi(command, 2, () => {}); + tcfApi(command, 2, () => {log.debug(`${command} command was called`)}); }; if (!created) { @@ -54,10 +54,10 @@ function checkConsent(tcfApi, store) { log.warn('Cookies are disabled. Ignoring CMP consent check'); } else { - const { getVendorList, getTCData } = config; + const { getVendorList } = config; if (getVendorList) { - getVendorList((vendorList, err) => { + getVendorList((err, vendorList) => { if (err) { log.error('Failed to get vendor list'); } else { @@ -65,15 +65,13 @@ function checkConsent(tcfApi, store) { handleConsentResult(tcfApi, store, vendorList); }, 100); - if (getTCData) { - config.getTCData((tcData, success) => { - if (success) { - let tcStringDecoded = decodeConsentData(tcData.tcString); - clearTimeout(timeout); - handleConsentResult(tcfApi, store, vendorList, tcStringDecoded); - } - }); - } + tcfApi('getTCData',2, (tcData, success) => { + if (success) { + let tcStringDecoded = decodeConsentData(tcData.tcString); + clearTimeout(timeout); + handleConsentResult(tcfApi, store, vendorList, tcStringDecoded); + } + }, undefined, true); } }); } diff --git a/src/lib/commands.js b/src/lib/commands.js index c7341eb5..e79b901a 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -27,12 +27,12 @@ const createCommands = (store, tcfManager) => { const { getVendorList } = config; if (getVendorList) { - getVendorList((data, err) => { + getVendorList((err, data) => { if (err) { - callback({}, err); + callback(err, {}); } else { vendorList = data; - callback(vendorList); + callback(err, vendorList); } }); } diff --git a/src/lib/config.js b/src/lib/config.js index e0347362..64c30ba0 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,7 +6,7 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - logging: false, + logging: true, localization: {}, forceLocale: null, gdprApplies: true, @@ -15,7 +15,6 @@ const defaultConfig = { getVendorList: null, decoratePageCallHandler: null, setPageCallHandlerContext: null, - getTCData: null, legIntPurposeIds: [], contractPurposeIds: [], autoDisplay: true, diff --git a/src/lib/init.js b/src/lib/init.js index f0a1eaf2..fa5ca866 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -22,7 +22,6 @@ function readExternalConsentData(config) { reject(err); } else { try { - console.log(data.consent); resolve(data.consent && decodeConsentData(data.consent) || undefined); } catch (err) { reject(err); @@ -52,9 +51,8 @@ export function init (configUpdates) { // Replace the __cmp with our implementation const tcfManager = new Cmp(store); - config.decoratePageCallHandler(CmpApi); const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, tcfManager)); - config.setPageCallHandlerContext(cmpApi); + config.decoratePageCallHandler(cmpApi); store.setCmpApi(cmpApi); diff --git a/src/lib/store.js b/src/lib/store.js index 83534970..5e52a7ba 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -436,8 +436,7 @@ export default class Store { const {publisherLegitimateInterests} = this.tcModel; if (isSelected) { publisherLegitimateInterests.set(purposeId); - } - else { + } else { publisherLegitimateInterests.unset(purposeId); } this.storeUpdate(); @@ -459,7 +458,10 @@ export default class Store { }; toggleConsentToolShowing = (isShown) => { - this.isConsentToolShowing = this.cmpApi.uiVisible = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; + this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; + if (this.isConsentToolShowing) { + this.cmpApi.uiVisible = true; + } this.isFooterShowing = false; this.storeUpdate(); }; @@ -484,7 +486,7 @@ export default class Store { } } this.isFooterShowing = typeof isShown === 'boolean' ? isShown : !this.isFooterShowing; - this.isConsentToolShowing = this.cmpApi.uiVisible = false; + this.isConsentToolShowing = false; this.storeUpdate(); }; diff --git a/src/lib/translations.js b/src/lib/translations.js index 52cc08d2..666af021 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -9,52 +9,52 @@ export default { intro: { title: 'Szanowna Użytkowniczko, Szanowny Użytkowniku,', description: `

    Zanim klikniesz „Przejdź do serwisu” lub zamkniesz to okno, prosimy o przeczytanie tej informacji. Prosimy w niej o Twoją dobrowolną zgodę na przetwarzanie Twoich danych osobowych przez naszych partnerów biznesowych oraz przekazujemy informacje o tzw. cookies i o przetwarzaniu przez nas Twoich danych osobowych. Klikając „Przejdź do serwisu” lub zamykając okno przez kliknięcie w znaczek X, zgadzasz się na poniższe. Możesz też odmówić zgody lub ograniczyć jej zakres.

    - +

    Zgoda

    - -

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    - + +

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    +

    Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    - -

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    - + +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    +

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    Administrator danych osobowych

    -

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    - +

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    +

    Podstawa i cel przetwarzania

    - +

    Twoje dane przetwarzamy w następujących celach:


      - +
    • 1. Jeśli zawieramy z Tobą umowę o realizację danej usługi (np. usługi zapewniającej Ci możliwość zapoznania się z jednym z naszych serwisów w oparciu o treść regulaminu tego serwisu), to możemy przetwarzać Twoje dane w zakresie niezbędnym do realizacji tej umowy. Gdy zakładasz konto poczty elektronicznej, to umowa o dostarczenie tego konta upoważnia nas do przetwarzania danych niezbędnych do jego zapewnienia (np. danych podanych przez Ciebie w profilu tego konta). Bez tego nie bylibyśmy w stanie zapewnić Ci usługi, a Ty nie mógłbyś z niej korzystać. Niepodanie takich danych uniemożliwi nam zawarcie i wykonanie umowy.
    • - +
    • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
    • - -
    • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
    • + +
    • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
    - +

    Twoje dane przetwarzane będą do czasu istnienia podstawy do ich przetwarzania, czyli w przypadku udzielenia zgody do momentu jej cofnięcia, ograniczenia lub innych działań z Twojej strony ograniczających tę zgodę, w przypadku niezbędności danych do wykonania umowy, przez czas jej wykonywania i ewentualnie okres przedawnienia roszczeń z niej (zwykle nie więcej niż 3 lata, a maksymalnie 6 lat), a w przypadku, gdy podstawą przetwarzania danych jest uzasadniony interes administratora, do czasu zgłoszenia przez Ciebie skutecznego sprzeciwu.

    - +

    Przekazywanie danych

    - +

    Administratorzy danych mogą powierzać Twoje dane podwykonawcom IT, księgowym, agencjom marketingowym etc. Zrobią to jedynie w niezbędnym zakresie i na podstawie umowy o powierzenie przetwarzania danych zobowiązującej taki podmiot do odpowiedniego zabezpieczenia danych i niekorzystania z nich do własnych celów.

    - +

    Cookies

    - -

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    - - + +

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    + +

    Twoje uprawnienia

    -

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:

    +

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. @@ -75,9 +75,9 @@ export default {

    W zakładce widocznej poniżej uzyskasz niezbędne informacje o celach, zakresach i podstawach przetwarzania Twoich danych osobowych, administratorach tych danych oraz będziesz mogła/mógł zarządzić tym przetwarzaniem.

    -

    Możesz w niej określić którym z Zaufanych Partnerów chcesz wyrazić zgodę na przetwarzanie Twoich danych osobowych, a także ustalić cele przetwarzania których dotyczyć ma Twoja zgoda – służy do tego suwak. Pozostawienie suwaka odznaczonego (ma on wtedy kolor szary) oznacza brak zgody, zaś kliknięcie w suwak powodować będzie wyrażenie zgody (suwak zmieni wtedy kolor na żółty), której on dotyczy – jej zakres jest podany przy danym suwaku. Pamiętaj, by potwierdzić Twój wybór klikając po dokonaniu wybranych przez Ciebie ustawień w przycisk „Zapisz i zamknij”.

    \ +

    Możesz w niej określić którym z Zaufanych Partnerów chcesz wyrazić zgodę na przetwarzanie Twoich danych osobowych, a także ustalić cele przetwarzania których dotyczyć ma Twoja zgoda – służy do tego suwak. Pozostawienie suwaka odznaczonego (ma on wtedy kolor szary) oznacza brak zgody, zaś kliknięcie w suwak powodować będzie wyrażenie zgody (suwak zmieni wtedy kolor na żółty), której on dotyczy – jej zakres jest podany przy danym suwaku. Pamiętaj, by potwierdzić Twój wybór klikając po dokonaniu wybranych przez Ciebie ustawień w przycisk „Zapisz i zamknij”.

    \ -

    Niektórzy z Zaufanych Partnerów przetwarzać mogą Twoje dane w oparciu o ich uzasadniony interes. W takim wypadku nie udzielasz im zgody na przetwarzanie Twoich danych, ale możesz wyrazić sprzeciw wobec takiego przetwarzania.

    +

    Niektórzy z Zaufanych Partnerów przetwarzać mogą Twoje dane w oparciu o ich uzasadniony interes. W takim wypadku nie udzielasz im zgody na przetwarzanie Twoich danych, ale możesz wyrazić sprzeciw wobec takiego przetwarzania.

    Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    diff --git a/src/lib/vendor.js b/src/lib/vendor.js index 8d303f20..4d16e747 100644 --- a/src/lib/vendor.js +++ b/src/lib/vendor.js @@ -29,7 +29,7 @@ function fetchGlobalVendorList() { if (getVendorList) { return new Promise((resolve, reject) => { try { - getVendorList((data, err) => { + getVendorList((err, data) => { if (err) { reject(err); } else { From 6f98b83f9882220c7ff8605f7388c948787bc50f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 17 Mar 2020 13:58:56 +0100 Subject: [PATCH 263/540] changed getConsentObject custom command, deleted getVendorList inside custom commands --- src/lib/commands.js | 222 ++++++++++++++++++-------------------------- src/lib/config.js | 3 +- src/lib/init.js | 4 +- src/lib/store.js | 9 +- 4 files changed, 94 insertions(+), 144 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index e79b901a..132b64d6 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -15,30 +15,10 @@ const arrayFrom = require('core-js/library/fn/array/from'); const COOKIE_VERSION_V1 = 1; const createCommands = (store, tcfManager) => { - let vendorList; - - const getVendorList = (callback) => { - if (vendorList) { - callback(vendorList); - } else if (store.vendorList && Object.keys(store.vendorList).length) { - vendorList = JSON.parse(JSON.stringify(store.vendorList)); - callback(vendorList); - } else { - const { getVendorList } = config; - - if (getVendorList) { - getVendorList((err, data) => { - if (err) { - callback(err, {}); - } else { - vendorList = data; - callback(err, vendorList); - } - }); - } - } - }; + /** + * Converts vector to consent object + */ const vectorToObject = (set) => { let obj = {}; @@ -124,6 +104,9 @@ const createCommands = (store, tcfManager) => { callback(valid(consentData) ? encodeVendorConsentData(consentData) : undefined); }; + /** + * Generates v1.1 compatible TC String + */ const getConsentFieldsV1 = (callback, params) => { const data = getConsentFieldsObject(); @@ -143,117 +126,90 @@ const createCommands = (store, tcfManager) => { }); }; - const getConsentObject = (callback, params) => { - getVendorList((vendorList, err) => { - if (err) { - callback({}, false); - } - if (vendorList) { - const { - vendorListVersion: paramsVendorListVersion, - ...tcModelFields - } = params; - const {persistedConsentData} = store; - const {vendors} = vendorList; - const globalVendorsObject = {}; - - for (let vendor of Object.values(vendors)) { - if (!vendor.globalId) { - continue; - } - - globalVendorsObject[vendor.globalId] = { - id: vendor.globalId, - name: vendor.name, - policyUrl: vendor.policyUrl, - purposes: vendor.purposes, - specialPurposes: vendor.specialPurposes, - legIntPurposes: vendor.legIntPurposes, - features: vendor.features, - specialFeatures: vendor.specialFeatures - }; - } - - vendorList.vendors = globalVendorsObject; - vendorList.vendorListVersion = paramsVendorListVersion; - - const tcModel = new TCModel(new GVL(vendorList)); - tcModel.cookieVersion = COOKIE_VERSION; - tcModel.cmpId = CMP_ID; - tcModel.cmpVersion = CMP_VERSION; - tcModel.created = persistedConsentData && persistedConsentData.created || new Date(); - tcModel.lastUpdated = persistedConsentData && persistedConsentData.lastUpdated || new Date(); - tcModel.vendorListVersion = tcModel.vendorListVersion_ = paramsVendorListVersion; - tcModel.isServiceSpecific = true; - tcModel.supportOOB = false; - - for (let key of Object.keys(tcModelFields)) { - tcModel[key] && tcModel[key].set(params[key]); - } - - const encoded = encodeConsentData(tcModel); - - const { - cmpId, - cmpVersion, - policyVersion: tcfPolicyVersion, - supportOOB, - vendorListVersion, - isServiceSpecific, - useNonStandardStacks, - publisherCountryCode: publisherCC, - purposeConsents, - purposeLegitimateInterests, - publisherConsents, - publisherLegitimateInterests, - vendorConsents, - vendorLegitimateInterests, - vendorsDisclosed, - vendorsAllowed, - specialFeatureOptIns, - created, - lastUpdated - } = tcModel; - - callback({ - tcString: encoded, - cmpId, - cmpVersion, - tcfPolicyVersion, - supportOOB, - vendorListVersion, - isServiceSpecific, - useNonStandardStacks, - publisherCC, - created, - lastUpdated, - gdprApplies: config.gdprApplies, - outOfBand: { - allowedVendors: vectorToObject(vendorsAllowed), - disclosedVendors: vectorToObject(vendorsDisclosed) - }, - purpose: { - consents: vectorToObject(purposeConsents), - legitimateInterests: vectorToObject(purposeLegitimateInterests) - }, - vendor: { - consents: vectorToObject(vendorConsents), - legitimateInterests: vectorToObject(vendorLegitimateInterests) - }, - specialFeatureOptins: vectorToObject(specialFeatureOptIns), - publisher: { - consents: vectorToObject(publisherConsents), - legitimateInterests: vectorToObject(publisherLegitimateInterests), - customPurposes: { - purposes: {}, - legitimateInterests: {} - }, - restrictions: {}, - }, - listenerId: undefined - }, true); + /** + * Generates consent object based on input params: consents and vendor list + */ + const getConsentObject = (callback, consents, vendorList) => { + + const { persistedConsentData } = store; + + const tcModel = new TCModel(new GVL(vendorList)); + tcModel.cookieVersion = COOKIE_VERSION; + tcModel.cmpId = CMP_ID; + tcModel.cmpVersion = CMP_VERSION; + tcModel.created = persistedConsentData && persistedConsentData.created || new Date(); + tcModel.lastUpdated = persistedConsentData && persistedConsentData.lastUpdated || new Date(); + tcModel.vendorListVersion = tcModel.vendorListVersion_ = vendorList.vendorListVersion; + tcModel.isServiceSpecific = true; + tcModel.supportOOB = false; + + for (let key of Object.keys(consents)) { + if (tcModel.hasOwnProperty(key)) { + tcModel[key].set(consents[key]); } - }); + } + + const encoded = encodeConsentData(tcModel); + + const { + cmpId, + cmpVersion, + policyVersion: tcfPolicyVersion, + supportOOB, + vendorListVersion, + isServiceSpecific, + useNonStandardStacks, + publisherCountryCode: publisherCC, + purposeConsents, + purposeLegitimateInterests, + publisherConsents, + publisherLegitimateInterests, + vendorConsents, + vendorLegitimateInterests, + vendorsDisclosed, + vendorsAllowed, + specialFeatureOptIns, + created, + lastUpdated + } = tcModel; + + callback({ + tcString: encoded, + cmpId, + cmpVersion, + tcfPolicyVersion, + supportOOB, + vendorListVersion, + isServiceSpecific, + useNonStandardStacks, + publisherCC, + created, + lastUpdated, + gdprApplies: config.gdprApplies, + outOfBand: { + allowedVendors: vectorToObject(vendorsAllowed), + disclosedVendors: vectorToObject(vendorsDisclosed) + }, + purpose: { + consents: vectorToObject(purposeConsents), + legitimateInterests: vectorToObject(purposeLegitimateInterests) + }, + vendor: { + consents: vectorToObject(vendorConsents), + legitimateInterests: vectorToObject(vendorLegitimateInterests) + }, + specialFeatureOptins: vectorToObject(specialFeatureOptIns), + publisher: { + consents: vectorToObject(publisherConsents), + legitimateInterests: vectorToObject(publisherLegitimateInterests), + customPurposes: { + purposes: {}, + legitimateInterests: {} + }, + restrictions: {}, + }, + listenerId: undefined + }, true); }; diff --git a/src/lib/config.js b/src/lib/config.js index 64c30ba0..e9d9cf1e 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,7 +6,7 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - logging: true, + logging: false, localization: {}, forceLocale: null, gdprApplies: true, @@ -14,7 +14,6 @@ const defaultConfig = { setConsentData: null, getVendorList: null, decoratePageCallHandler: null, - setPageCallHandlerContext: null, legIntPurposeIds: [], contractPurposeIds: [], autoDisplay: true, diff --git a/src/lib/init.js b/src/lib/init.js index fa5ca866..53e90af9 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -48,9 +48,7 @@ export function init (configUpdates) { consentData, }); - // Replace the __cmp with our implementation - const tcfManager = new Cmp(store); - + const tcfManager = new Cmp(); const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, tcfManager)); config.decoratePageCallHandler(cmpApi); diff --git a/src/lib/store.js b/src/lib/store.js index 5e52a7ba..4989b4bf 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -305,8 +305,7 @@ export default class Store { const {vendorConsents} = this.tcModel; if (isSelected) { vendorConsents.set(vendorId); - } - else { + } else { vendorConsents.unset(vendorId); } this.storeUpdate(); @@ -336,8 +335,7 @@ export default class Store { const {vendorLegitimateInterests} = this.tcModel; if (isSelected) { vendorLegitimateInterests.set(vendorId); - } - else { + } else { vendorLegitimateInterests.unset(vendorId); } this.storeUpdate(); @@ -409,8 +407,7 @@ export default class Store { const {publisherConsents} = this.tcModel; if (isSelected) { publisherConsents.set(purposeId); - } - else { + } else { publisherConsents.unset(purposeId); } this.storeUpdate(); From c841fcc349b80c277cde4bd73a326049b5e4ce69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 17 Mar 2020 16:05:44 +0100 Subject: [PATCH 264/540] removed cmp.js completely --- src/index.js | 2 +- src/lib/cmp.js | 28 ------ src/lib/cmp.test.js | 226 -------------------------------------------- src/lib/commands.js | 12 +-- src/lib/init.js | 12 +-- 5 files changed, 10 insertions(+), 270 deletions(-) delete mode 100644 src/lib/cmp.js delete mode 100644 src/lib/cmp.test.js diff --git a/src/index.js b/src/index.js index 4b4095b0..627f723e 100755 --- a/src/index.js +++ b/src/index.js @@ -26,7 +26,7 @@ function handleConsentResult(tcfApi, store = {}, vendorList, consentData = {}) { } = consentData; const tcfApiCall = (command) => { - tcfApi(command, 2, () => {log.debug(`${command} command was called`)}); + tcfApi(command, 2, () => log.debug(`${command} command was called`)); }; if (!created) { diff --git a/src/lib/cmp.js b/src/lib/cmp.js deleted file mode 100644 index 3c7ba7ac..00000000 --- a/src/lib/cmp.js +++ /dev/null @@ -1,28 +0,0 @@ -import log from './log'; - -export default class Cmp { - constructor () { - this.isLoaded = false; - this.cmpReady = false; - this.openConsentTool = false; - this.eventListeners = {}; - this.commandQueue = []; - } - - /** - * Trigger all event listener callbacks to be called. - * @param {string} event Name of the event being triggered - * @param {*} data Data that will be passed to each callback - */ - notify = (event, data) => { - log.info(`Notify event: ${event}`); - const eventSet = this.eventListeners[event] || new Set(); - eventSet.forEach(listener => { - try { - listener({event, data}); - } catch (err) { - log.error(err); - } - }); - }; -} diff --git a/src/lib/cmp.test.js b/src/lib/cmp.test.js deleted file mode 100644 index efeff14f..00000000 --- a/src/lib/cmp.test.js +++ /dev/null @@ -1,226 +0,0 @@ -/* eslint-disable max-nested-callbacks */ - -import { expect } from 'chai'; -import customPurposeList from '../docs/assets/purposes.json'; - -import Store from './store'; -import Cmp from './cmp'; - -jest.setTimeout(100); -jest.mock('./log'); -const mockLog = require('./log').default; - -const vendorList = { - "version": 1, - "purposes": [ - { - "id": 1, - "name": "Accessing a Device or Browser" - }, - { - "id": 2, - "name": "Advertising Personalisation" - }, - { - "id": 3, - "name": "Analytics" - }, - { - "id": 4, - "name": "Content Personalisation" - } - ], - "vendors": [ - { - "id": 1, - "name": "Globex" - }, - { - "id": 2, - "name": "Initech" - }, - { - "id": 3, - "name": "CRS" - }, - { - "id": 4, - "name": "Umbrella" - }, - { - "id": 5, - "name": "Aperture" - }, - { - "id": 6, - "name": "Pierce and Pierce" - } - ] -}; - -describe('cmp', () => { - - let cmp; - - beforeEach(() => { - cmp = new Cmp(new Store({ vendorList, customPurposeList })); - cmp.store.persist(); - }); - - describe('processCommand', () => { - - it('logs error on invalid command', () => { - mockLog.error = jest.fn(); - cmp.processCommand('fakeCommand'); - expect(mockLog.error.mock.calls[0][0]).to.contain('Invalid CMP command'); - }); - - it('getPublisherConsents executes', (done) => { - cmp.processCommand('getPublisherConsents', null, data => { - expect(Object.keys(data.standardPurposes).length).to.equal(vendorList.purposes.length); - expect(Object.keys(data.customPurposes).length).to.equal(customPurposeList.purposes.length); - done(); - }); - }); - - it('getPublisherConsents returns only persisted data', (done) => { - cmp.store.selectStandardPurpose(1, false); - cmp.processCommand('getPublisherConsents', null, data => { - expect(data.standardPurposes['1']).to.be.true; - cmp.store.persist(); - - cmp.processCommand('getPublisherConsents', null, data => { - expect(data.standardPurposes['1']).to.be.false; - done(); - }); - }); - }); - - it('getVendorConsents executes', (done) => { - cmp.processCommand('getVendorConsents', null, data => { - expect(Object.keys(data.purposeConsents).length).to.equal(vendorList.purposes.length); - expect(Object.keys(data.vendorConsents).length).to.equal(vendorList.vendors.length); - done(); - }); - }); - - it('getVendorConsents returns only persisted data', (done) => { - cmp.store.selectVendor(1, false); - cmp.processCommand('getVendorConsents', null, data => { - expect(data.vendorConsents['1']).to.be.true; - cmp.store.persist(); - - cmp.processCommand('getVendorConsents', null, data => { - expect(data.vendorConsents['1']).to.be.false; - done(); - }); - }); - }); - - it('getConsentData executes', (done) => { - cmp.processCommand('getConsentData', null, data => { - expect(typeof data.consentData).to.equal('string'); - done(); - }); - }); - - it('getConsentData returns persisted data', (done) => { - cmp.store.persist(); - cmp.processCommand('getConsentData', null, data => { - expect(typeof data.consentData).to.equal('string'); - done(); - }); - }); - - it('getVendorList executes', (done) => { - cmp.processCommand('getVendorList', null, data => { - expect(data.purposes).to.deep.equal(vendorList.purposes); - expect(data.vendors).to.deep.equal(vendorList.vendors); - done(); - }); - }); - - it('showConsentTool executes', (done) => { - cmp.processCommand('showConsentTool', null, data => { - expect(data).to.be.true; - expect(cmp.store.isConsentToolShowing).to.be.true; - done(); - }); - }); - - describe('addEventListener', () => { - - it('only adds the callback instance once', () => { - const callback = () => {}; - - cmp.processCommand('addEventListener', 'isLoaded', callback); - cmp.processCommand('addEventListener', 'isLoaded', callback); - - expect(cmp.eventListeners.isLoaded.size).to.equal(1); - }); - }); - - describe('removeEventListener', () => { - - it('removes a specific callback instance', () => { - const callback = () => {}; - - cmp.processCommand('addEventListener', 'isLoaded', callback); - expect(cmp.eventListeners.isLoaded.size).to.equal(1); - - cmp.processCommand('removeEventListener', 'isLoaded', callback); - - expect(cmp.eventListeners.isLoaded.size).to.equal(0); - }); - - it('removes all listeners of specific event', () => { - - cmp.processCommand('addEventListener', 'isLoaded', () => {}); - cmp.processCommand('addEventListener', 'isLoaded', () => {}); - expect(cmp.eventListeners.isLoaded.size).to.equal(2); - - cmp.processCommand('removeEventListener', 'isLoaded'); - - expect(cmp.eventListeners.isLoaded.size).to.equal(0); - }); - - it('removes all listeners for all events', () => { - - cmp.processCommand('addEventListener', 'isLoaded', () => {}); - cmp.processCommand('addEventListener', 'onSubmit', () => {}); - expect(cmp.eventListeners.isLoaded.size).to.equal(1); - expect(cmp.eventListeners.onSubmit.size).to.equal(1); - - cmp.processCommand('removeEventListener'); - - expect(cmp.eventListeners).to.deep.equal({}); - }); - }); - }); - - - it('notify invokes event listeners', (done) => { - cmp.processCommand('addEventListener', 'isLoaded', () => { - done(); - }); - - cmp.notify('isLoaded'); - }); - - it('processes messages from iframes', () => { - const source = { - postMessage: jest.fn() - }; - const processSpy = jest.spyOn(cmp, 'processCommand'); - cmp.receiveMessage({ - data: { - __cmpCall: { command: 'showConsentTool' } - }, - origin: {}, - source - }); - - expect(processSpy.mock.calls[0][0]).to.equal('showConsentTool'); - }); - -}); diff --git a/src/lib/commands.js b/src/lib/commands.js index 132b64d6..240f8a59 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -2,7 +2,7 @@ import { TCModel, GVL } from "@iabtcf/core"; import config from "./config"; import { encodeVendorConsentData, - encodeConsentData, + encodeConsentData } from "./cookie/cookie"; import { CMP_VERSION, @@ -10,6 +10,7 @@ import { COOKIE_VERSION } from "./init"; import {SECTION_DETAILS, SECTION_VENDORS} from "./store"; +import log from "./log"; const arrayFrom = require('core-js/library/fn/array/from'); const COOKIE_VERSION_V1 = 1; @@ -220,8 +221,7 @@ const createCommands = (store, tcfManager) => { store.updateSection(); store.toggleConsentToolShowing(true); - tcfManager.openConsentTool = true; - tcfManager.notify('openConsentTool', { section: 'intro' }); + log.info(`Notify event: openConsentTool`); callback(true); }; @@ -233,8 +233,7 @@ const createCommands = (store, tcfManager) => { store.updateSection(SECTION_DETAILS); store.toggleConsentToolShowing(true); - tcfManager.openConsentTool = true; - tcfManager.notify('openConsentTool', { section: 'details' }); + log.info(`Notify event: showConsentTool`); callback(true); }; @@ -246,8 +245,7 @@ const createCommands = (store, tcfManager) => { store.updateSection(SECTION_DETAILS, SECTION_VENDORS); store.toggleConsentToolShowing(true); - tcfManager.openConsentTool = true; - tcfManager.notify('openConsentTool', { section: 'details' }); + log.info(`Notify event: showVendors`); callback(true); }; diff --git a/src/lib/init.js b/src/lib/init.js index 53e90af9..4d3ef591 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -1,7 +1,6 @@ import { h, render } from 'preact'; import Promise from 'promise-polyfill'; import Store from './store'; -import Cmp from './cmp'; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; import { decodeConsentData, readConsentCookie } from './cookie/cookie'; @@ -48,20 +47,18 @@ export function init (configUpdates) { consentData, }); - const tcfManager = new Cmp(); - const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, tcfManager)); + const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store)); config.decoratePageCallHandler(cmpApi); store.setCmpApi(cmpApi); // Notify listeners that the CMP is loaded log.debug(`Successfully loaded CMP version: ${pack.version}`); - tcfManager.isLoaded = true; - tcfManager.notify('isLoaded'); + log.info('isLoaded'); // Render the UI const App = require('../components/app').default; - render(, document.body); + render(, document.body); let isConsentToolShowing = store.isConsentToolShowing; store.subscribe(store => { @@ -77,8 +74,7 @@ export function init (configUpdates) { store, fetchGlobalVendorList().then(store.updateVendorList) ]).then((params) => { - tcfManager.cmpReady = true; - tcfManager.notify('cmpReady'); + log.info('cmpReady'); return params[0]; }).catch(err => { log.error('Failed to load lists. CMP not ready', err); From 0dc6d719a6212211948d6d25758077da6cfe4a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 17 Mar 2020 16:07:29 +0100 Subject: [PATCH 265/540] removed unnecesary arguments --- src/lib/commands.js | 2 +- src/lib/store.test.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 240f8a59..aa08d528 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -15,7 +15,7 @@ import log from "./log"; const arrayFrom = require('core-js/library/fn/array/from'); const COOKIE_VERSION_V1 = 1; -const createCommands = (store, tcfManager) => { +const createCommands = (store) => { /** * Converts vector to consent object diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 02c556a8..43b61ec8 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -1,6 +1,6 @@ /* eslint-disable max-nested-callbacks */ import { expect, use } from 'chai'; -import datetime from 'chai-datetime' +import datetime from 'chai-datetime'; import Store from './store'; import { CmpApi } from "@iabtcf/cmpapi"; import { decodeConsentData, encodeConsentData } from "./cookie/cookie"; @@ -30,7 +30,7 @@ describe('store', () => { }); it('initializes with default data', () => { - const store = new Store({ cmpApi }); + const store = new Store(); expect(store.isConsentToolShowing).to.equal(false); expect(store.tcModel.cookieVersion).to.equal(2); @@ -319,7 +319,7 @@ describe('store', () => { expect(publisherConsents.length).to.equal(Object.keys(VENDOR_LIST.purposes).length - 2); expect(publisherConsentObject.publisherConsents['1']).to.be.false; expect(publisherConsentObject.publisherConsents['3']).to.be.false; -}); + }); it('selects ALL publisher purpose IDs', () => { const store = new Store(); @@ -394,6 +394,6 @@ describe('store', () => { expect(store.persistedConsentData.created).to.equalDate(created); expect(store.persistedConsentData.lastUpdated).to.equalDate(lastUpdated); done(); - }, 5) + }, 5); }); }); From 1b91c7546af26607ff1d8bcdf055453d3ab929c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 17 Mar 2020 17:45:13 +0100 Subject: [PATCH 266/540] commands tests + fixing other tests --- src/components/app.test.js | 5 +- src/components/popup/popup.jsx | 1 + src/components/popup/popup.test.js | 23 +++++-- src/lib/commands.js | 3 + src/lib/commands.test.js | 100 +++++++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 src/lib/commands.test.js diff --git a/src/components/app.test.js b/src/components/app.test.js index 3e4d041f..10b837eb 100644 --- a/src/components/app.test.js +++ b/src/components/app.test.js @@ -1,5 +1,6 @@ /* eslint-disable react/jsx-no-bind */ import { h, render } from 'preact'; +import { Vector} from "@iabtcf/core"; import { expect } from 'chai'; import style from './app.less'; import Store from '../lib/store'; @@ -65,8 +66,8 @@ describe('App', () => { ref={ref => app = ref} />, scratch); - expect(app.state.store.vendorConsentData.selectedVendorIds).to.deep.equal(new Set()); + expect(app.state.store.tcModel.vendorConsents).to.deep.equal(new Vector()); store.selectVendor(1, true); - expect(app.state.store.vendorConsentData.selectedVendorIds).to.deep.equal(new Set([1])); + expect(app.state.store.tcModel.vendorConsents.has(1)).to.be.true; }); }); diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index 290bc835..bfadc7de 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -14,6 +14,7 @@ export default class Popup extends Component { store.selectAllPurposesLegitimateInterests(true); store.selectAllSpecialFeatureOptIns(true); store.selectAllPublisherPurposes(true); + store.selectAllPublisherLegitimateInterests(true); onSave(); }; diff --git a/src/components/popup/popup.test.js b/src/components/popup/popup.test.js index 5756e496..78faf55a 100644 --- a/src/components/popup/popup.test.js +++ b/src/components/popup/popup.test.js @@ -4,6 +4,9 @@ import { expect } from 'chai'; import Store from '../../lib/store'; import Popup from './popup'; +import {VENDOR_LIST} from "../../../test/constants"; +import {CmpApi} from "@iabtcf/cmpapi"; +import {CMP_ID, CMP_VERSION} from "../../lib/init"; describe('Popup', () => { let scratch; @@ -27,11 +30,19 @@ describe('Popup', () => { }); it('should handle accept all', (done) => { + const cmpApi = new CmpApi(CMP_ID, CMP_VERSION); const store = new Store(); + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); store.selectAllVendors = jest.fn(); + + store.selectAllPurposes = jest.fn(); + store.selectAllVendorLegitimateInterests = jest.fn(); store.selectAllPurposes = jest.fn(); - store.selectAllStandardPurposes = jest.fn(); - store.selectAllCustomPurposes = jest.fn(); + store.selectAllPurposesLegitimateInterests = jest.fn(); + store.selectAllSpecialFeatureOptIns = jest.fn(); + store.selectAllPublisherPurposes = jest.fn(); + store.selectAllPublisherLegitimateInterests = jest.fn(); let popup; render( { ref={ref => popup = ref} onSave={() => { expect(store.selectAllVendors.mock.calls[0][0]).to.equal(true); + expect(store.selectAllVendorLegitimateInterests.mock.calls[0][0]).to.equal(true); expect(store.selectAllPurposes.mock.calls[0][0]).to.equal(true); - expect(store.selectAllStandardPurposes.mock.calls[0][0]).to.equal(true); - expect(store.selectAllCustomPurposes.mock.calls[0][0]).to.equal(true); + expect(store.selectAllPurposesLegitimateInterests.mock.calls[0][0]).to.equal(true); + expect(store.selectAllSpecialFeatureOptIns.mock.calls[0][0]).to.equal(true); + expect(store.selectAllPublisherPurposes.mock.calls[0][0]).to.equal(true); + expect(store.selectAllPublisherLegitimateInterests.mock.calls[0][0]).to.equal(true); done(); }} />, scratch); @@ -64,5 +78,4 @@ describe('Popup', () => { popup.onCancel(); expect(popup.props.store.section).to.equal(0); }); - }); diff --git a/src/lib/commands.js b/src/lib/commands.js index aa08d528..1f3ba1a4 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -131,6 +131,9 @@ const createCommands = (store) => { * Generates consent object based on input params: consents and vendor list */ const getConsentObject = (callback, consents, vendorList) => { + if (!consents || !vendorList) { + return callback({}, false); + } const { persistedConsentData } = store; diff --git a/src/lib/commands.test.js b/src/lib/commands.test.js new file mode 100644 index 00000000..759d8fc4 --- /dev/null +++ b/src/lib/commands.test.js @@ -0,0 +1,100 @@ +/* eslint-disable max-nested-callbacks */ +import { expect } from 'chai'; +import Store from './store'; +import createCommands from "./commands"; +import {VENDOR_LIST} from "../../test/constants"; +import {decodeConsentData} from "./cookie/cookie"; + +describe('cmp', () => { + let store, commands; + + beforeEach(() => { + store = new Store(); + commands = createCommands(store); + }); + + describe('getConsentObject', () => { + it('should return empty object and false when invoked without vendor list', (done) => { + const consents = {}; + + commands.getConsentObject((tcData, success) => { + expect(tcData).to.deep.equal({}); + expect(success).to.be.false; + done(); + }, consents); + }); + + it('should return empty object and false when invoked with undefined', (done) => { + commands.getConsentObject((tcData, success) => { + expect(tcData).to.deep.equal({}); + expect(success).to.be.false; + done(); + }, undefined, VENDOR_LIST); + }); + + it('should return consent object without any consents when invoked with empty object', (done) => { + const consents = {}; + + const blueprint = { + cmpId: 280, + cmpVersion: 2, + tcfPolicyVersion: 2, + supportOOB: false, + vendorListVersion: 100, + isServiceSpecific: true, + useNonStandardStacks: false, + publisherCC: 'AA', + gdprApplies: true, + outOfBand: { allowedVendors: {}, disclosedVendors: {} }, + purpose: { consents: {}, legitimateInterests: {} }, + vendor: { consents: {}, legitimateInterests: {} }, + specialFeatureOptins: {}, + publisher: { + consents: {}, + legitimateInterests: {}, + customPurposes: { purposes: {}, legitimateInterests: {} }, + restrictions: {} + }, + listenerId: undefined + }; + + commands.getConsentObject((tcData, success) => { + const { + tcString, + created, + lastUpdated, + ...rest + } = tcData; + + expect(success).to.be.true; + expect(tcString).not.to.be.undefined; + expect(decodeConsentData(tcString)).not.to.be.undefined; + expect(created).not.to.be.undefined; + expect(lastUpdated).not.to.be.undefined; + expect(rest).to.deep.equal(blueprint); + done(); + }, consents, VENDOR_LIST); + }); + }); + + describe('getConsentFieldsV1', () => { + + }); + + describe('showConsentTool', () => { + + }); + + describe('showConsentDetailView', () => { + + }); + + describe('showVendors', () => { + + }); + + describe('showFooter', () => { + + }); + +}); From b4372f31a98e34755829c1c9201ede845caa0785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 18 Mar 2020 12:34:28 +0100 Subject: [PATCH 267/540] ver bump -> changed checking established consents + specialFeatureOptins instead specialFeatureOptIns --- package-lock.json | 76 +++++++++++------------------------ package.json | 4 +- src/index.js | 29 ++++++++----- src/lib/commands.js | 22 +++++----- src/lib/commands.test.js | 2 +- src/lib/cookie/cookie.test.js | 12 +++--- src/lib/store.js | 18 ++++----- src/lib/store.test.js | 20 +++++---- 8 files changed, 83 insertions(+), 100 deletions(-) diff --git a/package-lock.json b/package-lock.json index d29bac10..daa5a936 100644 --- a/package-lock.json +++ b/package-lock.json @@ -208,17 +208,17 @@ } }, "@iabtcf/cmpapi": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.19.tgz", - "integrity": "sha512-pijr/1Zpzg5cyJVEgSzzAcXJw5/gia0+8rojn4F1e4Lq1iWWN/n6g2DPFL/eojpZZzPyMfaXVbqO880UYfn3ug==", + "version": "1.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.20.tgz", + "integrity": "sha512-9mAk1CuZJb4rNO2QfyYx9YonvN68nL2rzGTB4r0JOKK3SxtiZYkOG7eB2ZjLEgZGYk6HwyGuhOmvdN3J5BeTtg==", "requires": { - "@iabtcf/core": "1.0.0-beta.19" + "@iabtcf/core": "1.0.0-beta.20" } }, "@iabtcf/core": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.19.tgz", - "integrity": "sha512-oUZj7aglmN1Sq/sh6aUvinLyi2EdvOa4/CSOjtLuOCopgpxY4m9onEFm+bCr5Wvt7MBCRQeS1uorCbz+SDWSIg==" + "version": "1.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.20.tgz", + "integrity": "sha512-V5UVVgKSrtbm4uOvzfcXkHzPxMasEVJiJxze4sMr+4Tx/Qt1k0gGhLcGnkFL74rnhZkZF/FQ5NAcWKojnHl7ow==" }, "@sinonjs/commons": { "version": "1.7.1", @@ -4220,9 +4220,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.376", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz", - "integrity": "sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw==", + "version": "1.3.378", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.378.tgz", + "integrity": "sha512-nBp/AfhaVIOnfwgL1CZxt80IcqWcyYXiX6v5gflAksxy+SzBVz7A7UWR1Nos92c9ofXW74V9PoapzRb0jJfYXw==", "dev": true }, "elliptic": { @@ -8272,12 +8272,6 @@ "requires": { "minimist": "^1.2.0" } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true } } }, @@ -8487,14 +8481,6 @@ "read-pkg-up": "^1.0.1", "redent": "^1.0.0", "trim-newlines": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "merge": { @@ -8639,9 +8625,9 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mississippi": { "version": "2.0.0", @@ -8683,11 +8669,11 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "move-concurrently": { @@ -9233,6 +9219,13 @@ "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } } }, "optionator": { @@ -12304,13 +12297,6 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - } } }, "react-codemirror2": { @@ -13491,12 +13477,6 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true } } }, @@ -15152,14 +15132,6 @@ "requires": { "exec-sh": "^0.2.0", "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "watchpack": { diff --git a/package.json b/package.json index d9d7c2c4..2f8d5826 100644 --- a/package.json +++ b/package.json @@ -91,8 +91,8 @@ "webpack-dev-server": "^2.4.4" }, "dependencies": { - "@iabtcf/cmpapi": "^1.0.0-beta.19", - "@iabtcf/core": "^1.0.0-beta.19", + "@iabtcf/cmpapi": "^1.0.0-beta.20", + "@iabtcf/core": "^1.0.0-beta.20", "classnames": "^2.2.5", "codemirror": "^5.34.0", "core-js": "^2.5.3", diff --git a/src/index.js b/src/index.js index 627f723e..6567e829 100755 --- a/src/index.js +++ b/src/index.js @@ -54,8 +54,7 @@ function checkConsent(tcfApi, store) { log.warn('Cookies are disabled. Ignoring CMP consent check'); } else { - const { getVendorList } = config; - + const { getVendorList, getConsentData } = config; if (getVendorList) { getVendorList((err, vendorList) => { if (err) { @@ -65,13 +64,25 @@ function checkConsent(tcfApi, store) { handleConsentResult(tcfApi, store, vendorList); }, 100); - tcfApi('getTCData',2, (tcData, success) => { - if (success) { - let tcStringDecoded = decodeConsentData(tcData.tcString); - clearTimeout(timeout); - handleConsentResult(tcfApi, store, vendorList, tcStringDecoded); - } - }, undefined, true); + const resolve = (consentData = {}) => { + clearTimeout(timeout); + handleConsentResult(tcfApi, store, vendorList, consentData); + }; + + if (getConsentData) { + getConsentData((err, data) => { + if (err) { + resolve(); + } else { + try { + const tcStringDecoded = decodeConsentData(data.consent); + resolve(tcStringDecoded); + } catch (e) { + resolve(); + } + } + }); + } } }); } diff --git a/src/lib/commands.js b/src/lib/commands.js index 1f3ba1a4..33d7214f 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -9,11 +9,10 @@ import { CMP_ID, COOKIE_VERSION } from "./init"; -import {SECTION_DETAILS, SECTION_VENDORS} from "./store"; +import { SECTION_DETAILS, SECTION_VENDORS } from "./store"; import log from "./log"; const arrayFrom = require('core-js/library/fn/array/from'); -const COOKIE_VERSION_V1 = 1; const createCommands = (store) => { @@ -42,8 +41,8 @@ const createCommands = (store) => { created, lastUpdated, cmpId_: cmpId = store.tcModel.cmpId, - cmpVersion_: cmpVersion = 1, - consentScreen_: consentScreen = store.tcModel.consentScreen, + cmpVersion_: cmpVersion, + consentScreen_: consentScreen, consentLanguage_: consentLanguage = store.tcModel.consentLanguage, vendorListVersion_: vendorListVersion, } = persistedConsentData; @@ -69,7 +68,7 @@ const createCommands = (store) => { lastUpdated, consentLanguage_: consentLanguage, consentScreen_: consentScreen, - version_: version = COOKIE_VERSION_V1, + cmpVersion_: cmpVersion, cmpId_: cmpId = CMP_ID } = persistedConsentData; @@ -77,9 +76,8 @@ const createCommands = (store) => { selectedVendorIds = [], selectedPurposeIds = [], maxVendorId, - cookieVersion, vendorListVersion, - cmpVersion + cookieVersion } = data; const consentData = { @@ -92,7 +90,6 @@ const createCommands = (store) => { lastUpdated, consentLanguage, consentScreen, - version, selectedVendorIds: new Set(arrayFrom(selectedVendorIds)), selectedPurposeIds: new Set(arrayFrom(selectedPurposeIds)) }; @@ -109,6 +106,10 @@ const createCommands = (store) => { * Generates v1.1 compatible TC String */ const getConsentFieldsV1 = (callback, params) => { + if (!params.hasOwnProperty('cookieVersion') || !params.hasOwnProperty('vendorListVersion')) { + return callback ({}, false); + } + const data = getConsentFieldsObject(); generateConsentStringV1({ @@ -120,6 +121,7 @@ const createCommands = (store) => { gdprApplies: config.gdprApplies, hasGlobalScope: config.storeConsentGlobally, ...data, + cookieVersion: params.cookieVersion, vendorListVersion: params.vendorListVersion }; @@ -172,7 +174,7 @@ const createCommands = (store) => { vendorLegitimateInterests, vendorsDisclosed, vendorsAllowed, - specialFeatureOptIns, + specialFeatureOptins, created, lastUpdated } = tcModel; @@ -202,7 +204,7 @@ const createCommands = (store) => { consents: vectorToObject(vendorConsents), legitimateInterests: vectorToObject(vendorLegitimateInterests) }, - specialFeatureOptins: vectorToObject(specialFeatureOptIns), + specialFeatureOptins: vectorToObject(specialFeatureOptins), publisher: { consents: vectorToObject(publisherConsents), legitimateInterests: vectorToObject(publisherLegitimateInterests), diff --git a/src/lib/commands.test.js b/src/lib/commands.test.js index 759d8fc4..654fb931 100644 --- a/src/lib/commands.test.js +++ b/src/lib/commands.test.js @@ -5,7 +5,7 @@ import createCommands from "./commands"; import {VENDOR_LIST} from "../../test/constants"; import {decodeConsentData} from "./cookie/cookie"; -describe('cmp', () => { +describe('commands', () => { let store, commands; beforeEach(() => { diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index e9e1ab41..7a6fe1bc 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -51,7 +51,7 @@ describe('cookie', () => { tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); tcModel.publisherConsents.set(PUBLISHER_CONSENTS); tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); - tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); const decoded = decodeConsentData(encoded); @@ -73,7 +73,7 @@ describe('cookie', () => { vendorLegitimateInterests, publisherConsents, publisherLegitimateInterests, - specialFeatureOptIns + specialFeatureOptins } = decoded; expect(supportOOB).to.equal(tcModel.supportOOB); @@ -92,7 +92,7 @@ describe('cookie', () => { expect(vendorLegitimateInterests.maxId).to.equal(Math.max(...VENDOR_LEGITIMATE_INTERESTS)); expect(publisherConsents.maxId).to.equal(Math.max(...PUBLISHER_CONSENTS)); expect(publisherLegitimateInterests.maxId).to.equal(Math.max(...PUBLISHER_LEGITIMATE_INTERESTS)); - expect(specialFeatureOptIns.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); + expect(specialFeatureOptins.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); done(); }, 0); }); @@ -110,7 +110,7 @@ describe('cookie', () => { tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); tcModel.publisherConsents.set(PUBLISHER_CONSENTS); tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); - tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); @@ -135,7 +135,7 @@ describe('cookie', () => { vendorLegitimateInterests, publisherConsents, publisherLegitimateInterests, - specialFeatureOptIns + specialFeatureOptins } = fromCookie; expect(supportOOB).to.equal(tcModel.supportOOB); @@ -154,7 +154,7 @@ describe('cookie', () => { expect(vendorLegitimateInterests.maxId).to.equal(Math.max(...VENDOR_LEGITIMATE_INTERESTS)); expect(publisherConsents.maxId).to.equal(Math.max(...PUBLISHER_CONSENTS)); expect(publisherLegitimateInterests.maxId).to.equal(Math.max(...PUBLISHER_LEGITIMATE_INTERESTS)); - expect(specialFeatureOptIns.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); + expect(specialFeatureOptins.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); done(); }); }); diff --git a/src/lib/store.js b/src/lib/store.js index 4989b4bf..18542204 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -77,14 +77,14 @@ export default class Store { purposeConsents = new Vector(), purposeLegitimateInterests = new Vector(), vendorLegitimateInterests = new Vector(), - specialFeatureOptIns = new Vector() + specialFeatureOptins = new Vector() } = persistedConsentData; const {purposes = {}, vendors = {}, specialFeatures={}} = vendorList; const maxVendorId = vendorConsents.maxId; const maxPurposeId = purposeConsents.maxId; const maxLegIntId = purposeLegitimateInterests.maxId; - const maxSpecialFeatureOptInsId = specialFeatureOptIns.maxId; + const maxSpecialFeatureOptInsId = specialFeatureOptins.maxId; // Map requested vendorIds const vendorMap = {}; @@ -135,9 +135,9 @@ export default class Store { ...Object.values(specialFeatures).map(({id}) => id), ); - const specialFeatureOptInsMap = {}; + const specialFeatureOptinsMap = {}; for (let i = 1; i <= lastSpecialFeatureOptInsId; i++) { - specialFeatureOptInsMap[i] = specialFeatureOptIns.has(i); + specialFeatureOptinsMap[i] = specialFeatureOptins.has(i); } return { @@ -151,7 +151,7 @@ export default class Store { vendorListVersion, purposeConsents: purposeMap, purposeLegitimateInterests: legIntMap, - specialFeatureOptIns: specialFeatureOptInsMap, + specialFeatureOptins: specialFeatureOptinsMap, vendorConsents: vendorMap, vendorLegitimateInterests: vendorLegIntMap }; @@ -389,16 +389,16 @@ export default class Store { }; selectSpecialFeature = (specialFeatureId, isSelected) => { - const { specialFeatureOptIns } = this.tcModel; + const { specialFeatureOptins } = this.tcModel; if (isSelected) { - specialFeatureOptIns.set(specialFeatureId); + specialFeatureOptins.set(specialFeatureId); } else { - specialFeatureOptIns.unset(specialFeatureId); + specialFeatureOptins.unset(specialFeatureId); } }; selectAllSpecialFeatureOptIns = (isSelected) => { - const operation = isSelected ? 'setAllSpecialFeatureOptIns' : 'unsetAllSpecialFeatureOptIns'; + const operation = isSelected ? 'setAllSpecialFeatureOptins' : 'unsetAllSpecialFeatureOptins'; this.tcModel[operation](); this.storeUpdate(); }; diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 43b61ec8..fda8632e 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -38,9 +38,7 @@ describe('store', () => { }); it('initializes with vendorList', () => { - const store = new Store({ - cmpApi - }); + const store = new Store(); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -63,7 +61,7 @@ describe('store', () => { tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); tcModel.publisherConsents.set(PUBLISHER_CONSENTS); tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); - tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); @@ -81,7 +79,7 @@ describe('store', () => { expect(store.tcModel.vendorLegitimateInterests.maxId).to.equal(Math.max(...VENDOR_LEGITIMATE_INTERESTS)); expect(store.tcModel.publisherConsents.maxId).to.equal(Math.max(...PUBLISHER_CONSENTS)); expect(store.tcModel.publisherLegitimateInterests.maxId).to.equal(Math.max(...PUBLISHER_LEGITIMATE_INTERESTS)); - expect(store.tcModel.specialFeatureOptIns.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); + expect(store.tcModel.specialFeatureOptins.maxId).to.equal(Math.max(...SPECIAL_FEATURE_OPT_INS)); done(); }, 0); }); @@ -105,7 +103,7 @@ describe('store', () => { tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); tcModel.publisherConsents.set(PUBLISHER_CONSENTS); tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); - tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); @@ -138,7 +136,7 @@ describe('store', () => { tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); tcModel.publisherConsents.set(PUBLISHER_CONSENTS); tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); - tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); const decoded = decodeConsentData(encoded); @@ -280,10 +278,10 @@ describe('store', () => { store.persist(); const vendorConsentsObject = store.getVendorConsentsObject(); - const specialFeatureConsents = Object.keys(vendorConsentsObject.specialFeatureOptIns).filter(key => vendorConsentsObject.specialFeatureOptIns[key]); + const specialFeatureConsents = Object.keys(vendorConsentsObject.specialFeatureOptins).filter(key => vendorConsentsObject.specialFeatureOptins[key]); expect(specialFeatureConsents.length).to.equal(Object.keys(VENDOR_LIST.specialFeatures).length - 1); - expect(vendorConsentsObject.specialFeatureOptIns['2']).to.be.false; + expect(vendorConsentsObject.specialFeatureOptins['2']).to.be.false; }); it('selects ALL special feature opt ins IDs', () => { @@ -296,7 +294,7 @@ describe('store', () => { store.persist(); const vendorConsentsObject = store.getVendorConsentsObject(); - const specialFeatureConsents = Object.keys(vendorConsentsObject.specialFeatureOptIns).filter(key => vendorConsentsObject.specialFeatureOptIns[key]); + const specialFeatureConsents = Object.keys(vendorConsentsObject.specialFeatureOptins).filter(key => vendorConsentsObject.specialFeatureOptins[key]); expect(specialFeatureConsents.length).to.equal(0); }); @@ -379,7 +377,7 @@ describe('store', () => { tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); tcModel.publisherConsents.set(PUBLISHER_CONSENTS); tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); - tcModel.specialFeatureOptIns.set(SPECIAL_FEATURE_OPT_INS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); From 7a7cf7edb15bc27dbc4c695fc78b7f669b43efb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 18 Mar 2020 12:59:42 +0100 Subject: [PATCH 268/540] changed callback + constants in env --- src/lib/init.js | 6 +++--- src/lib/translations.js | 16 ++++++++-------- webpack.config.babel.js | 5 ++++- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/lib/init.js b/src/lib/init.js index 4d3ef591..affddea8 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -9,9 +9,9 @@ import pack from '../../package.json'; import config from './config'; import createCommands from "./commands"; -export const CMP_VERSION = 2; -export const CMP_ID = 280; -export const COOKIE_VERSION = 2; +export const CMP_VERSION = parseInt(process.env.CMP_VERSION,10); +export const CMP_ID = parseInt(process.env.CMP_ID, 10); +export const COOKIE_VERSION = parseInt(process.env.COOKIE_VERSION, 10); function readExternalConsentData(config) { return new Promise((resolve, reject) => { diff --git a/src/lib/translations.js b/src/lib/translations.js index 666af021..6fc06923 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -12,21 +12,21 @@ export default {

    Zgoda

    -

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    +

    Jeśli chcesz zgodzić się na przetwarzanie przez Zaufanych Partnerów Grupy RAS Polska Twoich danych osobowych, które udostępniasz w historii przeglądania stron i aplikacji internetowych oraz danych lokalizacyjnych generowanych przez Twoje urządzenie, w celach marketingowych (obejmujących zautomatyzowaną analizę Twojej aktywności na stronach internetowych i w aplikacjach w celu ustalenia Twoich potencjalnych zainteresowań dla dostosowania reklamy i oferty) w tym na umieszczanie znaczników internetowych (cookies itp.) na Twoich urządzeniach i odczytywanie takich znaczników, kliknij przycisk „Przejdź do serwisu” lub zamknij to okno.

    Jeśli nie chcesz wyrazić zgody lub ograniczyć jej zakres, kliknij „Ustawienia zaawansowane”.

    Wyrażenie zgody jest dobrowolne. Możesz edytować zakres zgody, w tym wycofać ją całkowicie, klikając „Ustawienia zaawansowane” lub przechodząc na naszą stronę polityki prywatności.

    -

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    +

    Powyższa zgoda dotyczy przetwarzania Twoich danych osobowych w celach marketingowych Zaufanych Partnerów. Zaufani Partnerzy to firmy z obszaru e-commerce i reklamodawcy oraz działające w ich imieniu domy mediowe i podobne organizacje, z którymi Grupa RAS Polska współpracuje lub które polecane są przez międzynarodowe organizacje branżowe takie jak np. organizacja IAB (Interactive Advertising Bureau). Niektórzy z Zaufanych Partnerów mogą przetwarzać Twoje dane w węższym zakresie, niektórzy z nich mogą też przetwarzać te dane w oparciu o inną podstawę niż Twoja zgoda (np. w oparciu o uzasadniony interes administratora). Kompletną listę Zaufanych Partnerów wraz z zakresem danych przetwarzanych przez nich w oparciu o Twoją zgodę lub inną podstawę prawną znajdziesz bezpośrednio pod tym linkiem.

    Podmioty z Grupy RAS Polska w ramach udostępnianych przez siebie usług internetowych przetwarzają Twoje dane opisane na wstępie, a także zagregowane informacje o wieku, płci i lokalizacji (wielkości miasta z którego pochodzisz itp.) pochodzące z Twoich kont w usługach świadczonych przez podmioty z Grupy RAS Polska w celach marketingowych w oparciu o prawnie uzasadniony, wspólny interes podmiotów Grupy RAS Polska. Dane te są jednocześnie danymi niezbędnymi do realizacji przez nas umowy zawartej z Tobą, która dotyczy korzystania przez Ciebie z naszych usług i serwisów internetowych, ze względu na właściwości tych usług. Treść tej umowy określa regulamin portalu Onet - https://polityka-prywatnosci.onet.pl/regulamin.html - lub regulaminy innych usług świadczonych przez podmioty z Grupy RAS Polska.

    Przetwarzanie takie nie wymaga dodatkowej zgody z Twojej strony, ale możesz mu się w każdej chwili sprzeciwić. O ile nie zdecydujesz inaczej, dokonując stosownych zmian ustawień w Twojej przeglądarce, podmioty z Grupy RAS Polska będą również instalować na Twoich urządzeniach pliki cookies i podobne oraz odczytywać informacje z takich plików. Bliższe informacje o cookies znajdziesz w akapicie „Cookies” pod koniec tej informacji.

    Administrator danych osobowych

    -

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    +

    Administratorem Twoich danych osobowych jest podmiot z Grupy RAS Polska, z którego serwisu lub aplikacji korzystasz. Naszą nazwę znajdziesz zawsze na samym dole strony po prawej stronie, a logo na planszy zawierającej niniejszą informację. Informację o powołaniu przez nas inspektora ochrony danych i jego danych kontaktowych znajdziesz też na samym dole strony w polityce prywatności. Administratorami Twoich danych osobowych będą także pozostałe podmioty z Grupy RAS Polska, których pełne dane możesz sprawdzić pod tym linkiem. Jeżeli wyrazisz zgodę, o którą wyżej prosimy, administratorami Twoich danych osobowych będą także nasi Zaufani Partnerzy. Listę Zaufanych Partnerów możesz sprawdzić w każdym momencie na stronie naszej polityki prywatności i tam też zmodyfikować lub cofnąć swoje zgody.

    Podstawa i cel przetwarzania

    @@ -38,7 +38,7 @@ export default {
  • 2. Zapewnianie bezpieczeństwa usługi (np. sprawdzenie, czy do Twojego konta nie loguje się nieuprawniona osoba), dokonanie pomiarów statystycznych, ulepszanie naszych usług i dopasowanie ich do potrzeb i wygody użytkowników (np. personalizowanie treści w usługach), jak również prowadzenie marketingu bezpośredniego (także na zlecenie reklamodawców) lub promocji własnych usług (np. jeśli interesujesz się historią i oglądasz materiały historyczne w portalu Onet lub na innych stronach internetowych, to możemy Ci wyświetlić reklamę dotyczącą artykułu w serwisie Onet Podróże o historycznych trasach krajoznawczych). Takie przetwarzanie danych to realizacja naszych prawnie uzasadnionych interesów.
  • -
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.
  • +
  • 3. Za Twoją zgodą usługi marketingowe dostarczą Ci nasi Zaufani Partnerzy oraz my dla podmiotów trzecich. Aby móc pokazać interesujące Cię reklamy (np. produktu, którego możesz potrzebować) reklamodawcy i ich przedstawiciele chcieliby mieć możliwość przetwarzania Twoich danych związanych z odwiedzanymi przez Ciebie stronami internetowymi. Udzielenie takiej zgody jest dobrowolne, nie musisz jej udzielać, nie pozbawi Cię to dostępu do naszych usług. Masz również możliwość ograniczenia zakresu lub zmiany zgody w dowolnym momencie.

  • @@ -50,11 +50,11 @@ export default {

    Cookies

    -

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    +

    Na naszych stronach i w aplikacjach używamy znaczników internetowych takich jak pliki np. cookie lub local storage do zbierania i przetwarzania danych osobowych w celu personalizowania treści i reklam oraz analizowania ruchu na stronach, aplikacjach i w Internecie. W ten sposób technologię tę wykorzystują również podmioty z Grupy RAS Polska oraz nasi Zaufani Partnerzy, którzy także chcą dopasowywać reklamy do Twoich preferencji. Cookies to dane informatyczne zapisywane w plikach i przechowywane na Twoim urządzeniu końcowym (tj. twój komputer, tablet, smartphone itp.), które przeglądarka wysyła do serwera przy każdorazowym wejściu na stronę z tego urządzenia, podczas gdy odwiedzasz strony w Internecie. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Pod tym linkiem znajdziesz także informację o tym jak zmienić ustawienia przeglądarki, aby ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    Twoje uprawnienia

    -

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:

    +

    Przysługują Ci następujące uprawnienia wobec Twoich danych i ich przetwarzania przez nas, inne podmioty z Grupy RAS Polska i Zaufanych Partnerów:


    1. Jeśli udzieliłeś zgody na przetwarzanie danych możesz ją w każdej chwili wycofać (cofnięcie zgody oczywiście nie uchyli zgodności z prawem przetwarzania już dokonanego na jej podstawie);

    2. Masz również prawo żądania dostępu do Twoich danych osobowych, ich sprostowania, usunięcia lub ograniczenia przetwarzania, prawo do przeniesienia danych, wyrażenia sprzeciwu wobec przetwarzania danych oraz prawo do wniesienia skargi do organu nadzorczego, którym w Polsce jest Prezes Urzędu Ochrony Danych Osobowych. Pod tym adresem znajdziesz dodatkowe informacje dotyczące przetwarzania danych i Twoich uprawnień. @@ -75,9 +75,9 @@ export default {

    W zakładce widocznej poniżej uzyskasz niezbędne informacje o celach, zakresach i podstawach przetwarzania Twoich danych osobowych, administratorach tych danych oraz będziesz mogła/mógł zarządzić tym przetwarzaniem.

    -

    Możesz w niej określić którym z Zaufanych Partnerów chcesz wyrazić zgodę na przetwarzanie Twoich danych osobowych, a także ustalić cele przetwarzania których dotyczyć ma Twoja zgoda – służy do tego suwak. Pozostawienie suwaka odznaczonego (ma on wtedy kolor szary) oznacza brak zgody, zaś kliknięcie w suwak powodować będzie wyrażenie zgody (suwak zmieni wtedy kolor na żółty), której on dotyczy – jej zakres jest podany przy danym suwaku. Pamiętaj, by potwierdzić Twój wybór klikając po dokonaniu wybranych przez Ciebie ustawień w przycisk „Zapisz i zamknij”.

    \ +

    Możesz w niej określić którym z Zaufanych Partnerów chcesz wyrazić zgodę na przetwarzanie Twoich danych osobowych, a także ustalić cele przetwarzania których dotyczyć ma Twoja zgoda – służy do tego suwak. Pozostawienie suwaka odznaczonego (ma on wtedy kolor szary) oznacza brak zgody, zaś kliknięcie w suwak powodować będzie wyrażenie zgody (suwak zmieni wtedy kolor na żółty), której on dotyczy – jej zakres jest podany przy danym suwaku. Pamiętaj, by potwierdzić Twój wybór klikając po dokonaniu wybranych przez Ciebie ustawień w przycisk „Zapisz i zamknij”.

    \ -

    Niektórzy z Zaufanych Partnerów przetwarzać mogą Twoje dane w oparciu o ich uzasadniony interes. W takim wypadku nie udzielasz im zgody na przetwarzanie Twoich danych, ale możesz wyrazić sprzeciw wobec takiego przetwarzania.

    +

    Niektórzy z Zaufanych Partnerów przetwarzać mogą Twoje dane w oparciu o ich uzasadniony interes. W takim wypadku nie udzielasz im zgody na przetwarzanie Twoich danych, ale możesz wyrazić sprzeciw wobec takiego przetwarzania.

    Na naszych stronach internetowych i w aplikacjach używamy technologii, takich jak pliki cookie, local storage i podobnych służących do zbierania i przetwarzania danych osobowych oraz danych eksploatacyjnych w celu personalizowania udostępnianych treści i reklam oraz analizowania ruchu na naszych stronach. Te pliki cookie pomagają poprawić jakość treści reklamowych na stronach i w aplikacjach. Dzięki tym technologiom możemy zapewnić Ci lepszą obsługę poprzez serwowanie reklam lepiej dopasowanych do Twoich preferencji i serwowanie treści, które mogą Cię bardziej zainteresować. Pliki te pozwalają nam również lepiej badać i analizować zainteresowanie naszymi stronami i treściami, które Ci serwujemy. Dzięki tym analizom możemy zadbać o jakość serwowanych przez nas treści. Szczegółową informację na temat plików cookie i ich funkcjonowania znajdziesz pod tym linkiem. Znajdziesz tam także informację o tym jak zmienić ustawienia przeglądarki, by ograniczyć lub wyłączyć funkcjonowanie plików cookies itp. oraz jak usunąć takie pliki z Twojego urządzenia.

    diff --git a/webpack.config.babel.js b/webpack.config.babel.js index dec9d9d3..c28f3296 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -182,7 +182,10 @@ module.exports = [ plugins: ([ new webpack.NoEmitOnErrorsPlugin(), new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(ENV) + 'process.env.NODE_ENV': JSON.stringify(ENV), + 'process.env.CMP_VERSION': JSON.stringify('2'), + 'process.env.CMP_ID': JSON.stringify('280'), + 'process.env.COOKIE_VERSION': JSON.stringify('2') }), new webpack.ProvidePlugin({ 'Promise': 'promise-polyfill' From 06f1021eabd110dfe11cd2cde855811f7058dfca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 18 Mar 2020 14:17:56 +0100 Subject: [PATCH 269/540] env variables in tests --- src/lib/commands.js | 6 ++---- test/setup.js | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 33d7214f..e4b9ad72 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -41,10 +41,9 @@ const createCommands = (store) => { created, lastUpdated, cmpId_: cmpId = store.tcModel.cmpId, - cmpVersion_: cmpVersion, - consentScreen_: consentScreen, + cmpVersion_: cmpVersion = store.tcModel.cmpVersion, + consentScreen_: consentScreen = store.tcModel.consentScreen, consentLanguage_: consentLanguage = store.tcModel.consentLanguage, - vendorListVersion_: vendorListVersion, } = persistedConsentData; return { @@ -53,7 +52,6 @@ const createCommands = (store) => { consentLanguage, consentScreen, created, - vendorListVersion, lastUpdated, }; }; diff --git a/test/setup.js b/test/setup.js index 8793ace2..988f181b 100644 --- a/test/setup.js +++ b/test/setup.js @@ -9,3 +9,7 @@ options.functions = false; chai.use(assertJsx); global.sleep = ms => new Promise( resolve => setTimeout(resolve, ms) ); + +global.process.env.CMP_ID = 280; +global.process.env.CMP_VERSION = 2; +global.process.env.COOKIE_VERSION = 2; From 6393d9ecffdbf7c34720e99b82b9dfb60eceb035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 18 Mar 2020 15:18:39 +0100 Subject: [PATCH 270/540] filtering vendors --- src/components/popup/details/details.jsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 1e727c51..1399278d 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -30,16 +30,16 @@ export default class Details extends Component { filterVendors = ({ isCustom = null, purposeIds = [], featureIds = [] } = {}) => { return this.getVendors().filter(vendor => { - if (isCustom !== null && (isCustom && vendor.external_id || !isCustom && !vendor.external_id)) { + if (isCustom !== null && (isCustom && vendor.globalId || !isCustom && !vendor.globalId)) { return false; } - const vendorPurposeIds = new Set([...(vendor.purposeIds || []), ...(vendor.legIntPurposeIds || [])]); + const vendorPurposeIds = new Set([...(vendor.purposes || []), ...(vendor.legIntPurposes || [])]); if (!purposeIds.every(purposeId => vendorPurposeIds.has(purposeId))) { return false; } - const vendorFeatureIds = new Set(vendor.featureIds || []); + const vendorFeatureIds = new Set(vendor.features|| []); if (!featureIds.every(featureId => vendorFeatureIds.has(featureId))) { return false; } @@ -70,6 +70,8 @@ export default class Details extends Component { store } = props; + console.log(this.state.vendors); + const { vendorList = {}, customPurposeList = {}, From 60d107e03b5be597f5e60a5c027b5911d73bb08b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 18 Mar 2020 15:33:19 +0100 Subject: [PATCH 271/540] removed console.log --- src/components/popup/details/details.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 1399278d..e120e586 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -70,8 +70,6 @@ export default class Details extends Component { store } = props; - console.log(this.state.vendors); - const { vendorList = {}, customPurposeList = {}, From db4463f86ba4a3eb7b6186815561eee7faa318ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 18 Mar 2020 18:29:03 +0100 Subject: [PATCH 272/540] new commands for adding event listeners --- src/lib/cmpManager.js | 66 +++++++++++++++++++++++++++++++++++++++++++ src/lib/commands.js | 24 ++++++++++++---- src/lib/config.js | 3 +- src/lib/init.js | 14 +++++---- src/lib/store.js | 2 +- 5 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 src/lib/cmpManager.js diff --git a/src/lib/cmpManager.js b/src/lib/cmpManager.js new file mode 100644 index 00000000..be46bf20 --- /dev/null +++ b/src/lib/cmpManager.js @@ -0,0 +1,66 @@ +import log from './log'; + +export default class CmpManager { + constructor(store) { + this.isLoaded = false; + this.cmpReady = false; + this.eventListeners = {}; + this.store = store; + } + + /** + * Remove a callback for an event. + * @param {string} event Name of the event to remove callback from + */ + removeEventListener = (event, callback) => { + // If an event is supplied remove the specific listener + if (event) { + const eventSet = this.eventListeners[event] || new Set(); + // If a callback is supplied remove it + if (callback) { + eventSet.delete(callback); + } + // If no callback is supplied clear all listeners for this event + else { + eventSet.clear(); + } + this.eventListeners[event] = eventSet; + } + // If no event is supplied clear ALL listeners + else { + this.eventListeners = {}; + } + }; + + + /** + * Add a callback to be fired on a specific event. + * @param {string} event Name of the event + */ + addEventListener = (event, callback) => { + const eventSet = this.eventListeners[event] || new Set(); + eventSet.add(callback); + this.eventListeners[event] = eventSet; + + // Trigger load events immediately if they have already occurred + if (event === 'isLoaded' && this.isLoaded) { + callback({event}); + } + if (event === 'cmpReady' && this.cmpReady) { + callback({event}); + } + }; + + /** + * Trigger all event listener callbacks to be called. + * @param {string} event Name of the event being triggered + * @param {*} data Data that will be passed to each callback + */ + notify = (event, data) => { + log.info(`Notify event: ${event}`); + const eventSet = this.eventListeners[event] || new Set(); + eventSet.forEach(listener => { + listener({event, data}); + }); + }; +} diff --git a/src/lib/commands.js b/src/lib/commands.js index e4b9ad72..73696729 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -14,8 +14,7 @@ import log from "./log"; const arrayFrom = require('core-js/library/fn/array/from'); -const createCommands = (store) => { - +const createCommands = (store, cmpManager) => { /** * Converts vector to consent object */ @@ -224,7 +223,8 @@ const createCommands = (store) => { store.updateSection(); store.toggleConsentToolShowing(true); - log.info(`Notify event: openConsentTool`); + cmpManager.openConsentTool = true; + cmpManager.notify('openConsentTool', { section: 'intro' }); callback(true); }; @@ -236,7 +236,8 @@ const createCommands = (store) => { store.updateSection(SECTION_DETAILS); store.toggleConsentToolShowing(true); - log.info(`Notify event: showConsentTool`); + cmpManager.openConsentTool = true; + cmpManager.notify('openConsentTool', { section: 'details' }); callback(true); }; @@ -248,7 +249,8 @@ const createCommands = (store) => { store.updateSection(SECTION_DETAILS, SECTION_VENDORS); store.toggleConsentToolShowing(true); - log.info(`Notify event: showVendors`); + cmpManager.openConsentTool = true; + cmpManager.notify('openConsentTool', { section: 'details' }); callback(true); }; @@ -261,13 +263,23 @@ const createCommands = (store) => { callback(true); }; + const registerEventListener = (callback, event) => { + cmpManager.addEventListener(event, callback); + }; + + const unregisterEventListener = (callback, event) => { + cmpManager.removeEventListener(event, callback); + }; + return { getConsentObject, getConsentFieldsV1, showConsentTool, showConsentDetailView, showVendors, - showFooter + showFooter, + registerEventListener, + unregisterEventListener }; }; diff --git a/src/lib/config.js b/src/lib/config.js index e9d9cf1e..d3b849c0 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,7 +6,7 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - logging: false, + logging: true, localization: {}, forceLocale: null, gdprApplies: true, @@ -17,7 +17,6 @@ const defaultConfig = { legIntPurposeIds: [], contractPurposeIds: [], autoDisplay: true, - allowedVendorIds: null, onConsentToolShowing: null }; diff --git a/src/lib/init.js b/src/lib/init.js index affddea8..1861e776 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -8,6 +8,7 @@ import log from './log'; import pack from '../../package.json'; import config from './config'; import createCommands from "./commands"; +import CmpManager from "./cmpManager"; export const CMP_VERSION = parseInt(process.env.CMP_VERSION,10); export const CMP_ID = parseInt(process.env.CMP_ID, 10); @@ -47,24 +48,26 @@ export function init (configUpdates) { consentData, }); - const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store)); + const cmpManager = new CmpManager(store); + const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, cmpManager)); config.decoratePageCallHandler(cmpApi); store.setCmpApi(cmpApi); // Notify listeners that the CMP is loaded log.debug(`Successfully loaded CMP version: ${pack.version}`); - log.info('isLoaded'); + cmpManager.isLoaded = true; + cmpManager.notify('isLoaded'); // Render the UI const App = require('../components/app').default; - render(, document.body); + render(, document.body); let isConsentToolShowing = store.isConsentToolShowing; store.subscribe(store => { if (store.isConsentToolShowing !== isConsentToolShowing) { isConsentToolShowing = store.isConsentToolShowing; - // tcfManager.notify('onToggleConsentToolShowing', isConsentToolShowing); + cmpManager.notify('onToggleConsentToolShowing', isConsentToolShowing); isConsentToolShowing && config.onConsentToolShowing(); } }); @@ -74,7 +77,8 @@ export function init (configUpdates) { store, fetchGlobalVendorList().then(store.updateVendorList) ]).then((params) => { - log.info('cmpReady'); + cmpManager.cmpReady = true; + cmpManager.notify('cmpReady'); return params[0]; }).catch(err => { log.error('Failed to load lists. CMP not ready', err); diff --git a/src/lib/store.js b/src/lib/store.js index 18542204..ba2b3262 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -34,7 +34,7 @@ export default class Store { tcModel, consentData, { - cookieVersion, + version: cookieVersion, cmpId, cmpVersion, consentLanguage From 4ca5660bb975d9dfffe241e026c94c0ae0fb4b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Wed, 18 Mar 2020 18:33:24 +0100 Subject: [PATCH 273/540] removed store from cmpManager --- src/lib/cmpManager.js | 3 +-- src/lib/commands.js | 6 ++++-- src/lib/init.js | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/lib/cmpManager.js b/src/lib/cmpManager.js index be46bf20..cf219214 100644 --- a/src/lib/cmpManager.js +++ b/src/lib/cmpManager.js @@ -1,11 +1,10 @@ import log from './log'; export default class CmpManager { - constructor(store) { + constructor () { this.isLoaded = false; this.cmpReady = false; this.eventListeners = {}; - this.store = store; } /** diff --git a/src/lib/commands.js b/src/lib/commands.js index 73696729..fc1b22f4 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -9,8 +9,10 @@ import { CMP_ID, COOKIE_VERSION } from "./init"; -import { SECTION_DETAILS, SECTION_VENDORS } from "./store"; -import log from "./log"; +import { + SECTION_DETAILS, + SECTION_VENDORS +} from "./store"; const arrayFrom = require('core-js/library/fn/array/from'); diff --git a/src/lib/init.js b/src/lib/init.js index 1861e776..91e83eb3 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -48,7 +48,7 @@ export function init (configUpdates) { consentData, }); - const cmpManager = new CmpManager(store); + const cmpManager = new CmpManager(); const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, cmpManager)); config.decoratePageCallHandler(cmpApi); From 95408d9f6ab523c9540b2998117460338f7a2e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 19 Mar 2020 09:41:42 +0100 Subject: [PATCH 274/540] object destruct in registerEventListener & unregisterEventListener --- src/lib/commands.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index fc1b22f4..befce550 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -265,11 +265,11 @@ const createCommands = (store, cmpManager) => { callback(true); }; - const registerEventListener = (callback, event) => { + const registerEventListener = (callback, {event}) => { cmpManager.addEventListener(event, callback); }; - const unregisterEventListener = (callback, event) => { + const unregisterEventListener = (callback, {event}) => { cmpManager.removeEventListener(event, callback); }; From 5b011e1c77b002b80ecf21248f9d96540035221c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 19 Mar 2020 10:25:00 +0100 Subject: [PATCH 275/540] logging: false + removed calling onConsentToolShowing method from config --- src/lib/config.js | 5 ++--- src/lib/init.js | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lib/config.js b/src/lib/config.js index d3b849c0..f6ddc08a 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -6,7 +6,7 @@ const defaultConfig = { globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, - logging: true, + logging: false, localization: {}, forceLocale: null, gdprApplies: true, @@ -16,8 +16,7 @@ const defaultConfig = { decoratePageCallHandler: null, legIntPurposeIds: [], contractPurposeIds: [], - autoDisplay: true, - onConsentToolShowing: null + autoDisplay: true }; class Config { diff --git a/src/lib/init.js b/src/lib/init.js index 91e83eb3..254be274 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -68,7 +68,6 @@ export function init (configUpdates) { if (store.isConsentToolShowing !== isConsentToolShowing) { isConsentToolShowing = store.isConsentToolShowing; cmpManager.notify('onToggleConsentToolShowing', isConsentToolShowing); - isConsentToolShowing && config.onConsentToolShowing(); } }); From 9093e1147fccab229363b8bd0ed784700790ed2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 19 Mar 2020 11:30:55 +0100 Subject: [PATCH 276/540] removed setting and accessing private variables --- src/lib/commands.js | 18 +++++++++--------- src/lib/store.js | 24 +++++++++++++----------- src/lib/store.test.js | 2 +- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index befce550..32f9e9ea 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -41,10 +41,10 @@ const createCommands = (store, cmpManager) => { const { created, lastUpdated, - cmpId_: cmpId = store.tcModel.cmpId, - cmpVersion_: cmpVersion = store.tcModel.cmpVersion, - consentScreen_: consentScreen = store.tcModel.consentScreen, - consentLanguage_: consentLanguage = store.tcModel.consentLanguage, + cmpId = store.tcModel.cmpId, + cmpVersion = store.tcModel.cmpVersion, + consentScreen = store.tcModel.consentScreen, + consentLanguage = store.tcModel.consentLanguage, } = persistedConsentData; return { @@ -65,10 +65,10 @@ const createCommands = (store, cmpManager) => { const { created, lastUpdated, - consentLanguage_: consentLanguage, - consentScreen_: consentScreen, - cmpVersion_: cmpVersion, - cmpId_: cmpId = CMP_ID + consentLanguage, + consentScreen, + cmpVersion, + cmpId = CMP_ID } = persistedConsentData; const { @@ -144,7 +144,7 @@ const createCommands = (store, cmpManager) => { tcModel.cmpVersion = CMP_VERSION; tcModel.created = persistedConsentData && persistedConsentData.created || new Date(); tcModel.lastUpdated = persistedConsentData && persistedConsentData.lastUpdated || new Date(); - tcModel.vendorListVersion = tcModel.vendorListVersion_ = vendorList.vendorListVersion; + tcModel.vendorListVersion = vendorList.vendorListVersion; tcModel.isServiceSpecific = true; tcModel.supportOOB = false; diff --git a/src/lib/store.js b/src/lib/store.js index ba2b3262..26dcbf69 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -65,14 +65,14 @@ export default class Store { } = this; const { - version_: cookieVersion, + version: cookieVersion, created, lastUpdated, - cmpId_: cmpId, - cmpVersion_: cmpVersion, - consentScreen_: consentScreen, - consentLanguage_: consentLanguage, - vendorListVersion_: vendorListVersion, + cmpId, + cmpVersion, + consentScreen, + consentLanguage, + vendorListVersion, vendorConsents = new Vector(), purposeConsents = new Vector(), purposeLegitimateInterests = new Vector(), @@ -168,11 +168,11 @@ export default class Store { } = this; const { - version_: cookieVersion, + version: cookieVersion, created, lastUpdated, - cmpId_: cmpId, - vendorListVersion_: vendorListVersion, + cmpId, + vendorListVersion, publisherConsents = new Vector(), publisherLegitimateInterests = new Vector(), publisherCustomConsents = new Vector(), @@ -261,9 +261,9 @@ export default class Store { const now = new Date(); tcModel.created = tcModel.created || now; tcModel.lastUpdated = now; - tcModel.vendorListVersion = tcModel.vendorListVersion_ = vendorListVersion; + tcModel.vendorListVersion = vendorListVersion; - let encodedConsent = encodeConsentData(this.tcModel); + let encodedConsent = encodeConsentData(tcModel); if (config.setConsentData) { let consentData = encodedConsent; @@ -466,6 +466,8 @@ export default class Store { toggleFooterShowing = (isShown) => { const vendorConsentsObject = this.getVendorConsentsObject(); + console.log(vendorConsentsObject); + if (this.isAllSetTrue(vendorConsentsObject.purposeConsents)) { let vendorConsents; if (this.vendorList) { diff --git a/src/lib/store.test.js b/src/lib/store.test.js index fda8632e..96613f84 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -33,7 +33,7 @@ describe('store', () => { const store = new Store(); expect(store.isConsentToolShowing).to.equal(false); - expect(store.tcModel.cookieVersion).to.equal(2); + expect(store.tcModel.version).to.equal(2); expect(store.tcModel.cmpId).to.equal(280); }); From cb09f4c87b832d7a6ea793f7b34bc44ffbb27d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 19 Mar 2020 17:26:59 +0100 Subject: [PATCH 277/540] commands tests & selectAllSpecialFeatureOptins function name changed --- src/components/popup/popup.jsx | 2 +- src/components/popup/popup.test.js | 4 +- src/lib/commands.js | 2 +- src/lib/commands.test.js | 407 ++++++++++++++++++++++++++++- src/lib/store.js | 6 +- src/lib/store.test.js | 2 +- 6 files changed, 400 insertions(+), 23 deletions(-) diff --git a/src/components/popup/popup.jsx b/src/components/popup/popup.jsx index bfadc7de..158f5e71 100644 --- a/src/components/popup/popup.jsx +++ b/src/components/popup/popup.jsx @@ -12,7 +12,7 @@ export default class Popup extends Component { store.selectAllVendorLegitimateInterests(true); store.selectAllPurposes(true); store.selectAllPurposesLegitimateInterests(true); - store.selectAllSpecialFeatureOptIns(true); + store.selectAllSpecialFeatureOptins(true); store.selectAllPublisherPurposes(true); store.selectAllPublisherLegitimateInterests(true); onSave(); diff --git a/src/components/popup/popup.test.js b/src/components/popup/popup.test.js index 78faf55a..3ae94b0b 100644 --- a/src/components/popup/popup.test.js +++ b/src/components/popup/popup.test.js @@ -40,7 +40,7 @@ describe('Popup', () => { store.selectAllVendorLegitimateInterests = jest.fn(); store.selectAllPurposes = jest.fn(); store.selectAllPurposesLegitimateInterests = jest.fn(); - store.selectAllSpecialFeatureOptIns = jest.fn(); + store.selectAllSpecialFeatureOptins = jest.fn(); store.selectAllPublisherPurposes = jest.fn(); store.selectAllPublisherLegitimateInterests = jest.fn(); @@ -53,7 +53,7 @@ describe('Popup', () => { expect(store.selectAllVendorLegitimateInterests.mock.calls[0][0]).to.equal(true); expect(store.selectAllPurposes.mock.calls[0][0]).to.equal(true); expect(store.selectAllPurposesLegitimateInterests.mock.calls[0][0]).to.equal(true); - expect(store.selectAllSpecialFeatureOptIns.mock.calls[0][0]).to.equal(true); + expect(store.selectAllSpecialFeatureOptins.mock.calls[0][0]).to.equal(true); expect(store.selectAllPublisherPurposes.mock.calls[0][0]).to.equal(true); expect(store.selectAllPublisherLegitimateInterests.mock.calls[0][0]).to.equal(true); done(); diff --git a/src/lib/commands.js b/src/lib/commands.js index 32f9e9ea..2fc37be4 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -105,7 +105,7 @@ const createCommands = (store, cmpManager) => { * Generates v1.1 compatible TC String */ const getConsentFieldsV1 = (callback, params) => { - if (!params.hasOwnProperty('cookieVersion') || !params.hasOwnProperty('vendorListVersion')) { + if (!params || !params.hasOwnProperty('cookieVersion') || !params.hasOwnProperty('vendorListVersion')) { return callback ({}, false); } diff --git a/src/lib/commands.test.js b/src/lib/commands.test.js index 654fb931..1d8590d7 100644 --- a/src/lib/commands.test.js +++ b/src/lib/commands.test.js @@ -1,16 +1,35 @@ /* eslint-disable max-nested-callbacks */ -import { expect } from 'chai'; -import Store from './store'; +import {expect, use} from 'chai'; +import Store, {SECTION_DETAILS, SECTION_VENDORS} from './store'; import createCommands from "./commands"; -import {VENDOR_LIST} from "../../test/constants"; -import {decodeConsentData} from "./cookie/cookie"; +import { + PUBLISHER_CONSENTS, PUBLISHER_LEGITIMATE_INTERESTS, + PURPOSE_CONSENTS, + PURPOSE_LEGITIMATE_INTERESTS, SPECIAL_FEATURE_OPT_INS, + VENDOR_CONSENTS, + VENDOR_LEGITIMATE_INTERESTS, + VENDOR_LIST +} from "../../test/constants"; +import {decodeConsentData, encodeConsentData} from "./cookie/cookie"; +import {CMP_ID, CMP_VERSION} from "./init"; +import {GVL, TCModel} from "@iabtcf/core"; +import {CmpApi} from "@iabtcf/cmpapi"; +import datetime from "chai-datetime"; +import CmpManager from "./cmpManager"; + +use(datetime); + +const filter = (object) => { + return Object.keys(object).filter(key => object[key]); +}; describe('commands', () => { - let store, commands; + let store, commands, cmpManager; beforeEach(() => { store = new Store(); - commands = createCommands(store); + cmpManager = new CmpManager(); + commands = createCommands(store, cmpManager); }); describe('getConsentObject', () => { @@ -75,26 +94,386 @@ describe('commands', () => { done(); }, consents, VENDOR_LIST); }); + + it('should return consent object with corresponded values when invoked with proper object but without any consents', (done) => { + const consents = { + vendorConsents: [], + vendorLegitimateInterests: [], + specialFeatureOptins: [], + purposeConsents: [], + purposeLegitimateInterests: [], + publisherConsents: [], + publisherLegitimateInterests: [] + }; + + commands.getConsentObject((tcData, success) => { + expect(success).to.be.true; + expect(tcData.tcString).not.to.be.undefined; + expect(decodeConsentData(tcData.tcString)).not.to.be.undefined; + expect(tcData.cmpId).to.equal(CMP_ID); + expect(tcData.cmpVersion).to.equal(CMP_VERSION); + expect(tcData.tcfPolicyVersion).to.equal(2); + expect(tcData.isServiceSpecific).to.be.true; + expect(tcData.vendorListVersion).to.equal(VENDOR_LIST.vendorListVersion); + expect(tcData.created).not.to.be.undefined; + expect(tcData.lastUpdated).not.to.be.undefined; + expect(Object.keys(tcData.outOfBand.allowedVendors).length).to.equal(0); + expect(Object.keys(tcData.outOfBand.disclosedVendors).length).to.equal(0); + + // vendors section + const purposeConsents = filter(tcData.purpose.consents); + const purposeLegInt = filter(tcData.purpose.legitimateInterests); + const vendorConsents = filter(tcData.vendor.consents); + const vendorLegInt = filter(tcData.vendor.legitimateInterests); + const specialFeatureOptins = filter(tcData.specialFeatureOptins); + + expect(purposeConsents.length).to.equal(consents.purposeConsents.length); + expect(purposeLegInt.length).to.equal(consents.purposeLegitimateInterests.length); + expect(vendorConsents.length).to.equal(consents.vendorConsents.length); + expect(vendorLegInt.length).to.equal(consents.vendorLegitimateInterests.length); + expect(specialFeatureOptins.length).to.equal(consents.specialFeatureOptins.length); + + // publisher section + const publisherConsents = filter(tcData.publisher.consents); + const publisherLegInt = filter(tcData.publisher.legitimateInterests); + expect(publisherConsents.length).to.equal(consents.publisherConsents.length); + expect(publisherLegInt.length).to.equal(consents.publisherLegitimateInterests.length); + done(); + }, consents, VENDOR_LIST); + }); + + it('should return consent object with corresponded values when invoked with proper object', (done) => { + const consents = { + vendorListVersion: 27, + vendorConsents: [1, 2], + vendorLegitimateInterests: [1, 2], + specialFeatureOptins: [1, 2], + purposeConsents: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + purposeLegitimateInterests: [1, 2, 3, 4, 6, 7, 9, 10], + publisherConsents: [6, 7, 8, 9, 10], + publisherLegitimateInterests: [1, 2, 3, 4, 5] + }; + + commands.getConsentObject((tcData, success) => { + expect(success).to.be.true; + expect(tcData.tcString).not.to.be.undefined; + expect(decodeConsentData(tcData.tcString)).not.to.be.undefined; + expect(tcData.cmpId).to.equal(CMP_ID); + expect(tcData.cmpVersion).to.equal(CMP_VERSION); + expect(tcData.tcfPolicyVersion).to.equal(2); + expect(tcData.isServiceSpecific).to.be.true; + expect(tcData.vendorListVersion).to.equal(VENDOR_LIST.vendorListVersion); + expect(tcData.created).not.to.be.undefined; + expect(tcData.lastUpdated).not.to.be.undefined; + expect(Object.keys(tcData.outOfBand.allowedVendors).length).to.equal(0); + expect(Object.keys(tcData.outOfBand.disclosedVendors).length).to.equal(0); + + // vendors section + const purposeConsents = filter(tcData.purpose.consents); + const purposeLegInt = filter(tcData.purpose.legitimateInterests); + const vendorConsents = filter(tcData.vendor.consents); + const vendorLegInt = filter(tcData.vendor.legitimateInterests); + const specialFeatureOptins = filter(tcData.specialFeatureOptins); + + expect(purposeConsents.length).to.equal(consents.purposeConsents.length); + expect(purposeLegInt.length).to.equal(consents.purposeLegitimateInterests.length); + expect(vendorConsents.length).to.equal(consents.vendorConsents.length); + expect(vendorLegInt.length).to.equal(consents.vendorLegitimateInterests.length); + expect(specialFeatureOptins.length).to.equal(consents.specialFeatureOptins.length); + + // publisher section + const publisherConsents = filter(tcData.publisher.consents); + const publisherLegInt = filter(tcData.publisher.legitimateInterests); + expect(publisherConsents.length).to.equal(consents.publisherConsents.length); + expect(publisherLegInt.length).to.equal(consents.publisherLegitimateInterests.length); + done(); + }, consents, VENDOR_LIST); + }); + + it('should return consent object with corresponded values when invoked with proper object also when consent was persisted before', (done) => { + const consents = { + vendorConsents: [1, 2], + vendorLegitimateInterests: [1, 2], + specialFeatureOptins: [1, 2], + purposeConsents: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + purposeLegitimateInterests: [1, 2, 3, 4, 6, 7, 9, 10], + publisherConsents: [6, 7, 8, 9, 10], + publisherLegitimateInterests: [1, 2, 3, 4, 5] + }; + + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(VENDOR_LIST); + + setTimeout(() => { + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(VENDOR_CONSENTS); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); + + // creating consent + const encoded = encodeConsentData(tcModel); + const localStore = new Store({ + consentData: decodeConsentData(encoded) + }); + const localCommands = createCommands(localStore); + const cmpApi = new CmpApi(280, 2, localCommands); + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + setTimeout(() => { + const now = new Date(); + localCommands.getConsentObject((tcData, success) => { + expect(success).to.be.true; + expect(tcData.tcString).not.to.be.undefined; + expect(decodeConsentData(tcData.tcString)).not.to.be.undefined; + expect(tcData.cmpId).to.equal(CMP_ID); + expect(tcData.cmpVersion).to.equal(CMP_VERSION); + expect(tcData.tcfPolicyVersion).to.equal(2); + expect(tcData.isServiceSpecific).to.be.true; + expect(tcData.vendorListVersion).to.equal(VENDOR_LIST.vendorListVersion); + expect(tcData.created).to.be.beforeTime(now); + expect(tcData.lastUpdated).to.be.beforeTime(now); + done(); + }, consents, VENDOR_LIST); + }, 100); + + }, 0); + }); }); describe('getConsentFieldsV1', () => { + it('should return empty object and false when invoked without vendor list', (done) => { + const consents = {}; - }); + commands.getConsentFieldsV1((tcData, success) => { + expect(tcData).to.deep.equal({}); + expect(success).to.be.false; + done(); + }, consents); + }); - describe('showConsentTool', () => { - }); + it('should return empty object and false when invoked with undefined', (done) => { + commands.getConsentFieldsV1((tcData, success) => { + expect(tcData).to.deep.equal({}); + expect(success).to.be.false; + done(); + }, undefined); + }); + + it('should return consent object without any consents when invoked with proper object but without any consents', (done) => { + const consents = { + "selectedPurposeIds": [], + "selectedVendorIds": [], + "vendorListVersion": 179, + "cookieVersion": 1, + "cmpVersion": 1 + }; - describe('showConsentDetailView', () => { + commands.getConsentFieldsV1((tcData, success) => { + expect(tcData.metadata).not.to.be.undefined; + expect(success).to.be.true; + expect(tcData.gdprApplies).to.be.true; + expect(tcData.hasGlobalScope).to.be.false; + expect(tcData.cmpId).to.be.equal(CMP_ID); + expect(tcData.cmpVersion).to.be.equal(CMP_VERSION); + expect(tcData.created).to.be.undefined; + expect(tcData.lastUpdated).to.be.undefined; + expect(tcData.cookieVersion).to.equal(1); + expect(tcData.vendorListVersion).to.equal(consents.vendorListVersion); + done(); + }, consents); + }); - }); + it('should return consent object without any consents when invoked with proper object', (done) => { + const consents = { + "maxVendorId": 200, + "selectedPurposeIds": [1, 2, 3, 4, 5], + "selectedVendorIds": [2,3,4,100, 157], + "vendorListVersion": 179, + "cookieVersion": 1, + "cmpVersion": 1 + }; - describe('showVendors', () => { + commands.getConsentFieldsV1((tcData, success) => { + expect(tcData.metadata).not.to.be.undefined; + expect(success).to.be.true; + expect(tcData.gdprApplies).to.be.true; + expect(tcData.hasGlobalScope).to.be.false; + expect(tcData.cmpId).to.be.equal(CMP_ID); + expect(tcData.cmpVersion).to.be.equal(CMP_VERSION); + expect(tcData.created).to.be.undefined; + expect(tcData.lastUpdated).to.be.undefined; + expect(tcData.cookieVersion).to.equal(1); + expect(tcData.vendorListVersion).to.equal(consents.vendorListVersion); + done(); + }, consents); + }); - }); + it('should return consent object with corresponded values when invoked with proper object also when consent was persisted before', (done) => { + const consents = { + "maxVendorId": 200, + "selectedPurposeIds": [1, 2, 3, 4, 5], + "selectedVendorIds": [2,3,4,100, 157], + "vendorListVersion": 179, + "cookieVersion": 1, + "cmpVersion": 1 + }; + + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(VENDOR_LIST); + + setTimeout(() => { + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(VENDOR_CONSENTS); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); - describe('showFooter', () => { + // creating consent + const encoded = encodeConsentData(tcModel); + const localStore = new Store({ + consentData: decodeConsentData(encoded) + }); + const localCommands = createCommands(localStore); + const cmpApi = new CmpApi(280, 2, localCommands); + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + setTimeout(() => { + const now = new Date(); + localCommands.getConsentFieldsV1((tcData, success) => { + expect(tcData.metadata).not.to.be.undefined; + expect(success).to.be.true; + expect(tcData.gdprApplies).to.be.true; + expect(tcData.hasGlobalScope).to.be.false; + expect(tcData.cmpId).to.be.equal(CMP_ID); + expect(tcData.cmpVersion).to.be.equal(CMP_VERSION); + expect(tcData.created).not.to.be.undefined; + expect(tcData.lastUpdated).not.to.be.undefined; + expect(tcData.cookieVersion).to.equal(1); + expect(tcData.vendorListVersion).to.equal(consents.vendorListVersion); + expect(tcData.created).to.be.beforeTime(now); + expect(tcData.lastUpdated).to.be.beforeTime(now); + done(); + }, consents, VENDOR_LIST); + }, 100); + + }, 0); + }); }); + describe('additional functions', () => { + let callbackExecuted, store, cmpManager, commands; + + beforeEach(() => { + store = new Store(); + cmpManager = new CmpManager(); + commands = createCommands(store, cmpManager); + callbackExecuted = false; + }); + + afterEach(() => { + callbackExecuted = false; + }); + + it('showConsentTool - should execute all inner methods', () => { + store.updateSection = jest.fn(); + store.toggleConsentToolShowing = jest.fn(); + cmpManager.notify = jest.fn(); + + commands.showConsentTool(() => { + callbackExecuted = true; + }); + + expect(store.updateSection.mock.calls.length).to.equal(1); + expect(store.toggleConsentToolShowing.mock.calls[0][0]).to.be.true; + expect(cmpManager.openConsentTool).to.be.true; + expect(cmpManager.notify.mock.calls[0][0]).to.equal('openConsentTool'); + expect(cmpManager.notify.mock.calls[0][1]).to.deep.equal({section: 'intro'}); + expect(callbackExecuted).to.be.true; + }); + + it('showConsentDetailView - should execute all inner methods', () => { + store.updateSection = jest.fn(); + store.toggleConsentToolShowing = jest.fn(); + cmpManager.notify = jest.fn(); + + commands.showConsentDetailView(() => { + callbackExecuted = true; + }); + + expect(store.updateSection.mock.calls[0][0]).to.equal(SECTION_DETAILS); + expect(store.toggleConsentToolShowing.mock.calls[0][0]).to.be.true; + expect(cmpManager.openConsentTool).to.be.true; + expect(cmpManager.notify.mock.calls[0][0]).to.equal('openConsentTool'); + expect(cmpManager.notify.mock.calls[0][1]).to.deep.equal({section: 'details'}); + expect(callbackExecuted).to.be.true; + }); + + it('showVendors - should execute all inner methods', () => { + store.updateSection = jest.fn(); + store.toggleConsentToolShowing = jest.fn(); + cmpManager.notify = jest.fn(); + + commands.showVendors(() => { + callbackExecuted = true; + }); + + expect(store.updateSection.mock.calls[0][0]).to.equal(SECTION_DETAILS); + expect(store.updateSection.mock.calls[0][0]).to.equal(SECTION_VENDORS); + expect(store.toggleConsentToolShowing.mock.calls[0][0]).to.be.true; + expect(cmpManager.openConsentTool).to.be.true; + expect(cmpManager.notify.mock.calls[0][0]).to.equal('openConsentTool'); + expect(cmpManager.notify.mock.calls[0][1]).to.deep.equal({section: 'details'}); + expect(callbackExecuted).to.be.true; + }); + + it('showFooter - should execute all inner methods', () => { + store.toggleFooterShowing = jest.fn(); + commands.showFooter(() => { + callbackExecuted = true; + }); + expect(store.toggleFooterShowing.mock.calls[0][0]).to.be.true; + expect(callbackExecuted).to.be.true; + }); + + it('registerEventListener - should execute all inner methods', () => { + cmpManager.addEventListener = jest.fn(); + + const callback = () => { + callbackExecuted = true; + }; + + commands.registerEventListener(callback, { + event: 'isLoaded' + }); + + expect(cmpManager.addEventListener.mock.calls[0][0]).to.equal('isLoaded'); + expect(cmpManager.addEventListener.mock.calls[0][1]).to.equal(callback); + }); + + it('unregisterEventListener - should execute all inner methods', () => { + cmpManager.removeEventListener = jest.fn(); + const callback = () => { + callbackExecuted = true; + }; + + commands.unregisterEventListener(callback, { + event: 'isLoaded' + }); + + expect(cmpManager.removeEventListener.mock.calls[0][0]).to.equal('isLoaded'); + expect(cmpManager.removeEventListener.mock.calls[0][1]).to.equal(callback); + }); + }); }); diff --git a/src/lib/store.js b/src/lib/store.js index 26dcbf69..3b7834e6 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -397,7 +397,7 @@ export default class Store { } }; - selectAllSpecialFeatureOptIns = (isSelected) => { + selectAllSpecialFeatureOptins = (isSelected) => { const operation = isSelected ? 'setAllSpecialFeatureOptins' : 'unsetAllSpecialFeatureOptins'; this.tcModel[operation](); this.storeUpdate(); @@ -466,8 +466,6 @@ export default class Store { toggleFooterShowing = (isShown) => { const vendorConsentsObject = this.getVendorConsentsObject(); - console.log(vendorConsentsObject); - if (this.isAllSetTrue(vendorConsentsObject.purposeConsents)) { let vendorConsents; if (this.vendorList) { @@ -520,7 +518,7 @@ export default class Store { this.selectAllPurposesLegitimateInterests(true); this.selectAllVendors(true); this.selectAllVendorLegitimateInterests(true); - this.selectAllSpecialFeatureOptIns(true); + this.selectAllSpecialFeatureOptins(true); this.selectAllPublisherPurposes(true); this.selectAllPublisherLegitimateInterests(true); diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 96613f84..1d0357b0 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -290,7 +290,7 @@ describe('store', () => { store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); - store.selectAllSpecialFeatureOptIns(false); + store.selectAllSpecialFeatureOptins(false); store.persist(); const vendorConsentsObject = store.getVendorConsentsObject(); From c595fcc9d7e7bb48e1186ba759f54f37d4d184fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 19 Mar 2020 17:31:46 +0100 Subject: [PATCH 278/540] removed getPublisherConsentsObject --- src/lib/store.js | 86 ------------------------------------------- src/lib/store.test.js | 15 ++------ 2 files changed, 4 insertions(+), 97 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index 3b7834e6..2a0f477e 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -157,92 +157,6 @@ export default class Store { }; }; - /** - * Build publisher consent object from data that has already been persisted. - * Purposes will only have consent=true if they exist in the current vendorList. - */ - getPublisherConsentsObject = () => { - const { - vendorList = {}, - persistedConsentData = {} - } = this; - - const { - version: cookieVersion, - created, - lastUpdated, - cmpId, - vendorListVersion, - publisherConsents = new Vector(), - publisherLegitimateInterests = new Vector(), - publisherCustomConsents = new Vector(), - publisherCustomLegitimateInterests = new Vector(), - } = persistedConsentData; - - const {purposes = {}} = vendorList; - let publisherCustomPurposesMap = {}; - let publisherCustomLegIntMap = {}; - - const maxPersistedPublisherPurposeId = publisherConsents.maxId; - const maxPersistedPublisherLegIntId = publisherLegitimateInterests.maxId; - - const lastPublisherPurposeId = Math.max( - ...Object.values(purposes).map(({id}) => id), - ...[maxPersistedPublisherPurposeId]); - - const publisherPurposesMap = {}; - for (let i = 1; i <= lastPublisherPurposeId; i++) { - publisherPurposesMap[i] = publisherConsents.has(i); - } - - const lastPublisherLegIntId = Math.max( - ...Object.values(purposes).map(({id}) => id), - ...[maxPersistedPublisherLegIntId]); - - const publisherLegIntMap= {}; - for (let i = 1; i <= lastPublisherLegIntId; i++) { - publisherLegIntMap[i] = publisherLegitimateInterests.has(i); - } - - if (publisherCustomConsents.size) { - const maxPersistedPublisherCustomPurposeId = publisherCustomConsents.maxId; - - const lastPublisherCustomPurposeId = Math.max( - ...Object.values(purposes).map(({id}) => id), - ...[maxPersistedPublisherCustomPurposeId]); - - publisherCustomPurposesMap = {}; - for (let i = 1; i <= lastPublisherCustomPurposeId; i++) { - publisherCustomPurposesMap[i] = publisherCustomConsents.has(i); - } - } - - if (publisherCustomLegitimateInterests.size) { - const maxPersistedPublisherCustomLegIntId = publisherCustomLegitimateInterests.maxId; - - const lastPublisherCustomLegIntId = Math.max( - ...Object.values(purposes).map(({id}) => id), - ...[maxPersistedPublisherCustomLegIntId]); - - publisherCustomLegIntMap = {}; - for (let i = 1; i <= lastPublisherCustomLegIntId; i++) { - publisherCustomLegIntMap[i] = publisherCustomLegitimateInterests.has(i); - } - } - - return { - cookieVersion, - created, - lastUpdated, - cmpId, - vendorListVersion, - publisherConsents: publisherPurposesMap, - publisherLegitimateInterests: publisherLegIntMap, - publisherCustomConsents: publisherCustomPurposesMap, - publisherCustomLegitimateInterests: publisherCustomLegIntMap - }; - }; - /** * Persist all consent data to the cookie. This data will NOT be filtered * by the vendorList and will include global consents set no matter what diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 1d0357b0..b3c729eb 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -308,15 +308,11 @@ describe('store', () => { store.selectPublisherPurpose(1, false); store.selectPublisherPurpose(3, false); - store.persist(); - const publisherConsentObject = store.getPublisherConsentsObject(); - const publisherConsents = Object.keys(publisherConsentObject.publisherConsents).filter(key => publisherConsentObject.publisherConsents[key]); - - expect(publisherConsents.length).to.equal(Object.keys(VENDOR_LIST.purposes).length - 2); - expect(publisherConsentObject.publisherConsents['1']).to.be.false; - expect(publisherConsentObject.publisherConsents['3']).to.be.false; + expect(store.persistedConsentData.publisherConsents.size).to.equal(Object.keys(VENDOR_LIST.purposes).length - 2); + expect(store.persistedConsentData.publisherConsents.has(1)).to.be.false; + expect(store.persistedConsentData.publisherConsents.has(3)).to.be.false; }); it('selects ALL publisher purpose IDs', () => { @@ -328,10 +324,7 @@ describe('store', () => { store.selectAllPublisherPurposes(true); store.persist(); - const publisherConsentObject = store.getPublisherConsentsObject(); - const publisherConsents = Object.keys(publisherConsentObject.publisherConsents).filter(key => publisherConsentObject.publisherConsents[key]); - - expect(publisherConsents.length).to.equal(Object.keys(VENDOR_LIST.purposes).length); + expect(store.persistedConsentData.publisherConsents.size).to.equal(Object.keys(VENDOR_LIST.purposes).length); }); it('toggle the consent modal', () => { From 49b58d5ed5afd3d1bcb947ab350f5cab86a7e7e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 19 Mar 2020 17:46:08 +0100 Subject: [PATCH 279/540] reverted some cookie tests --- src/lib/cookie/cookie.js | 68 +++++++++++++++++++++++++++++++++++ src/lib/cookie/cookie.test.js | 62 +++++++++++++++++++++++++++++++- 2 files changed, 129 insertions(+), 1 deletion(-) diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index e7745662..48261a49 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -4,6 +4,7 @@ import { TCString } from '@iabtcf/core'; import { padRight, encodeVendorCookieValue, + decodeVendorCookieValue } from './cookieutils'; const arrayFrom = require('core-js/library/fn/array/from'); @@ -118,6 +119,71 @@ function encodeVendorConsentData (vendorData) { return noRangesData.length < rangesData.length ? noRangesData : rangesData; } + +function decodeBitsToIds(bitString) { + return bitString.split('').reduce((acc, bit, index) => { + if (bit === '1') { + acc.add(index + 1); + } + return acc; + }, new Set()); +} + +function decodeVendorConsentData(cookieValue) { + const { + cookieVersion, + cmpId, + cmpVersion, + consentScreen, + consentLanguage, + vendorListVersion, + purposeIdBitString, + maxVendorId, + created, + lastUpdated, + isRange, + defaultConsent, + vendorIdBitString, + vendorRangeList + } = decodeVendorCookieValue(cookieValue); + + const cookieData = { + cookieVersion, + cmpId, + cmpVersion, + consentScreen, + consentLanguage, + vendorListVersion, + selectedPurposeIds: decodeBitsToIds(purposeIdBitString), + maxVendorId, + created, + lastUpdated + }; + + if (isRange) { + const idMap = vendorRangeList.reduce((acc, {isRange, startVendorId, endVendorId}) => { + const lastVendorId = isRange ? endVendorId : startVendorId; + for (let i = startVendorId; i <= lastVendorId; i++) { + acc[i] = true; + } + return acc; + }, {}); + + cookieData.selectedVendorIds = new Set(); + for (let i = 0; i <= maxVendorId; i++) { + if ((defaultConsent && !idMap[i]) || + (!defaultConsent && idMap[i])) { + cookieData.selectedVendorIds.add(i); + } + } + } + else { + cookieData.selectedVendorIds = decodeBitsToIds(vendorIdBitString); + } + + return cookieData; +} + export { writeCookie, decodeConsentData, @@ -125,5 +191,7 @@ export { readConsentCookie, writeConsentCookie, encodeVendorConsentData, + convertVendorsToRanges, + decodeVendorConsentData, CONSENT_COOKIE }; diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index 7a6fe1bc..d6b9ee93 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -7,6 +7,9 @@ import { encodeConsentData, writeConsentCookie, readConsentCookie, + convertVendorsToRanges, + encodeVendorConsentData, + decodeVendorConsentData, CONSENT_COOKIE } from './cookie'; import { @@ -38,7 +41,7 @@ describe('cookie', () => { mockPortal.sendPortalCommand = jest.fn().mockImplementation(() => Promise.resolve()); }); - it('encodes and decodes the vendor cookie object back to original value', (done) => { + it('encodes and decodes consent cookie object back to original value', (done) => { const tcModel = new TCModel(); tcModel.cmpId = 280; tcModel.cmpVersion = 2; @@ -166,4 +169,61 @@ describe('cookie', () => { const decoded = decodeConsentData(cookie_v1); expect(decoded).to.be.undefined; }); + + it('encodes and decodes the vendor cookie object back to original value', () => { + + const aDate = new Date('2018-07-15 PDT'); + const vendorConsentData = { + cookieVersion: 1, + cmpId: 1, + cmpVersion: 1, + consentScreen: 2, + consentLanguage: 'DE', + vendorListVersion: 1, + maxVendorId: Math.max(...Object.values(VENDOR_LIST.vendors).map(vendor => vendor.id)), + created: aDate, + lastUpdated: aDate, + selectedPurposeIds: new Set([1, 2]), + selectedVendorIds: new Set([1, 2, 4]) + }; + + const encodedString = encodeVendorConsentData({...vendorConsentData, VENDOR_LIST}); + const decoded = decodeVendorConsentData(encodedString); + + expect(decoded).to.deep.equal(vendorConsentData); + }); + + it('converts selected vendor list to a range', () => { + const maxVendorId = Math.max(...Object.values(VENDOR_LIST.vendors).map(vendor => vendor.id)); + const ranges = convertVendorsToRanges(maxVendorId, new Set([2, 3, 4])); + + expect(ranges).to.deep.equal([{ + isRange: true, + startVendorId: 2, + endVendorId: 4 + }]); + }); + + it('converts selected vendor list to multiple ranges', () => { + const maxVendorId = Math.max(...Object.values(VENDOR_LIST.vendors).map(vendor => vendor.id)); + const ranges = convertVendorsToRanges(maxVendorId, new Set([2, 3, 5, 6, 10])); + + expect(ranges).to.deep.equal([ + { + isRange: true, + startVendorId: 2, + endVendorId: 3 + }, + { + isRange: true, + startVendorId: 5, + endVendorId: 6 + }, + { + isRange: false, + startVendorId: 10, + endVendorId: undefined + } + ]); + }); }); From 9f963a6e22982e9bd92c922637783b4af903bad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 19 Mar 2020 18:00:57 +0100 Subject: [PATCH 280/540] cmpManager tests --- src/lib/cmpManager.test.js | 58 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/lib/cmpManager.test.js diff --git a/src/lib/cmpManager.test.js b/src/lib/cmpManager.test.js new file mode 100644 index 00000000..b699c67b --- /dev/null +++ b/src/lib/cmpManager.test.js @@ -0,0 +1,58 @@ +/* eslint-disable max-nested-callbacks */ +import {expect} from 'chai'; +import CmpManager from "./cmpManager"; + +describe('cmpManager', () => { + + let cmpManager; + + beforeEach(() => { + cmpManager = new CmpManager(); + }); + + describe('addEventListener', () => { + it('only adds the callback instance once', () => { + const callback = () => {}; + + cmpManager.addEventListener('isLoaded', callback); + + expect(cmpManager.eventListeners.isLoaded.size).to.equal(1); + }); + }); + + describe('removeEventListener', () => { + + it('removes a specific callback instance', () => { + const callback = () => {}; + + cmpManager.addEventListener('isLoaded', callback); + expect(cmpManager.eventListeners.isLoaded.size).to.equal(1); + + cmpManager.removeEventListener('isLoaded', callback); + + expect(cmpManager.eventListeners.isLoaded.size).to.equal(0); + }); + + it('removes all listeners of specific event', () => { + cmpManager.addEventListener('isLoaded', () => {}); + cmpManager.addEventListener('isLoaded', () => {}); + expect(cmpManager.eventListeners.isLoaded.size).to.equal(2); + + cmpManager.removeEventListener('isLoaded'); + + expect(cmpManager.eventListeners.isLoaded.size).to.equal(0); + }); + + it('removes all listeners for all events', () => { + + cmpManager.addEventListener('isLoaded', () => {}); + cmpManager.addEventListener('onSubmit', () => {}); + expect(cmpManager.eventListeners.isLoaded.size).to.equal(1); + expect(cmpManager.eventListeners.onSubmit.size).to.equal(1); + + cmpManager.removeEventListener(); + + expect(cmpManager.eventListeners).to.deep.equal({}); + }); + }); +}); From 9fa4c12b44e2f22602368ed03bb98ebfc1a77485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Thu, 19 Mar 2020 18:06:07 +0100 Subject: [PATCH 281/540] store update inside selectSpecialFeatureOptins & changed function name --- src/components/popup/details/details.jsx | 4 ++-- src/components/popup/details/purposes/purposes.jsx | 6 +++--- src/lib/store.js | 3 ++- src/lib/store.test.js | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index e120e586..0ea8f1fc 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -77,7 +77,7 @@ export default class Details extends Component { selectPurpose, selectPurposeLegitimateInterests, - selectSpecialFeature, + selectSpecialFeatureOptins, selectVendors, selectVendor, selectVendorLegitimateInterests, @@ -124,7 +124,7 @@ export default class Details extends Component { selectedPublisherCustomPurposeIds={publisherCustomConsents} selectPurpose={selectPurpose} selectPurposeLegitimateInterests={selectPurposeLegitimateInterests} - selectSpecialFeature={selectSpecialFeature} + selectSpecialFeatureOptins={selectSpecialFeatureOptins} initialVendorsRejection={initialVendorsRejection} selectPublisherPurpose={selectPublisherPurpose} selectPublisherLegitimateInterests={selectPublisherLegitimateInterests} diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 34f0a457..6fc84978 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -64,8 +64,8 @@ export default class Purposes extends Component { } }; - handleSelectSpecialFeature = ({isSelected, dataId}) => { - this.props.selectSpecialFeature(dataId, isSelected); + handleSelectSpecialFeatureOptins = ({isSelected, dataId}) => { + this.props.selectSpecialFeatureOptins(dataId, isSelected); }; createHandleSelectPurpose = (isPublisher) => { @@ -152,7 +152,7 @@ export default class Purposes extends Component { this.handleSelectPurpose({isSelected: false, dataId: index}, true, false); }); specialFeatures.forEach((specialFeature, index) => { - this.handleSelectSpecialFeature({isSelected:false, dataId: index+1}) + this.handleSelectSpecialFeatureOptins({isSelected:false, dataId: index+1}) }); initialVendorsRejection(); } diff --git a/src/lib/store.js b/src/lib/store.js index 2a0f477e..e8e2ac47 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -302,13 +302,14 @@ export default class Store { this.storeUpdate(); }; - selectSpecialFeature = (specialFeatureId, isSelected) => { + selectSpecialFeatureOptins = (specialFeatureId, isSelected) => { const { specialFeatureOptins } = this.tcModel; if (isSelected) { specialFeatureOptins.set(specialFeatureId); } else { specialFeatureOptins.unset(specialFeatureId); } + this.storeUpdate(); }; selectAllSpecialFeatureOptins = (isSelected) => { diff --git a/src/lib/store.test.js b/src/lib/store.test.js index b3c729eb..55b6f576 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -273,8 +273,8 @@ describe('store', () => { store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); - store.selectSpecialFeature(1, true); - store.selectSpecialFeature(2, false); + store.selectSpecialFeatureOptins(1, true); + store.selectSpecialFeatureOptins(2, false); store.persist(); const vendorConsentsObject = store.getVendorConsentsObject(); From 771fa79373df84ccb4edddfc8936f49550354bff Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 20 Mar 2020 09:42:47 +0100 Subject: [PATCH 282/540] prevent storeUpdate when applying vendorList, adding vendor id to vendorLegitimateInterests vector in case of new vendor on gvl --- src/lib/store.js | 36 ++++++++++++++++++++++++------------ src/lib/store.test.js | 1 + 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/lib/store.js b/src/lib/store.js index e8e2ac47..b03bd766 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -328,7 +328,7 @@ export default class Store { this.storeUpdate(); }; - selectAllPublisherPurposes = (isSelected) => { + selectAllPublisherPurposes = (isSelected, update = true) => { const {purposes = {}} = this.vendorList || {}; const operation = isSelected ? 'set' : 'unset'; const {legIntPurposeIds, contractPurposeIds} = config; @@ -341,7 +341,9 @@ export default class Store { } }); - this.storeUpdate(); + if (update) { + this.storeUpdate(); + } }; selectPublisherLegitimateInterests = (purposeId, isSelected) => { @@ -354,7 +356,7 @@ export default class Store { this.storeUpdate(); }; - selectAllPublisherLegitimateInterests = (isSelected) => { + selectAllPublisherLegitimateInterests = (isSelected, update) => { const {purposes = {}} = this.vendorList || {}; const {legIntPurposeIds, contractPurposeIds} = config; const operation = isSelected ? 'set' : 'unset'; @@ -366,7 +368,9 @@ export default class Store { } }); - this.storeUpdate(); + if (update) { + this.storeUpdate(); + } }; toggleConsentToolShowing = (isShown) => { @@ -429,20 +433,28 @@ export default class Store { // If vendor and publisher consent data has never been persisted set default selected status if (!created) { - this.selectAllPurposes(true); - this.selectAllPurposesLegitimateInterests(true); - this.selectAllVendors(true); - this.selectAllVendorLegitimateInterests(true); - this.selectAllSpecialFeatureOptins(true); - - this.selectAllPublisherPurposes(true); - this.selectAllPublisherLegitimateInterests(true); + const getIds = (object) => Object.keys(object) + .filter(key => object[key].id) + .map(key => object[key].id); + + const purposesIds = getIds(vendorList.purposes); + const vendorsIds = getIds(vendorList.vendors); + const specialFeatureIds = getIds(vendorList.specialFeatures); + + this.tcModel.purposeConsents.set(purposesIds); + this.tcModel.purposeLegitimateInterests.set(purposesIds); + this.tcModel.vendorConsents.set(vendorsIds); + this.tcModel.vendorLegitimateInterests.set(vendorsIds); + this.tcModel.specialFeatureOptins.set(specialFeatureIds); + this.selectAllPublisherPurposes(true, false); + this.selectAllPublisherLegitimateInterests(true, false); } // If vendor consent data has already been persisted set default selected status only for new vendors else { Object.values(vendors).forEach(v => { if (v.id > persistedMaxVendorId) { this.tcModel.vendorConsents.set(v.id); + this.tcModel.vendorLegitimateInterests.set(v.id); } }); } diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 55b6f576..56b04433 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -119,6 +119,7 @@ describe('store', () => { expect(store.tcModel.vendorConsents.size).to.equal(6); expect(store.tcModel.vendorConsents.maxId).to.equal(10); expect(store.tcModel.vendorConsents.has(10)).to.be.true; + expect(store.tcModel.vendorLegitimateInterests.has(10)).to.be.true; done(); }, 0); }); From 186a4ed1e45e43fb66b95bc224645fdfad91736b Mon Sep 17 00:00:00 2001 From: apocentek Date: Fri, 20 Mar 2020 11:15:19 +0100 Subject: [PATCH 283/540] config cleaned --- src/lib/config.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib/config.js b/src/lib/config.js index 479331c7..a725b1ff 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -17,7 +17,7 @@ const defaultConfig = { contractPurposeIds: [], autoDisplay: true, allowedVendorIds: null, - specialPurposes: [1,2] + specialPurposes: [] }; class Config { @@ -41,8 +41,6 @@ class Config { return acc; }, { validUpdates: {}, invalidKeys: [] }); -validUpdates.legIntPurposeIds = [2,3,4,5,6,7,8,9,10]; - Object.assign(this, validUpdates); if (invalidKeys.length) { log.warn(`Invalid CMP config values not applied: ${invalidKeys.join(', ')}`); From 598d957472dae75218237d354da1f77ff66b2c13 Mon Sep 17 00:00:00 2001 From: apocentek Date: Fri, 20 Mar 2020 12:03:16 +0100 Subject: [PATCH 284/540] details manual resolve --- src/components/popup/details/details.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index f3313b13..99dc9f47 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -82,6 +82,7 @@ export default class Details extends Component { selectPurpose, selectPurposeLegitimateInterests, selectSpecialFeatureOptins, + selectSpecialFeature, selectVendors, selectVendor, selectVendorLegitimateInterests, From ea50c51d161f2d83e839213932d52416c4c28a0e Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 20 Mar 2020 13:26:05 +0100 Subject: [PATCH 285/540] separating cookies function to decrease bundle weight --- src/components/app.test.js | 15 +- src/components/popup/details/details.test.js | 3 + .../popup/details/purposes/purposes.jsx | 2 +- src/components/popup/popup.test.js | 16 +- src/docs/assets/complete.html | 3 +- src/docs/components/tools/cookieDecoder.jsx | 2 +- src/docs/components/tools/cookieEncoder.jsx | 2 +- src/lib/commands.test.js | 10 +- src/lib/cookie/cookie.js | 100 +----- src/lib/cookie/cookie.test.js | 198 ++++++++++- src/lib/cookie/cookieDecodeHelpers.js | 168 +++++++++ src/lib/cookie/cookieDecodeHelpers.test.js | 69 ++++ src/lib/cookie/cookieEncodeHelpers.js | 160 +++++++++ src/lib/cookie/cookieEncodeHelpers.test.js | 84 +++++ src/lib/cookie/cookieutils.js | 325 ------------------ src/lib/cookie/cookieutils.test.js | 268 --------------- src/lib/store.js | 25 +- src/lib/store.test.js | 61 +++- webpack.config.babel.js | 1 + 19 files changed, 783 insertions(+), 729 deletions(-) create mode 100644 src/lib/cookie/cookieDecodeHelpers.js create mode 100644 src/lib/cookie/cookieDecodeHelpers.test.js create mode 100644 src/lib/cookie/cookieEncodeHelpers.js create mode 100644 src/lib/cookie/cookieEncodeHelpers.test.js delete mode 100644 src/lib/cookie/cookieutils.js delete mode 100644 src/lib/cookie/cookieutils.test.js diff --git a/src/components/app.test.js b/src/components/app.test.js index 10b837eb..2ccfc69f 100644 --- a/src/components/app.test.js +++ b/src/components/app.test.js @@ -6,6 +6,7 @@ import style from './app.less'; import Store from '../lib/store'; import App from './app'; +import {CMP_ID} from "../lib/init"; describe('App', () => { let scratch; @@ -26,18 +27,22 @@ describe('App', () => { it('should render app content', () => { - render(, scratch); + render(, scratch); expect(scratch.innerHTML).to.contain(style.gdpr); }); it('add a listener to the store to receive updates', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); render(, scratch); expect(store.listeners.size).to.equal(1); }); it('persist state on save', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); const notify = jest.fn(); store.persist = jest.fn(); store.toggleConsentToolShowing = jest.fn(); @@ -57,7 +62,9 @@ describe('App', () => { }); it('updates local state when store changes', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); let app; render( { let scratch; @@ -15,6 +16,7 @@ describe('Details', () => { it('should render with purpose panel initially', () => { const store = new Store({ + cmpId: CMP_ID, vendorList: { purposes: [ { id: 1, name: 'Purpose 1' }, @@ -30,6 +32,7 @@ describe('Details', () => { it('should switch between panel states', () => { const store = new Store({ + cmpId: CMP_ID, vendorList: { purposes: [ { id: 1, name: 'Purpose 1' }, diff --git a/src/components/popup/details/purposes/purposes.jsx b/src/components/popup/details/purposes/purposes.jsx index 6fc84978..cc20bf3b 100644 --- a/src/components/popup/details/purposes/purposes.jsx +++ b/src/components/popup/details/purposes/purposes.jsx @@ -114,7 +114,7 @@ export default class Purposes extends Component { specialPurposes, features, specialFeatures, - persistedConsentData, + persistedConsentData = {}, initialVendorsRejection } = props; diff --git a/src/components/popup/popup.test.js b/src/components/popup/popup.test.js index 3ae94b0b..0f25a2f7 100644 --- a/src/components/popup/popup.test.js +++ b/src/components/popup/popup.test.js @@ -16,14 +16,18 @@ describe('Popup', () => { }); it('should render with overlay hidden', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.isConsentToolShowing = false; const popup = ; expect(popup).to.contain('display: none'); }); it('should render with overlay visible', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.isConsentToolShowing = true; const popup = ; expect(popup).to.contain('display: flex'); @@ -31,7 +35,9 @@ describe('Popup', () => { it('should handle accept all', (done) => { const cmpApi = new CmpApi(CMP_ID, CMP_VERSION); - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); store.selectAllVendors = jest.fn(); @@ -64,7 +70,9 @@ describe('Popup', () => { }); it('should switch between panel states', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID, + }); let popup; render( window.__cmp = {config: {logging: 'debug'}}; - + + diff --git a/src/docs/components/tools/cookieDecoder.jsx b/src/docs/components/tools/cookieDecoder.jsx index b609174e..a70a410a 100644 --- a/src/docs/components/tools/cookieDecoder.jsx +++ b/src/docs/components/tools/cookieDecoder.jsx @@ -5,7 +5,7 @@ import { Controlled as CodeMirror } from 'react-codemirror2'; import { decodeCookieValue, decodeCookieBitValue -} from '../../../lib/cookie/cookieutils'; +} from '../../../lib/cookie/cookieDecodeHelpers'; export default class CookieDecoder extends Component { constructor(props) { diff --git a/src/docs/components/tools/cookieEncoder.jsx b/src/docs/components/tools/cookieEncoder.jsx index 29e01a85..116147d9 100644 --- a/src/docs/components/tools/cookieEncoder.jsx +++ b/src/docs/components/tools/cookieEncoder.jsx @@ -7,7 +7,7 @@ import { encodeField, encodeDataToBits, encodeCookieValue -} from '../../../lib/cookie/cookieutils'; +} from '../../../lib/cookie/cookieDecodeHelpers'; export default class CookieEncoder extends Component { diff --git a/src/lib/commands.test.js b/src/lib/commands.test.js index 1d8590d7..8e95fd38 100644 --- a/src/lib/commands.test.js +++ b/src/lib/commands.test.js @@ -27,7 +27,9 @@ describe('commands', () => { let store, commands, cmpManager; beforeEach(() => { - store = new Store(); + store = new Store({ + cmpId: CMP_ID + }); cmpManager = new CmpManager(); commands = createCommands(store, cmpManager); }); @@ -218,6 +220,7 @@ describe('commands', () => { // creating consent const encoded = encodeConsentData(tcModel); const localStore = new Store({ + cmpId: CMP_ID, consentData: decodeConsentData(encoded) }); const localCommands = createCommands(localStore); @@ -342,6 +345,7 @@ describe('commands', () => { // creating consent const encoded = encodeConsentData(tcModel); const localStore = new Store({ + cmpId: CMP_ID, consentData: decodeConsentData(encoded) }); const localCommands = createCommands(localStore); @@ -376,7 +380,9 @@ describe('commands', () => { let callbackExecuted, store, cmpManager, commands; beforeEach(() => { - store = new Store(); + store = new Store({ + cmpId: CMP_ID + }); cmpManager = new CmpManager(); commands = createCommands(store, cmpManager); callbackExecuted = false; diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 48261a49..0588b08b 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -3,9 +3,8 @@ import log from '../log'; import { TCString } from '@iabtcf/core'; import { padRight, - encodeVendorCookieValue, - decodeVendorCookieValue -} from './cookieutils'; + encodeVendorCookieValue +} from './cookieEncodeHelpers'; const arrayFrom = require('core-js/library/fn/array/from'); const CONSENT_COOKIE = 'adpconsent'; @@ -36,22 +35,22 @@ function decodeConsentData (encoded) { return decoded; } -function encodeConsentData (decoded) { +const encodeConsentData = (decoded) => { return TCString.encode(decoded); -} +}; -function readConsentCookie () { +const readConsentCookie = () => { const cookie = readCookie(CONSENT_COOKIE); log.debug('Read consent data from local cookie', cookie); return Promise.resolve(cookie && decodeConsentData(cookie)); -} +}; -function writeConsentCookie(encodedConsent) { +const writeConsentCookie = (encodedConsent) => { log.debug('Write consent data to local cookie'); return Promise.resolve(writeCookie(CONSENT_COOKIE, encodedConsent, CONSENT_COOKIE_MAX_AGE, '/')); -} +}; -function encodePurposeIdsToBits(selectedPurposeIds = new Set()) { +const encodePurposeIdsToBits = (selectedPurposeIds = new Set()) => { const maxPurposeId = Math.max(0, ...arrayFrom(selectedPurposeIds), MAX_PURPOSE_V1_ID); @@ -60,17 +59,17 @@ function encodePurposeIdsToBits(selectedPurposeIds = new Set()) { purposeString += (selectedPurposeIds.has(id) ? '1' : '0'); } return purposeString; -} +}; -function encodeVendorIdsToBits(maxVendorId, selectedVendorIds = new Set()) { +const encodeVendorIdsToBits = (maxVendorId, selectedVendorIds = new Set()) => { let vendorString = ''; for (let id = 1; id <= maxVendorId; id++) { vendorString += (selectedVendorIds.has(id) ? '1' : '0'); } return padRight(vendorString, Math.max(0, maxVendorId - vendorString.length)); -} +}; -function convertVendorsToRanges(maxVendorId, selectedIds) { +const convertVendorsToRanges = (maxVendorId, selectedIds) => { let range = []; const ranges = []; for (let id = 1; id <= maxVendorId; id++) { @@ -91,9 +90,9 @@ function convertVendorsToRanges(maxVendorId, selectedIds) { } } return ranges; -} +}; -function encodeVendorConsentData (vendorData) { +const encodeVendorConsentData = (vendorData) => { const { selectedPurposeIds, selectedVendorIds, maxVendorId } = vendorData; // Encode the data with and without ranges and return the smallest encoded payload @@ -117,81 +116,14 @@ function encodeVendorConsentData (vendorData) { }); return noRangesData.length < rangesData.length ? noRangesData : rangesData; -} - - -function decodeBitsToIds(bitString) { - return bitString.split('').reduce((acc, bit, index) => { - if (bit === '1') { - acc.add(index + 1); - } - return acc; - }, new Set()); -} - -function decodeVendorConsentData(cookieValue) { - const { - cookieVersion, - cmpId, - cmpVersion, - consentScreen, - consentLanguage, - vendorListVersion, - purposeIdBitString, - maxVendorId, - created, - lastUpdated, - isRange, - defaultConsent, - vendorIdBitString, - vendorRangeList - } = decodeVendorCookieValue(cookieValue); - - const cookieData = { - cookieVersion, - cmpId, - cmpVersion, - consentScreen, - consentLanguage, - vendorListVersion, - selectedPurposeIds: decodeBitsToIds(purposeIdBitString), - maxVendorId, - created, - lastUpdated - }; - - if (isRange) { - const idMap = vendorRangeList.reduce((acc, {isRange, startVendorId, endVendorId}) => { - const lastVendorId = isRange ? endVendorId : startVendorId; - for (let i = startVendorId; i <= lastVendorId; i++) { - acc[i] = true; - } - return acc; - }, {}); - - cookieData.selectedVendorIds = new Set(); - for (let i = 0; i <= maxVendorId; i++) { - if ((defaultConsent && !idMap[i]) || - (!defaultConsent && idMap[i])) { - cookieData.selectedVendorIds.add(i); - } - } - } - else { - cookieData.selectedVendorIds = decodeBitsToIds(vendorIdBitString); - } - - return cookieData; -} +}; export { - writeCookie, decodeConsentData, encodeConsentData, readConsentCookie, writeConsentCookie, encodeVendorConsentData, convertVendorsToRanges, - decodeVendorConsentData, CONSENT_COOKIE }; diff --git a/src/lib/cookie/cookie.test.js b/src/lib/cookie/cookie.test.js index d6b9ee93..1205795c 100644 --- a/src/lib/cookie/cookie.test.js +++ b/src/lib/cookie/cookie.test.js @@ -1,15 +1,12 @@ /* eslint-disable max-nested-callbacks */ - import { expect } from 'chai'; import { - writeCookie, decodeConsentData, encodeConsentData, writeConsentCookie, readConsentCookie, convertVendorsToRanges, encodeVendorConsentData, - decodeVendorConsentData, CONSENT_COOKIE } from './cookie'; import { @@ -23,24 +20,65 @@ import { VENDOR_LIST } from "../../../test/constants"; import { GVL, TCModel } from "@iabtcf/core"; -import Promise from "promise-polyfill"; +import {decodeVendorCookieValue, decodeBitsToIds, decodePublisherCookieValue} from "./cookieDecodeHelpers"; +import {encodePublisherCookieValue, encodeVendorCookieValue} from "./cookieEncodeHelpers"; -jest.mock('../portal'); -const mockPortal = require('../portal'); +function decodeVendorConsentData(cookieValue) { + const { + cookieVersion, + cmpId, + cmpVersion, + consentScreen, + consentLanguage, + vendorListVersion, + purposeIdBitString, + maxVendorId, + created, + lastUpdated, + isRange, + defaultConsent, + vendorIdBitString, + vendorRangeList + } = decodeVendorCookieValue(cookieValue); -describe('cookie', () => { - beforeEach(() => { - // Remove all cookies - const value = document.cookie.split(';'); - value.forEach(cookie => { - const parts = cookie.trim().split('='); - if (parts.length === 2) { - writeCookie(parts[0], '', 0); + const cookieData = { + cookieVersion, + cmpId, + cmpVersion, + consentScreen, + consentLanguage, + vendorListVersion, + selectedPurposeIds: decodeBitsToIds(purposeIdBitString), + maxVendorId, + created, + lastUpdated + }; + + if (isRange) { + const idMap = vendorRangeList.reduce((acc, {isRange, startVendorId, endVendorId}) => { + const lastVendorId = isRange ? endVendorId : startVendorId; + for (let i = startVendorId; i <= lastVendorId; i++) { + acc[i] = true; } - }); - mockPortal.sendPortalCommand = jest.fn().mockImplementation(() => Promise.resolve()); - }); + return acc; + }, {}); + cookieData.selectedVendorIds = new Set(); + for (let i = 0; i <= maxVendorId; i++) { + if ((defaultConsent && !idMap[i]) || + (!defaultConsent && idMap[i])) { + cookieData.selectedVendorIds.add(i); + } + } + } + else { + cookieData.selectedVendorIds = decodeBitsToIds(vendorIdBitString); + } + + return cookieData; +} + +describe('cookie', () => { it('encodes and decodes consent cookie object back to original value', (done) => { const tcModel = new TCModel(); tcModel.cmpId = 280; @@ -227,3 +265,129 @@ describe('cookie', () => { ]); }); }); + +describe('cookie common', () => { + it('encodes and decodes the vendor cookie value with ranges back to original value', () => { + + const aDate = new Date('2018-07-15 PDT'); + + const consentData = { + cookieVersion: 1, + created: aDate, + lastUpdated: aDate, + cmpId: 1, + cmpVersion: 1, + consentScreen: 1, + consentLanguage: 'EN', + vendorListVersion: 1, + purposeIdBitString: '111000001010101010001101', + maxVendorId: 5, + isRange: true, + defaultConsent: false, + numEntries: 2, + vendorRangeList: [ + { + isRange: true, + startVendorId: 2, + endVendorId: 4 + }, + { + isRange: false, + startVendorId: 1 + } + ] + }; + + const bitString = encodeVendorCookieValue(consentData); + const decoded = decodeVendorCookieValue(bitString); + + expect(decoded).to.deep.equal(consentData); + }); + + it('encodes and decodes the vendor cookie value with range ranges back to original value', () => { + + const aDate = new Date('2018-07-15 PDT'); + + const consentData = { + cookieVersion: 1, + created: aDate, + lastUpdated: aDate, + cmpId: 1, + cmpVersion: 1, + consentScreen: 1, + consentLanguage: 'EN', + vendorListVersion: 1, + purposeIdBitString: '111000001010101010001101', + maxVendorId: 5, + isRange: true, + defaultConsent: false, + numEntries: 2, + vendorRangeList: [ + { + isRange: false, + startVendorId: 2 + }, + { + isRange: false, + startVendorId: 1 + } + ] + }; + + const bitString = encodeVendorCookieValue(consentData); + const decoded = decodeVendorCookieValue(bitString); + + expect(decoded).to.deep.equal(consentData); + }); + + it('encodes and decodes the vendor cookie value without ranges back to original value', () => { + + const aDate = new Date('2018-07-15 PDT'); + + const consentData = { + cookieVersion: 1, + created: aDate, + lastUpdated: aDate, + cmpId: 1, + cmpVersion: 1, + consentScreen: 1, + consentLanguage: 'EN', + vendorListVersion: 1, + purposeIdBitString: '000000001010101010001100', + maxVendorId: 5, + isRange: false, + vendorIdBitString: '10011', + }; + + const bitString = encodeVendorCookieValue(consentData); + const decoded = decodeVendorCookieValue(bitString); + + expect(decoded).to.deep.equal(consentData); + }); + + + it('encodes and decodes the publisher cookie value without ranges back to original value', () => { + + const aDate = new Date('2018-07-15 PDT'); + + const consentData = { + cookieVersion: 1, + created: aDate, + lastUpdated: aDate, + cmpId: 1, + cmpVersion: 0, + consentScreen: 0, + consentLanguage: 'AA', + vendorListVersion: 1, + publisherPurposeVersion: 1, + numCustomPurposes: 4, + standardPurposeIdBitString: '000000001010101010001100', + customPurposeIdBitString: '1011', + }; + + const bitString = encodePublisherCookieValue(consentData); + const decoded = decodePublisherCookieValue(bitString); + + expect(decoded).to.deep.equal(consentData); + }); +}); diff --git a/src/lib/cookie/cookieDecodeHelpers.js b/src/lib/cookie/cookieDecodeHelpers.js new file mode 100644 index 00000000..a7a940de --- /dev/null +++ b/src/lib/cookie/cookieDecodeHelpers.js @@ -0,0 +1,168 @@ +import log from '../log'; +import { + NUM_BITS_VERSION, + vendorVersionMap, + publisherVersionMap +} from './definitions'; + +import { + padRight, + padLeft, SIX_BIT_ASCII_OFFSET, +} from "./cookieEncodeHelpers"; + +const decodeBitsToInt = (bitString, start, length) => parseInt(bitString.substr(start, length), 2); + +const decodeBitsToDate = (bitString, start, length) => new Date(decodeBitsToInt(bitString, start, length) * 100); + +const decodeBitsToBool = (bitString, start) => parseInt(bitString.substr(start, 1), 2) === 1; + +const decode6BitCharacters = (bitString, start, length) => { + let decoded = ''; + let decodeStart = start; + while (decodeStart < start + length) { + decoded += String.fromCharCode(SIX_BIT_ASCII_OFFSET + decodeBitsToInt(bitString, decodeStart, 6)); + decodeStart += 6; + } + return decoded; +}; + +const decodeField = ({ input, output, startPosition, field }) => { + const { type, numBits, decoder, validator, listCount } = field; + if (typeof validator === 'function') { + if (!validator(output)) { + // Not decoding this field so make sure we start parsing the next field at + // the same point + return {newPosition: startPosition}; + } + } + if (typeof decoder === 'function') { + return decoder(input, output, startPosition); + } + + const bitCount = typeof numBits === 'function' ? numBits(output) : numBits; + const listEntryCount = typeof listCount === 'function' ? + listCount(output) : typeof listCount === 'number' ? listCount : 0; + + switch (type) { + case 'int': + return { fieldValue: decodeBitsToInt(input, startPosition, bitCount) }; + case 'bool': + return { fieldValue: decodeBitsToBool(input, startPosition) }; + case 'date': + return { fieldValue: decodeBitsToDate(input, startPosition, bitCount) }; + case 'bits': + return { fieldValue: input.substr(startPosition, bitCount) }; + case '6bitchar': + return { fieldValue: decode6BitCharacters(input, startPosition, bitCount) }; + case 'list': + return new Array(listEntryCount).fill().reduce((acc) => { + const { decodedObject, newPosition } = decodeFields({ + input, + fields: field.fields, + startPosition: acc.newPosition + }); + return { + fieldValue: [...acc.fieldValue, decodedObject], + newPosition + }; + }, { fieldValue: [], newPosition: startPosition }); + default: + log.warn(`Cookie definition field found without decoder or type: ${name}`); + return {}; + } +}; + +const decodeFields = ({ input, fields, startPosition = 0 }) => { + let position = startPosition; + const decodedObject = fields.reduce((acc, field) => { + const { name, numBits } = field; + const { fieldValue, newPosition } = decodeField({ + input, + output: acc, + startPosition: position, + field + }); + if (fieldValue !== undefined) { + acc[name] = fieldValue; + } + if (newPosition !== undefined) { + position = newPosition; + } + else if (typeof numBits === 'number') { + position += numBits; + } + return acc; + }, {}); + return { + decodedObject, + newPosition: position + }; +}; + +/** + * Decode the (URL safe Base64) value of a cookie into an object. + */ +const decodeCookieValue = (cookieValue, definitionMap) => { + + // Replace safe characters + const unsafe = cookieValue + .replace(/-/g, '+') + .replace(/_/g, '/') + '=='.substring(0, (3 * cookieValue.length) % 4); + + const bytes = atob(unsafe); + + let inputBits = ''; + for (let i = 0; i < bytes.length; i++) { + const bitString = bytes.charCodeAt(i).toString(2); + inputBits += padLeft(bitString, 8 - bitString.length); + } + + return decodeCookieBitValue(inputBits, definitionMap); +}; + +const decodeCookieBitValue = (bitString, definitionMap) => { + const cookieVersion = decodeBitsToInt(bitString, 0, NUM_BITS_VERSION); + if (typeof cookieVersion !== 'number') { + log.error('Could not find cookieVersion to decode'); + return {}; + } + else if (!vendorVersionMap[cookieVersion]) { + log.error(`Could not find definition to decode cookie version ${cookieVersion}`); + return {}; + } + const cookieFields = definitionMap[cookieVersion].fields; + const { decodedObject } = decodeFields({ input: bitString, fields: cookieFields }); + return decodedObject; +}; + + +const decodeVendorCookieValue = (cookieValue) => { + return decodeCookieValue(cookieValue, vendorVersionMap); +}; + +const decodePublisherCookieValue = (cookieValue) => { + return decodeCookieValue(cookieValue, publisherVersionMap); +}; + +const decodeBitsToIds = (bitString) => { + return bitString.split('').reduce((acc, bit, index) => { + if (bit === '1') { + acc.add(index + 1); + } + return acc; + }, new Set()); +}; + +export { + padRight, + padLeft, + decodeBitsToInt, + decodeBitsToDate, + decodeBitsToBool, + decodeCookieValue, + decodeCookieBitValue, + decodeVendorCookieValue, + decodePublisherCookieValue, + decode6BitCharacters, + decodeBitsToIds, +}; diff --git a/src/lib/cookie/cookieDecodeHelpers.test.js b/src/lib/cookie/cookieDecodeHelpers.test.js new file mode 100644 index 00000000..d37d8435 --- /dev/null +++ b/src/lib/cookie/cookieDecodeHelpers.test.js @@ -0,0 +1,69 @@ +import { expect } from 'chai'; + +import { + decodeBitsToInt, + decodeBitsToDate, + decodeBitsToBool, + decodeVendorCookieValue, + decode6BitCharacters +} from './cookieDecodeHelpers'; + +import { + encodeIntToBits, + encodeDateToBits, + encodeBoolToBits, + encode6BitCharacters, +} from "./cookieEncodeHelpers"; + +describe('cookieutils', () => { + describe('decodeBitsToInt', () => { + it('decodes a bit string to original encoded value', () => { + const bitString = encodeIntToBits(123); + const decoded = decodeBitsToInt(bitString, 0, bitString.length); + expect(decoded).to.equal(123); + }); + }); + + describe('decodeBitsToDate', () => { + it('decodes a bit string to original encoded value', () => { + const now = new Date('2018-07-15 PDT'); + const bitString = encodeDateToBits(now); + const decoded = decodeBitsToDate(bitString, 0, bitString.length); + expect(decoded.getTime()).to.equal(now.getTime()); + }); + }); + + describe('decodeBitsToBool', () => { + it('decodes a bit string to original encoded "true" value', () => { + const bitString = encodeBoolToBits(true); + const decoded = decodeBitsToBool(bitString, 0, bitString.length); + expect(decoded).to.equal(true); + }); + it('decodes a bit string to original encoded "false" value', () => { + const bitString = encodeBoolToBits(false); + const decoded = decodeBitsToBool(bitString, 0, bitString.length); + expect(decoded).to.equal(false); + }); + }); + + describe('decode6BitCharacters', () => { + it('decodes a bit string to original encoded value', () => { + const string = 'STUFF'; + const bitString = encode6BitCharacters(string); + const decoded = decode6BitCharacters(bitString, 0, bitString.length); + expect(decoded).to.equal(string); + }); + it('decodes a bit string that is longer than length', () => { + const string = 'STUFF'; + const bitString = encode6BitCharacters(string); + const decoded = decode6BitCharacters(bitString, 0, 12); + expect(decoded).to.equal('ST'); + }); + }); + + it('fails to decode an invalid cookie version', () => { + const bitString = encodeIntToBits(999, 6); + const decoded = decodeVendorCookieValue(bitString); + expect(decoded).to.be.empty; + }); +}); diff --git a/src/lib/cookie/cookieEncodeHelpers.js b/src/lib/cookie/cookieEncodeHelpers.js new file mode 100644 index 00000000..be10a4ee --- /dev/null +++ b/src/lib/cookie/cookieEncodeHelpers.js @@ -0,0 +1,160 @@ +import {vendorVersionMap, publisherVersionMap} from "./definitions"; +import log from "../log"; + +const SIX_BIT_ASCII_OFFSET = 65; + +const repeat = (count, string='0') => { + let padString = ''; + for (let i = 0; i < count; i++) { + padString += string; + } + return padString; +}; + +const padRight = (string, padding) => string + repeat(Math.max(0, padding)); + +const padLeft = (string, padding) => repeat(Math.max(0, padding)) + string; + +const encodeIntToBits = (number, numBits) => { + let bitString = ''; + if (typeof number === 'number' && !isNaN(number)) { + bitString = parseInt(number, 10).toString(2); + } + + // Pad the string if not filling all bits + if (numBits >= bitString.length) { + bitString = padLeft(bitString, numBits - bitString.length); + } + + // Truncate the string if longer than the number of bits + if (bitString.length > numBits) { + bitString = bitString.substring(0, numBits); + } + return bitString; +}; + +/** + * Encodes each character of a string in 6 bits starting + * with [aA]=0 through [zZ]=25 + */ +const encode6BitCharacters = (string, numBits) => { + const encoded = typeof string !== 'string' ? '' : string.split('').map(char => { + const int = Math.max(0, char.toUpperCase().charCodeAt(0) - SIX_BIT_ASCII_OFFSET); + return encodeIntToBits(int > 25 ? 0 : int, 6); + }).join(''); + return padRight(encoded, numBits).substr(0, numBits); +}; + +const encodeBoolToBits = (value) => encodeIntToBits(value === true ? 1 : 0, 1); + +const encodeDateToBits = (date, numBits) => { + if (date instanceof Date) { + return encodeIntToBits(date.getTime() / 100, numBits); + } + return encodeIntToBits(date, numBits); +}; + +const encodeField = ({ input, field }) => { + const { name, type, numBits, encoder, validator } = field; + if (typeof validator === 'function') { + if (!validator(input)) { + return ''; + } + } + if (typeof encoder === 'function') { + return encoder(input); + } + + const bitCount = typeof numBits === 'function' ? numBits(input) : numBits; + + const inputValue = input[name]; + const fieldValue = inputValue === null || inputValue === undefined ? '' : inputValue; + switch (type) { + case 'int': + return encodeIntToBits(fieldValue, bitCount); + case 'bool': + return encodeBoolToBits(fieldValue); + case 'date': + return encodeDateToBits(fieldValue, bitCount); + case 'bits': + return padRight(fieldValue, bitCount - fieldValue.length).substring(0, bitCount); + case '6bitchar': + return encode6BitCharacters(fieldValue, bitCount); + case 'list': + return fieldValue.reduce((acc, listValue) => acc + encodeFields({ + input: listValue, + fields: field.fields + }), ''); + default: + log.warn(`Cookie definition field found without encoder or type: ${name}`); + return ''; + } +}; + +const encodeFields = ({ input, fields }) => { + return fields.reduce((acc, field) => { + acc += encodeField({ input, field }); + return acc; + }, ''); +}; + +/** + * Encode the data properties to a bit string. Encoding will encode + * either `selectedVendorIds` or the `vendorRangeList` depending on + * the value of the `isRange` flag. + */ +const encodeDataToBits = (data, definitionMap) => { + const { cookieVersion } = data; + + if (typeof cookieVersion !== 'number') { + log.error('Could not find cookieVersion to encode'); + } + else if (!definitionMap[cookieVersion]) { + log.error(`Could not find definition to encode cookie version ${cookieVersion}`); + } + else { + const cookieFields = definitionMap[cookieVersion].fields; + return encodeFields({ input: data, fields: cookieFields }); + } +}; + +/** + * Take all fields required to encode the cookie and produce the + * URL safe Base64 encoded value. + */ +const encodeCookieValue = (data, definitionMap) => { + const binaryValue = encodeDataToBits(data, definitionMap); + if (binaryValue) { + + // Pad length to multiple of 8 + const paddedBinaryValue = padRight(binaryValue, 7 - (binaryValue.length + 7) % 8); + + // Encode to bytes + let bytes = ''; + for (let i = 0; i < paddedBinaryValue.length; i += 8) { + bytes += String.fromCharCode(parseInt(paddedBinaryValue.substr(i, 8), 2)); + } + + // Make base64 string URL friendly + return btoa(bytes) + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=+$/, ''); + } +}; + +const encodeVendorCookieValue = (vendorData) => encodeCookieValue(vendorData, vendorVersionMap); + +const encodePublisherCookieValue = (publisherData) => encodeCookieValue(publisherData, publisherVersionMap); + +export { + padRight, + padLeft, + encodeVendorCookieValue, + encodePublisherCookieValue, + encodeIntToBits, + encodeBoolToBits, + encodeDateToBits, + encode6BitCharacters, + SIX_BIT_ASCII_OFFSET +}; diff --git a/src/lib/cookie/cookieEncodeHelpers.test.js b/src/lib/cookie/cookieEncodeHelpers.test.js new file mode 100644 index 00000000..b0ef7b2c --- /dev/null +++ b/src/lib/cookie/cookieEncodeHelpers.test.js @@ -0,0 +1,84 @@ +import { expect } from 'chai'; + +import { + encodeIntToBits, + encodeBoolToBits, + encodeDateToBits, + encode6BitCharacters, + encodeVendorCookieValue, +} from './cookieEncodeHelpers'; + +describe('cookieutils', () => { + describe('encodeIntToBits', () => { + it('encodes an integer to a bit string', () => { + const bitString = encodeIntToBits(123); + expect(bitString).to.equal('1111011'); + }); + it('encodes an integer to a bit string with padding', () => { + const bitString = encodeIntToBits(123, 12); + expect(bitString).to.equal('000001111011'); + }); + + }); + + describe('encodeBoolToBits', () => { + it('encodes a "true" boolean to a bit string', () => { + const bitString = encodeBoolToBits(true); + expect(bitString).to.equal('1'); + }); + it('encode a "false" boolean to a bit string', () => { + const bitString = encodeBoolToBits(false); + expect(bitString).to.equal('0'); + }); + }); + + describe('encodeDateToBits', () => { + it('encode a date to a bit string', () => { + const date = new Date(1512661975200); + const bitString = encodeDateToBits(date); + expect(bitString).to.equal('1110000101100111011110011001101000'); + }); + it('encode a date to a bit string with padding', () => { + const date = new Date(1512661975200); + const bitString = encodeDateToBits(date, 36); + expect(bitString).to.equal('001110000101100111011110011001101000'); + }); + }); + + describe('encode6BitCharacters', () => { + it('encode a 6bitchar string to a bit string', () => { + const bitString = encode6BitCharacters('hello'); + expect(bitString).to.equal('000111000100001011001011001110'); + }); + }); + + it('fails to encode a cookie version that does not exist', () => { + const aDate = new Date('2018-07-15 PDT'); + + const consentData = { + cookieVersion: 999, + created: aDate, + lastUpdated: aDate, + cmpId: 1, + vendorListVersion: 1, + }; + + const bitString = encodeVendorCookieValue(consentData); + expect(bitString).to.be.undefined; + }); + + it('fails to encode an invalid cookie version', () => { + const aDate = new Date('2018-07-15 PDT'); + + const consentData = { + cookieVersion: 'hello', + created: aDate, + lastUpdated: aDate, + cmpId: 1, + vendorListVersion: 1, + }; + + const bitString = encodeVendorCookieValue(consentData); + expect(bitString).to.be.undefined; + }); +}); diff --git a/src/lib/cookie/cookieutils.js b/src/lib/cookie/cookieutils.js deleted file mode 100644 index 86b5ecb7..00000000 --- a/src/lib/cookie/cookieutils.js +++ /dev/null @@ -1,325 +0,0 @@ -import log from '../log'; -import { - NUM_BITS_VERSION, - vendorVersionMap, - publisherVersionMap -} from './definitions'; - -const SIX_BIT_ASCII_OFFSET = 65; - -function repeat(count, string='0') { - let padString = ''; - for (let i = 0; i < count; i++) { - padString += string; - } - return padString; -} - -function padLeft(string, padding) { - return repeat(Math.max(0, padding)) + string; -} - -function padRight(string, padding) { - return string + repeat(Math.max(0, padding)); -} - -function encodeIntToBits(number, numBits) { - let bitString = ''; - if (typeof number === 'number' && !isNaN(number)) { - bitString = parseInt(number, 10).toString(2); - } - - // Pad the string if not filling all bits - if (numBits >= bitString.length) { - bitString = padLeft(bitString, numBits - bitString.length); - } - - // Truncate the string if longer than the number of bits - if (bitString.length > numBits) { - bitString = bitString.substring(0, numBits); - } - return bitString; -} - -/** - * Encodes each character of a string in 6 bits starting - * with [aA]=0 through [zZ]=25 - */ -function encode6BitCharacters(string, numBits) { - const encoded = typeof string !== 'string' ? '' : string.split('').map(char => { - const int = Math.max(0, char.toUpperCase().charCodeAt(0) - SIX_BIT_ASCII_OFFSET); - return encodeIntToBits(int > 25 ? 0 : int, 6); - }).join(''); - return padRight(encoded, numBits).substr(0, numBits); -} - -function encodeBoolToBits(value) { - return encodeIntToBits(value === true ? 1 : 0, 1); -} - -function encodeDateToBits(date, numBits) { - if (date instanceof Date) { - return encodeIntToBits(date.getTime() / 100, numBits); - } - return encodeIntToBits(date, numBits); -} - -function decodeBitsToInt(bitString, start, length) { - return parseInt(bitString.substr(start, length), 2); -} - -function decodeBitsToDate(bitString, start, length) { - return new Date(decodeBitsToInt(bitString, start, length) * 100); -} - -function decodeBitsToBool(bitString, start) { - return parseInt(bitString.substr(start, 1), 2) === 1; -} -function decode6BitCharacters(bitString, start, length) { - let decoded = ''; - let decodeStart = start; - while (decodeStart < start + length) { - decoded += String.fromCharCode(SIX_BIT_ASCII_OFFSET + decodeBitsToInt(bitString, decodeStart, 6)); - decodeStart += 6; - } - return decoded; -} - - -function encodeField({ input, field }) { - const { name, type, numBits, encoder, validator } = field; - if (typeof validator === 'function') { - if (!validator(input)) { - return ''; - } - } - if (typeof encoder === 'function') { - return encoder(input); - } - - const bitCount = typeof numBits === 'function' ? numBits(input) : numBits; - - const inputValue = input[name]; - const fieldValue = inputValue === null || inputValue === undefined ? '' : inputValue; - switch (type) { - case 'int': - return encodeIntToBits(fieldValue, bitCount); - case 'bool': - return encodeBoolToBits(fieldValue); - case 'date': - return encodeDateToBits(fieldValue, bitCount); - case 'bits': - return padRight(fieldValue, bitCount - fieldValue.length).substring(0, bitCount); - case '6bitchar': - return encode6BitCharacters(fieldValue, bitCount); - case 'list': - return fieldValue.reduce((acc, listValue) => acc + encodeFields({ - input: listValue, - fields: field.fields - }), ''); - default: - log.warn(`Cookie definition field found without encoder or type: ${name}`); - return ''; - } -} - -function encodeFields({ input, fields }) { - return fields.reduce((acc, field) => { - acc += encodeField({ input, field }); - return acc; - }, ''); -} - -function decodeField({ input, output, startPosition, field }) { - const { type, numBits, decoder, validator, listCount } = field; - if (typeof validator === 'function') { - if (!validator(output)) { - // Not decoding this field so make sure we start parsing the next field at - // the same point - return {newPosition: startPosition}; - } - } - if (typeof decoder === 'function') { - return decoder(input, output, startPosition); - } - - const bitCount = typeof numBits === 'function' ? numBits(output) : numBits; - const listEntryCount = typeof listCount === 'function' ? - listCount(output) : typeof listCount === 'number' ? listCount : 0; - - switch (type) { - case 'int': - return { fieldValue: decodeBitsToInt(input, startPosition, bitCount) }; - case 'bool': - return { fieldValue: decodeBitsToBool(input, startPosition) }; - case 'date': - return { fieldValue: decodeBitsToDate(input, startPosition, bitCount) }; - case 'bits': - return { fieldValue: input.substr(startPosition, bitCount) }; - case '6bitchar': - return { fieldValue: decode6BitCharacters(input, startPosition, bitCount) }; - case 'list': - return new Array(listEntryCount).fill().reduce((acc) => { - const { decodedObject, newPosition } = decodeFields({ - input, - fields: field.fields, - startPosition: acc.newPosition - }); - return { - fieldValue: [...acc.fieldValue, decodedObject], - newPosition - }; - }, { fieldValue: [], newPosition: startPosition }); - default: - log.warn(`Cookie definition field found without decoder or type: ${name}`); - return {}; - } -} - -function decodeFields({ input, fields, startPosition = 0 }) { - let position = startPosition; - const decodedObject = fields.reduce((acc, field) => { - const { name, numBits } = field; - const { fieldValue, newPosition } = decodeField({ - input, - output: acc, - startPosition: position, - field - }); - if (fieldValue !== undefined) { - acc[name] = fieldValue; - } - if (newPosition !== undefined) { - position = newPosition; - } - else if (typeof numBits === 'number') { - position += numBits; - } - return acc; - }, {}); - return { - decodedObject, - newPosition: position - }; -} - -/** - * Encode the data properties to a bit string. Encoding will encode - * either `selectedVendorIds` or the `vendorRangeList` depending on - * the value of the `isRange` flag. - */ -function encodeDataToBits(data, definitionMap) { - const { cookieVersion } = data; - - if (typeof cookieVersion !== 'number') { - log.error('Could not find cookieVersion to encode'); - } - else if (!definitionMap[cookieVersion]) { - log.error(`Could not find definition to encode cookie version ${cookieVersion}`); - } - else { - const cookieFields = definitionMap[cookieVersion].fields; - return encodeFields({ input: data, fields: cookieFields }); - } -} - -/** - * Take all fields required to encode the cookie and produce the - * URL safe Base64 encoded value. - */ -function encodeCookieValue(data, definitionMap) { - const binaryValue = encodeDataToBits(data, definitionMap); - if (binaryValue) { - - // Pad length to multiple of 8 - const paddedBinaryValue = padRight(binaryValue, 7 - (binaryValue.length + 7) % 8); - - // Encode to bytes - let bytes = ''; - for (let i = 0; i < paddedBinaryValue.length; i += 8) { - bytes += String.fromCharCode(parseInt(paddedBinaryValue.substr(i, 8), 2)); - } - - // Make base64 string URL friendly - return btoa(bytes) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=+$/, ''); - } -} - -function encodeVendorCookieValue(vendorData) { - return encodeCookieValue(vendorData, vendorVersionMap); -} - -function encodePublisherCookieValue(publisherData) { - return encodeCookieValue(publisherData, publisherVersionMap); -} - - -/** - * Decode the (URL safe Base64) value of a cookie into an object. - */ -function decodeCookieValue(cookieValue, definitionMap) { - - // Replace safe characters - const unsafe = cookieValue - .replace(/-/g, '+') - .replace(/_/g, '/') + '=='.substring(0, (3 * cookieValue.length) % 4); - - const bytes = atob(unsafe); - - let inputBits = ''; - for (let i = 0; i < bytes.length; i++) { - const bitString = bytes.charCodeAt(i).toString(2); - inputBits += padLeft(bitString, 8 - bitString.length); - } - - return decodeCookieBitValue(inputBits, definitionMap); -} - -function decodeCookieBitValue(bitString, definitionMap) { - const cookieVersion = decodeBitsToInt(bitString, 0, NUM_BITS_VERSION); - if (typeof cookieVersion !== 'number') { - log.error('Could not find cookieVersion to decode'); - return {}; - } - else if (!vendorVersionMap[cookieVersion]) { - log.error(`Could not find definition to decode cookie version ${cookieVersion}`); - return {}; - } - const cookieFields = definitionMap[cookieVersion].fields; - const { decodedObject } = decodeFields({ input: bitString, fields: cookieFields }); - return decodedObject; -} - - -function decodeVendorCookieValue(cookieValue) { - return decodeCookieValue(cookieValue, vendorVersionMap); -} - -function decodePublisherCookieValue(cookieValue) { - return decodeCookieValue(cookieValue, publisherVersionMap); -} - -export { - padRight, - padLeft, - encodeCookieValue, - encodeField, - encodeDataToBits, - encodeIntToBits, - encodeBoolToBits, - encodeDateToBits, - encode6BitCharacters, - decodeBitsToInt, - decodeBitsToDate, - decodeBitsToBool, - decodeCookieValue, - decodeCookieBitValue, - encodeVendorCookieValue, - decodeVendorCookieValue, - encodePublisherCookieValue, - decodePublisherCookieValue, - decode6BitCharacters -}; diff --git a/src/lib/cookie/cookieutils.test.js b/src/lib/cookie/cookieutils.test.js deleted file mode 100644 index dbb3e789..00000000 --- a/src/lib/cookie/cookieutils.test.js +++ /dev/null @@ -1,268 +0,0 @@ -import { expect } from 'chai'; - -import { - encodeIntToBits, - encodeBoolToBits, - encodeDateToBits, - encode6BitCharacters, - decodeBitsToInt, - decodeBitsToDate, - decodeBitsToBool, - encodeVendorCookieValue, - decodeVendorCookieValue, - encodePublisherCookieValue, - decodePublisherCookieValue, - decode6BitCharacters -} from './cookieutils'; - -describe('cookieutils', () => { - - describe('encodeIntToBits', () => { - it('encodes an integer to a bit string', () => { - const bitString = encodeIntToBits(123); - expect(bitString).to.equal('1111011'); - }); - it('encodes an integer to a bit string with padding', () => { - const bitString = encodeIntToBits(123, 12); - expect(bitString).to.equal('000001111011'); - }); - - }); - - describe('encodeBoolToBits', () => { - it('encodes a "true" boolean to a bit string', () => { - const bitString = encodeBoolToBits(true); - expect(bitString).to.equal('1'); - }); - it('encode a "false" boolean to a bit string', () => { - const bitString = encodeBoolToBits(false); - expect(bitString).to.equal('0'); - }); - }); - - describe('encodeDateToBits', () => { - it('encode a date to a bit string', () => { - const date = new Date(1512661975200); - const bitString = encodeDateToBits(date); - expect(bitString).to.equal('1110000101100111011110011001101000'); - }); - it('encode a date to a bit string with padding', () => { - const date = new Date(1512661975200); - const bitString = encodeDateToBits(date, 36); - expect(bitString).to.equal('001110000101100111011110011001101000'); - }); - }); - - describe('encode6BitCharacters', () => { - it('encode a 6bitchar string to a bit string', () => { - const bitString = encode6BitCharacters('hello'); - expect(bitString).to.equal('000111000100001011001011001110'); - }); - }); - - describe('decodeBitsToInt', () => { - it('decodes a bit string to original encoded value', () => { - const bitString = encodeIntToBits(123); - const decoded = decodeBitsToInt(bitString, 0, bitString.length); - expect(decoded).to.equal(123); - }); - }); - - describe('decodeBitsToDate', () => { - it('decodes a bit string to original encoded value', () => { - const now = new Date('2018-07-15 PDT'); - const bitString = encodeDateToBits(now); - const decoded = decodeBitsToDate(bitString, 0, bitString.length); - expect(decoded.getTime()).to.equal(now.getTime()); - }); - }); - - describe('decodeBitsToBool', () => { - it('decodes a bit string to original encoded "true" value', () => { - const bitString = encodeBoolToBits(true); - const decoded = decodeBitsToBool(bitString, 0, bitString.length); - expect(decoded).to.equal(true); - }); - it('decodes a bit string to original encoded "false" value', () => { - const bitString = encodeBoolToBits(false); - const decoded = decodeBitsToBool(bitString, 0, bitString.length); - expect(decoded).to.equal(false); - }); - }); - - describe('decode6BitCharacters', () => { - it('decodes a bit string to original encoded value', () => { - const string = 'STUFF'; - const bitString = encode6BitCharacters(string); - const decoded = decode6BitCharacters(bitString, 0, bitString.length); - expect(decoded).to.equal(string); - }); - it('decodes a bit string that is longer than length', () => { - const string = 'STUFF'; - const bitString = encode6BitCharacters(string); - const decoded = decode6BitCharacters(bitString, 0, 12); - expect(decoded).to.equal('ST'); - }); - }); - - - it('fails to encode a cookie version that does not exist', () => { - const aDate = new Date('2018-07-15 PDT'); - - const consentData = { - cookieVersion: 999, - created: aDate, - lastUpdated: aDate, - cmpId: 1, - vendorListVersion: 1, - }; - - const bitString = encodeVendorCookieValue(consentData); - expect(bitString).to.be.undefined; - }); - - it('fails to encode an invalid cookie version', () => { - const aDate = new Date('2018-07-15 PDT'); - - const consentData = { - cookieVersion: 'hello', - created: aDate, - lastUpdated: aDate, - cmpId: 1, - vendorListVersion: 1, - }; - - const bitString = encodeVendorCookieValue(consentData); - expect(bitString).to.be.undefined; - }); - - it('fails to decode an invalid cookie version', () => { - const bitString = encodeIntToBits(999, 6); - const decoded = decodeVendorCookieValue(bitString); - expect(decoded).to.be.empty; - }); - - it('encodes and decodes the vendor cookie value with ranges back to original value', () => { - - const aDate = new Date('2018-07-15 PDT'); - - const consentData = { - cookieVersion: 1, - created: aDate, - lastUpdated: aDate, - cmpId: 1, - cmpVersion: 1, - consentScreen: 1, - consentLanguage: 'EN', - vendorListVersion: 1, - purposeIdBitString: '111000001010101010001101', - maxVendorId: 5, - isRange: true, - defaultConsent: false, - numEntries: 2, - vendorRangeList: [ - { - isRange: true, - startVendorId: 2, - endVendorId: 4 - }, - { - isRange: false, - startVendorId: 1 - } - ] - }; - - const bitString = encodeVendorCookieValue(consentData); - const decoded = decodeVendorCookieValue(bitString); - - expect(decoded).to.deep.equal(consentData); - }); - - it('encodes and decodes the vendor cookie value with range ranges back to original value', () => { - - const aDate = new Date('2018-07-15 PDT'); - - const consentData = { - cookieVersion: 1, - created: aDate, - lastUpdated: aDate, - cmpId: 1, - cmpVersion: 1, - consentScreen: 1, - consentLanguage: 'EN', - vendorListVersion: 1, - purposeIdBitString: '111000001010101010001101', - maxVendorId: 5, - isRange: true, - defaultConsent: false, - numEntries: 2, - vendorRangeList: [ - { - isRange: false, - startVendorId: 2 - }, - { - isRange: false, - startVendorId: 1 - } - ] - }; - - const bitString = encodeVendorCookieValue(consentData); - const decoded = decodeVendorCookieValue(bitString); - - expect(decoded).to.deep.equal(consentData); - }); - - it('encodes and decodes the vendor cookie value without ranges back to original value', () => { - - const aDate = new Date('2018-07-15 PDT'); - - const consentData = { - cookieVersion: 1, - created: aDate, - lastUpdated: aDate, - cmpId: 1, - cmpVersion: 1, - consentScreen: 1, - consentLanguage: 'EN', - vendorListVersion: 1, - purposeIdBitString: '000000001010101010001100', - maxVendorId: 5, - isRange: false, - vendorIdBitString: '10011', - }; - - const bitString = encodeVendorCookieValue(consentData); - const decoded = decodeVendorCookieValue(bitString); - - expect(decoded).to.deep.equal(consentData); - }); - - - it('encodes and decodes the publisher cookie value without ranges back to original value', () => { - - const aDate = new Date('2018-07-15 PDT'); - - const consentData = { - cookieVersion: 1, - created: aDate, - lastUpdated: aDate, - cmpId: 1, - cmpVersion: 0, - consentScreen: 0, - consentLanguage: 'AA', - vendorListVersion: 1, - publisherPurposeVersion: 1, - numCustomPurposes: 4, - standardPurposeIdBitString: '000000001010101010001100', - customPurposeIdBitString: '1011', - }; - - const bitString = encodePublisherCookieValue(consentData); - const decoded = decodePublisherCookieValue(bitString); - - expect(decoded).to.deep.equal(consentData); - }); -}); diff --git a/src/lib/store.js b/src/lib/store.js index b03bd766..f65929a9 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -15,7 +15,7 @@ export const SECTION_VENDORS = 1; export default class Store { constructor({ - cmpId = 280, + cmpId, cmpVersion = 2, cookieVersion = 2, consentData @@ -255,10 +255,23 @@ export default class Store { this.storeUpdate(); }; - selectAllVendorLegitimateInterests = (isSelected) => { - const operation = isSelected ? 'setAllVendorLegitimateInterests' : 'unsetAllVendorLegitimateInterests'; - this.tcModel[operation](); - this.storeUpdate(); + selectAllVendorLegitimateInterests = (isSelected, update = true) => { + const {vendorLegitimateInterests} = this.tcModel; + const vendorsWithLegIntsIds = Object.keys(this.vendorList.vendors) + .filter(key => this.vendorList.vendors[key].legIntPurposes.length > 0) + .map(key => this.vendorList.vendors[key].id); + + vendorsWithLegIntsIds.forEach(id => { + if (isSelected) { + vendorLegitimateInterests.set(id); + } else { + vendorLegitimateInterests.unset(id); + } + }); + + if (update) { + this.storeUpdate(); + } }; initialVendorsRejection = () => { @@ -444,7 +457,7 @@ export default class Store { this.tcModel.purposeConsents.set(purposesIds); this.tcModel.purposeLegitimateInterests.set(purposesIds); this.tcModel.vendorConsents.set(vendorsIds); - this.tcModel.vendorLegitimateInterests.set(vendorsIds); + this.selectAllVendorLegitimateInterests(true, false); this.tcModel.specialFeatureOptins.set(specialFeatureIds); this.selectAllPublisherPurposes(true, false); this.selectAllPublisherLegitimateInterests(true, false); diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 56b04433..b757e4b1 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -15,6 +15,7 @@ import { SPECIAL_FEATURE_OPT_INS, VENDOR_LIST } from "../../test/constants"; +import {CMP_ID} from "./init"; use(datetime); @@ -30,7 +31,9 @@ describe('store', () => { }); it('initializes with default data', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); expect(store.isConsentToolShowing).to.equal(false); expect(store.tcModel.version).to.equal(2); @@ -38,7 +41,9 @@ describe('store', () => { }); it('initializes with vendorList', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -66,6 +71,7 @@ describe('store', () => { const encoded = encodeConsentData(tcModel); const store = new Store({ + cmpId: CMP_ID, consentData: decodeConsentData(encoded), }); @@ -110,6 +116,7 @@ describe('store', () => { const decoded = decodeConsentData(encoded); const store = new Store({ + cmpId: CMP_ID, consentData: decoded, }); @@ -143,6 +150,7 @@ describe('store', () => { const decoded = decodeConsentData(encoded); const store = new Store({ + cmpId: 280, consentData: decoded, }); @@ -172,7 +180,7 @@ describe('store', () => { it('selects vendor IDs', () => { const store = new Store({ - cmpApi + cmpId: CMP_ID, }); store.setCmpApi(cmpApi); @@ -189,7 +197,7 @@ describe('store', () => { it('selects ALL vendor IDs', () => { const store = new Store({ - cmpApi + cmpId: CMP_ID }); store.setCmpApi(cmpApi); @@ -205,7 +213,9 @@ describe('store', () => { }); it('selects purpose IDs', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -222,7 +232,9 @@ describe('store', () => { }); it('selects ALL purpose IDs', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -237,7 +249,9 @@ describe('store', () => { }); it('selects legitimate interests IDs', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -254,7 +268,9 @@ describe('store', () => { }); it('selects ALL legitimate interests IDs', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -269,7 +285,9 @@ describe('store', () => { }); it('selects special feature opt ins IDs', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -286,7 +304,9 @@ describe('store', () => { }); it('selects ALL special feature opt ins IDs', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -301,7 +321,9 @@ describe('store', () => { }); it('selects publisher purpose IDs', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -317,7 +339,9 @@ describe('store', () => { }); it('selects ALL publisher purpose IDs', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); store.updateVendorList(VENDOR_LIST); @@ -329,7 +353,9 @@ describe('store', () => { }); it('toggle the consent modal', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.setCmpApi(cmpApi); expect(store.isConsentToolShowing).to.be.false; store.toggleConsentToolShowing(); @@ -337,7 +363,9 @@ describe('store', () => { }); it('calls event listeners on update', (done) => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); store.subscribe(() => { done(); @@ -346,7 +374,9 @@ describe('store', () => { }); it('removes event listeners', () => { - const store = new Store(); + const store = new Store({ + cmpId: CMP_ID + }); const event = () => {}; store.subscribe(event); @@ -376,6 +406,7 @@ describe('store', () => { const encoded = encodeConsentData(tcModel); const store = new Store({ + cmpId: CMP_ID, consentData: decodeConsentData(encoded), }); diff --git a/webpack.config.babel.js b/webpack.config.babel.js index c28f3296..49e14afd 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -170,6 +170,7 @@ module.exports = [ { entry: { cmp: './index.js', + cookie: './lib/cookie/cookieDecodeHelpers.js', portal: './docs/assets/portal.js' }, From f7df7ff5fb68ab4ee7fce9ae3a2a5ccc18c9d19b Mon Sep 17 00:00:00 2001 From: apocentek Date: Fri, 20 Mar 2020 14:39:24 +0100 Subject: [PATCH 286/540] cleaning duplicates after method name change --- src/components/popup/details/details.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/popup/details/details.jsx b/src/components/popup/details/details.jsx index 99dc9f47..c8ff519b 100644 --- a/src/components/popup/details/details.jsx +++ b/src/components/popup/details/details.jsx @@ -82,7 +82,6 @@ export default class Details extends Component { selectPurpose, selectPurposeLegitimateInterests, selectSpecialFeatureOptins, - selectSpecialFeature, selectVendors, selectVendor, selectVendorLegitimateInterests, @@ -133,7 +132,6 @@ export default class Details extends Component { selectPurpose={selectPurpose} selectPurposeLegitimateInterests={selectPurposeLegitimateInterests} selectedPurposeLegitimateInterests={purposeLegitimateInterests} - selectSpecialFeature={selectSpecialFeature} selectSpecialFeatureOptins={selectSpecialFeatureOptins} initialVendorsRejection={initialVendorsRejection} selectPublisherPurpose={selectPublisherPurpose} From e4f6c86107f0d8f936b238fcb62914d3c33bf0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Fri, 20 Mar 2020 19:25:29 +0100 Subject: [PATCH 287/540] cmpManager tweaks + docs --- src/docs/assets/complete.html | 4 +- src/docs/components/docs/cmpApi.jsx | 119 +++++++++++------- src/docs/components/docs/configuration.jsx | 4 +- src/docs/components/docs/quickstart.jsx | 6 +- .../components/examples/basic/consentData.jsx | 6 +- .../examples/basic/customEventListeners.jsx | 33 +++++ .../examples/basic/eventListeners.jsx | 27 ++-- src/docs/components/examples/basic/ping.jsx | 2 +- .../examples/basic/publisherPurposes.jsx | 16 --- .../components/examples/basic/showConsent.jsx | 2 +- .../examples/basic/vendorConsents.jsx | 17 --- .../components/examples/basic/vendorList.jsx | 6 +- src/docs/components/examples/example.jsx | 2 +- src/docs/components/nav/nav.jsx | 16 ++- src/docs/components/tools/cookieEncoder.jsx | 2 +- src/docs/components/tools/iabToolRedirect.jsx | 18 +++ src/index.html | 38 +----- src/lib/cmpManager.js | 11 +- src/lib/config.js | 2 +- src/lib/cookie/cookieEncodeHelpers.js | 3 + src/lib/init.js | 5 +- 21 files changed, 184 insertions(+), 155 deletions(-) create mode 100644 src/docs/components/examples/basic/customEventListeners.jsx delete mode 100644 src/docs/components/examples/basic/publisherPurposes.jsx delete mode 100644 src/docs/components/examples/basic/vendorConsents.jsx create mode 100644 src/docs/components/tools/iabToolRedirect.jsx diff --git a/src/docs/assets/complete.html b/src/docs/assets/complete.html index 916cd7db..e69f1642 100644 --- a/src/docs/assets/complete.html +++ b/src/docs/assets/complete.html @@ -53,7 +53,7 @@
    GDPR Single Script Solution
    - +
    Console Output (debugging enabled):
    
    @@ -82,7 +82,7 @@
     	});
     
     
     
     
    diff --git a/src/docs/components/docs/cmpApi.jsx b/src/docs/components/docs/cmpApi.jsx
    index 6196252a..1a6b34ef 100644
    --- a/src/docs/components/docs/cmpApi.jsx
    +++ b/src/docs/components/docs/cmpApi.jsx
    @@ -4,55 +4,58 @@ import style from './docs.less';
     
     const commands = [
     	{
    -		command: 'getVendorConsents',
    -		parameter: {
    +		command: 'getTCData',
    +		parameters: [{
     			type: '[parameter] (Array)',
     			description: 'Array of vendor IDs. Omitting the parameter returns all vendor consents'
    -		},
    +		}],
     		callback: {
    -			resultType: 'result (Object)',
    +			resultType: 'result (Object, Boolean)',
     			resultDescription: 'Object containing consent data for vendor IDs requested'
     		}
     	},
     	{
    -		command: 'getPublisherConsents',
    -		parameter: {
    -			type: '[parameter]',
    -			description: '(ignored)'
    -		},
    +		command: 'getConsentObject',
    +		parameters: [{
    +			type: 'parameter (Object)',
    +			description: 'Object that contains established consents'
    +		}, {
    +			type: 'parameter (Object)',
    +			description: 'Valid vendor list'
    +		}],
     		callback: {
    -			resultType: 'result (Object)',
    -			resultDescription: 'Object containing all purpose consent data'
    +			resultType: 'result (Object, Boolean)',
    +			resultDescription: 'Object containing consent data for vendor IDs requested'
     		}
     	},
     	{
    -		command: 'getConsentData',
    -		parameter: {
    -			type: '[parameter]',
    -			description: '(ignored)'
    -		},
    +		command: 'getConsentFieldsV1',
    +		parameters: [{
    +			type: 'parameter (Object)',
    +			description: 'Object that contains established consents'
    +		}],
     		callback: {
    -			resultType: 'result (String)',
    -			resultDescription: 'Base64 encoded string containing all vendor consent data'
    +			resultType: 'result (Object, Boolean)',
    +			resultDescription: 'Object containing consent data in TCF v1.1 format'
     		}
     	},
     	{
     		command: 'getVendorList',
    -		parameter: {
    -			type: '[parameter]',
    -			description: '(ignored)'
    -		},
    +		parameters: [{
    +			type: 'int or string',
    +			description: 'vendorListVersion'
    +		}],
     		callback: {
    -			resultType: 'result (Object)',
    +			resultType: 'result (Object, Boolean)',
     			resultDescription: 'Object containing the entire vendor list of IDs and names'
     		}
     	},
     	{
     		command: 'showConsentTool',
    -		parameter: {
    +		parameters: [{
     			type: '[parameter]',
     			description: '(ignored)'
    -		},
    +		}],
     		callback: {
     			resultType: 'result (Boolean)',
     			resultDescription: 'true'
    @@ -60,10 +63,10 @@ const commands = [
     	},
     	{
     		command: 'showConsentDetailView',
    -		parameter: {
    +		parameters: [{
     			type: '[parameter]',
     			description: '(ignored)'
    -		},
    +		}],
     		callback: {
     			resultType: 'result (Boolean)',
     			resultDescription: 'true'
    @@ -71,10 +74,10 @@ const commands = [
     	},
     	{
     		command: 'showVendors',
    -		parameter: {
    +		parameters: [{
     			type: '[parameter]',
     			description: '(ignored)'
    -		},
    +		}],
     		callback: {
     			resultType: 'result (Boolean)',
     			resultDescription: 'true'
    @@ -82,10 +85,10 @@ const commands = [
     	},
         {
     		command: 'showFooter',
    -		parameter: {
    +		parameters: [{
     			type: '[parameter]',
     			description: '(ignored)'
    -		},
    +		}],
     		callback: {
     			resultType: 'result (Boolean)',
     			resultDescription: 'true'
    @@ -93,25 +96,49 @@ const commands = [
     	},
     	{
     		command: 'addEventListener',
    -		parameter: {
    -			type: 'parameter (String)',
    -			description: 'Name of the event to listen to'
    -		},
    +		parameters: [{
    +			type: 'parameter',
    +			description: '(ignored)'
    +		}],
     		callback: {
     			description: 'Function to execute when the event is fired',
    +			resultType: 'result (Object, Boolean)',
    +			resultDescription: 'Object containing the event name and any data the event may return'
    +		}
    +	},
    +	{
    +		command: 'registerEventListener',
    +		parameters: [{
    +			type: 'parameter (Object)',
    +			description: 'Object with \'event\' property'
    +		}],
    +		callback: {
    +			description: 'Callback function to remove as a listener',
     			resultType: 'result (Object)',
     			resultDescription: 'Object containing the event name and any data the event may return'
     		}
     	},
     	{
     		command: 'removeEventListener',
    -		parameter: {
    -			type: 'parameter (String)',
    -			description: 'Name of the event to listen to'
    +		parameters: [{
    +			type: 'parameter',
    +			description: '(ignored)'
    +		}],
    +		callback: {
    +			description: 'Callback function to remove as a listener',
    +			resultType: 'result (Object, Boolean)',
    +			resultDescription: 'Object containing the event name and any data the event may return'
     		},
    +	},
    +	{
    +		command: 'unregisterEventListener',
    +		parameters: [{
    +			type: 'parameter (Object)',
    +			description: 'Object with \'event\' property'
    +		}],
     		callback: {
     			description: 'Callback function to remove as a listener',
    -			resultType: 'result (Object)',
    +			resultType: 'result (Object, boolean)',
     			resultDescription: 'Object containing the event name and any data the event may return'
     		}
     	}
    @@ -146,29 +173,33 @@ export default class CmpApi extends Component {
     		return (
     			
    CMP API -
    __cmp(command, [parameter], [callback])
    +
    __tcfapi(command, 2, [callback], [parameter])
    Arguments command (String): Name of the command to execute - [parameter] (*): Parameter to be passed to the command function + [callback] (Function): Function to be executed with the result of the command - [callback] (Function): Function to be executed with the result of the command + [parameter] (*): Parameter to be passed to the command function
    Commands
    - {commands.map(({command, parameter, callback}) => ( + {commands.map(({command, parameters, callback}) => (
    {command}
    command: "{command}" - {parameter.type}: {parameter.description} + {parameters.map(parameter => ( +
    + {parameter.type}: {parameter.description} +
    + ))}
    [callback(result)]: {callback.description || 'Function to be executed with the result of the command'} diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 6d04295d..4461c320 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -5,8 +5,8 @@ import {js_beautify as beautify} from 'js-beautify'; const script = beautify(` -window.__cmp.config = { - globalVendorListLocation: 'https://vendorlist.consensu.org/vendorlist.json', +window.__tcfConfig = { + globalVendorListLocation: 'https://vendorlist.consensu.org/v2/vendor-list.json', globalConsentLocation: './portal.html', customPurposeListLocation: './purposes.json', storeConsentGlobally: true, diff --git a/src/docs/components/docs/quickstart.jsx b/src/docs/components/docs/quickstart.jsx index b7add576..861fe869 100644 --- a/src/docs/components/docs/quickstart.jsx +++ b/src/docs/components/docs/quickstart.jsx @@ -6,7 +6,7 @@ import Url from 'url'; import JSCode from 'codemirror/mode/htmlmixed/htmlmixed'; // eslint-disable-line no-unused-vars const {host, pathname} = window.location; -const SCRIPT_PATH = Url.resolve(`//${host}${pathname}`, '../cmp.complete.bundle.js'); +const SCRIPT_PATH = Url.resolve(`//${host}${pathname}`, '../cmp.bundle.js'); const basicInclude = ` @@ -19,7 +19,7 @@ const basicInclude = ` const enableLogging = ` - + @@ -28,7 +28,7 @@ const enableLogging = ` const manualShow = ` - + `.trim(); diff --git a/src/docs/components/examples/basic/consentData.jsx b/src/docs/components/examples/basic/consentData.jsx index 3dea9664..1f6b11eb 100644 --- a/src/docs/components/examples/basic/consentData.jsx +++ b/src/docs/components/examples/basic/consentData.jsx @@ -1,8 +1,10 @@ import Example from '../example'; const execute = -`window.__cmp('getConsentData', 'vendorConsents', function(result){ - myLogger('getConsentData callback result: ' + JSON.stringify(result,null,2)); +`window.__tcfapi('getTCData', 2, function (tcData, success) { + if (success) { + myLogger('getTCData callback result: ' + JSON.stringify(tcData)); + } });`; export default class ConsentData extends Example { diff --git a/src/docs/components/examples/basic/customEventListeners.jsx b/src/docs/components/examples/basic/customEventListeners.jsx new file mode 100644 index 00000000..a57c15d4 --- /dev/null +++ b/src/docs/components/examples/basic/customEventListeners.jsx @@ -0,0 +1,33 @@ +import Example from "../example"; + +const execute = +`myLogger('Add custom eventListener "isLoaded"'); +window.__tcfapi('registerEventListener', 2, function(result) { + myLogger('Event "isLoaded" called: ' + JSON.stringify(result)); +}, {event: 'isLoaded'}); + +myLogger('Add custom eventListener "cmpReady"'); +window.__tcfapi('registerEventListener', 2, function(result) { + myLogger('Event "cmpReady" called: ' + JSON.stringify(result)); +}, {event: 'cmpReady'}); + +myLogger('Add custom eventListener "openConsentTool"'); +window.__tcfapi('registerEventListener', 2, function(result) { + myLogger('Event "openConsentTool" called: ' + JSON.stringify(result)); +}, {event: 'openConsentTool'}); + +myLogger('Add custom eventListener "onSubmit"'); +window.__tcfapi('registerEventListener', 2, function(result) { + myLogger('Event "onSubmit" called: ' + JSON.stringify(result)); +}, {event: 'onSubmit'}); +`; + +export default class CustomEventListeners extends Example { + constructor(props) { + super(props); + this.state = { + title: 'Custom Event Listeners', + execute + }; + } +} diff --git a/src/docs/components/examples/basic/eventListeners.jsx b/src/docs/components/examples/basic/eventListeners.jsx index 19b845b6..2776ecb5 100644 --- a/src/docs/components/examples/basic/eventListeners.jsx +++ b/src/docs/components/examples/basic/eventListeners.jsx @@ -1,24 +1,11 @@ import Example from "../example"; -const setup = -`myLogger('Add eventListener "isLoaded"'); -window.__cmp('addEventListener', 'isLoaded', function(result){ - myLogger('Event "isLoaded" called: ' + JSON.stringify(result)); -}); - -myLogger('Add eventListener "cmpReady"'); -window.__cmp('addEventListener', 'cmpReady', function(result){ - myLogger('Event "cmpReady" called: ' + JSON.stringify(result)); -}); - -myLogger('Add eventListener "openConsentTool"'); -window.__cmp('addEventListener', 'openConsentTool', function(result){ - myLogger('Event "openConsentTool" called: ' + JSON.stringify(result)); -}); - -myLogger('Add eventListener "onSubmit"'); -window.__cmp('addEventListener', 'onSubmit', function(result){ - myLogger('Event "onSubmit" called: ' + JSON.stringify(result)); +const execute = +`myLogger('Add eventListener'); +window.__tcfapi('addEventListener', 2, function (tcData, success) { + if (success && tcData.eventStatus === 'tcloaded') { + myLogger('Event status is ' + JSON.stringify(tcData.eventStatus)); + } }); `; @@ -27,7 +14,7 @@ export default class EventListeners extends Example { super(props); this.state = { title: 'Event Listeners', - setup + execute }; } } diff --git a/src/docs/components/examples/basic/ping.jsx b/src/docs/components/examples/basic/ping.jsx index 7a44d32e..18cde6ca 100644 --- a/src/docs/components/examples/basic/ping.jsx +++ b/src/docs/components/examples/basic/ping.jsx @@ -1,7 +1,7 @@ import Example from '../example'; const execute = -`window.__cmp('ping', null, function(result){ +`window.__tcfapi('ping', 2, function(result){ myLogger('ping callback result: ' + JSON.stringify(result,null,2)); });`; diff --git a/src/docs/components/examples/basic/publisherPurposes.jsx b/src/docs/components/examples/basic/publisherPurposes.jsx deleted file mode 100644 index 5a1265f7..00000000 --- a/src/docs/components/examples/basic/publisherPurposes.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import Example from '../example'; - -const execute = -`window.__cmp('getPublisherConsents', null, function(result){ - myLogger('getPublisherConsents callback result:\\n' + JSON.stringify(result, null, 2)); -});`; - -export default class PublisherPurposes extends Example { - constructor(props) { - super(props); - this.state = { - title: 'Get Publisher Consents', - execute, - }; - } -} diff --git a/src/docs/components/examples/basic/showConsent.jsx b/src/docs/components/examples/basic/showConsent.jsx index 0aabbda8..15de5e28 100644 --- a/src/docs/components/examples/basic/showConsent.jsx +++ b/src/docs/components/examples/basic/showConsent.jsx @@ -1,7 +1,7 @@ import Example from '../example'; const execute = -`window.__cmp('showConsentTool', null, function(result){ +`window.__tcfapi('showConsentTool', 2, function(result){ myLogger('showConsentTool callback'); });`; diff --git a/src/docs/components/examples/basic/vendorConsents.jsx b/src/docs/components/examples/basic/vendorConsents.jsx deleted file mode 100644 index 927149ef..00000000 --- a/src/docs/components/examples/basic/vendorConsents.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import Example from "../example"; - -const execute = - `window.__cmp('getVendorConsents', [1,2,3,4], function(result){ - myLogger('getVendorConsents callback result:\\n' + JSON.stringify(result, null, 2)); -});`; - -export default class VendorConsents extends Example { - constructor(props) { - super(props); - this.state = { - title: 'Get Vendor Consents', - execute, - }; - } -} - diff --git a/src/docs/components/examples/basic/vendorList.jsx b/src/docs/components/examples/basic/vendorList.jsx index da91b609..788c990d 100644 --- a/src/docs/components/examples/basic/vendorList.jsx +++ b/src/docs/components/examples/basic/vendorList.jsx @@ -1,8 +1,10 @@ import Example from "../example"; const execute = - `window.__cmp('getVendorList', null, function(result){ - myLogger('getVendorList callback result:\\n' + JSON.stringify(result, null, 2)); + `window.__tcfapi('getVendorList', 2, function (result, success) { + if (success) { + myLogger('getVendorList callback result:\\n' + JSON.stringify(result, null, 2)); + } });`; export default class VendorList extends Example { diff --git a/src/docs/components/examples/example.jsx b/src/docs/components/examples/example.jsx index edbc0cfe..7ce8dc1a 100644 --- a/src/docs/components/examples/example.jsx +++ b/src/docs/components/examples/example.jsx @@ -42,7 +42,7 @@ export default class Example extends Component { componentWillMount() { // Always clear ALL event listeners before setting up the example - window.__cmp && window.__cmp('removeEventListener'); + window.__tcfapi && window.__tcfapi('unregisterEventListener', 2, function () {}, {event: undefined}); } componentDidMount() { diff --git a/src/docs/components/nav/nav.jsx b/src/docs/components/nav/nav.jsx index 8112158c..acc842f2 100644 --- a/src/docs/components/nav/nav.jsx +++ b/src/docs/components/nav/nav.jsx @@ -6,12 +6,11 @@ import Setup from '../docs/setup'; import CmpApi from '../docs/cmpApi'; import Ping from '../examples/basic/ping'; import EventListeners from '../examples/basic/eventListeners'; -import VendorConsents from '../examples/basic/vendorConsents'; +import CustomEventListeners from '../examples/basic/customEventListeners'; import ConsentData from '../examples/basic/consentData'; import ShowConsent from '../examples/basic/showConsent'; import IFrame from '../examples/iframe'; import VendorList from '../examples/basic/vendorList'; -import PublisherPurposes from '../examples/basic/publisherPurposes'; import RequireConsent from '../examples/advanced/requireConsent'; import InspectVendorConsent from '../examples/advanced/inspectVendorConsent'; import AdAfterConsent from '../examples/advanced/adAfterConsent'; @@ -23,6 +22,7 @@ import VendorListBuilder from '../tools/vendorListBuilder/vendorListBuilder'; import Intro from '../intro/intro'; import Configration from '../docs/configuration'; import QuickStart from '../docs/quickstart'; +import IabToolRedirect from '../tools/iabToolRedirect' export const navItems = [ { @@ -46,10 +46,9 @@ export const navItems = [ { to: '/basic/ping', title: 'Ping', component: Ping}, { to: '/basic/show', title: 'Show Consent Tool', component: ShowConsent}, { to: '/basic/events', title: 'Event Listeners', component: EventListeners}, - { to: '/basic/vendor', title: 'Get Vendor Consents', component: VendorConsents }, + { to: '/basic/custom-events', title: 'Custom Event Listeners', component: CustomEventListeners}, { to: '/basic/data', title: 'Get Consent Data', component: ConsentData }, { to: '/basic/list', title: 'Get Vendor List', component: VendorList }, - { to: '/basic/publisher', title: 'Get Publisher Consents', component: PublisherPurposes }, ] }, { @@ -70,7 +69,7 @@ export const navItems = [ ] }, { - title: 'Tools', + title: 'Tools (TCF v1.1)', items: [ {to: '/tools/vendor-list-builder', title: 'Vendor List Builder', component: VendorListBuilder}, {to: '/tools/vendor-cookie-encoder', title: 'Encode Vendor Cookie', component: VendorCookieEncoder}, @@ -78,6 +77,13 @@ export const navItems = [ {to: '/tools/publisher-cookie-encoder', title: 'Encode Publisher Cookie', component: PublisherCookieEncoder}, {to: '/tools/publisher-cookie-decoder', title: 'Decode Publisher Cookie', component: PublisherCookieDecoder} ] + }, + { + title: 'Tools (TCF v2.0)', + items: [ + {to: '/tools/v2/encode', title: 'Encode Consent Cookie ', component: () => }, + {to: '/tools/v2/decode', title: 'Decode Consent Cookie ', component: () => }, + ] } ]; diff --git a/src/docs/components/tools/cookieEncoder.jsx b/src/docs/components/tools/cookieEncoder.jsx index 116147d9..86b3c366 100644 --- a/src/docs/components/tools/cookieEncoder.jsx +++ b/src/docs/components/tools/cookieEncoder.jsx @@ -7,7 +7,7 @@ import { encodeField, encodeDataToBits, encodeCookieValue -} from '../../../lib/cookie/cookieDecodeHelpers'; +} from '../../../lib/cookie/cookieEncodeHelpers'; export default class CookieEncoder extends Component { diff --git a/src/docs/components/tools/iabToolRedirect.jsx b/src/docs/components/tools/iabToolRedirect.jsx new file mode 100644 index 00000000..2b4c2e4b --- /dev/null +++ b/src/docs/components/tools/iabToolRedirect.jsx @@ -0,0 +1,18 @@ +import { h } from 'preact'; +import style from '../intro/intro.less'; + +const IabToolRedirect = (props) => { + return ( +
    +

    {props.encode ? "Encode consent cookie" : "Decode consent cookie"}

    +

    + {props.encode ? ( + Click here + ) : ( + Click here + )} +

    +
    ); +}; + +export default IabToolRedirect; diff --git a/src/index.html b/src/index.html index 9cb4da20..75a83c62 100644 --- a/src/index.html +++ b/src/index.html @@ -6,41 +6,9 @@ diff --git a/src/lib/cmpManager.js b/src/lib/cmpManager.js index cf219214..9403db3d 100644 --- a/src/lib/cmpManager.js +++ b/src/lib/cmpManager.js @@ -4,6 +4,7 @@ export default class CmpManager { constructor () { this.isLoaded = false; this.cmpReady = false; + this.openConsentTool = false; this.eventListeners = {}; } @@ -48,6 +49,9 @@ export default class CmpManager { if (event === 'cmpReady' && this.cmpReady) { callback({event}); } + if (event === 'openConsentTool' && this.openConsentTool) { + callback({event}); + } }; /** @@ -59,7 +63,12 @@ export default class CmpManager { log.info(`Notify event: ${event}`); const eventSet = this.eventListeners[event] || new Set(); eventSet.forEach(listener => { - listener({event, data}); + try { + listener({event, data}); + } catch (err) { + log.error(err); + } }); + }; } diff --git a/src/lib/config.js b/src/lib/config.js index f6ddc08a..6cf8a9e1 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -2,7 +2,7 @@ import log from './log'; const defaultConfig = { customPurposeListLocation: './purposes.json', - globalVendorListLocation: 'https://vendorlist.consensu.org/vendorlist.json', + globalVendorListLocation: 'https://vendorlist.consensu.org/v2/vendor-list.json', globalConsentLocation: './portal.html', storeConsentGlobally: false, storePublisherData: false, diff --git a/src/lib/cookie/cookieEncodeHelpers.js b/src/lib/cookie/cookieEncodeHelpers.js index be10a4ee..1c8907c2 100644 --- a/src/lib/cookie/cookieEncodeHelpers.js +++ b/src/lib/cookie/cookieEncodeHelpers.js @@ -156,5 +156,8 @@ export { encodeBoolToBits, encodeDateToBits, encode6BitCharacters, + encodeField, + encodeDataToBits, + encodeCookieValue, SIX_BIT_ASCII_OFFSET }; diff --git a/src/lib/init.js b/src/lib/init.js index 254be274..cf00f44b 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -50,7 +50,10 @@ export function init (configUpdates) { const cmpManager = new CmpManager(); const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, cmpManager)); - config.decoratePageCallHandler(cmpApi); + + if (config.decoratePageCallHandler) { + config.decoratePageCallHandler(cmpApi); + } store.setCmpApi(cmpApi); From 5f96c96eab1d66c364b30f44e623f2f0b2cebad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 23 Mar 2020 14:47:36 +0100 Subject: [PATCH 288/540] version update - not assigning tcModel to cmpApi directly - use update function instead --- package-lock.json | 15863 ---------------------------------------- package.json | 4 +- src/lib/config.js | 2 - src/lib/init.js | 1 - src/lib/store.js | 5 +- src/lib/store.test.js | 1 + 6 files changed, 5 insertions(+), 15871 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index daa5a936..00000000 --- a/package-lock.json +++ /dev/null @@ -1,15863 +0,0 @@ -{ - "name": "appnexus-cmp", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", - "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", - "dev": true, - "requires": { - "@babel/highlight": "7.0.0-beta.44" - } - }, - "@babel/generator": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", - "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44", - "jsesc": "^2.5.1", - "lodash": "^4.2.0", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", - "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.44", - "@babel/template": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", - "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", - "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", - "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "@babel/runtime": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", - "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", - "requires": { - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "@babel/runtime-corejs3": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.7.tgz", - "integrity": "sha512-sc7A+H4I8kTd7S61dgB9RomXu/C+F4IrRr4Ytze4dnfx7AXEpCrejSNpjx7vq6y/Bak9S6Kbk65a/WgMLtg43Q==", - "dev": true, - "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - } - } - }, - "@babel/template": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", - "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - } - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", - "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/generator": "7.0.0-beta.44", - "@babel/helper-function-name": "7.0.0-beta.44", - "@babel/helper-split-export-declaration": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", - "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@iabtcf/cmpapi": { - "version": "1.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.20.tgz", - "integrity": "sha512-9mAk1CuZJb4rNO2QfyYx9YonvN68nL2rzGTB4r0JOKK3SxtiZYkOG7eB2ZjLEgZGYk6HwyGuhOmvdN3J5BeTtg==", - "requires": { - "@iabtcf/core": "1.0.0-beta.20" - } - }, - "@iabtcf/core": { - "version": "1.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.20.tgz", - "integrity": "sha512-V5UVVgKSrtbm4uOvzfcXkHzPxMasEVJiJxze4sMr+4Tx/Qt1k0gGhLcGnkFL74rnhZkZF/FQ5NAcWKojnHl7ow==" - }, - "@sinonjs/commons": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", - "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/formatio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", - "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", - "dev": true, - "requires": { - "samsam": "1.3.0" - } - }, - "@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "dependencies": { - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } - } - } - }, - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "^4.0.3" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "^2.0.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "arch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", - "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" - }, - "arg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-2.0.0.tgz", - "integrity": "sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "args": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/args/-/args-4.0.0.tgz", - "integrity": "sha512-4b7lVF58nlo7sNtq8s2OueroOY/UHn0Nt/NVjsx9zn28u6yDVb9bQ/uy/5jKtHCbUDil4MlMyDLF5+OHEgnTug==", - "requires": { - "camelcase": "5.0.0", - "chalk": "2.3.2", - "leven": "2.1.0", - "mri": "1.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", - "dev": true, - "requires": { - "browserslist": "^2.11.3", - "caniuse-lite": "^1.0.30000805", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.17", - "postcss-value-parser": "^3.2.3" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true - }, - "babel": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz", - "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", - "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/traverse": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", - "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", - "dev": true, - "requires": { - "babel-plugin-istanbul": "^4.1.5", - "babel-preset-jest": "^22.4.4" - } - }, - "babel-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" - } - }, - "babel-plugin-jest-hoist": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", - "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", - "dev": true - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-do-expressions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", - "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", - "dev": true - }, - "babel-plugin-syntax-function-bind": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", - "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true, - "requires": { - "babel-plugin-syntax-class-constructor-call": "^6.18.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-decorators-legacy": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", - "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", - "dev": true, - "requires": { - "babel-plugin-syntax-decorators": "^6.1.18", - "babel-runtime": "^6.2.0", - "babel-template": "^6.3.0" - } - }, - "babel-plugin-transform-do-expressions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", - "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", - "dev": true, - "requires": { - "babel-plugin-syntax-do-expressions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true, - "requires": { - "babel-plugin-syntax-export-extensions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-function-bind": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", - "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", - "dev": true, - "requires": { - "babel-plugin-syntax-function-bind": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-assign": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz", - "integrity": "sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", - "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^22.4.4", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" - } - }, - "babel-preset-stage-0": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", - "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", - "dev": true, - "requires": { - "babel-plugin-transform-do-expressions": "^6.22.0", - "babel-plugin-transform-function-bind": "^6.22.0", - "babel-preset-stage-1": "^6.24.1" - } - }, - "babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true, - "requires": { - "babel-plugin-transform-class-constructor-call": "^6.24.1", - "babel-plugin-transform-export-extensions": "^6.22.0", - "babel-preset-stage-2": "^6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "basic-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", - "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "dev": true, - "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } - } - }, - "caniuse-db": { - "version": "1.0.30001035", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001035.tgz", - "integrity": "sha512-kLUON4XN3tq5Nwl7ZICDw+7/vMynSpRMVYDRkzLL31lgnpa6M2YXYdjst3h+xbzjMgdcveRTnRGE1h/1IcKK6A==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001035", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", - "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", - "dev": true - }, - "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", - "dev": true, - "requires": { - "rsvp": "^3.3.3" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chai-datetime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/chai-datetime/-/chai-datetime-1.5.0.tgz", - "integrity": "sha1-N0LxiwJMdbdqK37uKRZiMkRnWWw=", - "dev": true, - "requires": { - "chai": ">1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dev": true, - "requires": { - "chalk": "^1.1.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "clipboardy": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", - "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", - "requires": { - "arch": "^2.1.0", - "execa": "^0.8.0" - }, - "dependencies": { - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "requires": { - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codemirror": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.52.0.tgz", - "integrity": "sha512-K2UB6zjscrfME03HeRe/IuOmCeqNpw7PLKGHThYpLbZEuKf+ZoujJPhxZN4hHJS1O7QyzEsV7JJZGxuQWVaFCg==" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "dev": true, - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", - "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } - } - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" - }, - "core-js-pure": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", - "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-env": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", - "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.5" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-loader": { - "version": "0.28.11", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", - "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": "^3.10.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.1.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dargs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", - "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "detect-port": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.2.3.tgz", - "integrity": "sha512-IDbrX6PxqnYy8jV4wSHBaJlErYKTJvW8OQb9F7xivl1iQLqiUYHGa+nZ61Do6+N5uuOn/pReXKNqI9rUn04vug==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.378", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.378.tgz", - "integrity": "sha512-nBp/AfhaVIOnfwgL1CZxt80IcqWcyYXiX6v5gflAksxy+SzBVz7A7UWR1Nos92c9ofXW74V9PoapzRb0jJfYXw==", - "dev": true - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" - } - }, - "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "eslint-plugin-jest": { - "version": "21.27.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.27.2.tgz", - "integrity": "sha512-0E4OIgBJVlAmf1KfYFtZ3gYxgUzC5Eb3Jzmrc9ikI1OY+/cM8Kh72Ti7KfpeHNeD3HJNf9SmEfmvQLIz44Hrhw==", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", - "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.15.1", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.2", - "xregexp": "^4.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, - "requires": { - "original": ">=0.0.5" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "expect": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", - "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^22.4.3", - "jest-get-type": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-regex-util": "^22.4.3" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", - "dev": true, - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } - } - } - } - }, - "html-webpack-inline-source-plugin": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/html-webpack-inline-source-plugin/-/html-webpack-inline-source-plugin-0.0.10.tgz", - "integrity": "sha512-0ZNU57u7283vrXSF5a4VDnVOMWiSwypKIp1z/XfXWoVHLA1r3Xmyxx5+Lz+mnthz/UvxL1OAf41w5UIF68Jngw==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "slash": "^1.0.0", - "source-map-url": "^0.4.0" - } - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "dev": true, - "requires": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dev": true, - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "immutability-helper": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-2.9.1.tgz", - "integrity": "sha512-r/RmRG8xO06s/k+PIaif2r5rGc3j4Yhc01jSBfwPCXDLYZwp/yxralI37Df1mwmuzcCsen/E/ITKcTEvc1PQmQ==", - "requires": { - "invariant": "^2.2.0" - } - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "dev": true, - "requires": { - "meow": "^3.3.0" - } - }, - "internal-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", - "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", - "dev": true, - "requires": { - "es-abstract": "^1.17.0-next.1", - "has": "^1.0.3", - "side-channel": "^1.0.2" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "dev": true, - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - } - } - }, - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", - "dev": true, - "requires": { - "handlebars": "^4.0.3" - } - }, - "jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", - "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", - "dev": true, - "requires": { - "import-local": "^1.0.0", - "jest-cli": "^22.4.4" - }, - "dependencies": { - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "jest-cli": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", - "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.14", - "istanbul-lib-coverage": "^1.1.1", - "istanbul-lib-instrument": "^1.8.0", - "istanbul-lib-source-maps": "^1.2.1", - "jest-changed-files": "^22.2.0", - "jest-config": "^22.4.4", - "jest-environment-jsdom": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^22.4.2", - "jest-message-util": "^22.4.0", - "jest-regex-util": "^22.1.0", - "jest-resolve-dependencies": "^22.1.0", - "jest-runner": "^22.4.4", - "jest-runtime": "^22.4.4", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "jest-worker": "^22.2.2", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^10.0.3" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" - } - } - } - }, - "jest-changed-files": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", - "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", - "dev": true, - "requires": { - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", - "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^22.4.1", - "jest-environment-node": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^22.4.4", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "pretty-format": "^22.4.0" - }, - "dependencies": { - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } - } - }, - "jest-diff": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", - "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" - }, - "dependencies": { - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } - } - }, - "jest-docblock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", - "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-environment-jsdom": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", - "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", - "dev": true, - "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", - "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", - "dev": true, - "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "jest-haste-map": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", - "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", - "dev": true, - "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^22.4.3", - "jest-serializer": "^22.4.3", - "jest-worker": "^22.4.3", - "micromatch": "^2.3.11", - "sane": "^2.0.0" - } - }, - "jest-jasmine2": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", - "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^22.4.0", - "graceful-fs": "^4.1.11", - "is-generator-fn": "^1.0.0", - "jest-diff": "^22.4.0", - "jest-matcher-utils": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "source-map-support": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "jest-leak-detector": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", - "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", - "dev": true, - "requires": { - "pretty-format": "^22.4.3" - }, - "dependencies": { - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } - } - }, - "jest-matcher-utils": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", - "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" - }, - "dependencies": { - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } - } - }, - "jest-message-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", - "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", - "dev": true - }, - "jest-regex-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", - "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", - "dev": true - }, - "jest-resolve": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", - "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", - "dev": true, - "requires": { - "browser-resolve": "^1.11.2", - "chalk": "^2.0.1" - } - }, - "jest-resolve-dependencies": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", - "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", - "dev": true, - "requires": { - "jest-regex-util": "^22.4.3" - } - }, - "jest-runner": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", - "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", - "dev": true, - "requires": { - "exit": "^0.1.2", - "jest-config": "^22.4.4", - "jest-docblock": "^22.4.0", - "jest-haste-map": "^22.4.2", - "jest-jasmine2": "^22.4.4", - "jest-leak-detector": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-runtime": "^22.4.4", - "jest-util": "^22.4.1", - "jest-worker": "^22.2.2", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", - "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", - "dev": true, - "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^22.4.4", - "babel-plugin-istanbul": "^4.1.5", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^22.4.4", - "jest-haste-map": "^22.4.2", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^10.0.3" - }, - "dependencies": { - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" - } - } - } - }, - "jest-serializer": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", - "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", - "dev": true - }, - "jest-snapshot": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", - "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^22.4.3" - }, - "dependencies": { - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } - } - }, - "jest-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", - "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", - "dev": true, - "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^22.4.3", - "mkdirp": "^0.5.1", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "jest-validate": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", - "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-config": "^22.4.4", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^22.4.0" - }, - "dependencies": { - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - } - } - }, - "jest-worker": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", - "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", - "dev": true, - "requires": { - "merge-stream": "^1.0.1" - } - }, - "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", - "dev": true - }, - "js-beautify": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.3.tgz", - "integrity": "sha512-wfk/IAWobz1TfApSdivH5PJ0miIHgDoYb1ugSqHcODPmaYu46rYe5FVuIEkhjg8IQiv6rDNPyhsqbsohI/C2vQ==", - "requires": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "~0.5.1", - "nopt": "~4.0.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "just-extend": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "less": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", - "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - } - } - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", - "dev": true - }, - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-expression-evaluator": { - "version": "1.2.22", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz", - "integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==", - "dev": true - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micro": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.1.tgz", - "integrity": "sha512-83uimpPJqfwkfKvJl2WWontBlV3hmzrIgyJ+L2uhDXKNk7Ll+/ezK3zBz7TljubpKPqjM0JdT2Ker4MTPmhjgA==", - "requires": { - "arg": "2.0.0", - "chalk": "2.4.0", - "content-type": "1.0.4", - "is-stream": "1.1.0", - "raw-body": "2.3.2" - }, - "dependencies": { - "chalk": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", - "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "micro-compress": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micro-compress/-/micro-compress-1.0.0.tgz", - "integrity": "sha1-U/WoC0rQMgyhZaVZtuPfFF1PcE8=", - "requires": { - "compression": "^1.6.2" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "requires": { - "mime-db": "~1.33.0" - }, - "dependencies": { - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "mri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz", - "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - } - } - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "node-version": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.1.3.tgz", - "integrity": "sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg==" - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - }, - "dependencies": { - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "openssl-self-signed-certificate": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/openssl-self-signed-certificate/-/openssl-self-signed-certificate-1.1.6.tgz", - "integrity": "sha1-nTpHdrGlfphHNQOSEUrS+RWoPdQ=" - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" - } - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true, - "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "dev": true, - "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "dev": true, - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true, - "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true, - "requires": { - "postcss": "^5.0.16" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", - "dev": true, - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", - "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^0.4.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dev": true, - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dev": true, - "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dev": true, - "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "dev": true, - "requires": { - "postcss": "^5.0.5" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "dev": true, - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "dev": true, - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "dev": true, - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "dev": true, - "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "preact": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-8.5.3.tgz", - "integrity": "sha512-O3kKP+1YdgqHOFsZF2a9JVdtqD+RPzCQc3rP+Ualf7V6rmRDchZ9MJbiGTT7LuyqFKZqlHSOyO/oMFmI2lVTsw==" - }, - "preact-compat": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/preact-compat/-/preact-compat-3.19.0.tgz", - "integrity": "sha512-f83A4hIhH8Uzhb9GbIcGk8SM19ffWlwP9mDaYwQdRnMdekZwcCA7eIAbeV4EMQaV9C0Yuy8iKgBAtyTKPZQt/Q==", - "requires": { - "immutability-helper": "^2.7.1", - "preact-context": "^1.1.3", - "preact-render-to-string": "^3.8.2", - "preact-transition-group": "^1.1.1", - "prop-types": "^15.6.2", - "standalone-react-addons-pure-render-mixin": "^0.1.1" - } - }, - "preact-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/preact-context/-/preact-context-1.1.4.tgz", - "integrity": "sha512-gcCjPJ65R0MiW9hDu8W/3WAmyTElIvwLyEO6oLQiM6/TbLKLxCpBCWV8GJjx52TTEyUr60HLDcmoCXZlslelzQ==" - }, - "preact-jsx-chai": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/preact-jsx-chai/-/preact-jsx-chai-2.3.2.tgz", - "integrity": "sha512-LIvtYOUgC7bdXnylosrRYM//06lsdIvnfmkM3vz6rzCSTMzIU30//9s/jQndA2/XxlQJxkR/H2VNYhLX9zRSiw==", - "dev": true, - "requires": { - "preact-render-to-string": "^4.1.0" - }, - "dependencies": { - "preact-render-to-string": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-4.1.0.tgz", - "integrity": "sha512-FlFBJRxo8z4cp6VsDmeYjIEx4ZK2clFJnKIvIj8K1IQCRm7ZgJ/SZ1+BotT86/Nc+V1pNtFabHoUi6gpjx5Pug==", - "dev": true, - "requires": { - "pretty-format": "^3.8.0" - } - } - } - }, - "preact-render-to-string": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-3.8.2.tgz", - "integrity": "sha512-przuZPajiurStGgxMoJP0EJeC4xj5CgHv+M7GfF3YxAdhGgEWAkhOSE0xympAFN20uMayntBZpttIZqqLl77fw==", - "requires": { - "pretty-format": "^3.5.1" - } - }, - "preact-transition-group": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/preact-transition-group/-/preact-transition-group-1.1.1.tgz", - "integrity": "sha1-8KSTJ+pRXs406ivoZMSn0p5dbhA=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", - "integrity": "sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U=" - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-polyfill": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", - "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==" - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "proptypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proptypes/-/proptypes-1.1.0.tgz", - "integrity": "sha1-eLOCilqmuxMIk54N48YETf1L0jk=" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "raw-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", - "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react-codemirror2": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-4.3.0.tgz", - "integrity": "sha512-tC0n9CHgrQYc976pUlKOaVJYEHAAYTVMers04gNy6jbkFf4rbPlw72y7bbOAfkHHvu6COG5S629Fek30bvHe8w==" - }, - "react-is": { - "version": "16.13.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", - "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==" - }, - "react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.1", - "warning": "^4.0.1" - } - }, - "react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "requires": { - "history": "^4.7.2", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.1", - "react-router": "^4.3.1", - "warning": "^4.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "reduce-function-call": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", - "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "^1.0.1" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-bundle-webpack-plugin": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-bundle-webpack-plugin/-/replace-bundle-webpack-plugin-1.0.0.tgz", - "integrity": "sha1-VugfcOGm609T9TwSUi3xxvEhllg=", - "dev": true, - "requires": { - "webpack-core": "^0.6.8" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true - }, - "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true - }, - "sane": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", - "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - }, - "script-ext-html-webpack-plugin": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/script-ext-html-webpack-plugin/-/script-ext-html-webpack-plugin-1.8.8.tgz", - "integrity": "sha512-9mxSrvfX8on97tu4pUfLXQ9StKGxfHKSy3NXsYBi+4EpyhI4oUUhE3KEWUViDiTQHmY7u2ztLT5OfOjQRzmJaQ==", - "dev": true, - "requires": { - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } - } - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - }, - "serve": { - "version": "6.5.8", - "resolved": "https://registry.npmjs.org/serve/-/serve-6.5.8.tgz", - "integrity": "sha512-GZYlJz7f6E7Xq6xbg1rTSvQQV9x4v/yYB/sum6egzSBLa/mdk1PViDSX2JvL0Me83sxu3JpEpQELfakDKbGcrw==", - "requires": { - "args": "4.0.0", - "basic-auth": "2.0.0", - "bluebird": "3.5.1", - "boxen": "1.3.0", - "chalk": "2.4.1", - "clipboardy": "1.2.3", - "dargs": "5.1.0", - "detect-port": "1.2.3", - "filesize": "3.6.1", - "fs-extra": "6.0.1", - "handlebars": "4.0.11", - "ip": "1.1.5", - "micro": "9.3.1", - "micro-compress": "1.0.0", - "mime-types": "2.1.18", - "node-version": "1.1.3", - "openssl-self-signed-certificate": "1.1.6", - "opn": "5.3.0", - "path-is-inside": "1.0.2", - "path-type": "3.0.0", - "send": "0.16.2", - "update-check": "1.5.1" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "side-channel": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", - "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", - "dev": true, - "requires": { - "es-abstract": "^1.17.0-next.1", - "object-inspect": "^1.7.0" - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "sinon": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", - "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^2.0.0", - "diff": "^3.1.0", - "lodash.get": "^4.4.2", - "lolex": "^2.2.0", - "nise": "^1.2.0", - "supports-color": "^5.1.0", - "type-detect": "^4.0.5" - } - }, - "sinon-chai": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", - "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "dev": true, - "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" - }, - "dependencies": { - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - }, - "source-map-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", - "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", - "dev": true, - "requires": { - "async": "^2.5.0", - "loader-utils": "^1.1.0" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - } - } - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "standalone-react-addons-pure-render-mixin": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/standalone-react-addons-pure-render-mixin/-/standalone-react-addons-pure-render-mixin-0.1.1.tgz", - "integrity": "sha1-PHQJ9MecQN6axyxhbPZ5qZTzdVE=" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string.prototype.matchall": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", - "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "has-symbols": "^1.0.1", - "internal-slot": "^1.0.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.2" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "style-loader": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.20.3.tgz", - "integrity": "sha512-2I7AVP73MvK33U7B9TKlYZAqdROyMXDYSMvHLX43qy3GCOaJNiV6i0v/sv9idWIaQ42Yn2dNv79Q5mKXbKhAZg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "dev": true, - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "tapable": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", - "dev": true - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - } - }, - "test-exclude": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", - "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^2.3.11", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "time-stamp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", - "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - } - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-check": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.1.tgz", - "integrity": "sha512-M3rjq5KwSrWZrm2GVPIQIF+NXpIn5I9mIV67gGoydptQvzRjLp9ZbM6ctFJeNuaWSm5+mNP7aInELjSiLcIw6A==", - "requires": { - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0" - } - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "webpack": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "dev": true, - "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", - "dev": true, - "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", - "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "bonjour": "^3.5.0", - "chokidar": "^2.1.2", - "compression": "^1.7.3", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "^0.19.1", - "import-local": "^1.0.0", - "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "^4.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "requires": { - "string-width": "^2.1.1" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xregexp": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", - "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", - "dev": true, - "requires": { - "@babel/runtime-corejs3": "^7.8.3" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - } - } - }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - } - } -} diff --git a/package.json b/package.json index 2f8d5826..705723e7 100644 --- a/package.json +++ b/package.json @@ -91,8 +91,8 @@ "webpack-dev-server": "^2.4.4" }, "dependencies": { - "@iabtcf/cmpapi": "^1.0.0-beta.20", - "@iabtcf/core": "^1.0.0-beta.20", + "@iabtcf/cmpapi": "^1.0.0-beta.22", + "@iabtcf/core": "^1.0.0-beta.22", "classnames": "^2.2.5", "codemirror": "^5.34.0", "core-js": "^2.5.3", diff --git a/src/lib/config.js b/src/lib/config.js index 6cf8a9e1..542d58a0 100644 --- a/src/lib/config.js +++ b/src/lib/config.js @@ -1,11 +1,9 @@ import log from './log'; const defaultConfig = { - customPurposeListLocation: './purposes.json', globalVendorListLocation: 'https://vendorlist.consensu.org/v2/vendor-list.json', globalConsentLocation: './portal.html', storeConsentGlobally: false, - storePublisherData: false, logging: false, localization: {}, forceLocale: null, diff --git a/src/lib/init.js b/src/lib/init.js index cf00f44b..56a06553 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -50,7 +50,6 @@ export function init (configUpdates) { const cmpManager = new CmpManager(); const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, cmpManager)); - if (config.decoratePageCallHandler) { config.decoratePageCallHandler(cmpApi); } diff --git a/src/lib/store.js b/src/lib/store.js index f65929a9..ab102111 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -195,7 +195,7 @@ export default class Store { } this.persistedConsentData = decodeConsentData(encodedConsent); - this.cmpApi.tcModel = this.tcModel; + this.cmpApi.update(encodedConsent); // Notify of date changes this.storeUpdate(); @@ -389,7 +389,7 @@ export default class Store { toggleConsentToolShowing = (isShown) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; if (this.isConsentToolShowing) { - this.cmpApi.uiVisible = true; + this.cmpApi.update(encodeConsentData(this.tcModel), true); } this.isFooterShowing = false; this.storeUpdate(); @@ -441,7 +441,6 @@ export default class Store { const persistedMaxVendorId = this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; this.tcModel.gvl = new GVL(vendorList); - this.cmpApi.tcModel = this.tcModel; this.vendorList = vendorList; // If vendor and publisher consent data has never been persisted set default selected status diff --git a/src/lib/store.test.js b/src/lib/store.test.js index b757e4b1..56ecb372 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -357,6 +357,7 @@ describe('store', () => { cmpId: CMP_ID }); store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); expect(store.isConsentToolShowing).to.be.false; store.toggleConsentToolShowing(); expect(store.isConsentToolShowing).to.be.true; From f534b7c6993855f549f95cc92aaa775b93c78fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 23 Mar 2020 14:47:50 +0100 Subject: [PATCH 289/540] added package-lock --- package-lock.json | 15864 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 15864 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..122c5e64 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15864 @@ +{ + "name": "appnexus-cmp", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "@babel/runtime-corejs3": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz", + "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@iabtcf/cmpapi": { + "version": "1.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.22.tgz", + "integrity": "sha512-MtG2gtlVloBSBQFajwxfIhMGuRtsh6zv10AkuUnUh4haObjXF2i4bRoxTzyaTJhyaHJF+gWISbITk1BVttugsw==", + "requires": { + "@iabtcf/core": "1.0.0-beta.22" + } + }, + "@iabtcf/core": { + "version": "1.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.22.tgz", + "integrity": "sha512-fOw09vU0eFDCsfkEPe+dstMIV+bb5mB9piOBf+uc/V5pS38lJzjJ/hzbuUHRqKg7LyLmR5ZPEM8MtHoeJlm4NA==" + }, + "@sinonjs/commons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "dependencies": { + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + } + } + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" + }, + "arg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-2.0.0.tgz", + "integrity": "sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "args": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/args/-/args-4.0.0.tgz", + "integrity": "sha512-4b7lVF58nlo7sNtq8s2OueroOY/UHn0Nt/NVjsx9zn28u6yDVb9bQ/uy/5jKtHCbUDil4MlMyDLF5+OHEgnTug==", + "requires": { + "camelcase": "5.0.0", + "chalk": "2.3.2", + "leven": "2.1.0", + "mri": "1.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "babel": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz", + "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", + "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.4" + } + }, + "babel-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-do-expressions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", + "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-function-bind": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "dev": true, + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, + "babel-plugin-transform-do-expressions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", + "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", + "dev": true, + "requires": { + "babel-plugin-syntax-do-expressions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-function-bind": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", + "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", + "dev": true, + "requires": { + "babel-plugin-syntax-function-bind": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-assign": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz", + "integrity": "sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^22.4.4", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-preset-stage-0": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", + "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", + "dev": true, + "requires": { + "babel-plugin-transform-do-expressions": "^6.22.0", + "babel-plugin-transform-function-bind": "^6.22.0", + "babel-preset-stage-1": "^6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + } + } + }, + "caniuse-db": { + "version": "1.0.30001036", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001036.tgz", + "integrity": "sha512-plRkihXQyiDaFUXC7x/jAIXXTKiiaWvfAagsruh/vmstnRQ+a2a95HyENxiTr5WrkPSvmFUIvsRUalVFyeh2/w==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001036", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz", + "integrity": "sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w==", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chai-datetime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/chai-datetime/-/chai-datetime-1.5.0.tgz", + "integrity": "sha1-N0LxiwJMdbdqK37uKRZiMkRnWWw=", + "dev": true, + "requires": { + "chai": ">1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clipboardy": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", + "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", + "requires": { + "arch": "^2.1.0", + "execa": "^0.8.0" + }, + "dependencies": { + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codemirror": { + "version": "5.52.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.52.2.tgz", + "integrity": "sha512-WCGCixNUck2HGvY8/ZNI1jYfxPG5cRHv0VjmWuNzbtCLz8qYA5d+je4QhSSCtCaagyeOwMi/HmmPTjBgiTm2lQ==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "core-js-pure": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", + "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-env": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", + "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-loader": { + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "detect-port": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.2.3.tgz", + "integrity": "sha512-IDbrX6PxqnYy8jV4wSHBaJlErYKTJvW8OQb9F7xivl1iQLqiUYHGa+nZ61Do6+N5uuOn/pReXKNqI9rUn04vug==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.380", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz", + "integrity": "sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "21.27.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.27.2.tgz", + "integrity": "sha512-0E4OIgBJVlAmf1KfYFtZ3gYxgUzC5Eb3Jzmrc9ikI1OY+/cM8Kh72Ti7KfpeHNeD3HJNf9SmEfmvQLIz44Hrhw==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", + "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "dev": true, + "requires": { + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": ">=0.0.5" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "harmony-reflect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", + "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + } + } + }, + "html-webpack-inline-source-plugin": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/html-webpack-inline-source-plugin/-/html-webpack-inline-source-plugin-0.0.10.tgz", + "integrity": "sha512-0ZNU57u7283vrXSF5a4VDnVOMWiSwypKIp1z/XfXWoVHLA1r3Xmyxx5+Lz+mnthz/UvxL1OAf41w5UIF68Jngw==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "slash": "^1.0.0", + "source-map-url": "^0.4.0" + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immutability-helper": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-2.9.1.tgz", + "integrity": "sha512-r/RmRG8xO06s/k+PIaif2r5rGc3j4Yhc01jSBfwPCXDLYZwp/yxralI37Df1mwmuzcCsen/E/ITKcTEvc1PQmQ==", + "requires": { + "invariant": "^2.2.0" + } + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "^3.3.0" + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", + "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^22.4.4" + }, + "dependencies": { + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "jest-cli": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", + "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.2.0", + "jest-config": "^22.4.4", + "jest-environment-jsdom": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^22.4.2", + "jest-message-util": "^22.4.0", + "jest-regex-util": "^22.1.0", + "jest-resolve-dependencies": "^22.1.0", + "jest-runner": "^22.4.4", + "jest-runtime": "^22.4.4", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "jest-worker": "^22.2.2", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + } + } + }, + "jest-changed-files": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", + "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.1", + "jest-environment-node": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^22.4.4", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "pretty-format": "^22.4.0" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-docblock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", + "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.0", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.0", + "jest-matcher-utils": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "source-map-support": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "dev": true, + "requires": { + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" + } + }, + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "dev": true, + "requires": { + "jest-regex-util": "^22.4.3" + } + }, + "jest-runner": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", + "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "jest-config": "^22.4.4", + "jest-docblock": "^22.4.0", + "jest-haste-map": "^22.4.2", + "jest-jasmine2": "^22.4.4", + "jest-leak-detector": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-runtime": "^22.4.4", + "jest-util": "^22.4.1", + "jest-worker": "^22.2.2", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", + "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^22.4.4", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.4", + "jest-haste-map": "^22.4.2", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" + }, + "dependencies": { + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + } + } + }, + "jest-serializer": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "jest-validate": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", + "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-config": "^22.4.4", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^22.4.0" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-worker": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", + "dev": true + }, + "js-beautify": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.3.tgz", + "integrity": "sha512-wfk/IAWobz1TfApSdivH5PJ0miIHgDoYb1ugSqHcODPmaYu46rYe5FVuIEkhjg8IQiv6rDNPyhsqbsohI/C2vQ==", + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "~0.5.1", + "nopt": "~4.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "just-extend": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", + "dev": true + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "less": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", + "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "dev": true + }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-expression-evaluator": { + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz", + "integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==", + "dev": true + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micro": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.1.tgz", + "integrity": "sha512-83uimpPJqfwkfKvJl2WWontBlV3hmzrIgyJ+L2uhDXKNk7Ll+/ezK3zBz7TljubpKPqjM0JdT2Ker4MTPmhjgA==", + "requires": { + "arg": "2.0.0", + "chalk": "2.4.0", + "content-type": "1.0.4", + "is-stream": "1.1.0", + "raw-body": "2.3.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "micro-compress": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micro-compress/-/micro-compress-1.0.0.tgz", + "integrity": "sha1-U/WoC0rQMgyhZaVZtuPfFF1PcE8=", + "requires": { + "compression": "^1.6.2" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "mri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz", + "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-version": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.1.3.tgz", + "integrity": "sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg==" + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "dependencies": { + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "openssl-self-signed-certificate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/openssl-self-signed-certificate/-/openssl-self-signed-certificate-1.1.6.tgz", + "integrity": "sha1-nTpHdrGlfphHNQOSEUrS+RWoPdQ=" + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "^5.0.16" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", + "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "^5.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "preact": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-8.5.3.tgz", + "integrity": "sha512-O3kKP+1YdgqHOFsZF2a9JVdtqD+RPzCQc3rP+Ualf7V6rmRDchZ9MJbiGTT7LuyqFKZqlHSOyO/oMFmI2lVTsw==" + }, + "preact-compat": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/preact-compat/-/preact-compat-3.19.0.tgz", + "integrity": "sha512-f83A4hIhH8Uzhb9GbIcGk8SM19ffWlwP9mDaYwQdRnMdekZwcCA7eIAbeV4EMQaV9C0Yuy8iKgBAtyTKPZQt/Q==", + "requires": { + "immutability-helper": "^2.7.1", + "preact-context": "^1.1.3", + "preact-render-to-string": "^3.8.2", + "preact-transition-group": "^1.1.1", + "prop-types": "^15.6.2", + "standalone-react-addons-pure-render-mixin": "^0.1.1" + } + }, + "preact-context": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/preact-context/-/preact-context-1.1.4.tgz", + "integrity": "sha512-gcCjPJ65R0MiW9hDu8W/3WAmyTElIvwLyEO6oLQiM6/TbLKLxCpBCWV8GJjx52TTEyUr60HLDcmoCXZlslelzQ==" + }, + "preact-jsx-chai": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/preact-jsx-chai/-/preact-jsx-chai-2.3.2.tgz", + "integrity": "sha512-LIvtYOUgC7bdXnylosrRYM//06lsdIvnfmkM3vz6rzCSTMzIU30//9s/jQndA2/XxlQJxkR/H2VNYhLX9zRSiw==", + "dev": true, + "requires": { + "preact-render-to-string": "^4.1.0" + }, + "dependencies": { + "preact-render-to-string": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-4.1.0.tgz", + "integrity": "sha512-FlFBJRxo8z4cp6VsDmeYjIEx4ZK2clFJnKIvIj8K1IQCRm7ZgJ/SZ1+BotT86/Nc+V1pNtFabHoUi6gpjx5Pug==", + "dev": true, + "requires": { + "pretty-format": "^3.8.0" + } + } + } + }, + "preact-render-to-string": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-3.8.2.tgz", + "integrity": "sha512-przuZPajiurStGgxMoJP0EJeC4xj5CgHv+M7GfF3YxAdhGgEWAkhOSE0xympAFN20uMayntBZpttIZqqLl77fw==", + "requires": { + "pretty-format": "^3.5.1" + } + }, + "preact-transition-group": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/preact-transition-group/-/preact-transition-group-1.1.1.tgz", + "integrity": "sha1-8KSTJ+pRXs406ivoZMSn0p5dbhA=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-polyfill": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", + "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proptypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proptypes/-/proptypes-1.1.0.tgz", + "integrity": "sha1-eLOCilqmuxMIk54N48YETf1L0jk=" + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", + "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react-codemirror2": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-codemirror2/-/react-codemirror2-4.3.0.tgz", + "integrity": "sha512-tC0n9CHgrQYc976pUlKOaVJYEHAAYTVMers04gNy6jbkFf4rbPlw72y7bbOAfkHHvu6COG5S629Fek30bvHe8w==" + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", + "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-bundle-webpack-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-bundle-webpack-plugin/-/replace-bundle-webpack-plugin-1.0.0.tgz", + "integrity": "sha1-VugfcOGm609T9TwSUi3xxvEhllg=", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + }, + "script-ext-html-webpack-plugin": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/script-ext-html-webpack-plugin/-/script-ext-html-webpack-plugin-1.8.8.tgz", + "integrity": "sha512-9mxSrvfX8on97tu4pUfLXQ9StKGxfHKSy3NXsYBi+4EpyhI4oUUhE3KEWUViDiTQHmY7u2ztLT5OfOjQRzmJaQ==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serve": { + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/serve/-/serve-6.5.8.tgz", + "integrity": "sha512-GZYlJz7f6E7Xq6xbg1rTSvQQV9x4v/yYB/sum6egzSBLa/mdk1PViDSX2JvL0Me83sxu3JpEpQELfakDKbGcrw==", + "requires": { + "args": "4.0.0", + "basic-auth": "2.0.0", + "bluebird": "3.5.1", + "boxen": "1.3.0", + "chalk": "2.4.1", + "clipboardy": "1.2.3", + "dargs": "5.1.0", + "detect-port": "1.2.3", + "filesize": "3.6.1", + "fs-extra": "6.0.1", + "handlebars": "4.0.11", + "ip": "1.1.5", + "micro": "9.3.1", + "micro-compress": "1.0.0", + "mime-types": "2.1.18", + "node-version": "1.1.3", + "openssl-self-signed-certificate": "1.1.6", + "opn": "5.3.0", + "path-is-inside": "1.0.2", + "path-type": "3.0.0", + "send": "0.16.2", + "update-check": "1.5.1" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sinon": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", + "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + } + }, + "sinon-chai": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", + "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "dev": true, + "requires": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "standalone-react-addons-pure-render-mixin": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/standalone-react-addons-pure-render-mixin/-/standalone-react-addons-pure-render-mixin-0.1.1.tgz", + "integrity": "sha1-PHQJ9MecQN6axyxhbPZ5qZTzdVE=" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-loader": { + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.20.3.tgz", + "integrity": "sha512-2I7AVP73MvK33U7B9TKlYZAqdROyMXDYSMvHLX43qy3GCOaJNiV6i0v/sv9idWIaQ42Yn2dNv79Q5mKXbKhAZg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "dev": true + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.0" + } + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-check": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.1.tgz", + "integrity": "sha512-M3rjq5KwSrWZrm2GVPIQIF+NXpIn5I9mIV67gGoydptQvzRjLp9ZbM6ctFJeNuaWSm5+mNP7aInELjSiLcIw6A==", + "requires": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "mime": "^1.4.1", + "schema-utils": "^0.3.0" + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", + "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^2.1.2", + "compression": "^1.7.3", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "^0.19.1", + "import-local": "^1.0.0", + "internal-ip": "1.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.5", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} From cb21957fb94d7acbab4639b0984379d253234d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 23 Mar 2020 17:24:36 +0100 Subject: [PATCH 290/540] persistedConsentData as a valid tcModel --- src/lib/commands.js | 12 ++++++++--- src/lib/commands.test.js | 4 ++-- src/lib/cookie/cookie.js | 8 +++++++- src/lib/init.js | 8 ++++---- src/lib/store.js | 44 +++++++++++++++++++++++++++++----------- src/lib/store.test.js | 13 +++++------- 6 files changed, 59 insertions(+), 30 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 2fc37be4..50b84485 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -34,19 +34,25 @@ const createCommands = (store, cmpManager) => { * Build consent fields object v1 from data that has already been persisted. */ const getConsentFieldsObject = () => { + let created, lastUpdated; + const { - persistedConsentData + persistedConsentData, + persistedConsentString } = store; const { - created, - lastUpdated, cmpId = store.tcModel.cmpId, cmpVersion = store.tcModel.cmpVersion, consentScreen = store.tcModel.consentScreen, consentLanguage = store.tcModel.consentLanguage, } = persistedConsentData; + if (persistedConsentString) { + created = persistedConsentData.created; + lastUpdated = persistedConsentData.lastUpdated; + } + return { cmpId, cmpVersion, diff --git a/src/lib/commands.test.js b/src/lib/commands.test.js index 8e95fd38..fd09794f 100644 --- a/src/lib/commands.test.js +++ b/src/lib/commands.test.js @@ -221,7 +221,7 @@ describe('commands', () => { const encoded = encodeConsentData(tcModel); const localStore = new Store({ cmpId: CMP_ID, - consentData: decodeConsentData(encoded) + consentString: encoded }); const localCommands = createCommands(localStore); const cmpApi = new CmpApi(280, 2, localCommands); @@ -346,7 +346,7 @@ describe('commands', () => { const encoded = encodeConsentData(tcModel); const localStore = new Store({ cmpId: CMP_ID, - consentData: decodeConsentData(encoded) + consentString: encoded }); const localCommands = createCommands(localStore); const cmpApi = new CmpApi(280, 2, localCommands); diff --git a/src/lib/cookie/cookie.js b/src/lib/cookie/cookie.js index 0588b08b..a9c3d9e8 100644 --- a/src/lib/cookie/cookie.js +++ b/src/lib/cookie/cookie.js @@ -36,7 +36,13 @@ function decodeConsentData (encoded) { } const encodeConsentData = (decoded) => { - return TCString.encode(decoded); + let encoded; + try { + encoded = TCString.encode(decoded); + } catch (e) { + log.debug('Invalid consent data - unable to encode'); + } + return encoded; }; const readConsentCookie = () => { diff --git a/src/lib/init.js b/src/lib/init.js index 56a06553..3a59e7fd 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -3,7 +3,7 @@ import Promise from 'promise-polyfill'; import Store from './store'; import { CmpApi } from '@iabtcf/cmpapi'; import { fetchGlobalVendorList } from './vendor'; -import { decodeConsentData, readConsentCookie } from './cookie/cookie'; +import { readConsentCookie } from './cookie/cookie'; import log from './log'; import pack from '../../package.json'; import config from './config'; @@ -22,7 +22,7 @@ function readExternalConsentData(config) { reject(err); } else { try { - resolve(data.consent && decodeConsentData(data.consent) || undefined); + resolve(data.consent && data.consent || undefined); } catch (err) { reject(err); } @@ -40,12 +40,12 @@ export function init (configUpdates) { // Fetch the current vendor consent before initializing return ((config.getConsentData) ? readExternalConsentData(config) : readConsentCookie()) - .then((consentData) => { + .then((consentString) => { const store = new Store({ cmpVersion: CMP_VERSION, cmpId: CMP_ID, cookieVersion: COOKIE_VERSION, - consentData, + consentString, }); const cmpManager = new CmpManager(); diff --git a/src/lib/store.js b/src/lib/store.js index ab102111..8ce779d2 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -18,21 +18,37 @@ export default class Store { cmpId, cmpVersion = 2, cookieVersion = 2, - consentData + consentString } = {}) { // Keep track of data that has already been persisted - consentData = consentData || {}; - this.persistedConsentData = consentData; const consentLanguage = findLocale().substr(0, 2).toUpperCase(); const tcModel = new TCModel(); tcModel.cmpId = cmpId; tcModel.cmpVersion = cmpVersion; tcModel.isServiceSpecific = true; tcModel.supportOOB = false; + const persistedTcModel = new TCModel(); + persistedTcModel.cmpId = cmpId; + persistedTcModel.cmpVersion = cmpVersion; + persistedTcModel.isServiceSpecific = true; + persistedTcModel.supportOOB = false; + + this.persistedConsentString = consentString; + this.persistedConsentData = decodeConsentData(consentString) || {}; this.tcModel = Object.assign( tcModel, - consentData, + this.persistedConsentData, + { + version: cookieVersion, + cmpId, + cmpVersion, + consentLanguage + }); + + this.persistedConsentData = Object.assign( + persistedTcModel, + this.persistedConsentData, { version: cookieVersion, cmpId, @@ -194,6 +210,7 @@ export default class Store { writeConsentCookie(encodedConsent); } + this.persistedConsentString = encodedConsent; this.persistedConsentData = decodeConsentData(encodedConsent); this.cmpApi.update(encodedConsent); @@ -389,7 +406,7 @@ export default class Store { toggleConsentToolShowing = (isShown) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; if (this.isConsentToolShowing) { - this.cmpApi.update(encodeConsentData(this.tcModel), true); + this.cmpApi.update(encodeConsentData(this.persistedConsentData), true); } this.isFooterShowing = false; this.storeUpdate(); @@ -430,21 +447,24 @@ export default class Store { }; updateVendorList = (vendorList) => { - const { - created, - } = this.persistedConsentData || {}; - const { vendors = {}, } = vendorList || {}; - const persistedMaxVendorId = this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; + const persistedMaxVendorId = this.persistedConsentString && + this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; + + const gvl = new GVL(vendorList); + this.tcModel.gvl = gvl; + + if (!this.persistedConsentString) { + this.persistedConsentData.gvl = gvl; + } - this.tcModel.gvl = new GVL(vendorList); this.vendorList = vendorList; // If vendor and publisher consent data has never been persisted set default selected status - if (!created) { + if (!this.persistedConsentString) { const getIds = (object) => Object.keys(object) .filter(key => object[key].id) .map(key => object[key].id); diff --git a/src/lib/store.test.js b/src/lib/store.test.js index 56ecb372..ec959e87 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -3,7 +3,7 @@ import { expect, use } from 'chai'; import datetime from 'chai-datetime'; import Store from './store'; import { CmpApi } from "@iabtcf/cmpapi"; -import { decodeConsentData, encodeConsentData } from "./cookie/cookie"; +import { encodeConsentData } from "./cookie/cookie"; import {GVL, TCModel} from "@iabtcf/core"; import { PURPOSE_CONSENTS, @@ -72,7 +72,7 @@ describe('store', () => { const store = new Store({ cmpId: CMP_ID, - consentData: decodeConsentData(encoded), + consentString: encoded, }); store.setCmpApi(cmpApi); @@ -111,13 +111,11 @@ describe('store', () => { tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); - const encoded = encodeConsentData(tcModel); - const decoded = decodeConsentData(encoded); const store = new Store({ cmpId: CMP_ID, - consentData: decoded, + consentString: encoded, }); store.setCmpApi(cmpApi); @@ -147,11 +145,10 @@ describe('store', () => { tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); const encoded = encodeConsentData(tcModel); - const decoded = decodeConsentData(encoded); const store = new Store({ cmpId: 280, - consentData: decoded, + consentString: encoded, }); store.setCmpApi(cmpApi); @@ -408,7 +405,7 @@ describe('store', () => { const store = new Store({ cmpId: CMP_ID, - consentData: decodeConsentData(encoded), + consentString: encoded }); store.setCmpApi(cmpApi); From 4e0bf48756ef65849aacade3590f7c5dec007d70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Mon, 23 Mar 2020 19:21:20 +0100 Subject: [PATCH 291/540] fix for uiVisible --- src/lib/store.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/store.js b/src/lib/store.js index 8ce779d2..6ccb3a65 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -406,7 +406,10 @@ export default class Store { toggleConsentToolShowing = (isShown) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; if (this.isConsentToolShowing) { - this.cmpApi.update(encodeConsentData(this.persistedConsentData), true); + const encodedString = this.persistedConsentString ? + this.persistedConsentString : + encodeConsentData(this.persistedConsentData); + this.cmpApi.update(encodedString, true); } this.isFooterShowing = false; this.storeUpdate(); From da7743aba1ee817743e20c521fc50bb46f436d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 24 Mar 2020 09:32:10 +0100 Subject: [PATCH 292/540] cmpApi fix for user with consent scenario --- src/lib/store.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/store.js b/src/lib/store.js index 6ccb3a65..df2e84e0 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -65,6 +65,9 @@ export default class Store { setCmpApi (cmpApi) { this.cmpApi = cmpApi; + if (this.persistedConsentString) { + this.cmpApi.update(this.persistedConsentString, false); + } } isAllSetTrue = obj => Object.keys(obj).map(key => obj[key]).every((value) => value === true); From 605835d943ae8b7990a8631426aed400682dffd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 24 Mar 2020 10:41:29 +0100 Subject: [PATCH 293/540] version update + custom command for getting vendor list version --- package-lock.json | 26 +++++++++++++------------- package.json | 4 ++-- src/lib/commands.js | 13 +++++++++++++ src/lib/commands.test.js | 40 ++++++++++++++++++++++++++++++++++++++++ src/lib/init.js | 2 +- src/lib/store.js | 40 +++++++++------------------------------- 6 files changed, 78 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 122c5e64..5766c198 100644 --- a/package-lock.json +++ b/package-lock.json @@ -208,17 +208,17 @@ } }, "@iabtcf/cmpapi": { - "version": "1.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.22.tgz", - "integrity": "sha512-MtG2gtlVloBSBQFajwxfIhMGuRtsh6zv10AkuUnUh4haObjXF2i4bRoxTzyaTJhyaHJF+gWISbITk1BVttugsw==", + "version": "1.0.0-beta.25", + "resolved": "https://registry.npmjs.org/@iabtcf/cmpapi/-/cmpapi-1.0.0-beta.25.tgz", + "integrity": "sha512-mJc1FnDHKXBULypV6dgwg/VQfKX/RJa69pvS4Pth5sI6ztzH2BTqou6fylxq2sybRhdljO7HeZD3X7iLNzmHuw==", "requires": { - "@iabtcf/core": "1.0.0-beta.22" + "@iabtcf/core": "1.0.0-beta.25" } }, "@iabtcf/core": { - "version": "1.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.22.tgz", - "integrity": "sha512-fOw09vU0eFDCsfkEPe+dstMIV+bb5mB9piOBf+uc/V5pS38lJzjJ/hzbuUHRqKg7LyLmR5ZPEM8MtHoeJlm4NA==" + "version": "1.0.0-beta.25", + "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.0.0-beta.25.tgz", + "integrity": "sha512-8sDodVM1PNDJQJ8y5M605kCij6/rGXBMfIXpPvqnmIbsAZ0Z0S9R5X9xzRPeXH0ruNbZjiC0WLj78V8wqtcU7w==" }, "@sinonjs/commons": { "version": "1.7.1", @@ -4220,9 +4220,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.380", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz", - "integrity": "sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw==", + "version": "1.3.382", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.382.tgz", + "integrity": "sha512-gJfxOcgnBlXhfnUUObsq3n3ReU8CT6S8je97HndYRkKsNZMJJ38zO/pI5aqO7L3Myfq+E3pqPyKK/ynyLEQfBA==", "dev": true }, "elliptic": { @@ -8670,9 +8670,9 @@ } }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", "requires": { "minimist": "^1.2.5" } diff --git a/package.json b/package.json index 705723e7..023dab9e 100644 --- a/package.json +++ b/package.json @@ -91,8 +91,8 @@ "webpack-dev-server": "^2.4.4" }, "dependencies": { - "@iabtcf/cmpapi": "^1.0.0-beta.22", - "@iabtcf/core": "^1.0.0-beta.22", + "@iabtcf/cmpapi": "^1.0.0-beta.25", + "@iabtcf/core": "^1.0.0-beta.25", "classnames": "^2.2.5", "codemirror": "^5.34.0", "core-js": "^2.5.3", diff --git a/src/lib/commands.js b/src/lib/commands.js index 50b84485..2db149df 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -279,9 +279,22 @@ const createCommands = (store, cmpManager) => { cmpManager.removeEventListener(event, callback); }; + const getVendorListVersion = (callback = () => {})=> { + const { + persistedConsentData + } = store; + + const { + vendorListVersion = null + } = persistedConsentData; + + callback(vendorListVersion); + }; + return { getConsentObject, getConsentFieldsV1, + getVendorListVersion, showConsentTool, showConsentDetailView, showVendors, diff --git a/src/lib/commands.test.js b/src/lib/commands.test.js index fd09794f..63bb0352 100644 --- a/src/lib/commands.test.js +++ b/src/lib/commands.test.js @@ -374,6 +374,46 @@ describe('commands', () => { }, 0); }); + + + it('getVendorListVersion - should return null if transparency was not established', () => { + commands.getVendorListVersion((vendorListVersion) => { + expect(vendorListVersion).to.be.null; + }) + }); + + it('getVendorListVersion - should return vendor list version if transparency was established', () => { + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(VENDOR_LIST); + + setTimeout(() => { + tcModel.purposeConsents.set(PURPOSE_CONSENTS); + tcModel.purposeLegitimateInterests.set(PURPOSE_LEGITIMATE_INTERESTS); + tcModel.vendorConsents.set(VENDOR_CONSENTS); + tcModel.vendorLegitimateInterests.set(VENDOR_LEGITIMATE_INTERESTS); + tcModel.publisherConsents.set(PUBLISHER_CONSENTS); + tcModel.publisherLegitimateInterests.set(PUBLISHER_LEGITIMATE_INTERESTS); + tcModel.specialFeatureOptins.set(SPECIAL_FEATURE_OPT_INS); + + // creating consent + const encoded = encodeConsentData(tcModel); + const localStore = new Store({ + cmpId: CMP_ID, + consentString: encoded + }); + + const localCommands = createCommands(localStore); + const cmpApi = new CmpApi(280, 2, localCommands); + store.setCmpApi(cmpApi); + store.updateVendorList(VENDOR_LIST); + + localCommands.getVendorListVersion((vendorListVersion) => { + expect(vendorListVersion).to.equal(100); + }); + }, 0); + }); }); describe('additional functions', () => { diff --git a/src/lib/init.js b/src/lib/init.js index 3a59e7fd..873516b9 100755 --- a/src/lib/init.js +++ b/src/lib/init.js @@ -49,7 +49,7 @@ export function init (configUpdates) { }); const cmpManager = new CmpManager(); - const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, createCommands(store, cmpManager)); + const cmpApi = new CmpApi(CMP_ID, CMP_VERSION, true, createCommands(store, cmpManager)); if (config.decoratePageCallHandler) { config.decoratePageCallHandler(cmpApi); } diff --git a/src/lib/store.js b/src/lib/store.js index df2e84e0..2e2d8a27 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -27,13 +27,8 @@ export default class Store { tcModel.cmpVersion = cmpVersion; tcModel.isServiceSpecific = true; tcModel.supportOOB = false; - const persistedTcModel = new TCModel(); - persistedTcModel.cmpId = cmpId; - persistedTcModel.cmpVersion = cmpVersion; - persistedTcModel.isServiceSpecific = true; - persistedTcModel.supportOOB = false; - this.persistedConsentString = consentString; + this.persistedConsentString = consentString || ''; this.persistedConsentData = decodeConsentData(consentString) || {}; this.tcModel = Object.assign( @@ -46,16 +41,6 @@ export default class Store { consentLanguage }); - this.persistedConsentData = Object.assign( - persistedTcModel, - this.persistedConsentData, - { - version: cookieVersion, - cmpId, - cmpVersion, - consentLanguage - }); - this.isConsentToolShowing = false; this.isFooterShowing = false; this.section = SECTION_INTRO; @@ -409,10 +394,7 @@ export default class Store { toggleConsentToolShowing = (isShown) => { this.isConsentToolShowing = typeof isShown === 'boolean' ? isShown : !this.isConsentToolShowing; if (this.isConsentToolShowing) { - const encodedString = this.persistedConsentString ? - this.persistedConsentString : - encodeConsentData(this.persistedConsentData); - this.cmpApi.update(encodedString, true); + this.cmpApi.update(this.persistedConsentString, true); } this.isFooterShowing = false; this.storeUpdate(); @@ -453,24 +435,20 @@ export default class Store { }; updateVendorList = (vendorList) => { + const { + created + } = this.persistedConsentData; + const { vendors = {}, } = vendorList || {}; - const persistedMaxVendorId = this.persistedConsentString && - this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; - - const gvl = new GVL(vendorList); - this.tcModel.gvl = gvl; - - if (!this.persistedConsentString) { - this.persistedConsentData.gvl = gvl; - } - + const persistedMaxVendorId = this.persistedConsentData.vendorConsents && this.persistedConsentData.vendorConsents.maxId || 0; + this.tcModel.gvl = new GVL(vendorList); this.vendorList = vendorList; // If vendor and publisher consent data has never been persisted set default selected status - if (!this.persistedConsentString) { + if (!created) { const getIds = (object) => Object.keys(object) .filter(key => object[key].id) .map(key => object[key].id); From 810f7c259cc51582c5e9308819a6f09fa5218be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 24 Mar 2020 10:43:03 +0100 Subject: [PATCH 294/540] semicolon + shorter synthax --- src/lib/commands.js | 6 +----- src/lib/commands.test.js | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/lib/commands.js b/src/lib/commands.js index 2db149df..62764118 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -280,13 +280,9 @@ const createCommands = (store, cmpManager) => { }; const getVendorListVersion = (callback = () => {})=> { - const { - persistedConsentData - } = store; - const { vendorListVersion = null - } = persistedConsentData; + } = store.persistedConsentData; callback(vendorListVersion); }; diff --git a/src/lib/commands.test.js b/src/lib/commands.test.js index 63bb0352..042e124c 100644 --- a/src/lib/commands.test.js +++ b/src/lib/commands.test.js @@ -379,7 +379,7 @@ describe('commands', () => { it('getVendorListVersion - should return null if transparency was not established', () => { commands.getVendorListVersion((vendorListVersion) => { expect(vendorListVersion).to.be.null; - }) + }); }); it('getVendorListVersion - should return vendor list version if transparency was established', () => { From ba9bfaab6d86244f0367601420cf47db0c470a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 24 Mar 2020 11:35:09 +0100 Subject: [PATCH 295/540] fix for handling consent string v1.1 --- src/lib/store.js | 3 ++- src/lib/store.test.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/lib/store.js b/src/lib/store.js index 2e2d8a27..b49cdade 100644 --- a/src/lib/store.js +++ b/src/lib/store.js @@ -28,7 +28,8 @@ export default class Store { tcModel.isServiceSpecific = true; tcModel.supportOOB = false; - this.persistedConsentString = consentString || ''; + // decoding to check if string is compatible + this.persistedConsentString = decodeConsentData(consentString) ? consentString : ''; this.persistedConsentData = decodeConsentData(consentString) || {}; this.tcModel = Object.assign( diff --git a/src/lib/store.test.js b/src/lib/store.test.js index ec959e87..99979f96 100644 --- a/src/lib/store.test.js +++ b/src/lib/store.test.js @@ -90,6 +90,35 @@ describe('store', () => { }, 0); }); + it('initializes with consent string v1.1', (done) => { + const oldConsentString = 'BOwkm8VOwkm8VEYABAPL89-AAAAzR__7_98t_TlDfLj99f7v_zf37_2___r_BgwV__3v__r_____5_93__-______f_7_________________________________________________________________________4A'; + + const tcModel = new TCModel(); + tcModel.cmpId = 280; + tcModel.cmpVersion = 2; + tcModel.gvl = new GVL(VENDOR_LIST); + + setTimeout(() => { + const store = new Store({ + cmpId: CMP_ID, + consentString: oldConsentString, + }); + + store.setCmpApi(cmpApi); + + expect(store.persistedConsentString.length).to.equal(0); + expect(store.persistedConsentData).to.deep.equal({}); + expect(store.tcModel.purposeConsents.maxId).to.equal(0); + expect(store.tcModel.purposeLegitimateInterests.maxId).to.equal(0); + expect(store.tcModel.vendorConsents.maxId).to.equal(0); + expect(store.tcModel.vendorLegitimateInterests.maxId).to.equal(0); + expect(store.tcModel.publisherConsents.maxId).to.equal(0); + expect(store.tcModel.publisherLegitimateInterests.maxId).to.equal(0); + expect(store.tcModel.specialFeatureOptins.maxId).to.equal(0); + done(); + }, 0); + }); + it('initializes with new vendor list', (done) => { const vendorList = JSON.parse(JSON.stringify(VENDOR_LIST)); vendorList.vendorListVersion = 101; From a479967cfa9bfe8682b78bedd1022c9434fb55c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 24 Mar 2020 12:47:58 +0100 Subject: [PATCH 296/540] sandbox --- src/index.html | 5 ----- src/index.js | 36 +++++++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/index.html b/src/index.html index 75a83c62..fc3ad2ce 100644 --- a/src/index.html +++ b/src/index.html @@ -5,11 +5,6 @@ GDPR Documentation - diff --git a/src/index.js b/src/index.js index 6567e829..c5f49a00 100755 --- a/src/index.js +++ b/src/index.js @@ -7,7 +7,8 @@ import 'core-js/fn/set'; import {init} from './lib/init'; import log from "./lib/log"; import config from "./lib/config"; -import { decodeConsentData } from "./lib/cookie/cookie"; +import { decodeConsentData, readConsentCookie } from "./lib/cookie/cookie"; +import {fetchGlobalVendorList} from "./lib/vendor"; const TCF_CONFIG = '__tcfConfig'; @@ -54,6 +55,11 @@ function checkConsent(tcfApi, store) { log.warn('Cookies are disabled. Ignoring CMP consent check'); } else { + const resolve = (timeout, consentData = {}, vendorList) => { + clearTimeout(timeout); + handleConsentResult(tcfApi, store, vendorList, consentData); + }; + const { getVendorList, getConsentData } = config; if (getVendorList) { getVendorList((err, vendorList) => { @@ -64,27 +70,39 @@ function checkConsent(tcfApi, store) { handleConsentResult(tcfApi, store, vendorList); }, 100); - const resolve = (consentData = {}) => { - clearTimeout(timeout); - handleConsentResult(tcfApi, store, vendorList, consentData); - }; - if (getConsentData) { getConsentData((err, data) => { if (err) { - resolve(); + resolve(timeout); } else { try { const tcStringDecoded = decodeConsentData(data.consent); - resolve(tcStringDecoded); + resolve(timeout, tcStringDecoded, vendorList); } catch (e) { - resolve(); + resolve(timeout); } } }); } } }); + } else { + fetchGlobalVendorList().then((vendorList) => { + const timeout = setTimeout(() => { + handleConsentResult(tcfApi, store, vendorList); + }, 100); + + readConsentCookie().then((cookie) => { + if (cookie) { + try { + const tcStringDecoded = decodeConsentData(cookie); + resolve(timeout, tcStringDecoded, vendorList); + } catch (e) { + resolve(timeout); + } + } + }); + }); } } } From 605554f14ca7fbb04c59ba0a38e83c0f60297550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Z=C4=85bek?= Date: Tue, 24 Mar 2020 13:56:53 +0100 Subject: [PATCH 297/540] missing cookie changes from previous commit + docs --- src/docs/components/docs/cmpApi.jsx | 8 ++ src/docs/components/docs/configuration.jsx | 18 +---- src/docs/components/docs/quickstart.jsx | 4 +- src/docs/components/docs/setup.jsx | 18 ++--- .../examples/advanced/adAfterConsent.jsx | 6 +- .../advanced/inspectVendorConsent.jsx | 22 ++---- .../examples/advanced/requireConsent.jsx | 20 ++--- .../examples/basic/customEventListeners.jsx | 8 +- src/docs/components/examples/basic/ping.jsx | 2 +- .../components/examples/basic/showConsent.jsx | 2 +- src/docs/components/examples/example.jsx | 4 +- src/docs/components/nav/nav.jsx | 32 ++++---- src/docs/lib/stub.js | 74 ------------------- src/lib/cookie/cookie.js | 2 +- src/lib/cookie/cookie.test.js | 3 +- 15 files changed, 70 insertions(+), 153 deletions(-) diff --git a/src/docs/components/docs/cmpApi.jsx b/src/docs/components/docs/cmpApi.jsx index 1a6b34ef..997d1680 100644 --- a/src/docs/components/docs/cmpApi.jsx +++ b/src/docs/components/docs/cmpApi.jsx @@ -50,6 +50,14 @@ const commands = [ resultDescription: 'Object containing the entire vendor list of IDs and names' } }, + { + command: 'getVendorListVersion', + parameters: [], + callback: { + resultType: 'result (Integer)', + resultDescription: 'Vendor list version when transparency was established, null otherwise.' + } + }, { command: 'showConsentTool', parameters: [{ diff --git a/src/docs/components/docs/configuration.jsx b/src/docs/components/docs/configuration.jsx index 4461c320..830dca6d 100644 --- a/src/docs/components/docs/configuration.jsx +++ b/src/docs/components/docs/configuration.jsx @@ -8,9 +8,7 @@ const script = beautify(` window.__tcfConfig = { globalVendorListLocation: 'https://vendorlist.consensu.org/v2/vendor-list.json', globalConsentLocation: './portal.html', - customPurposeListLocation: './purposes.json', storeConsentGlobally: true, - storePublisherData: true, logging: 'debug' } `); @@ -49,23 +47,11 @@ export default class CmpApi extends Component { Location of the HTML file that is required to communicate global vendor consent data to a third-party domain. See: /src/docs/assets/portal.js
    - - customPurposeListLocation (String): - Location of the JSON file that holds a list of custom purposes a user can select. This file - must be able to be requested from the domain that the CMP is loaded on. - See: /src/docs/assets/purposes.json - storeConsentGlobally (Boolean): If true then the the consent data is written to a cookie on the globalConsentLocation domain. If false then the consent data will be written to a cookie on the domain that the CMP is loaded from. - - storePublisherData (Boolean): - If true then custom purposes will be loaded from customPurposeListLocation and a the purpose consent information will be - written into a cookie on the domain that the CMP is loaded from. This cookie is unique from the vendor consent cookie. If false - then the customPurposeListLocation will not be requested and no cookie will be written with purpose consent data. - logging (String|Boolean): @@ -123,6 +109,10 @@ export default class CmpApi extends Component { Default is set true. If true autoDisplay: true when initialize CMP the consent tool UI may be displayed automatically according to user's current consents. If is set false autoDisplay: false the consent tool UI will never be displayed when initialize CMP + + decoratePageCallHandler (function) + Custom function to overwrite default behaviour pageCallHandler function. +
    ); diff --git a/src/docs/components/docs/quickstart.jsx b/src/docs/components/docs/quickstart.jsx index 861fe869..a93d8b86 100644 --- a/src/docs/components/docs/quickstart.jsx +++ b/src/docs/components/docs/quickstart.jsx @@ -82,11 +82,9 @@ export default class Setup extends Component { The consent tool presents the user with lists of purposes and vendors that they can individually consent to. These lists are controlled by a JSON file configured by config.globalVendorListLocation (default - location: https://vendorlist.consensu.org/vendorlist.json). You can modify this + location: https://vendorlist.consensu.org/v2/vendor-list.json). You can modify this value to point to your own custom list (NOTE: the location must serve the appropriate CORS headers). - - You can generate a file using this tool.

    diff --git a/src/docs/components/docs/setup.jsx b/src/docs/components/docs/setup.jsx index c9992b0d..d32de192 100644 --- a/src/docs/components/docs/setup.jsx +++ b/src/docs/components/docs/setup.jsx @@ -18,20 +18,20 @@ export default class Setup extends Component { storePublisherData: false }; - const bookmarkScript = `javascript:(function(){ - ${buildScript(config, `//${CURRENT_LOCATION}../cmp.bundle.js`)} - window.__cmp('showConsentTool'); - }());`.replace(/}\n/g, '};'); + // const bookmarkScript = `javascript:(function(){ + // ${buildScript(config, `//${CURRENT_LOCATION}../cmp.bundle.js`)} + // window.__cmp('showConsentTool'); + // }());`.replace(/}\n/g, '};'); this.setState({ - bookmarklet: bookmarkScript, + // bookmarklet: bookmarkScript, tag: beautify(``), }); } render(props, state) { - const { tag, bookmarklet} = state; + const { tag } = state; return (
    @@ -41,9 +41,9 @@ export default class Setup extends Component { immediately after the script include. When the full implementation is loaded any queued commands will be executed in the order they were received.

    -
    - Run this on any site by creating a bookmark of this link -
    + {/*
    */} + {/* Run this on any site by creating a bookmark of this link*/} + {/*
    */} { + eval(setup); + }, 500) } } diff --git a/src/docs/components/nav/nav.jsx b/src/docs/components/nav/nav.jsx index acc842f2..7a9b0bfc 100644 --- a/src/docs/components/nav/nav.jsx +++ b/src/docs/components/nav/nav.jsx @@ -51,15 +51,15 @@ export const navItems = [ { to: '/basic/list', title: 'Get Vendor List', component: VendorList }, ] }, - { - title: 'IFrame Examples', - items: [ - { to: '/iframe/show', title: 'Show Consent Tool', component: () =>